jvm/regs/bits_java.py
2024-12-27 08:28:27 -06:00

50 lines
1.7 KiB
Python

from bits import sign_extend
from bits import mask_from_bits
def generate_bit(bit):
#name = bit.bit_name
if bit.enum_name == "":
name = f"{bit.register_name}__{bit.bit_name}".lower()
else:
name = f"{bit.register_name}__{bit.enum_name}__{bit.bit_name}".lower()
if not bit.value and not bit.mask:
yield f"public static int {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 {name} = {bit.value} << {min(bit.bits)};"
elif bit.mask:
assert (bit.value is None) ^ (bit.mask is None), bit
yield f"public static int {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 f"public class {class_name} {{"
for register_name, enum_group in group.items():
#yield f"public class {register_name.lower()} {{"
yield from generate_enums(enum_group)
#yield "}"
yield "}"