aboutsummaryrefslogtreecommitdiff
path: root/c_utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'c_utils.py')
-rw-r--r--c_utils.py79
1 files changed, 79 insertions, 0 deletions
diff --git a/c_utils.py b/c_utils.py
new file mode 100644
index 0000000..8aa5138
--- /dev/null
+++ b/c_utils.py
@@ -0,0 +1,79 @@
+import logging
+import os
+import pprint
+
+from constants import causes, csrs, csrs32
+from shared_utils import InstrDict, arg_lut
+
+pp = pprint.PrettyPrinter(indent=2)
+logging.basicConfig(level=logging.INFO, format="%(levelname)s:: %(message)s")
+
+
+def make_c(instr_dict: InstrDict):
+ mask_match_str = ""
+ declare_insn_str = ""
+ for i in instr_dict:
+ mask_match_str += (
+ f'#define MATCH_{i.upper().replace(".","_")} {instr_dict[i]["match"]}\n'
+ )
+ mask_match_str += (
+ f'#define MASK_{i.upper().replace(".","_")} {instr_dict[i]["mask"]}\n'
+ )
+ declare_insn_str += f'DECLARE_INSN({i.replace(".","_")}, MATCH_{i.upper().replace(".","_")}, MASK_{i.upper().replace(".","_")})\n'
+
+ csr_names_str = ""
+ declare_csr_str = ""
+ for num, name in csrs + csrs32:
+ csr_names_str += f"#define CSR_{name.upper()} {hex(num)}\n"
+ declare_csr_str += f"DECLARE_CSR({name}, CSR_{name.upper()})\n"
+
+ causes_str = ""
+ declare_cause_str = ""
+ for num, name in causes:
+ causes_str += f"#define CAUSE_{name.upper().replace(' ', '_')} {hex(num)}\n"
+ declare_cause_str += (
+ f"DECLARE_CAUSE(\"{name}\", CAUSE_{name.upper().replace(' ','_')})\n"
+ )
+
+ arg_str = ""
+ for name, rng in arg_lut.items():
+ sanitized_name = name.replace(" ", "_").replace("=", "_eq_")
+ begin = rng[1]
+ end = rng[0]
+ mask = ((1 << (end - begin + 1)) - 1) << begin
+ arg_str += f"#define INSN_FIELD_{sanitized_name.upper()} {hex(mask)}\n"
+
+ with open(f"{os.path.dirname(__file__)}/encoding.h", "r", encoding="utf-8") as file:
+ enc_header = file.read()
+
+ commit = os.popen('git log -1 --format="format:%h"').read()
+
+ # Generate the output as a string
+ output_str = f"""/* SPDX-License-Identifier: BSD-3-Clause */
+
+/* Copyright (c) 2023 RISC-V International */
+
+/*
+ * This file is auto-generated by running 'make' in
+ * https://github.com/riscv/riscv-opcodes ({commit})
+ */
+
+{enc_header}
+/* Automatically generated by parse_opcodes. */
+#ifndef RISCV_ENCODING_H
+#define RISCV_ENCODING_H
+{mask_match_str}
+{csr_names_str}
+{causes_str}
+{arg_str}#endif
+#ifdef DECLARE_INSN
+{declare_insn_str}#endif
+#ifdef DECLARE_CSR
+{declare_csr_str}#endif
+#ifdef DECLARE_CAUSE
+{declare_cause_str}#endif
+"""
+
+ # Write the modified output to the file
+ with open("encoding.out.h", "w", encoding="utf-8") as enc_file:
+ enc_file.write(output_str)