#!/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]]()