r500/regs/generate_bits_python.py

35 lines
902 B
Python

from os import path
import sys
from parse_bits import parse_file_fields
from parse_bits import aggregate
def mask_from_bits(bits):
if type(bits) is int:
return 1
else:
high, low = bits
assert high > low, bits
length = (high - low) + 1
return (1 << length) - 1
def low_from_bits(bits):
if type(bits) is int:
return bits
else:
high, low = bits
return low
def render_descriptor(prefix, d):
mask = mask_from_bits(d.bits)
low = low_from_bits(d.bits)
print(f"#define {prefix.upper()}__{d.field_name}(n) (((n) & {hex(mask)}) << {low})")
if __name__ == "__main__":
assert sys.argv[1].endswith('.txt')
prefix = sys.argv[1].removesuffix('.txt')
prefix = path.split(prefix)[1]
l = list(parse_file_fields(sys.argv[1]))
for descriptor in aggregate(l):
render_descriptor(prefix, descriptor)