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 "}"