orbum/liborbum/doc/Instruction List Parser/formatter.py

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()