jvm/regs/bits_java.py
2024-12-27 07:11:22 -06:00

45 lines
1.5 KiB
Python

from bits import sign_extend
from bits import mask_from_bits
def generate_bit(bit):
if not bit.value and not bit.mask:
yield f"public static int {bit.bit_name}(int n) {{"
yield f"return (n >> {min(bit.bits)}) & {sign_extend(mask_from_bits(bit.bits), 32)};"
yield "}"
elif bit.value:
assert (bit.value is None) ^ (bit.mask is None), bit
yield f"public static final int {bit.bit_name} = {bit.value << min(bit.bits)};"
elif bit.mask:
assert (bit.value is None) ^ (bit.mask is None), bit
yield f"public static int {bit.bit_name}(int n) {{"
if type(bit.mask) is str:
yield f"return (n & {sign_extend(mask_from_bits(bit.bits), 32)}) << {min(bit.bits)};"
else:
yield f"return (n & {bit.mask}) << {min(bit.bits)};"
yield "}"
else:
assert False, bit
def generate_bits(bits):
for bit in bits:
yield from generate_bit(bit)
def generate_enums(enum_group):
for enum_name, bits in enum_group.items():
if enum_name == "":
yield from generate_bits(bits)
else:
yield f"public class {enum_name} {{"
yield from generate_bits(bits)
yield "}"
def generate_registers(package_name, class_name, group):
yield f"package sega.dreamcast.{package_name};"
yield ""
yield f"public class {class_name} {{"
for register_name, enum_group in group.items():
yield f"public class {register_name} {{"
yield from generate_enums(enum_group)
yield "}"
yield "}"