aboutsummaryrefslogtreecommitdiffstats
path: root/validate.py
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2021-07-05 12:01:38 +0000
committers-ol <s+removethis@s-ol.nu>2021-07-05 12:02:19 +0000
commitae0e0c052e7f1f613fb27d5aa21dfa83fbafcd61 (patch)
treefcc6e9a67329620b6427756b51b598d659746b45 /validate.py
parentupdate survey for new stage order (diff)
downloadsubv-ae0e0c052e7f1f613fb27d5aa21dfa83fbafcd61.tar.gz
subv-ae0e0c052e7f1f613fb27d5aa21dfa83fbafcd61.zip
update format for new pipeline
Diffstat (limited to 'validate.py')
-rwxr-xr-xvalidate.py175
1 files changed, 76 insertions, 99 deletions
diff --git a/validate.py b/validate.py
index 452b4fa..84bb036 100755
--- a/validate.py
+++ b/validate.py
@@ -38,28 +38,27 @@ main:
37/u 5/rd 10010/imm20
# store 0x48 (H) in UART0+0
13/i 6/rd 0/funct3 0/rs 48/imm12
-23/s 5/rs1 0/off12 2/funct3 6/rs2
+23/s 5/rs1 0/imm12 2/funct3 6/rs2
# store 0x65 (e) in UART0+0
13/i 6/rd 0/funct3 0/rs 65/imm12
-23/s 5/rs1 0/off12 2/funct3 6/rs2
+23/s 5/rs1 0/imm12 2/funct3 6/rs2
# store 0x6c (l) in UART0+0
13/i 6/rd 0/funct3 0/rs 6c/imm12
-23/s 5/rs1 0/off12 2/funct3 6/rs2
+23/s 5/rs1 0/imm12 2/funct3 6/rs2
# store 0x6c (l) in UART0+0
13/i 6/rd 0/funct3 0/rs 6c/imm12
-23/s 5/rs1 0/off12 2/funct3 6/rs2
+23/s 5/rs1 0/imm12 2/funct3 6/rs2
# store 0x6f (o) in UART0+0
13/i 6/rd 0/funct3 0/rs 6f/imm12
-23/s 5/rs1 0/off12 2/funct3 6/rs2
+23/s 5/rs1 0/imm12 2/funct3 6/rs2
# store 0x0a (\\n) in UART0+0
13/i 6/rd 0/funct3 0/rs a/imm12
-23/s 5/rs1 0/off12 2/funct3 6/rs2
+23/s 5/rs1 0/imm12 2/funct3 6/rs2
# jump back up to the top
6f/j 0/rd main/off21
"""
import subv
-import bits
def pop_piece(line, labels):
@@ -71,48 +70,26 @@ def pop_piece(line, labels):
raise ValueError("Expected a part with labels {}".format(labels))
-REG_NAMES = {}
-REG_NAMES.update(
- {
- name: i
- for i, name in enumerate(
- [
- "zero",
- "ra",
- "sp",
- "gp",
- "tp",
- "t0",
- "t1",
- "t2",
- "s0",
- "s1",
- "a0",
- "a1",
- "a2",
- "a3",
- "a4",
- "a5",
- "a6",
- "a7",
- "s2",
- "s3",
- "s4",
- "s5",
- "s6",
- "s7",
- "s8",
- "s9",
- "s10",
- "s11",
- "t3",
- "t4",
- "t5",
- "t6",
- ]
- )
- }
-)
+def pop_immediate(line, sizes, allow_offset=False):
+ if isinstance(sizes, int):
+ sizes = [sizes]
+
+ for part in line:
+ imm = subv.parse_immediate(part[1])
+ if imm and imm["size"] in sizes:
+ line.remove(part)
+ if not isinstance(part[0], str):
+ imm["mode"] = "imm"
+
+ return (part[0], subv.format_immediate(imm))
+
+ raise ValueError(
+ "Expected an immediate with size {}".format("/".join(str(s) for s in sizes))
+ )
+
+
+REG_NAMES = "zero,ra,sp,gp,tp,t0,t1,t2,s0,s1,a0,a1,a2,a3,a4,a5,a6,a7,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,t3,t4,t5,t6"
+REG_NAMES = {name: i for i, name in enumerate(REG_NAMES.split(","))}
REG_NAMES.update({"x{}".format(i): i for i in range(32)})
@@ -143,35 +120,22 @@ def pop_register(line, labels):
raise ValueError("Expected a register with labels {}".format(labels))
-def validate_u(inputs):
+def validate_r(inputs):
op = inputs.pop(0)
- rd = pop_register(inputs, ["rd", "dest"])
- imm = inputs.pop()
- assert len(inputs) == 0, ValueError("Extra arguments: {}".format(inputs))
-
- return [
- (op[0], "u"),
- rd,
- imm,
- ]
-
-
-def validate_s(inputs):
- op = inputs.pop(0)
- width = pop_piece(inputs, ["funct3", "funct", "width"])
- base = pop_register(inputs, ["rs1", "rs", "base"])
- src = pop_register(inputs, ["rs2", "rs", "src"])
- offset = inputs.pop()
+ dest = pop_register(inputs, ["rd", "dest"])
+ funct = pop_piece(inputs, ["funct7", "funct", "subop"])
+ rs1 = pop_register(inputs, ["rs1", "rs", "src1", "src"])
+ rs2 = pop_register(inputs, ["rs2", "rs", "src2", "src"])
assert len(inputs) == 0, ValueError("Extra arguments: {}".format(inputs))
return [
- (op[0], "s"),
- base,
- offset,
- width,
- src,
+ (op[0], "r"),
+ dest,
+ funct,
+ rs1,
+ rs2,
]
@@ -185,7 +149,7 @@ def validate_i(inputs):
dest = pop_register(inputs, ["rd", "dest"])
funct = pop_piece(inputs, ["funct3", "funct", "subop"])
rs = pop_register(inputs, ["rs", rs_name])
- imm = inputs.pop()
+ imm = pop_immediate(inputs, 12)
assert len(inputs) == 0, ValueError("Extra arguments: {}".format(inputs))
@@ -198,69 +162,82 @@ def validate_i(inputs):
]
-def validate_r(inputs):
+def validate_s(inputs):
op = inputs.pop(0)
+ base = pop_register(inputs, ["rs1", "rs", "base"])
+ offset = pop_immediate(inputs, 12, allow_offset=True)
+ width = pop_piece(inputs, ["funct3", "funct", "width"])
+ src = pop_register(inputs, ["rs2", "rs", "src"])
- dest = pop_register(inputs, ["rd", "dest"])
- funct = pop_piece(inputs, ["funct7", "funct", "subop"])
+ assert len(inputs) == 0, ValueError("Extra arguments: {}".format(inputs))
+
+ return [
+ (op[0], "s"),
+ base,
+ offset,
+ width,
+ src,
+ ]
+
+
+def validate_b(inputs):
+ op = inputs.pop(0)
+
+ funct = pop_piece(inputs, ["funct3", "funct", "subop"])
rs1 = pop_register(inputs, ["rs1", "rs", "src1", "src"])
rs2 = pop_register(inputs, ["rs2", "rs", "src2", "src"])
+ offset = pop_immediate(inputs, [12, 13], allow_offset=True)
assert len(inputs) == 0, ValueError("Extra arguments: {}".format(inputs))
return [
- (op[0], "r"),
- dest,
+ (op[0], "b"),
funct,
- rs1,
- rs2,
+ src1,
+ src2,
+ offset,
]
-def validate_j(inputs):
+def validate_u(inputs):
op = inputs.pop(0)
-
- dest = pop_register(inputs, ["rd", "dest"])
- offset = inputs.pop()
+ rd = pop_register(inputs, ["rd", "dest"])
+ imm = pop_immediate(inputs, 20, allow_offset=True)
assert len(inputs) == 0, ValueError("Extra arguments: {}".format(inputs))
return [
- (op[0], "j"),
- dest,
- offset,
+ (op[0], "u"),
+ rd,
+ imm,
]
-def validate_b(inputs):
+def validate_j(inputs):
op = inputs.pop(0)
- funct = pop_piece(inputs, ["funct3", "funct", "subop"])
- rs1 = pop_register(inputs, ["rs1", "rs", "src1", "src"])
- rs2 = pop_register(inputs, ["rs2", "rs", "src2", "src"])
- offset = inputs.pop()
+ dest = pop_register(inputs, ["rd", "dest"])
+ offset = pop_immediate(inputs, [21, 20], allow_offset=True)
assert len(inputs) == 0, ValueError("Extra arguments: {}".format(inputs))
return [
- (op[0], "b"),
- funct,
- src1,
- src2,
+ (op[0], "j"),
+ dest,
offset,
]
instr_map = {
- "opi": (validate_i, 0x13),
"opr": (validate_r, 0x33),
+ "opi": (validate_i, 0x13),
"load": (validate_i, 0x03),
- "store": (validate_s, 0x23),
- "jal": (validate_j, 0x6F),
"jalr": (validate_i, 0x67),
+ "store": (validate_s, 0x23),
"branch": (validate_b, 0x63),
"lui": (validate_u, 0x37),
"auipc": (validate_u, 0x17),
+ "jal": (validate_j, 0x6F),
}