mirror of
https://github.com/hch12907/orbum.git
synced 2025-04-02 10:31:46 -04:00
74 lines
2.3 KiB
Python
74 lines
2.3 KiB
Python
import json
|
|
|
|
INPUT_PARSED_LOOKUP_TREE_FILE = 'parsed_lookup_tree.json'
|
|
OUTPUT_SOURCE_FILE = 'Lookup.cpp'
|
|
OUTPUT_TABLE_FILE = 'Table.cpp'
|
|
DEFAULT_NOT_FOUND = 'throw std::runtime_error("Could not determine instruction");'
|
|
|
|
def write_line(level, text):
|
|
out_file.write(' ' * level)
|
|
out_file.write(text)
|
|
out_file.write('\n')
|
|
|
|
|
|
def start_class(level, class_):
|
|
write_line(level, 'case ' + str(class_['value']) + ':')
|
|
write_line(level, '{')
|
|
write_line(level + 1, 'switch (inst.' + class_['lookup_field'] + '())')
|
|
write_line(level + 1, '{')
|
|
|
|
|
|
def end_class(level):
|
|
write_line(level + 1, 'default:')
|
|
write_line(level + 2, DEFAULT_NOT_FOUND)
|
|
write_line(level + 1, '}')
|
|
write_line(level, '}')
|
|
|
|
|
|
def write_instruction(level, inst):
|
|
instruction_lookup_table.append(inst)
|
|
write_line(level, 'case ' + str(inst['class_index']) + ':')
|
|
write_line(level + 1, f'return &INSTRUCTION_TABLE[{len(instruction_lookup_table) - 1}];')
|
|
|
|
|
|
def write_traverse_lookup_tree(level, base):
|
|
for k, v in base.items():
|
|
if isinstance(v, dict):
|
|
if v['type'] == 'class':
|
|
start_class(level, v)
|
|
write_traverse_lookup_tree(level + 1, v)
|
|
end_class(level)
|
|
elif v['type'] == 'instruction':
|
|
write_instruction(level, v)
|
|
else:
|
|
raise ValueError('Unrecognised type')
|
|
|
|
|
|
instruction_lookup_table = []
|
|
|
|
# Load in instruction tree.
|
|
with open(INPUT_PARSED_LOOKUP_TREE_FILE, 'r') as f:
|
|
lookup_tree = json.load(f)
|
|
|
|
# Write out lookup proceedure.
|
|
out_file = open(OUTPUT_SOURCE_FILE, 'w')
|
|
write_line(0, 'MipsInstructionInfo lookup(const MipsInstruction & inst)')
|
|
write_line(0, '{')
|
|
root_lookup_field = lookup_tree['lookup_field']
|
|
write_line(1, f'switch (inst.{root_lookup_field}())')
|
|
write_line(1, '{')
|
|
write_traverse_lookup_tree(1, lookup_tree)
|
|
write_line(1, 'default:')
|
|
write_line(2, DEFAULT_NOT_FOUND)
|
|
write_line(1, '}')
|
|
write_line(0, '}')
|
|
out_file.close()
|
|
|
|
# Write out instruction table (C array).
|
|
out_file = open(OUTPUT_TABLE_FILE, 'w')
|
|
write_line(0, f'MipsInstructionInfo INSTRUCTION_TABLE[{len(instruction_lookup_table)}] =')
|
|
write_line(0, '{')
|
|
for inst in instruction_lookup_table:
|
|
write_line(1, '{ "' + inst['name'] + '", ' + str(inst['impl_index']) + ', ' + str(inst['cpi']) + ' },')
|
|
write_line(0, '};')
|
|
out_file.close()
|