dreamcast/dreamcast2/regs/render_sh7091.py

56 lines
1.6 KiB
Python

import sys
from generate import renderer
from csv_input import read_input
from block_regs import new_writer
from block_regs import headers
from block_regs import size_to_type
def blocks(rows):
stack = []
last_block = None
for row in rows:
block = row["block"]
if last_block != block:
offset = int(row["offset"], 16)
stack.append((block, offset))
last_block = block
yield "struct sh7091_reg {"
last_offset = 0
last_block = None
reserved_num = 0
for block, offset in stack:
if offset != last_offset:
assert last_block is not None
type = size_to_type(1)
raw_pad = (offset - last_offset) << 16
yield f"{type} _pad{reserved_num}[{hex(raw_pad)} - (sizeof (struct {last_block.lower()}_reg))];"
reserved_num += 1
yield f"struct {block.lower()}_reg {block};"
last_offset = offset
last_block = block
yield "};"
for block, offset in stack:
yield f"static_assert((offsetof (struct sh7091_reg, {block})) == {hex(offset << 16)});"
yield ""
yield 'extern struct sh7091_reg sh7091 __asm("sh7091");'
def namespace(namespace_name, rows):
yield f"namespace {namespace_name} {{"
yield from process(rows)
yield from blocks(rows)
yield "}"
if __name__ == "__main__":
input_file = sys.argv[1]
namespace_name = sys.argv[2]
rows = read_input(input_file)
process = new_writer()
render, out = renderer()
render(headers())
render(namespace(namespace_name, rows))
sys.stdout.write(out.getvalue())