feature: add pipe-maps for RISC-V instructions

Pipe-maps are JSON files that map opcodes to functional units.
The commit also includes the script import-riscv-opcodes.py which can create a
new pipe-map, or update an existing one, based on the opcodes from the
riscv-opcodes repo (new opcodes are mapped to "UNKNOWN", old opcodes keep their
old mapping, or dropped if they no longer exist).

Change-Id: I9e28ae1497448bb851f5833b40b59e28156d4738
diff --git a/README.md b/README.md
index c8c7457..a1690b6 100644
--- a/README.md
+++ b/README.md
@@ -7,8 +7,9 @@
 - tbm/gentrace-spike.py - reads a Spike trace and reformat it. We expect to support
   other functional simulators, each of those will have its own gentrace-*.py
   file.
-- tbm/tbm.py - runs a trace in TBM; the main tool here.
+- tbm/import-riscv-opcodes.py - create and update pipe-maps.
 - tbm/merge-counters.py - merges results from multiple runs of TBM.
+- tbm/tbm.py - runs a trace in TBM; the main tool here.
 
 ### Python modules:
 
@@ -45,3 +46,4 @@
 
 - config/uarch.schema.json - JSON schema for uArch configuration files.
 - config/rvv-simple.yaml - a uArch configuration example.
+- pipe_maps/riscv/*.json - pipe-maps, mapping RISC-V opcodes to functional units.
diff --git a/pipe_maps/riscv/custom.json b/pipe_maps/riscv/custom.json
new file mode 100644
index 0000000..72efa45
--- /dev/null
+++ b/pipe_maps/riscv/custom.json
@@ -0,0 +1,27 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "custom0": "UNKNOWN",
+  "custom0.rs1": "UNKNOWN",
+  "custom0.rs1.rs2": "UNKNOWN",
+  "custom0.rd": "UNKNOWN",
+  "custom0.rd.rs1": "UNKNOWN",
+  "custom0.rd.rs1.rs2": "UNKNOWN",
+  "custom1": "UNKNOWN",
+  "custom1.rs1": "UNKNOWN",
+  "custom1.rs1.rs2": "UNKNOWN",
+  "custom1.rd": "UNKNOWN",
+  "custom1.rd.rs1": "UNKNOWN",
+  "custom1.rd.rs1.rs2": "UNKNOWN",
+  "custom2": "UNKNOWN",
+  "custom2.rs1": "UNKNOWN",
+  "custom2.rs1.rs2": "UNKNOWN",
+  "custom2.rd": "UNKNOWN",
+  "custom2.rd.rs1": "UNKNOWN",
+  "custom2.rd.rs1.rs2": "UNKNOWN",
+  "custom3": "vnimp",
+  "custom3.rs1": "UNKNOWN",
+  "custom3.rs1.rs2": "vnimp",
+  "custom3.rd": "UNKNOWN",
+  "custom3.rd.rs1": "UNKNOWN",
+  "custom3.rd.rs1.rs2": "UNKNOWN"
+}
diff --git a/pipe_maps/riscv/missing.json b/pipe_maps/riscv/missing.json
new file mode 100644
index 0000000..95dab3f
--- /dev/null
+++ b/pipe_maps/riscv/missing.json
@@ -0,0 +1,56 @@
+{
+  "sbu": "lsu",
+  "shu": "lsu",
+  "csrr": "csr",
+  "csrw": "csr",
+  "csrs": "csr",
+  "csrsi": "csr",
+  "csrci": "csr",
+  "csrwi": "csr",
+  "zext.b": "alu",
+  "zext.h": "alu",
+  "flb": "lsu",
+  "fsb": "lsu",
+  "fmv": "fpu",
+  "fcvt": "fpu",
+  "feq": "fpu",
+  "flt": "fpu",
+  "fle": "fpu",
+  "fadd": "fpu",
+  "fsub": "fpu",
+  "fmul": "fpu",
+  "fmadd": "fpu",
+  "fmsub": "fpu",
+  "fnmadd": "fpu",
+  "fnmsub": "fpu",
+  "fmax": "fpu",
+  "fmin": "fpu",
+  "fdiv": "fspecial",
+  "fsqrt": "fspecial",
+  "vsetvxi": "vctrl",
+  "vmclr.m": "vmask",
+  "vmmv.m": "vmask",
+  "vmnot.m": "vmask",
+  "vmset.m": "vmask",
+  "li": "alu",
+  "mv": "alu",
+  "snez": "alu",
+  "seqz": "alu",
+  "slez": "alu",
+  "sgez": "alu",
+  "sltz": "alu",
+  "sgtz": "alu",
+  "neg": "alu",
+  "not": "alu",
+  "bnez": "branch",
+  "beqz": "branch",
+  "blez": "branch",
+  "bgez": "branch",
+  "bltz": "branch",
+  "bgtz": "branch",
+  "bleu": "branch",
+  "bgtu": "branch",
+  "j": "branch",
+  "jr": "branch",
+  "ret": "branch"
+}
diff --git a/pipe_maps/riscv/pseudo.json b/pipe_maps/riscv/pseudo.json
new file mode 100644
index 0000000..4fcffc2
--- /dev/null
+++ b/pipe_maps/riscv/pseudo.json
@@ -0,0 +1,26 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "slli.rv32": "UNKNOWN",
+  "srli.rv32": "UNKNOWN",
+  "srai.rv32": "UNKNOWN",
+  "frflags": "UNKNOWN",
+  "fsflags": "UNKNOWN",
+  "fsflagsi": "UNKNOWN",
+  "frrm": "UNKNOWN",
+  "fsrm": "UNKNOWN",
+  "fsrmi": "UNKNOWN",
+  "fscsr": "UNKNOWN",
+  "frcsr": "UNKNOWN",
+  "rdcycle": "UNKNOWN",
+  "rdtime": "UNKNOWN",
+  "rdinstret": "UNKNOWN",
+  "rdcycleh": "UNKNOWN",
+  "rdtimeh": "UNKNOWN",
+  "rdinstreth": "UNKNOWN",
+  "scall": "UNKNOWN",
+  "sbreak": "UNKNOWN",
+  "fmv.x.s": "UNKNOWN",
+  "fmv.s.x": "UNKNOWN",
+  "fence.tso": "UNKNOWN",
+  "pause": "UNKNOWN"
+}
diff --git a/pipe_maps/riscv/rv32a.json b/pipe_maps/riscv/rv32a.json
new file mode 100644
index 0000000..4e48df2
--- /dev/null
+++ b/pipe_maps/riscv/rv32a.json
@@ -0,0 +1,14 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "amoadd.w": "lsu",
+  "amoxor.w": "lsu",
+  "amoor.w": "lsu",
+  "amoand.w": "lsu",
+  "amomin.w": "lsu",
+  "amomax.w": "lsu",
+  "amominu.w": "lsu",
+  "amomaxu.w": "lsu",
+  "amoswap.w": "lsu",
+  "lr.w": "lsu",
+  "sc.w": "lsu"
+}
diff --git a/pipe_maps/riscv/rv32a.json.good b/pipe_maps/riscv/rv32a.json.good
new file mode 100644
index 0000000..600ff6f
--- /dev/null
+++ b/pipe_maps/riscv/rv32a.json.good
@@ -0,0 +1,14 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "amoadd.w": "lsu",
+  "amoxor.w": "lsu",
+  "amoor.w": "lsu",
+  "amoand.w": "lsu",
+  "amomin.w": "lsu",
+  "amomax.w": "lsu",
+  "amominu.w": "lsu",
+  "amomaxu.w": "lsu",
+  "amoswap.w": "lsu",
+  "lr.w": "lsu",
+  "sc.w": "lsu"
+}
\ No newline at end of file
diff --git a/pipe_maps/riscv/rv32b.json b/pipe_maps/riscv/rv32b.json
new file mode 100644
index 0000000..bc6aea2
--- /dev/null
+++ b/pipe_maps/riscv/rv32b.json
@@ -0,0 +1,64 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "andn": "UNKNOWN",
+  "orn": "UNKNOWN",
+  "xnor": "UNKNOWN",
+  "slo": "UNKNOWN",
+  "sro": "UNKNOWN",
+  "rol": "UNKNOWN",
+  "ror": "UNKNOWN",
+  "bclr": "UNKNOWN",
+  "bset": "UNKNOWN",
+  "binv": "UNKNOWN",
+  "bext": "UNKNOWN",
+  "gorc": "UNKNOWN",
+  "grev": "UNKNOWN",
+  "sloi": "UNKNOWN",
+  "sroi": "UNKNOWN",
+  "rori": "UNKNOWN",
+  "bclri": "UNKNOWN",
+  "bseti": "UNKNOWN",
+  "binvi": "UNKNOWN",
+  "bexti": "UNKNOWN",
+  "gorci": "UNKNOWN",
+  "grevi": "UNKNOWN",
+  "cmix": "UNKNOWN",
+  "cmov": "UNKNOWN",
+  "fsl": "UNKNOWN",
+  "fsr": "UNKNOWN",
+  "fsri": "UNKNOWN",
+  "clz": "UNKNOWN",
+  "ctz": "UNKNOWN",
+  "cpop": "UNKNOWN",
+  "sext.b": "UNKNOWN",
+  "sext.h": "UNKNOWN",
+  "crc32.b": "UNKNOWN",
+  "crc32.h": "UNKNOWN",
+  "crc32.w": "UNKNOWN",
+  "crc32c.b": "UNKNOWN",
+  "crc32c.h": "UNKNOWN",
+  "crc32c.w": "UNKNOWN",
+  "sh1add": "UNKNOWN",
+  "sh2add": "UNKNOWN",
+  "sh3add": "UNKNOWN",
+  "clmul": "UNKNOWN",
+  "clmulr": "UNKNOWN",
+  "clmulh": "UNKNOWN",
+  "min": "UNKNOWN",
+  "minu": "UNKNOWN",
+  "max": "UNKNOWN",
+  "maxu": "UNKNOWN",
+  "shfl": "UNKNOWN",
+  "unshfl": "UNKNOWN",
+  "bcompress": "UNKNOWN",
+  "bdecompress": "UNKNOWN",
+  "pack": "UNKNOWN",
+  "packu": "UNKNOWN",
+  "packh": "UNKNOWN",
+  "bfp": "UNKNOWN",
+  "shfli": "UNKNOWN",
+  "unshfli": "UNKNOWN",
+  "xperm4": "UNKNOWN",
+  "xperm8": "UNKNOWN",
+  "xperm16": "UNKNOWN"
+}
diff --git a/pipe_maps/riscv/rv32c.json b/pipe_maps/riscv/rv32c.json
new file mode 100644
index 0000000..fd3fcec
--- /dev/null
+++ b/pipe_maps/riscv/rv32c.json
@@ -0,0 +1,6 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "c.srli.rv32": "UNKNOWN",
+  "c.srai.rv32": "UNKNOWN",
+  "c.slli.rv32": "UNKNOWN"
+}
diff --git a/pipe_maps/riscv/rv32d-zfh.json b/pipe_maps/riscv/rv32d-zfh.json
new file mode 100644
index 0000000..c3a68f7
--- /dev/null
+++ b/pipe_maps/riscv/rv32d-zfh.json
@@ -0,0 +1,5 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "fcvt.h.d": "UNKNOWN",
+  "fcvt.d.h": "UNKNOWN"
+}
diff --git a/pipe_maps/riscv/rv32d.json b/pipe_maps/riscv/rv32d.json
new file mode 100644
index 0000000..4efde0b
--- /dev/null
+++ b/pipe_maps/riscv/rv32d.json
@@ -0,0 +1,29 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "fadd.d": "fpu",
+  "fsub.d": "fpu",
+  "fmul.d": "fpu",
+  "fdiv.d": "fpu",
+  "fsgnj.d": "fpu",
+  "fsgnjn.d": "fpu",
+  "fsgnjx.d": "fpu",
+  "fmin.d": "fpu",
+  "fmax.d": "fpu",
+  "fcvt.s.d": "fpu",
+  "fcvt.d.s": "fpu",
+  "fsqrt.d": "fpu",
+  "fle.d": "fpu",
+  "flt.d": "fpu",
+  "feq.d": "fpu",
+  "fcvt.w.d": "fpu",
+  "fcvt.wu.d": "fpu",
+  "fclass.d": "fpu",
+  "fcvt.d.w": "fpu",
+  "fcvt.d.wu": "fpu",
+  "fld": "lsu",
+  "fsd": "lsu",
+  "fmadd.d": "fpu",
+  "fmsub.d": "fpu",
+  "fnmsub.d": "fpu",
+  "fnmadd.d": "fpu"
+}
diff --git a/pipe_maps/riscv/rv32f.json b/pipe_maps/riscv/rv32f.json
new file mode 100644
index 0000000..352a9e3
--- /dev/null
+++ b/pipe_maps/riscv/rv32f.json
@@ -0,0 +1,29 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "fadd.s": "fpu",
+  "fsub.s": "fpu",
+  "fmul.s": "fpu",
+  "fdiv.s": "fpu",
+  "fsgnj.s": "fpu",
+  "fsgnjn.s": "fpu",
+  "fsgnjx.s": "fpu",
+  "fmin.s": "fpu",
+  "fmax.s": "fpu",
+  "fsqrt.s": "fpu",
+  "fle.s": "fpu",
+  "flt.s": "fpu",
+  "feq.s": "fpu",
+  "fcvt.w.s": "fpu",
+  "fcvt.wu.s": "fpu",
+  "fmv.x.w": "fpu",
+  "fclass.s": "fpu",
+  "fcvt.s.w": "fpu",
+  "fcvt.s.wu": "fpu",
+  "fmv.w.x": "fpu",
+  "flw": "lsu",
+  "fsw": "lsu",
+  "fmadd.s": "fpu",
+  "fmsub.s": "fpu",
+  "fnmsub.s": "fpu",
+  "fnmadd.s": "fpu"
+}
diff --git a/pipe_maps/riscv/rv32h.json b/pipe_maps/riscv/rv32h.json
new file mode 100644
index 0000000..3f2a4ad
--- /dev/null
+++ b/pipe_maps/riscv/rv32h.json
@@ -0,0 +1,15 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "hfence.vvma": "UNKNOWN",
+  "hfence.gvma": "UNKNOWN",
+  "hlv.b": "lsu",
+  "hlv.bu": "lsu",
+  "hlv.h": "lsu",
+  "hlv.hu": "lsu",
+  "hlvx.hu": "lsu",
+  "hlv.w": "lsu",
+  "hlvx.wu": "lsu",
+  "hsv.b": "lsu",
+  "hsv.h": "lsu",
+  "hsv.w": "lsu"
+}
diff --git a/pipe_maps/riscv/rv32i.json b/pipe_maps/riscv/rv32i.json
new file mode 100644
index 0000000..2d93721
--- /dev/null
+++ b/pipe_maps/riscv/rv32i.json
@@ -0,0 +1,39 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "beq": "branch",
+  "bne": "branch",
+  "blt": "branch",
+  "bge": "branch",
+  "bltu": "branch",
+  "bgeu": "branch",
+  "jalr": "branch",
+  "jal": "branch",
+  "lui": "alu",
+  "auipc": "alu",
+  "addi": "alu",
+  "slti": "alu",
+  "sltiu": "alu",
+  "xori": "alu",
+  "ori": "alu",
+  "andi": "alu",
+  "add": "alu",
+  "sub": "alu",
+  "sll": "alu",
+  "slt": "alu",
+  "sltu": "alu",
+  "xor": "alu",
+  "srl": "alu",
+  "sra": "alu",
+  "or": "alu",
+  "and": "alu",
+  "lb": "lsu",
+  "lh": "lsu",
+  "lw": "lsu",
+  "lbu": "lsu",
+  "lhu": "lsu",
+  "sb": "lsu",
+  "sh": "lsu",
+  "sw": "lsu",
+  "fence": "UNKNOWN",
+  "fence.i": "UNKNOWN"
+}
diff --git a/pipe_maps/riscv/rv32k.json b/pipe_maps/riscv/rv32k.json
new file mode 100644
index 0000000..eb88ebc
--- /dev/null
+++ b/pipe_maps/riscv/rv32k.json
@@ -0,0 +1,13 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "aes32esmi": "UNKNOWN",
+  "aes32esi": "UNKNOWN",
+  "aes32dsmi": "UNKNOWN",
+  "aes32dsi": "UNKNOWN",
+  "sha512sum0r": "UNKNOWN",
+  "sha512sum1r": "UNKNOWN",
+  "sha512sig0l": "UNKNOWN",
+  "sha512sig0h": "UNKNOWN",
+  "sha512sig1l": "UNKNOWN",
+  "sha512sig1h": "UNKNOWN"
+}
diff --git a/pipe_maps/riscv/rv32m.json b/pipe_maps/riscv/rv32m.json
new file mode 100644
index 0000000..8f08be3
--- /dev/null
+++ b/pipe_maps/riscv/rv32m.json
@@ -0,0 +1,11 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "mul": "mul",
+  "mulh": "mul",
+  "mulhsu": "mul",
+  "mulhu": "mul",
+  "div": "div",
+  "divu": "div",
+  "rem": "div",
+  "remu": "div"
+}
diff --git a/pipe_maps/riscv/rv32q-zfh.json b/pipe_maps/riscv/rv32q-zfh.json
new file mode 100644
index 0000000..f325e77
--- /dev/null
+++ b/pipe_maps/riscv/rv32q-zfh.json
@@ -0,0 +1,5 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "fcvt.h.q": "UNKNOWN",
+  "fcvt.q.h": "UNKNOWN"
+}
diff --git a/pipe_maps/riscv/rv32q.json b/pipe_maps/riscv/rv32q.json
new file mode 100644
index 0000000..c5f0d5a
--- /dev/null
+++ b/pipe_maps/riscv/rv32q.json
@@ -0,0 +1,31 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "fadd.q": "fpu",
+  "fsub.q": "fpu",
+  "fmul.q": "fpu",
+  "fdiv.q": "fpu",
+  "fsgnj.q": "fpu",
+  "fsgnjn.q": "fpu",
+  "fsgnjx.q": "fpu",
+  "fmin.q": "fpu",
+  "fmax.q": "fpu",
+  "fcvt.s.q": "fpu",
+  "fcvt.q.s": "fpu",
+  "fcvt.d.q": "fpu",
+  "fcvt.q.d": "fpu",
+  "fsqrt.q": "fpu",
+  "fle.q": "fpu",
+  "flt.q": "fpu",
+  "feq.q": "fpu",
+  "fcvt.w.q": "fpu",
+  "fcvt.wu.q": "fpu",
+  "fclass.q": "fpu",
+  "fcvt.q.w": "fpu",
+  "fcvt.q.wu": "fpu",
+  "flq": "lsu",
+  "fsq": "lsu",
+  "fmadd.q": "fpu",
+  "fmsub.q": "fpu",
+  "fnmsub.q": "fpu",
+  "fnmadd.q": "fpu"
+}
diff --git a/pipe_maps/riscv/rv32zfh.json b/pipe_maps/riscv/rv32zfh.json
new file mode 100644
index 0000000..83a1550
--- /dev/null
+++ b/pipe_maps/riscv/rv32zfh.json
@@ -0,0 +1,31 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "fadd.h": "fpu",
+  "fsub.h": "fpu",
+  "fmul.h": "fpu",
+  "fdiv.h": "fpu",
+  "fsgnj.h": "fpu",
+  "fsgnjn.h": "fpu",
+  "fsgnjx.h": "fpu",
+  "fmin.h": "fpu",
+  "fmax.h": "fpu",
+  "fcvt.h.s": "fpu",
+  "fcvt.s.h": "fpu",
+  "fsqrt.h": "fpu",
+  "fle.h": "fpu",
+  "flt.h": "fpu",
+  "feq.h": "fpu",
+  "fcvt.w.h": "fpu",
+  "fcvt.wu.h": "fpu",
+  "fmv.x.h": "fpu",
+  "fclass.h": "fpu",
+  "fcvt.h.w": "fpu",
+  "fcvt.h.wu": "fpu",
+  "fmv.h.x": "fpu",
+  "flh": "lsu",
+  "fsh": "lsu",
+  "fmadd.h": "fpu",
+  "fmsub.h": "fpu",
+  "fnmsub.h": "fpu",
+  "fnmadd.h": "fpu"
+}
diff --git a/pipe_maps/riscv/rv64a.json b/pipe_maps/riscv/rv64a.json
new file mode 100644
index 0000000..c76b753
--- /dev/null
+++ b/pipe_maps/riscv/rv64a.json
@@ -0,0 +1,14 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "amoadd.d": "lsu",
+  "amoxor.d": "lsu",
+  "amoor.d": "lsu",
+  "amoand.d": "lsu",
+  "amomin.d": "lsu",
+  "amomax.d": "lsu",
+  "amominu.d": "lsu",
+  "amomaxu.d": "lsu",
+  "amoswap.d": "lsu",
+  "lr.d": "lsu",
+  "sc.d": "lsu"
+}
diff --git a/pipe_maps/riscv/rv64b.json b/pipe_maps/riscv/rv64b.json
new file mode 100644
index 0000000..d782f9b
--- /dev/null
+++ b/pipe_maps/riscv/rv64b.json
@@ -0,0 +1,45 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "bmatflip": "UNKNOWN",
+  "crc32.d": "UNKNOWN",
+  "crc32c.d": "UNKNOWN",
+  "bmator": "UNKNOWN",
+  "bmatxor": "UNKNOWN",
+  "slli.uw": "UNKNOWN",
+  "add.uw": "UNKNOWN",
+  "slow": "UNKNOWN",
+  "srow": "UNKNOWN",
+  "rolw": "UNKNOWN",
+  "rorw": "UNKNOWN",
+  "sbclrw": "UNKNOWN",
+  "sbsetw": "UNKNOWN",
+  "sbinvw": "UNKNOWN",
+  "sbextw": "UNKNOWN",
+  "gorcw": "UNKNOWN",
+  "grevw": "UNKNOWN",
+  "sloiw": "UNKNOWN",
+  "sroiw": "UNKNOWN",
+  "roriw": "UNKNOWN",
+  "sbclriw": "UNKNOWN",
+  "sbsetiw": "UNKNOWN",
+  "sbinviw": "UNKNOWN",
+  "gorciw": "UNKNOWN",
+  "greviw": "UNKNOWN",
+  "fslw": "UNKNOWN",
+  "fsrw": "UNKNOWN",
+  "fsriw": "UNKNOWN",
+  "clzw": "UNKNOWN",
+  "ctzw": "UNKNOWN",
+  "cpopw": "UNKNOWN",
+  "sh1add.uw": "UNKNOWN",
+  "sh2add.uw": "UNKNOWN",
+  "sh3add.uw": "UNKNOWN",
+  "shflw": "UNKNOWN",
+  "unshflw": "UNKNOWN",
+  "bcompressw": "UNKNOWN",
+  "bdecompressw": "UNKNOWN",
+  "packw": "UNKNOWN",
+  "packuw": "UNKNOWN",
+  "bfpw": "UNKNOWN",
+  "xperm32": "UNKNOWN"
+}
diff --git a/pipe_maps/riscv/rv64c.json b/pipe_maps/riscv/rv64c.json
new file mode 100644
index 0000000..1974cca
--- /dev/null
+++ b/pipe_maps/riscv/rv64c.json
@@ -0,0 +1,10 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "c.ld": "UNKNOWN",
+  "c.sd": "UNKNOWN",
+  "c.subw": "UNKNOWN",
+  "c.addw": "UNKNOWN",
+  "c.addiw": "UNKNOWN",
+  "c.ldsp": "UNKNOWN",
+  "c.sdsp": "UNKNOWN"
+}
diff --git a/pipe_maps/riscv/rv64d.json b/pipe_maps/riscv/rv64d.json
new file mode 100644
index 0000000..42a7f36
--- /dev/null
+++ b/pipe_maps/riscv/rv64d.json
@@ -0,0 +1,9 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "fcvt.l.d": "fpu",
+  "fcvt.lu.d": "fpu",
+  "fmv.x.d": "fpu",
+  "fcvt.d.l": "fpu",
+  "fcvt.d.lu": "fpu",
+  "fmv.d.x": "fpu"
+}
diff --git a/pipe_maps/riscv/rv64f.json b/pipe_maps/riscv/rv64f.json
new file mode 100644
index 0000000..443f03c
--- /dev/null
+++ b/pipe_maps/riscv/rv64f.json
@@ -0,0 +1,7 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "fcvt.l.s": "fpu",
+  "fcvt.lu.s": "fpu",
+  "fcvt.s.l": "fpu",
+  "fcvt.s.lu": "fpu"
+}
diff --git a/pipe_maps/riscv/rv64h.json b/pipe_maps/riscv/rv64h.json
new file mode 100644
index 0000000..52d47c9
--- /dev/null
+++ b/pipe_maps/riscv/rv64h.json
@@ -0,0 +1,6 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "hlv.wu": "lsu",
+  "hlv.d": "lsu",
+  "hsv.d": "lsu"
+}
diff --git a/pipe_maps/riscv/rv64i.json b/pipe_maps/riscv/rv64i.json
new file mode 100644
index 0000000..37a3771
--- /dev/null
+++ b/pipe_maps/riscv/rv64i.json
@@ -0,0 +1,18 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "addiw": "alu",
+  "slliw": "alu",
+  "srliw": "alu",
+  "sraiw": "alu",
+  "addw": "alu",
+  "subw": "alu",
+  "sllw": "alu",
+  "srlw": "alu",
+  "sraw": "alu",
+  "ld": "lsu",
+  "lwu": "lsu",
+  "sd": "lsu",
+  "slli": "alu",
+  "srli": "alu",
+  "srai": "alu"
+}
diff --git a/pipe_maps/riscv/rv64k.json b/pipe_maps/riscv/rv64k.json
new file mode 100644
index 0000000..c8d39f9
--- /dev/null
+++ b/pipe_maps/riscv/rv64k.json
@@ -0,0 +1,14 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "aes64ks1i": "UNKNOWN",
+  "aes64im": "UNKNOWN",
+  "aes64ks2": "UNKNOWN",
+  "aes64esm": "UNKNOWN",
+  "aes64es": "UNKNOWN",
+  "aes64dsm": "UNKNOWN",
+  "aes64ds": "UNKNOWN",
+  "sha512sum0": "UNKNOWN",
+  "sha512sum1": "UNKNOWN",
+  "sha512sig0": "UNKNOWN",
+  "sha512sig1": "UNKNOWN"
+}
diff --git a/pipe_maps/riscv/rv64m.json b/pipe_maps/riscv/rv64m.json
new file mode 100644
index 0000000..90d551d
--- /dev/null
+++ b/pipe_maps/riscv/rv64m.json
@@ -0,0 +1,8 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "mulw": "mul",
+  "divw": "div",
+  "divuw": "div",
+  "remw": "div",
+  "remuw": "div"
+}
diff --git a/pipe_maps/riscv/rv64q.json b/pipe_maps/riscv/rv64q.json
new file mode 100644
index 0000000..2afa606
--- /dev/null
+++ b/pipe_maps/riscv/rv64q.json
@@ -0,0 +1,7 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "fcvt.l.q": "fpu",
+  "fcvt.lu.q": "fpu",
+  "fcvt.q.l": "fpu",
+  "fcvt.q.lu": "fpu"
+}
diff --git a/pipe_maps/riscv/rv64zfh.json b/pipe_maps/riscv/rv64zfh.json
new file mode 100644
index 0000000..3af18b5
--- /dev/null
+++ b/pipe_maps/riscv/rv64zfh.json
@@ -0,0 +1,7 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "fcvt.l.h": "UNKNOWN",
+  "fcvt.lu.h": "UNKNOWN",
+  "fcvt.h.l": "UNKNOWN",
+  "fcvt.h.lu": "UNKNOWN"
+}
diff --git a/pipe_maps/riscv/rvc.json b/pipe_maps/riscv/rvc.json
new file mode 100644
index 0000000..5774838
--- /dev/null
+++ b/pipe_maps/riscv/rvc.json
@@ -0,0 +1,38 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "c.nop": "UNKNOWN",
+  "c.addi16sp": "UNKNOWN",
+  "c.jr": "UNKNOWN",
+  "c.jalr": "UNKNOWN",
+  "c.ebreak": "UNKNOWN",
+  "c.addi4spn": "UNKNOWN",
+  "c.fld": "UNKNOWN",
+  "c.lw": "UNKNOWN",
+  "c.flw": "UNKNOWN",
+  "c.fsd": "UNKNOWN",
+  "c.sw": "UNKNOWN",
+  "c.fsw": "UNKNOWN",
+  "c.addi": "UNKNOWN",
+  "c.jal": "UNKNOWN",
+  "c.li": "UNKNOWN",
+  "c.lui": "UNKNOWN",
+  "c.srli": "UNKNOWN",
+  "c.srai": "UNKNOWN",
+  "c.andi": "UNKNOWN",
+  "c.sub": "UNKNOWN",
+  "c.xor": "UNKNOWN",
+  "c.or": "UNKNOWN",
+  "c.and": "UNKNOWN",
+  "c.j": "UNKNOWN",
+  "c.beqz": "UNKNOWN",
+  "c.bnez": "UNKNOWN",
+  "c.slli": "UNKNOWN",
+  "c.fldsp": "UNKNOWN",
+  "c.lwsp": "UNKNOWN",
+  "c.flwsp": "UNKNOWN",
+  "c.mv": "UNKNOWN",
+  "c.add": "UNKNOWN",
+  "c.fsdsp": "UNKNOWN",
+  "c.swsp": "UNKNOWN",
+  "c.fswsp": "UNKNOWN"
+}
diff --git a/pipe_maps/riscv/rvk.json b/pipe_maps/riscv/rvk.json
new file mode 100644
index 0000000..0d3b6ee
--- /dev/null
+++ b/pipe_maps/riscv/rvk.json
@@ -0,0 +1,11 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "sm4ed": "UNKNOWN",
+  "sm4ks": "UNKNOWN",
+  "sm3p0": "UNKNOWN",
+  "sm3p1": "UNKNOWN",
+  "sha256sum0": "UNKNOWN",
+  "sha256sum1": "UNKNOWN",
+  "sha256sig0": "UNKNOWN",
+  "sha256sig1": "UNKNOWN"
+}
diff --git a/pipe_maps/riscv/rvp.json b/pipe_maps/riscv/rvp.json
new file mode 100644
index 0000000..575f5ea
--- /dev/null
+++ b/pipe_maps/riscv/rvp.json
@@ -0,0 +1,329 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "add8": "UNKNOWN",
+  "add16": "UNKNOWN",
+  "add64": "UNKNOWN",
+  "ave": "UNKNOWN",
+  "bitrev": "UNKNOWN",
+  "bitrevi": "UNKNOWN",
+  "bpick": "UNKNOWN",
+  "clrs8": "UNKNOWN",
+  "clrs16": "UNKNOWN",
+  "clrs32": "UNKNOWN",
+  "clo8": "UNKNOWN",
+  "clo16": "UNKNOWN",
+  "clo32": "UNKNOWN",
+  "clz8": "UNKNOWN",
+  "clz16": "UNKNOWN",
+  "clz32": "UNKNOWN",
+  "cmpeq8": "UNKNOWN",
+  "cmpeq16": "UNKNOWN",
+  "cras16": "UNKNOWN",
+  "crsa16": "UNKNOWN",
+  "insb": "UNKNOWN",
+  "kabs8": "UNKNOWN",
+  "kabs16": "UNKNOWN",
+  "kabsw": "UNKNOWN",
+  "kadd8": "UNKNOWN",
+  "kadd16": "UNKNOWN",
+  "kadd64": "UNKNOWN",
+  "kaddh": "UNKNOWN",
+  "kaddw": "UNKNOWN",
+  "kcras16": "UNKNOWN",
+  "kcrsa16": "UNKNOWN",
+  "kdmbb": "UNKNOWN",
+  "kdmbt": "UNKNOWN",
+  "kdmtt": "UNKNOWN",
+  "kdmabb": "UNKNOWN",
+  "kdmabt": "UNKNOWN",
+  "kdmatt": "UNKNOWN",
+  "khm8": "UNKNOWN",
+  "khmx8": "UNKNOWN",
+  "khm16": "UNKNOWN",
+  "khmx16": "UNKNOWN",
+  "khmbb": "UNKNOWN",
+  "khmbt": "UNKNOWN",
+  "khmtt": "UNKNOWN",
+  "kmabb": "UNKNOWN",
+  "kmabt": "UNKNOWN",
+  "kmatt": "UNKNOWN",
+  "kmada": "UNKNOWN",
+  "kmaxda": "UNKNOWN",
+  "kmads": "UNKNOWN",
+  "kmadrs": "UNKNOWN",
+  "kmaxds": "UNKNOWN",
+  "kmar64": "UNKNOWN",
+  "kmda": "UNKNOWN",
+  "kmxda": "UNKNOWN",
+  "kmmac": "UNKNOWN",
+  "kmmac.u": "UNKNOWN",
+  "kmmawb": "UNKNOWN",
+  "kmmawb.u": "UNKNOWN",
+  "kmmawb2": "UNKNOWN",
+  "kmmawb2.u": "UNKNOWN",
+  "kmmawt": "UNKNOWN",
+  "kmmawt.u": "UNKNOWN",
+  "kmmawt2": "UNKNOWN",
+  "kmmawt2.u": "UNKNOWN",
+  "kmmsb": "UNKNOWN",
+  "kmmsb.u": "UNKNOWN",
+  "kmmwb2": "UNKNOWN",
+  "kmmwb2.u": "UNKNOWN",
+  "kmmwt2": "UNKNOWN",
+  "kmmwt2.u": "UNKNOWN",
+  "kmsda": "UNKNOWN",
+  "kmsxda": "UNKNOWN",
+  "kmsr64": "UNKNOWN",
+  "ksllw": "UNKNOWN",
+  "kslliw": "UNKNOWN",
+  "ksll8": "UNKNOWN",
+  "kslli8": "UNKNOWN",
+  "ksll16": "UNKNOWN",
+  "kslli16": "UNKNOWN",
+  "kslra8": "UNKNOWN",
+  "kslra8.u": "UNKNOWN",
+  "kslra16": "UNKNOWN",
+  "kslra16.u": "UNKNOWN",
+  "kslraw": "UNKNOWN",
+  "kslraw.u": "UNKNOWN",
+  "kstas16": "UNKNOWN",
+  "kstsa16": "UNKNOWN",
+  "ksub8": "UNKNOWN",
+  "ksub16": "UNKNOWN",
+  "ksub64": "UNKNOWN",
+  "ksubh": "UNKNOWN",
+  "ksubw": "UNKNOWN",
+  "kwmmul": "UNKNOWN",
+  "kwmmul.u": "UNKNOWN",
+  "maddr32": "UNKNOWN",
+  "maxw": "UNKNOWN",
+  "minw": "UNKNOWN",
+  "msubr32": "UNKNOWN",
+  "mulr64": "UNKNOWN",
+  "mulsr64": "UNKNOWN",
+  "pbsad": "UNKNOWN",
+  "pbsada": "UNKNOWN",
+  "pkbb16": "UNKNOWN",
+  "pkbt16": "UNKNOWN",
+  "pktt16": "UNKNOWN",
+  "pktb16": "UNKNOWN",
+  "radd8": "UNKNOWN",
+  "radd16": "UNKNOWN",
+  "radd64": "UNKNOWN",
+  "raddw": "UNKNOWN",
+  "rcras16": "UNKNOWN",
+  "rcrsa16": "UNKNOWN",
+  "rstas16": "UNKNOWN",
+  "rstsa16": "UNKNOWN",
+  "rsub8": "UNKNOWN",
+  "rsub16": "UNKNOWN",
+  "rsub64": "UNKNOWN",
+  "rsubw": "UNKNOWN",
+  "sclip8": "UNKNOWN",
+  "sclip16": "UNKNOWN",
+  "sclip32": "UNKNOWN",
+  "scmple8": "UNKNOWN",
+  "scmple16": "UNKNOWN",
+  "scmplt8": "UNKNOWN",
+  "scmplt16": "UNKNOWN",
+  "sll8": "UNKNOWN",
+  "slli8": "UNKNOWN",
+  "sll16": "UNKNOWN",
+  "slli16": "UNKNOWN",
+  "smal": "UNKNOWN",
+  "smalbb": "UNKNOWN",
+  "smalbt": "UNKNOWN",
+  "smaltt": "UNKNOWN",
+  "smalda": "UNKNOWN",
+  "smalxda": "UNKNOWN",
+  "smalds": "UNKNOWN",
+  "smaldrs": "UNKNOWN",
+  "smalxds": "UNKNOWN",
+  "smar64": "UNKNOWN",
+  "smaqa": "UNKNOWN",
+  "smaqa.su": "UNKNOWN",
+  "smax8": "UNKNOWN",
+  "smax16": "UNKNOWN",
+  "smbb16": "UNKNOWN",
+  "smbt16": "UNKNOWN",
+  "smtt16": "UNKNOWN",
+  "smds": "UNKNOWN",
+  "smdrs": "UNKNOWN",
+  "smxds": "UNKNOWN",
+  "smin8": "UNKNOWN",
+  "smin16": "UNKNOWN",
+  "smmul": "UNKNOWN",
+  "smmul.u": "UNKNOWN",
+  "smmwb": "UNKNOWN",
+  "smmwb.u": "UNKNOWN",
+  "smmwt": "UNKNOWN",
+  "smmwt.u": "UNKNOWN",
+  "smslda": "UNKNOWN",
+  "smslxda": "UNKNOWN",
+  "smsr64": "UNKNOWN",
+  "smul8": "UNKNOWN",
+  "smulx8": "UNKNOWN",
+  "smul16": "UNKNOWN",
+  "smulx16": "UNKNOWN",
+  "sra.u": "UNKNOWN",
+  "srai.u": "UNKNOWN",
+  "sra8": "UNKNOWN",
+  "sra8.u": "UNKNOWN",
+  "srai8": "UNKNOWN",
+  "srai8.u": "UNKNOWN",
+  "sra16": "UNKNOWN",
+  "sra16.u": "UNKNOWN",
+  "srai16": "UNKNOWN",
+  "srai16.u": "UNKNOWN",
+  "srl8": "UNKNOWN",
+  "srl8.u": "UNKNOWN",
+  "srli8": "UNKNOWN",
+  "srli8.u": "UNKNOWN",
+  "srl16": "UNKNOWN",
+  "srl16.u": "UNKNOWN",
+  "srli16": "UNKNOWN",
+  "srli16.u": "UNKNOWN",
+  "stas16": "UNKNOWN",
+  "stsa16": "UNKNOWN",
+  "sub8": "UNKNOWN",
+  "sub16": "UNKNOWN",
+  "sub64": "UNKNOWN",
+  "sunpkd810": "UNKNOWN",
+  "sunpkd820": "UNKNOWN",
+  "sunpkd830": "UNKNOWN",
+  "sunpkd831": "UNKNOWN",
+  "sunpkd832": "UNKNOWN",
+  "swap8": "UNKNOWN",
+  "uclip8": "UNKNOWN",
+  "uclip16": "UNKNOWN",
+  "uclip32": "UNKNOWN",
+  "ucmple8": "UNKNOWN",
+  "ucmple16": "UNKNOWN",
+  "ucmplt8": "UNKNOWN",
+  "ucmplt16": "UNKNOWN",
+  "ukadd8": "UNKNOWN",
+  "ukadd16": "UNKNOWN",
+  "ukadd64": "UNKNOWN",
+  "ukaddh": "UNKNOWN",
+  "ukaddw": "UNKNOWN",
+  "ukcras16": "UNKNOWN",
+  "ukcrsa16": "UNKNOWN",
+  "ukmar64": "UNKNOWN",
+  "ukmsr64": "UNKNOWN",
+  "ukstas16": "UNKNOWN",
+  "ukstsa16": "UNKNOWN",
+  "uksub8": "UNKNOWN",
+  "uksub16": "UNKNOWN",
+  "uksub64": "UNKNOWN",
+  "uksubh": "UNKNOWN",
+  "uksubw": "UNKNOWN",
+  "umar64": "UNKNOWN",
+  "umaqa": "UNKNOWN",
+  "umax8": "UNKNOWN",
+  "umax16": "UNKNOWN",
+  "umin8": "UNKNOWN",
+  "umin16": "UNKNOWN",
+  "umsr64": "UNKNOWN",
+  "umul8": "UNKNOWN",
+  "umulx8": "UNKNOWN",
+  "umul16": "UNKNOWN",
+  "umulx16": "UNKNOWN",
+  "uradd8": "UNKNOWN",
+  "uradd16": "UNKNOWN",
+  "uradd64": "UNKNOWN",
+  "uraddw": "UNKNOWN",
+  "urcras16": "UNKNOWN",
+  "urcrsa16": "UNKNOWN",
+  "urstas16": "UNKNOWN",
+  "urstsa16": "UNKNOWN",
+  "ursub8": "UNKNOWN",
+  "ursub16": "UNKNOWN",
+  "ursub64": "UNKNOWN",
+  "ursubw": "UNKNOWN",
+  "wexti": "UNKNOWN",
+  "wext": "UNKNOWN",
+  "zunpkd810": "UNKNOWN",
+  "zunpkd820": "UNKNOWN",
+  "zunpkd830": "UNKNOWN",
+  "zunpkd831": "UNKNOWN",
+  "zunpkd832": "UNKNOWN",
+  "add32": "UNKNOWN",
+  "cras32": "UNKNOWN",
+  "crsa32": "UNKNOWN",
+  "kabs32": "UNKNOWN",
+  "kadd32": "UNKNOWN",
+  "kcras32": "UNKNOWN",
+  "kcrsa32": "UNKNOWN",
+  "kdmbb16": "UNKNOWN",
+  "kdmbt16": "UNKNOWN",
+  "kdmtt16": "UNKNOWN",
+  "kdmabb16": "UNKNOWN",
+  "kdmabt16": "UNKNOWN",
+  "kdmatt16": "UNKNOWN",
+  "khmbb16": "UNKNOWN",
+  "khmbt16": "UNKNOWN",
+  "khmtt16": "UNKNOWN",
+  "kmabb32": "UNKNOWN",
+  "kmabt32": "UNKNOWN",
+  "kmatt32": "UNKNOWN",
+  "kmaxda32": "UNKNOWN",
+  "kmda32": "UNKNOWN",
+  "kmxda32": "UNKNOWN",
+  "kmads32": "UNKNOWN",
+  "kmadrs32": "UNKNOWN",
+  "kmaxds32": "UNKNOWN",
+  "kmsda32": "UNKNOWN",
+  "kmsxda32": "UNKNOWN",
+  "ksll32": "UNKNOWN",
+  "kslli32": "UNKNOWN",
+  "kslra32": "UNKNOWN",
+  "kslra32.u": "UNKNOWN",
+  "kstas32": "UNKNOWN",
+  "kstsa32": "UNKNOWN",
+  "ksub32": "UNKNOWN",
+  "pkbb32": "UNKNOWN",
+  "pkbt32": "UNKNOWN",
+  "pktt32": "UNKNOWN",
+  "pktb32": "UNKNOWN",
+  "radd32": "UNKNOWN",
+  "rcras32": "UNKNOWN",
+  "rcrsa32": "UNKNOWN",
+  "rstas32": "UNKNOWN",
+  "rstsa32": "UNKNOWN",
+  "rsub32": "UNKNOWN",
+  "sll32": "UNKNOWN",
+  "slli32": "UNKNOWN",
+  "smax32": "UNKNOWN",
+  "smbt32": "UNKNOWN",
+  "smtt32": "UNKNOWN",
+  "smds32": "UNKNOWN",
+  "smdrs32": "UNKNOWN",
+  "smxds32": "UNKNOWN",
+  "smin32": "UNKNOWN",
+  "sra32": "UNKNOWN",
+  "sra32.u": "UNKNOWN",
+  "srai32": "UNKNOWN",
+  "srai32.u": "UNKNOWN",
+  "sraiw.u": "UNKNOWN",
+  "srl32": "UNKNOWN",
+  "srl32.u": "UNKNOWN",
+  "srli32": "UNKNOWN",
+  "srli32.u": "UNKNOWN",
+  "stas32": "UNKNOWN",
+  "stsa32": "UNKNOWN",
+  "sub32": "UNKNOWN",
+  "ukadd32": "UNKNOWN",
+  "ukcras32": "UNKNOWN",
+  "ukcrsa32": "UNKNOWN",
+  "ukstas32": "UNKNOWN",
+  "ukstsa32": "UNKNOWN",
+  "uksub32": "UNKNOWN",
+  "umax32": "UNKNOWN",
+  "umin32": "UNKNOWN",
+  "uradd32": "UNKNOWN",
+  "urcras32": "UNKNOWN",
+  "urcrsa32": "UNKNOWN",
+  "urstas32": "UNKNOWN",
+  "urstsa32": "UNKNOWN",
+  "ursub32": "UNKNOWN"
+}
diff --git a/pipe_maps/riscv/rvv-pseudo.json b/pipe_maps/riscv/rvv-pseudo.json
new file mode 100644
index 0000000..b7c8335
--- /dev/null
+++ b/pipe_maps/riscv/rvv-pseudo.json
@@ -0,0 +1,13 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "vmvnfr.v": "UNKNOWN",
+  "vl1r.v": "UNKNOWN",
+  "vl2r.v": "UNKNOWN",
+  "vl4r.v": "UNKNOWN",
+  "vl8r.v": "UNKNOWN",
+  "vle1.v": "UNKNOWN",
+  "vse1.v": "UNKNOWN",
+  "vfredsum.vs": "UNKNOWN",
+  "vfwredsum.vs": "UNKNOWN",
+  "vpopc.m": "vmask"
+}
diff --git a/pipe_maps/riscv/rvv.json b/pipe_maps/riscv/rvv.json
new file mode 100644
index 0000000..691a79b
--- /dev/null
+++ b/pipe_maps/riscv/rvv.json
@@ -0,0 +1,450 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "vsetivli": "vctrl",
+  "vsetvli": "vctrl",
+  "vsetvl": "vctrl",
+  "vlm.v": "vlsu",
+  "vsm.v": "vlsu",
+  "vle8.v": "vlsu",
+  "vle16.v": "vlsu",
+  "vle32.v": "vlsu",
+  "vle64.v": "vlsu",
+  "vle128.v": "vlsu",
+  "vle256.v": "vlsu",
+  "vle512.v": "vlsu",
+  "vle1024.v": "vlsu",
+  "vse8.v": "vlsu",
+  "vse16.v": "vlsu",
+  "vse32.v": "vlsu",
+  "vse64.v": "vlsu",
+  "vse128.v": "vlsu",
+  "vse256.v": "vlsu",
+  "vse512.v": "vlsu",
+  "vse1024.v": "vlsu",
+  "vluxei8.v": "vlsu",
+  "vluxei16.v": "vlsu",
+  "vluxei32.v": "vlsu",
+  "vluxei64.v": "vlsu",
+  "vluxei128.v": "UNKNOWN",
+  "vluxei256.v": "UNKNOWN",
+  "vluxei512.v": "UNKNOWN",
+  "vluxei1024.v": "UNKNOWN",
+  "vsuxei8.v": "vlsu",
+  "vsuxei16.v": "vlsu",
+  "vsuxei32.v": "vlsu",
+  "vsuxei64.v": "vlsu",
+  "vsuxei128.v": "UNKNOWN",
+  "vsuxei256.v": "UNKNOWN",
+  "vsuxei512.v": "UNKNOWN",
+  "vsuxei1024.v": "UNKNOWN",
+  "vlse8.v": "vlsu",
+  "vlse16.v": "vlsu",
+  "vlse32.v": "vlsu",
+  "vlse64.v": "vlsu",
+  "vlse128.v": "vlsu",
+  "vlse256.v": "vlsu",
+  "vlse512.v": "vlsu",
+  "vlse1024.v": "vlsu",
+  "vsse8.v": "vlsu",
+  "vsse16.v": "vlsu",
+  "vsse32.v": "vlsu",
+  "vsse64.v": "vlsu",
+  "vsse128.v": "vlsu",
+  "vsse256.v": "vlsu",
+  "vsse512.v": "vlsu",
+  "vsse1024.v": "vlsu",
+  "vloxei8.v": "vlsu",
+  "vloxei16.v": "vlsu",
+  "vloxei32.v": "vlsu",
+  "vloxei64.v": "vlsu",
+  "vloxei128.v": "UNKNOWN",
+  "vloxei256.v": "UNKNOWN",
+  "vloxei512.v": "UNKNOWN",
+  "vloxei1024.v": "UNKNOWN",
+  "vsoxei8.v": "vlsu",
+  "vsoxei16.v": "vlsu",
+  "vsoxei32.v": "vlsu",
+  "vsoxei64.v": "vlsu",
+  "vsoxei128.v": "UNKNOWN",
+  "vsoxei256.v": "UNKNOWN",
+  "vsoxei512.v": "UNKNOWN",
+  "vsoxei1024.v": "UNKNOWN",
+  "vle8ff.v": "vlsu",
+  "vle16ff.v": "vlsu",
+  "vle32ff.v": "vlsu",
+  "vle64ff.v": "vlsu",
+  "vle128ff.v": "vlsu",
+  "vle256ff.v": "vlsu",
+  "vle512ff.v": "vlsu",
+  "vle1024ff.v": "vlsu",
+  "vl1re8.v": "vlsu",
+  "vl1re16.v": "vlsu",
+  "vl1re32.v": "vlsu",
+  "vl1re64.v": "vlsu",
+  "vl2re8.v": "vlsu",
+  "vl2re16.v": "vlsu",
+  "vl2re32.v": "vlsu",
+  "vl2re64.v": "vlsu",
+  "vl4re8.v": "vlsu",
+  "vl4re16.v": "vlsu",
+  "vl4re32.v": "vlsu",
+  "vl4re64.v": "vlsu",
+  "vl8re8.v": "vlsu",
+  "vl8re16.v": "vlsu",
+  "vl8re32.v": "vlsu",
+  "vl8re64.v": "vlsu",
+  "vs1r.v": "vlsu",
+  "vs2r.v": "vlsu",
+  "vs4r.v": "vlsu",
+  "vs8r.v": "vlsu",
+  "vfadd.vf": "valu",
+  "vfsub.vf": "valu",
+  "vfmin.vf": "valu",
+  "vfmax.vf": "valu",
+  "vfsgnj.vf": "valu",
+  "vfsgnjn.vf": "valu",
+  "vfsgnjx.vf": "valu",
+  "vfslide1up.vf": "vperm",
+  "vfslide1down.vf": "vperm",
+  "vfmv.s.f": "vmv",
+  "vfmerge.vfm": "vmv",
+  "vfmv.v.f": "vmv",
+  "vmfeq.vf": "valu",
+  "vmfle.vf": "valu",
+  "vmflt.vf": "valu",
+  "vmfne.vf": "valu",
+  "vmfgt.vf": "valu",
+  "vmfge.vf": "valu",
+  "vfdiv.vf": "vfspecial",
+  "vfrdiv.vf": "vfspecial",
+  "vfmul.vf": "valu",
+  "vfrsub.vf": "valu",
+  "vfmadd.vf": "valu",
+  "vfnmadd.vf": "valu",
+  "vfmsub.vf": "valu",
+  "vfnmsub.vf": "valu",
+  "vfmacc.vf": "valu",
+  "vfnmacc.vf": "valu",
+  "vfmsac.vf": "valu",
+  "vfnmsac.vf": "valu",
+  "vfwadd.vf": "valu",
+  "vfwsub.vf": "valu",
+  "vfwadd.wf": "valu",
+  "vfwsub.wf": "valu",
+  "vfwmul.vf": "valu",
+  "vfwmacc.vf": "valu",
+  "vfwnmacc.vf": "valu",
+  "vfwmsac.vf": "valu",
+  "vfwnmsac.vf": "valu",
+  "vfadd.vv": "valu",
+  "vfredusum.vs": "valu",
+  "vfsub.vv": "valu",
+  "vfredosum.vs": "valu",
+  "vfmin.vv": "valu",
+  "vfredmin.vs": "valu",
+  "vfmax.vv": "valu",
+  "vfredmax.vs": "valu",
+  "vfsgnj.vv": "valu",
+  "vfsgnjn.vv": "valu",
+  "vfsgnjx.vv": "valu",
+  "vfmv.f.s": "vmv",
+  "vmfeq.vv": "valu",
+  "vmfle.vv": "valu",
+  "vmflt.vv": "valu",
+  "vmfne.vv": "valu",
+  "vfdiv.vv": "vfspecial",
+  "vfmul.vv": "valu",
+  "vfmadd.vv": "valu",
+  "vfnmadd.vv": "valu",
+  "vfmsub.vv": "valu",
+  "vfnmsub.vv": "valu",
+  "vfmacc.vv": "valu",
+  "vfnmacc.vv": "valu",
+  "vfmsac.vv": "valu",
+  "vfnmsac.vv": "valu",
+  "vfcvt.xu.f.v": "valu",
+  "vfcvt.x.f.v": "valu",
+  "vfcvt.f.xu.v": "valu",
+  "vfcvt.f.x.v": "valu",
+  "vfcvt.rtz.xu.f.v": "valu",
+  "vfcvt.rtz.x.f.v": "valu",
+  "vfwcvt.xu.f.v": "valu",
+  "vfwcvt.x.f.v": "valu",
+  "vfwcvt.f.xu.v": "valu",
+  "vfwcvt.f.x.v": "valu",
+  "vfwcvt.f.f.v": "valu",
+  "vfwcvt.rtz.xu.f.v": "valu",
+  "vfwcvt.rtz.x.f.v": "valu",
+  "vfncvt.xu.f.w": "valu",
+  "vfncvt.x.f.w": "valu",
+  "vfncvt.f.xu.w": "valu",
+  "vfncvt.f.x.w": "valu",
+  "vfncvt.f.f.w": "valu",
+  "vfncvt.rod.f.f.w": "valu",
+  "vfncvt.rtz.xu.f.w": "valu",
+  "vfncvt.rtz.x.f.w": "valu",
+  "vfsqrt.v": "vfspecial",
+  "vfrsqrt7.v": "vfspecial",
+  "vfrec7.v": "UNKNOWN",
+  "vfclass.v": "valu",
+  "vfwadd.vv": "valu",
+  "vfwredusum.vs": "valu",
+  "vfwsub.vv": "valu",
+  "vfwredosum.vs": "valu",
+  "vfwadd.wv": "valu",
+  "vfwsub.wv": "valu",
+  "vfwmul.vv": "valu",
+  "vfwmacc.vv": "valu",
+  "vfwnmacc.vv": "valu",
+  "vfwmsac.vv": "valu",
+  "vfwnmsac.vv": "valu",
+  "vadd.vx": "valu",
+  "vsub.vx": "valu",
+  "vrsub.vx": "valu",
+  "vminu.vx": "valu",
+  "vmin.vx": "valu",
+  "vmaxu.vx": "valu",
+  "vmax.vx": "valu",
+  "vand.vx": "valu",
+  "vor.vx": "valu",
+  "vxor.vx": "valu",
+  "vrgather.vx": "vperm",
+  "vslideup.vx": "vperm",
+  "vslidedown.vx": "vperm",
+  "vadc.vxm": "valu",
+  "vmadc.vxm": "valu",
+  "vmadc.vx": "valu",
+  "vsbc.vxm": "valu",
+  "vmsbc.vxm": "valu",
+  "vmsbc.vx": "valu",
+  "vmerge.vxm": "vmv",
+  "vmv.v.x": "vmv",
+  "vmseq.vx": "valu",
+  "vmsne.vx": "valu",
+  "vmsltu.vx": "valu",
+  "vmslt.vx": "valu",
+  "vmsleu.vx": "valu",
+  "vmsle.vx": "valu",
+  "vmsgtu.vx": "valu",
+  "vmsgt.vx": "valu",
+  "vsaddu.vx": "valu",
+  "vsadd.vx": "valu",
+  "vssubu.vx": "valu",
+  "vssub.vx": "valu",
+  "vsll.vx": "valu",
+  "vsmul.vx": "vmac",
+  "vsrl.vx": "valu",
+  "vsra.vx": "valu",
+  "vssrl.vx": "valu",
+  "vssra.vx": "valu",
+  "vnsrl.wx": "valu",
+  "vnsra.wx": "valu",
+  "vnclipu.wx": "valu",
+  "vnclip.wx": "valu",
+  "vadd.vv": "valu",
+  "vsub.vv": "valu",
+  "vminu.vv": "valu",
+  "vmin.vv": "valu",
+  "vmaxu.vv": "valu",
+  "vmax.vv": "valu",
+  "vand.vv": "valu",
+  "vor.vv": "valu",
+  "vxor.vv": "valu",
+  "vrgather.vv": "vperm",
+  "vrgatherei16.vv": "vperm",
+  "vadc.vvm": "valu",
+  "vmadc.vvm": "valu",
+  "vmadc.vv": "valu",
+  "vsbc.vvm": "valu",
+  "vmsbc.vvm": "valu",
+  "vmsbc.vv": "valu",
+  "vmerge.vvm": "vmv",
+  "vmv.v.v": "vmv",
+  "vmseq.vv": "valu",
+  "vmsne.vv": "valu",
+  "vmsltu.vv": "valu",
+  "vmslt.vv": "valu",
+  "vmsleu.vv": "valu",
+  "vmsle.vv": "valu",
+  "vsaddu.vv": "valu",
+  "vsadd.vv": "valu",
+  "vssubu.vv": "valu",
+  "vssub.vv": "valu",
+  "vsll.vv": "valu",
+  "vsmul.vv": "vmac",
+  "vsrl.vv": "valu",
+  "vsra.vv": "valu",
+  "vssrl.vv": "valu",
+  "vssra.vv": "valu",
+  "vnsrl.wv": "valu",
+  "vnsra.wv": "valu",
+  "vnclipu.wv": "valu",
+  "vnclip.wv": "valu",
+  "vwredsumu.vs": "vred",
+  "vwredsum.vs": "vred",
+  "vadd.vi": "valu",
+  "vrsub.vi": "valu",
+  "vand.vi": "valu",
+  "vor.vi": "valu",
+  "vxor.vi": "valu",
+  "vrgather.vi": "vperm",
+  "vslideup.vi": "vperm",
+  "vslidedown.vi": "vperm",
+  "vadc.vim": "valu",
+  "vmadc.vim": "valu",
+  "vmadc.vi": "valu",
+  "vmerge.vim": "vmv",
+  "vmv.v.i": "vmv",
+  "vmseq.vi": "valu",
+  "vmsne.vi": "valu",
+  "vmsleu.vi": "valu",
+  "vmsle.vi": "valu",
+  "vmsgtu.vi": "valu",
+  "vmsgt.vi": "valu",
+  "vsaddu.vi": "valu",
+  "vsadd.vi": "valu",
+  "vsll.vi": "valu",
+  "vmv1r.v": "vmv",
+  "vmv2r.v": "vmv",
+  "vmv4r.v": "vmv",
+  "vmv8r.v": "vmv",
+  "vsrl.vi": "valu",
+  "vsra.vi": "valu",
+  "vssrl.vi": "valu",
+  "vssra.vi": "valu",
+  "vnsrl.wi": "valu",
+  "vnsra.wi": "valu",
+  "vnclipu.wi": "valu",
+  "vnclip.wi": "valu",
+  "vredsum.vs": "vred",
+  "vredand.vs": "vred",
+  "vredor.vs": "vred",
+  "vredxor.vs": "vred",
+  "vredminu.vs": "vred",
+  "vredmin.vs": "vred",
+  "vredmaxu.vs": "vred",
+  "vredmax.vs": "vred",
+  "vaaddu.vv": "valu",
+  "vaadd.vv": "valu",
+  "vasubu.vv": "valu",
+  "vasub.vv": "valu",
+  "vmv.x.s": "vmv",
+  "vzext.vf8": "valu",
+  "vsext.vf8": "valu",
+  "vzext.vf4": "valu",
+  "vsext.vf4": "valu",
+  "vzext.vf2": "valu",
+  "vsext.vf2": "valu",
+  "vcompress.vm": "vperm",
+  "vmandnot.mm": "vmsk",
+  "vmand.mm": "vmsk",
+  "vmor.mm": "vmsk",
+  "vmxor.mm": "vmsk",
+  "vmornot.mm": "vmsk",
+  "vmnand.mm": "vmsk",
+  "vmnor.mm": "vmsk",
+  "vmxnor.mm": "vmsk",
+  "vmsbf.m": "vmsk",
+  "vmsof.m": "vmsk",
+  "vmsif.m": "vmsk",
+  "viota.m": "vmv",
+  "vid.v": "vmv",
+  "vcpop.m": "UNKNOWN",
+  "vfirst.m": "vmsk",
+  "vdivu.vv": "vdiv",
+  "vdiv.vv": "vdiv",
+  "vremu.vv": "vdiv",
+  "vrem.vv": "vdiv",
+  "vmulhu.vv": "vmac",
+  "vmul.vv": "vmac",
+  "vmulhsu.vv": "vmac",
+  "vmulh.vv": "vmac",
+  "vmadd.vv": "vmac",
+  "vnmsub.vv": "vmac",
+  "vmacc.vv": "vmac",
+  "vnmsac.vv": "vmac",
+  "vwaddu.vv": "valu",
+  "vwadd.vv": "valu",
+  "vwsubu.vv": "valu",
+  "vwsub.vv": "valu",
+  "vwaddu.wv": "valu",
+  "vwadd.wv": "valu",
+  "vwsubu.wv": "valu",
+  "vwsub.wv": "valu",
+  "vwmulu.vv": "vmac",
+  "vwmulsu.vv": "vmac",
+  "vwmul.vv": "vmac",
+  "vwmaccu.vv": "vmac",
+  "vwmacc.vv": "vmac",
+  "vwmaccsu.vv": "vmac",
+  "vaaddu.vx": "valu",
+  "vaadd.vx": "valu",
+  "vasubu.vx": "valu",
+  "vasub.vx": "valu",
+  "vmv.s.x": "vmv",
+  "vslide1up.vx": "vperm",
+  "vslide1down.vx": "vperm",
+  "vdivu.vx": "vdiv",
+  "vdiv.vx": "vdiv",
+  "vremu.vx": "vdiv",
+  "vrem.vx": "vdiv",
+  "vmulhu.vx": "vmac",
+  "vmul.vx": "vmac",
+  "vmulhsu.vx": "vmac",
+  "vmulh.vx": "vmac",
+  "vmadd.vx": "vmac",
+  "vnmsub.vx": "vmac",
+  "vmacc.vx": "vmac",
+  "vnmsac.vx": "vmac",
+  "vwaddu.vx": "valu",
+  "vwadd.vx": "valu",
+  "vwsubu.vx": "valu",
+  "vwsub.vx": "valu",
+  "vwaddu.wx": "valu",
+  "vwadd.wx": "valu",
+  "vwsubu.wx": "valu",
+  "vwsub.wx": "valu",
+  "vwmulu.vx": "vmac",
+  "vwmulsu.vx": "vmac",
+  "vwmul.vx": "vmac",
+  "vwmaccu.vx": "vmac",
+  "vwmacc.vx": "vmac",
+  "vwmaccus.vx": "vmac",
+  "vwmaccsu.vx": "vmac",
+  "vamoswapei8.v": "UNKNOWN",
+  "vamoaddei8.v": "UNKNOWN",
+  "vamoxorei8.v": "UNKNOWN",
+  "vamoandei8.v": "UNKNOWN",
+  "vamoorei8.v": "UNKNOWN",
+  "vamominei8.v": "UNKNOWN",
+  "vamomaxei8.v": "UNKNOWN",
+  "vamominuei8.v": "UNKNOWN",
+  "vamomaxuei8.v": "UNKNOWN",
+  "vamoswapei16.v": "UNKNOWN",
+  "vamoaddei16.v": "UNKNOWN",
+  "vamoxorei16.v": "UNKNOWN",
+  "vamoandei16.v": "UNKNOWN",
+  "vamoorei16.v": "UNKNOWN",
+  "vamominei16.v": "UNKNOWN",
+  "vamomaxei16.v": "UNKNOWN",
+  "vamominuei16.v": "UNKNOWN",
+  "vamomaxuei16.v": "UNKNOWN",
+  "vamoswapei32.v": "UNKNOWN",
+  "vamoaddei32.v": "UNKNOWN",
+  "vamoxorei32.v": "UNKNOWN",
+  "vamoandei32.v": "UNKNOWN",
+  "vamoorei32.v": "UNKNOWN",
+  "vamominei32.v": "UNKNOWN",
+  "vamomaxei32.v": "UNKNOWN",
+  "vamominuei32.v": "UNKNOWN",
+  "vamomaxuei32.v": "UNKNOWN",
+  "vamoswapei64.v": "UNKNOWN",
+  "vamoaddei64.v": "UNKNOWN",
+  "vamoxorei64.v": "UNKNOWN",
+  "vamoandei64.v": "UNKNOWN",
+  "vamoorei64.v": "UNKNOWN",
+  "vamominei64.v": "UNKNOWN",
+  "vamomaxei64.v": "UNKNOWN",
+  "vamominuei64.v": "UNKNOWN",
+  "vamomaxuei64.v": "UNKNOWN"
+}
diff --git a/pipe_maps/riscv/springbok.json b/pipe_maps/riscv/springbok.json
new file mode 100644
index 0000000..8bc243b
--- /dev/null
+++ b/pipe_maps/riscv/springbok.json
@@ -0,0 +1,6 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "simprint": "UNKNOWN",
+  "hostreq": "UNKNOWN",
+  "finish": "UNKNOWN"
+}
diff --git a/pipe_maps/riscv/svinval.json b/pipe_maps/riscv/svinval.json
new file mode 100644
index 0000000..045cfdb
--- /dev/null
+++ b/pipe_maps/riscv/svinval.json
@@ -0,0 +1,8 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "sinval.vma": "UNKNOWN",
+  "sfence.w.inval": "UNKNOWN",
+  "sfence.inval.ir": "UNKNOWN",
+  "hinval.vvma": "UNKNOWN",
+  "hinval.gvma": "UNKNOWN"
+}
diff --git a/pipe_maps/riscv/system.json b/pipe_maps/riscv/system.json
new file mode 100644
index 0000000..f98c55c
--- /dev/null
+++ b/pipe_maps/riscv/system.json
@@ -0,0 +1,16 @@
+{
+  "__comment__": "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!",
+  "ecall": "branch",
+  "ebreak": "branch",
+  "sret": "branch",
+  "mret": "branch",
+  "dret": "UNKNOWN",
+  "sfence.vma": "UNKNOWN",
+  "wfi": "UNKNOWN",
+  "csrrw": "csr",
+  "csrrs": "csr",
+  "csrrc": "csr",
+  "csrrwi": "csr",
+  "csrrsi": "csr",
+  "csrrci": "csr"
+}
diff --git a/tbm/import-riscv-opcodes.py b/tbm/import-riscv-opcodes.py
new file mode 100755
index 0000000..9284665
--- /dev/null
+++ b/tbm/import-riscv-opcodes.py
@@ -0,0 +1,106 @@
+#! /usr/bin/env python3
+"""Generate a pipe-map json file from RISC-V opcodes file.
+
+Generate a new pipe-map json file, with all the opcodes from OPFILE. OPFILE is
+a file from the riscv-opcodes repo. Entries are created in the new map file
+only for opcodes from the OPFILE file. If an opcode also has an entry in the
+old map file, the pipe for this opcode will be copied to the new map file,
+otherwise it will be set to "UNKNOWN".
+"""
+
+import argparse
+import json
+import logging
+import sys
+from typing import Sequence
+
+
+import utilities
+
+
+logger = logging.getLogger(__name__)
+
+
+def main(argv: Sequence[str]) -> int:
+    parser = argparse.ArgumentParser(
+        description=__doc__,
+        formatter_class=argparse.ArgumentDefaultsHelpFormatter
+    )
+
+    parser.add_argument("-m", "--oldmap",
+                        help="The old pipe-map file",
+                        metavar="JSON")
+
+    parser.add_argument("-n", "--newmap",
+                        required=True,
+                        help="Output pipe-map file",
+                        metavar="JSON")
+
+    # The -v flag is setup so that verbose holds the number of times the flag
+    # was used. This is the standard way to use -v, even though at the moment
+    # we have only two levels of verbosity: warning (the default, with no -v),
+    # and info.
+    parser.add_argument("-v", "--verbose",
+                        default=0,
+                        action="count",
+                        help="Increase the verbosity level. By default only"
+                        " errors and warnings will show. Use '-v' to also show"
+                        " information messages.")
+
+    parser.add_argument("opcodes_file",
+                        help="Opcode file",
+                        metavar="OPFILE")
+
+    args = parser.parse_args(argv)
+
+    log_level = logging.WARNING
+    if args.verbose > 0:
+        log_level = logging.INFO
+
+    utilities.logging_config(log_level)
+
+    if args.oldmap:
+        with open(args.oldmap, "r", encoding="ascii") as oldmap_io:
+            old_map = json.load(oldmap_io)
+    else:
+        old_map = {}
+
+    new_map = {
+        "__comment__":
+        "AUTO-GENERATED FILE, DO NOT ADD NEW KEYS (it's ok to change values)!"
+    }
+
+    with open(args.opcodes_file, "r", encoding="ascii") as opcodes_io:
+        for line in opcodes_io:
+            line = line.partition("#")
+            tokens = line[0].split()
+
+            if not tokens:
+                continue
+
+            name = tokens[0]
+            pseudo = name[0] == "@"
+            if pseudo:
+                name = name[1:]
+
+            if name in old_map:
+                new_map[name] = old_map[name]
+            else:
+                logger.info("Adding a new opcode: '%s':  'UNKNOWN'.", name)
+                new_map[name] = "UNKNOWN"
+
+    with open(args.newmap, "w", encoding="ascii") as newmap_io:
+        json.dump(new_map, newmap_io, indent=2)
+        newmap_io.write("\n")
+
+    old_keys = old_map.keys() - new_map.keys()
+    if old_keys:
+        logger.warning("Some opcodes from the old map were dropped (%d): %s",
+                       len(old_keys),
+                       ", ".join(old_keys))
+
+    return 0
+
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv[1:]))