435 | 435 |
"""
|
436 | 436 |
validate system operations.
|
437 | 437 |
|
438 | |
>>> validate_system(subv.parse('73/system 0/dest/x0 1/subop/csrrw 5/rs/t0 afe/csr12')['instr'])
|
|
438 |
>>> validate_system(subv.parse('73/system 0/dest/x0 1/subop/csrrw 5/rs/t0 afe/csr')['instr'])
|
439 | 439 |
[(115, 'i'), (0, 'rd'), (1, 'funct3'), (5, 'rs'), (2814, 'imm12')]
|
440 | |
>>> validate_system(subv.parse('73/system 0/dest/x0 5/subop/csrrwi 7/imm5 afe/csr12')['instr'])
|
|
440 |
>>> validate_system(subv.parse('73/system 0/dest/x0 5/subop/csrrwi 7/imm5 afe/csr')['instr'])
|
441 | 441 |
[(115, 'i'), (0, 'rd'), (5, 'funct3'), (7, 'imm5'), (2814, 'imm12')]
|
442 | 442 |
|
443 | 443 |
>>> validate_system(subv.parse('73/system 0/subop/priv 0/funct12/ecall')['instr'])
|
|
445 | 445 |
>>> validate_system(subv.parse('73/system 0/subop/priv 1/funct12/ebreak')['instr'])
|
446 | 446 |
[(115, 'i'), (0, 'rd'), (0, 'funct3'), (0, 'rs'), (1, 'imm12')]
|
447 | 447 |
|
448 | |
>>> validate_system(subv.parse('73/system 0/dest/x0 1/subop/csrrw 7/imm5 afe/csr12')['instr'])
|
|
448 |
>>> validate_system(subv.parse('73/system 0/dest/x0 1/subop/csrrw 7/imm5 afe/csr')['instr'])
|
449 | 449 |
Traceback (most recent call last):
|
450 | 450 |
...
|
451 | 451 |
ValueError: Expected a register with label rs/rs1/src
|
452 | |
>>> validate_system(subv.parse('73/system 0/dest/x0 5/subop/csrrwi 5/rs/t0 afe/csr12')['instr'])
|
|
452 |
>>> validate_system(subv.parse('73/system 0/dest/x0 5/subop/csrrwi 5/rs/t0 afe/csr')['instr'])
|
453 | 453 |
Traceback (most recent call last):
|
454 | 454 |
...
|
455 | 455 |
ValueError: Expected an immediate with size 5
|
|
474 | 474 |
src = try_pop_zeroes(inputs, ["rs", "rs1", "src"])
|
475 | 475 |
else:
|
476 | 476 |
dest = validate_reg(inputs, ["rd", "dest"])
|
477 | |
imm = pop_immediate(inputs, 12, ["imm", "csr"])
|
|
477 |
imm = pop_part(inputs, ["imm12", "csr"], "CSR-specifier")
|
478 | 478 |
|
479 | 479 |
if funct[2][-1] == "i":
|
480 | 480 |
src = pop_immediate(inputs, 5)
|