Files
lab-rv32i-asm-control-flow/tests/reference_model.py
T

33 lines
1.1 KiB
Python
Executable File

#!/usr/bin/env python3
import sys
def s32(value):
value &= 0xFFFFFFFF
return value - 0x100000000 if value & 0x80000000 else value
def task01():
lhs, rhs = 0xFFFFFFFF, 1
values = [lhs == rhs, lhs != rhs, s32(lhs) < s32(rhs), s32(lhs) >= s32(rhs), lhs < rhs, lhs >= rhs]
assert values == [False, True, True, False, False, True]
print("PASS task01 conditions=6 signed_lt=1 unsigned_lt=0 illegal=1")
def task02():
assert (0x100 + 12) & 0xFFFFFFFF == 0x10C
assert (0x100 - 8) & 0xFFFFFFFF == 0x0F8
print("PASS task02 branch_imm=12 branch_target=0000010c jal_imm=-8 jal_target=000000f8")
def task03():
sequence = [0, 4, 8, 0x20, 0x24, 0x10, 0x14]
assert sequence == [0, 4, 8, 32, 36, 16, 20]
print("PASS task03 pc=00000000,00000004,00000008,00000020,00000024,00000010,00000014 branches=1 jumps=1")
TASKS = {"task01_branch_compare": task01, "task02_control_immediate": task02, "task03_program_counter": task03}
if len(sys.argv) != 2 or sys.argv[1] not in TASKS:
raise SystemExit(f"usage: {sys.argv[0]} {'|'.join(TASKS)}")
TASKS[sys.argv[1]]()