freedreno/registers: Generate python files with reg offsets

This would allow us to use register names in python scripts.

Signed-off-by: Danylo Piliaiev <dpiliaiev@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23217>
This commit is contained in:
Danylo Piliaiev 2023-08-11 15:30:47 +02:00 committed by Marge Bot
parent a9fc9bc46b
commit 0b25388afe
2 changed files with 58 additions and 0 deletions

View file

@ -32,6 +32,16 @@ xml_files = [
'adreno_pm4.xml',
]
xml_reg_files = [
'a2xx.xml',
'a3xx.xml',
'a4xx.xml',
'a5xx.xml',
'a6xx.xml',
]
freedreno_py_header_files = []
foreach f : xml_files
_name = f + '.h'
freedreno_xml_header_files += custom_target(
@ -69,3 +79,14 @@ freedreno_xml_header_files += custom_target(
command: [prog_python, '@INPUT0@', '--rnn', rnn_src_path, '--xml', '@INPUT1@', 'c-pack-structs'],
capture: true,
)
foreach f : xml_reg_files
_pyname = f.split('.')[0] + '.py'
freedreno_py_header_files += custom_target(
_pyname,
input: [gen_header_py, f],
output: _pyname,
command: [prog_python, '@INPUT0@', '--rnn', rnn_src_path, '--xml', '@INPUT1@', 'py-defines'],
capture: true,
)
endforeach

View file

@ -309,6 +309,10 @@ class Reg(object):
if self.bitset.inline:
self.bitset.dump_regpair_builder(self)
def dump_py(self):
print("\tREG_%s = 0x%08x" % (self.full_name, self.offset))
class Parser(object):
def __init__(self):
self.current_array = None
@ -630,6 +634,17 @@ class Parser(object):
self.dump_reg_usages()
def dump_regs_py(self):
regs = []
for e in self.file:
if isinstance(e, Reg):
regs.append(e)
for e in regs:
e.dump_py()
def dump_reg_variants(self, regname, variants):
# Don't bother for things that only have a single variant:
if len(variants) == 1:
@ -742,6 +757,25 @@ def dump_c_pack_structs(args):
dump_c(args.rnn, args.xml, guard, lambda p: p.dump_structs())
def dump_py_defines(args):
p = Parser()
try:
p.parse(args.rnn, args.xml)
except Error as e:
print(e, file=sys.stderr)
exit(1)
file_name = os.path.splitext(os.path.basename(args.xml))[0]
print("from enum import IntEnum")
print("class %sRegs(IntEnum):" % file_name.upper())
os.path.basename(args.xml)
p.dump_regs_py()
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--rnn', type=str, required=True)
@ -755,6 +789,9 @@ def main():
parser_c_pack_structs = subparsers.add_parser('c-pack-structs')
parser_c_pack_structs.set_defaults(func=dump_c_pack_structs)
parser_py_defines = subparsers.add_parser('py-defines')
parser_py_defines.set_defaults(func=dump_py_defines)
args = parser.parse_args()
args.func(args)