Files

35 lines
1.2 KiB
Python
Executable File

#!/usr/bin/env python3
import sys
def task01():
assert (1 << 3) == 0b1000 and (0b11 << 2) == 0b1100
assert ((0xAA << 24) & 0xFFFFFFFF) == 0xAA000000
assert ((0xBEEF << 16) & 0xFFFFFFFF) == 0xBEEF0000
print("PASS task01 sb_strobe=1000 sb_data=aa000000 sh_strobe=1100 sh_data=beef0000 sw_strobe=1111 fault=1")
def sign_extend(value, bits):
return (value | (~0 << bits)) & 0xFFFFFFFF if value & (1 << (bits - 1)) else value
def task02():
word = 0x80FF7F01
assert sign_extend((word >> 24) & 0xFF, 8) == 0xFFFFFF80
assert ((word >> 24) & 0xFF) == 0x80
assert sign_extend((word >> 16) & 0xFFFF, 16) == 0xFFFF80FF
print("PASS task02 lb=ffffff80 lbu=00000080 lh=ffff80ff lhu=000080ff")
def task03():
word = 0x11223344
word = (word & ~(0xFF << 8)) | (0xAA << 8)
assert word == 0x1122AA44 and sign_extend(0xAA, 8) == 0xFFFFFFAA
print("PASS task03 word=1122aa44 lb=ffffffaa lbu=000000aa fault=1")
TASKS = {"task01_store_lanes": task01, "task02_load_extend": task02, "task03_load_store_unit": 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]]()