diff options
| author | s-ol <s+removethis@s-ol.nu> | 2021-07-05 12:01:38 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2021-07-05 12:02:19 +0000 |
| commit | ae0e0c052e7f1f613fb27d5aa21dfa83fbafcd61 (patch) | |
| tree | fcc6e9a67329620b6427756b51b598d659746b45 /validate.py | |
| parent | update survey for new stage order (diff) | |
| download | subv-ae0e0c052e7f1f613fb27d5aa21dfa83fbafcd61.tar.gz subv-ae0e0c052e7f1f613fb27d5aa21dfa83fbafcd61.zip | |
update format for new pipeline
Diffstat (limited to 'validate.py')
| -rwxr-xr-x | validate.py | 175 |
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), } |
