From 08ca2b1ed5fcce8d08bd61a861e71f6e222905eb Mon Sep 17 00:00:00 2001 From: "Pavel I. Kryukov" Date: Thu, 9 Jun 2022 15:27:43 +0300 Subject: Check for overlaps between different fields (#122) --- parse.py | 15 ++++++++++----- rv64_zba | 2 +- rv64_zbb | 2 +- rv64_zbs | 8 ++++---- test.py | 3 +++ unratified/rv64_zbp | 4 ++-- unratified/rv64_zbt | 2 +- unratified/rv_b | 4 ++-- 8 files changed, 24 insertions(+), 16 deletions(-) diff --git a/parse.py b/parse.py index 5bc7b26..482dd69 100755 --- a/parse.py +++ b/parse.py @@ -95,6 +95,11 @@ def process_enc_line(line, ext): for (lsb, value, drop) in single_fixed.findall(remaining): lsb = int(lsb, 0) value = int(value, 0) + if encoding[31 - lsb] != '-': + logging.error( + f'{line.split(" ")[0]:<10} has {lsb} bit overlapping in it\'s opcodes' + ) + raise SystemExit(1) encoding[31 - lsb] = str(value) # convert the list of encodings into a single string for match and mask @@ -104,19 +109,19 @@ def process_enc_line(line, ext): # check if all args of the instruction are present in arg_lut present in # constants.py args = single_fixed.sub(' ', remaining).split() - encoding_args = ['-'] * 32 + encoding_args = encoding for a in args: if a not in arg_lut: logging.error(f' Found variable {a} in instruction {name} whose mapping in arg_lut does not exist') raise SystemExit(1) else: (msb, lsb) = arg_lut[a] - for ind in range(lsb, msb): + for ind in range(lsb, msb + 1): # overlapping bits - if encoding_args[ind] != '-': - logging.error(f' Found variable {a} in instruction {name} overlapping {encoding_args[ind]} variable') + if encoding_args[31 - ind] != '-': + logging.error(f' Found variable {a} in instruction {name} overlapping {encoding_args[31 - ind]} variable in bit {ind}') raise SystemExit(1) - encoding_args[ind] = a + encoding_args[31 - ind] = a # update the fields of the instruction as a dict and return back along with # the name of the instruction diff --git a/rv64_zba b/rv64_zba index 52d9dcd..5378e52 100644 --- a/rv64_zba +++ b/rv64_zba @@ -2,4 +2,4 @@ add.uw rd rs1 rs2 31..25=4 14..12=0 6..2=0x0E 1..0=3 sh1add.uw rd rs1 rs2 31..25=16 14..12=2 6..2=0x0E 1..0=3 sh2add.uw rd rs1 rs2 31..25=16 14..12=4 6..2=0x0E 1..0=3 sh3add.uw rd rs1 rs2 31..25=16 14..12=6 6..2=0x0E 1..0=3 -slli.uw rd rs1 31..26=2 shamt 14..12=1 6..2=0x06 1..0=3 +slli.uw rd rs1 31..26=2 shamtd 14..12=1 6..2=0x06 1..0=3 diff --git a/rv64_zbb b/rv64_zbb index fc19561..4a8b24a 100644 --- a/rv64_zbb +++ b/rv64_zbb @@ -4,6 +4,6 @@ cpopw rd rs1 31..20=0x602 14..12=1 6..2=0x06 1..0 rolw rd rs1 rs2 31..25=0x30 14..12=1 6..2=0x0E 1..0=3 rorw rd rs1 rs2 31..25=0x30 14..12=5 6..2=0x0E 1..0=3 roriw rd rs1 31..25=0x30 shamtw 14..12=5 6..2=0x06 1..0=3 -rori rd rs1 31..26=0x18 shamt 14..12=5 6..2=0x04 1..0=3 +rori rd rs1 31..26=0x18 shamtd 14..12=5 6..2=0x04 1..0=3 $pseudo_op rv64_zbe::packw zext.h rd rs1 31..25=0x04 24..20=0 14..12=0x4 6..2=0xE 1..0=0x3 $pseudo_op rv64_zbp::grevi rev8 rd rs1 31..20=0x6B8 14..12=5 6..0=0x13 diff --git a/rv64_zbs b/rv64_zbs index d3203a6..27e6360 100644 --- a/rv64_zbs +++ b/rv64_zbs @@ -1,5 +1,5 @@ -bclri rd rs1 31..26=0x12 shamt 14..12=1 6..2=0x04 1..0=3 -bexti rd rs1 31..26=0x12 shamt 14..12=5 6..2=0x04 1..0=3 -binvi rd rs1 31..26=0x1a shamt 14..12=1 6..2=0x04 1..0=3 -bseti rd rs1 31..26=0x0a shamt 14..12=1 6..2=0x04 1..0=3 +bclri rd rs1 31..26=0x12 shamtd 14..12=1 6..2=0x04 1..0=3 +bexti rd rs1 31..26=0x12 shamtd 14..12=5 6..2=0x04 1..0=3 +binvi rd rs1 31..26=0x1a shamtd 14..12=1 6..2=0x04 1..0=3 +bseti rd rs1 31..26=0x0a shamtd 14..12=1 6..2=0x04 1..0=3 diff --git a/test.py b/test.py index e3f6443..9ddd072 100644 --- a/test.py +++ b/test.py @@ -21,6 +21,9 @@ class EncodingLineTest(unittest.TestCase): def test_overlapping(self): self.assertError('jol rd jimm20 6..2=0x00 3..0=7') + self.assertError('jol rd jimm20 6..2=0x00 3=1') + self.assertError('jol rd jimm20 6..2=0x00 10=1') + self.assertError('jol rd jimm20 6..2=0x00 31..10=1') def test_invalid_order(self): self.assertError('jol 2..6=0x1b') diff --git a/unratified/rv64_zbp b/unratified/rv64_zbp index f8c06bd..6ffc33f 100644 --- a/unratified/rv64_zbp +++ b/unratified/rv64_zbp @@ -1,5 +1,5 @@ -grevi rd rs1 31..26=26 shamt 14..12=5 6..2=0x04 1..0=3 -gorci rd rs1 31..26=10 shamt 14..12=5 6..2=0x04 1..0=3 +grevi rd rs1 31..26=26 shamtd 14..12=5 6..2=0x04 1..0=3 +gorci rd rs1 31..26=10 shamtd 14..12=5 6..2=0x04 1..0=3 shfli rd rs1 31..26=2 25=0 shamtw 14..12=1 6..2=0x04 1..0=3 unshfli rd rs1 31..26=2 25=0 shamtw 14..12=5 6..2=0x04 1..0=3 $import rv64_zbe::packw diff --git a/unratified/rv64_zbt b/unratified/rv64_zbt index fcb84b5..d009b73 100644 --- a/unratified/rv64_zbt +++ b/unratified/rv64_zbt @@ -1,6 +1,6 @@ fslw rd rs1 rs2 rs3 26..25=2 14..12=1 6..2=0x0E 1..0=3 fsrw rd rs1 rs2 rs3 26..25=2 14..12=5 6..2=0x0E 1..0=3 fsriw rd rs1 rs3 26..25=2 shamtw 14..12=5 6..2=0x06 1..0=3 -fsri rd rs1 rs3 26=1 shamt 14..12=5 6..2=0x04 1..0=3 +fsri rd rs1 rs3 26=1 shamtd 14..12=5 6..2=0x04 1..0=3 diff --git a/unratified/rv_b b/unratified/rv_b index 4fe7ef0..b0b68b0 100644 --- a/unratified/rv_b +++ b/unratified/rv_b @@ -3,8 +3,8 @@ slo rd rs1 rs2 31..25=16 14..12=1 6..2=0x0C 1..0=3 sro rd rs1 rs2 31..25=16 14..12=5 6..2=0x0C 1..0=3 -sloi rd rs1 31..26=8 shamt 14..12=1 6..2=0x04 1..0=3 -sroi rd rs1 31..26=8 shamt 14..12=5 6..2=0x04 1..0=3 +sloi rd rs1 31..26=8 shamtd 14..12=1 6..2=0x04 1..0=3 +sroi rd rs1 31..26=8 shamtd 14..12=5 6..2=0x04 1..0=3 -- cgit v1.1