diff --git a/generate_act_format.py b/generate_act_format.py index 538286f..0f50f75 100644 --- a/generate_act_format.py +++ b/generate_act_format.py @@ -36,7 +36,7 @@ def generate_act_format(opcodes_file): opcode_mapping = dict() for line in opcodes_file.readlines(): - match_groups = re.findall(r'^\s*([^\/].*)= (.*),\s*\/\/.*$', line) + match_groups = re.findall(r'^\s*([^\/].*)=\s*(.*),\s*\/\/.*$', line) if len(match_groups) != 1: continue diff --git a/generate_opcodes_file.py b/generate_opcodes_file.py new file mode 100644 index 0000000..86bbc6c --- /dev/null +++ b/generate_opcodes_file.py @@ -0,0 +1,61 @@ +import json +import re +import click + +def load_diff_file(f, reverse=False): + diff = dict() + diff_json = json.load(f) + for pair in diff_json: + if "old" not in pair or "new" not in pair: + continue + old_key = "new" if reverse else "old" + new_key = "old" if reverse else "new" + for old_opcode in pair[old_key]: + diff[int(old_opcode, 16)] = set((int(new_opcode, 16) for new_opcode in pair[new_key])) + return diff + +def opcodes_str(opcodes): + if len(opcodes) == 1: + return hex(list(opcodes)[0]) + elif len(opcodes) > 1: + return " or ".join((hex(opcode) for opcode in opcodes)) + else: + return "UNKNOWN" + +def replace_line_with_new_opcode(line, diff, ver): + match_groups = re.findall(r'^\s*([^\/].*)=\s*(.*),\s*\/\/.*$', line) + if len(match_groups) != 1: + return line + + opcode_name = match_groups[0][0] + opcode_val = match_groups[0][1] + if " or " in opcode_val: + old_opcode = int(opcode_val.split(" or ")[0], 16) + else: + old_opcode = int(opcode_val, 16) + if old_opcode in diff: + new_opcodes = diff[old_opcode] + return f"{opcode_name}= {opcodes_str(new_opcodes)}, // updated {ver}\n" + + return f"// {line}" + + +@click.command() +@click.argument("new_version_string") +@click.argument("diff_file", type=click.File('r')) +@click.argument("opcodes_file", type=click.File('r')) +@click.option("--reverse", is_flag=True) +def generate_opcodes_file(new_version_string, diff_file, opcodes_file, reverse): + diff = load_diff_file(diff_file, reverse) + queued_lines = [] + for line in opcodes_file.readlines(): + queued_lines.append(replace_line_with_new_opcode(line, diff, new_version_string)) + + new_filename = f"{new_version_string}_opcodes.txt" + with open(new_filename, "w+") as f: + f.writelines(queued_lines) + + print("Wrote to", new_filename) + +if __name__ == "__main__": + generate_opcodes_file() \ No newline at end of file