121 lines
3.5 KiB
Python
121 lines
3.5 KiB
Python
import sys
|
|
|
|
def parse_reg_value(value):
|
|
if '-' in value:
|
|
start, end = value.split('-')
|
|
return int(start, 16), int(end, 16)
|
|
else:
|
|
return int(value, 16)
|
|
|
|
def reg_name_value(lines):
|
|
for line in lines:
|
|
if not line.strip():
|
|
continue
|
|
reg_name = line.split(':')[1].split(' ')[0]
|
|
reg_value = line.split(' MMReg:')[1:]
|
|
for value in reg_value:
|
|
yield reg_name, parse_reg_value(value.removesuffix(','))
|
|
|
|
aos_order_table = [
|
|
"VTX_AOS_ATTR01",
|
|
"VTX_AOS_ADDR0",
|
|
"VTX_AOS_ADDR1",
|
|
"VTX_AOS_ATTR23",
|
|
"VTX_AOS_ADDR2",
|
|
"VTX_AOS_ADDR3",
|
|
"VTX_AOS_ATTR45",
|
|
"VTX_AOS_ADDR4",
|
|
"VTX_AOS_ADDR5",
|
|
"VTX_AOS_ATTR67",
|
|
"VTX_AOS_ADDR6",
|
|
"VTX_AOS_ADDR7",
|
|
"VTX_AOS_ATTR89",
|
|
"VTX_AOS_ADDR8",
|
|
"VTX_AOS_ADDR9",
|
|
"VTX_AOS_ATTR1011",
|
|
"VTX_AOS_ADDR10",
|
|
"VTX_AOS_ADDR11",
|
|
"VTX_AOS_ATTR1213",
|
|
"VTX_AOS_ADDR12",
|
|
"VTX_AOS_ADDR13",
|
|
"VTX_AOS_ATTR1415",
|
|
"VTX_AOS_ADDR14",
|
|
"VTX_AOS_ADDR15",
|
|
]
|
|
|
|
def generate(lines, callback, callback_array):
|
|
for reg_name, reg_value in reg_name_value(lines):
|
|
if type(reg_value) is int:
|
|
callback(reg_value, reg_name)
|
|
else:
|
|
start, end = reg_value
|
|
if '[' not in reg_name:
|
|
offset = start
|
|
while offset <= end:
|
|
ix = (offset - start) // 4
|
|
callback_array(offset, reg_name, ix)
|
|
offset += 4
|
|
else:
|
|
reg_basename = reg_name.split('[')[0]
|
|
index_range = reg_name.split('[')[1].split(']')[0]
|
|
reg_tail = reg_name.split(']')[1]
|
|
start_ix, end_ix = map(int, index_range.split('-'))
|
|
|
|
offset_increment = 4
|
|
|
|
if (end - start) // 4 != end_ix - start_ix:
|
|
# guess the offset increment
|
|
if start + end_ix * 8 == end:
|
|
offset_increment = 8
|
|
elif start + end_ix * 16 == end:
|
|
offset_increment = 16
|
|
elif reg_basename == 'VAP_VTX_AOS_ADDR':
|
|
pass
|
|
elif reg_basename == 'VAP_VTX_AOS_ATTR':
|
|
for i, name in enumerate(aos_order_table):
|
|
callback(i * 4 + start, name)
|
|
continue
|
|
else:
|
|
print(reg_name, reg_value)
|
|
assert False
|
|
|
|
offset = start
|
|
while offset <= end:
|
|
ix = (offset - start) // offset_increment
|
|
name = f"{reg_basename}{ix}{reg_tail}"
|
|
callback(offset, name)
|
|
offset += offset_increment
|
|
|
|
def python_callback_array(offset, name, ix):
|
|
print(f' 0x{offset:04x}: "{name}[{ix}]",')
|
|
|
|
def python_callback(offset, name):
|
|
print(f' 0x{offset:04x}: "{name}",')
|
|
|
|
def generate_python(lines):
|
|
print("registers_lookup = {")
|
|
generate(lines, python_callback, python_callback_array)
|
|
print('}')
|
|
|
|
def c_callback(offset, name):
|
|
print(f"#define {name} 0x{offset:04x}")
|
|
|
|
def c_callback_array(offset, name, ix):
|
|
print(f"#define {name}_{ix} 0x{offset:04x}")
|
|
|
|
def generate_c(lines):
|
|
generate(lines, c_callback, c_callback_array)
|
|
|
|
mode = sys.argv[1]
|
|
filename = sys.argv[2]
|
|
|
|
with open(filename) as f:
|
|
lines = f.read().split('\n')
|
|
|
|
if mode == "python":
|
|
generate_python(lines)
|
|
elif mode == "c":
|
|
generate_c(lines)
|
|
else:
|
|
assert False, mode
|