diff options
Diffstat (limited to 'go_utils.py')
-rw-r--r-- | go_utils.py | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/go_utils.py b/go_utils.py new file mode 100644 index 0000000..19a5955 --- /dev/null +++ b/go_utils.py @@ -0,0 +1,64 @@ +import logging +import pprint +import sys + +from constants import csrs +from shared_utils import InstrDict, signed + +pp = pprint.PrettyPrinter(indent=2) +logging.basicConfig(level=logging.INFO, format="%(levelname)s:: %(message)s") + + +def make_go(instr_dict: InstrDict): + + args = " ".join(sys.argv) + prelude = f"""// Code generated by {args}; DO NOT EDIT.""" + + prelude += """ +package riscv + +import "cmd/internal/obj" + +type inst struct { + opcode uint32 + funct3 uint32 + rs1 uint32 + rs2 uint32 + csr int64 + funct7 uint32 +} + +func encode(a obj.As) *inst { + switch a { +""" + + csrs_map_str = """ } + return nil +} + +var csrs = map[uint16]string { +""" + + endoffile = """} +""" + + instr_str = "" + for i in instr_dict: + enc_match = int(instr_dict[i]["match"], 0) + opcode = (enc_match >> 0) & ((1 << 7) - 1) + funct3 = (enc_match >> 12) & ((1 << 3) - 1) + rs1 = (enc_match >> 15) & ((1 << 5) - 1) + rs2 = (enc_match >> 20) & ((1 << 5) - 1) + csr = (enc_match >> 20) & ((1 << 12) - 1) + funct7 = (enc_match >> 25) & ((1 << 7) - 1) + instr_str += f""" case A{i.upper().replace("_","")}: + return &inst{{ {hex(opcode)}, {hex(funct3)}, {hex(rs1)}, {hex(rs2)}, {signed(csr,12)}, {hex(funct7)} }} +""" + for num, name in sorted(csrs, key=lambda row: row[0]): + csrs_map_str += f'{hex(num)} : "{name.upper()}",\n' + + with open("inst.go", "w", encoding="utf-8") as file: + file.write(prelude) + file.write(instr_str) + file.write(csrs_map_str) + file.write(endoffile) |