1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
constants: dict[str, str] = {
# Registers
"rz": "0",
"ra": "1",
"rb": "2",
"rc": "3",
"rd": "4",
"re": "5",
"rf": "6",
"rg": "7",
# ALU instructions
"al_plus": "0",
"al_minus": "1",
"al_and": "2",
"al_or": "3",
"al_xor": "4",
"al_slr": "5",
"al_sar": "6",
"al_sll": "7",
# ALU flags
"f_carry": "0",
"f_overflow": "1",
"f_zero": "2",
"f_sign": "3",
}
labels: dict[str, int] = {}
def check_size(bits: int, val: int) -> None:
if val >= 2 ** bits:
raise Exception(f"Value does not fit in {bits} bits: {val}")
def eval_symbol(c: str) -> str:
if c in labels:
return str(labels[c])
if c in constants:
return constants[c]
return c
def eval_expr(expr: str, bits: int = 16) -> int:
expr = eval_symbol(expr)
ret = eval(expr, labels.copy()) # eval as Python expr
check_size(bits, ret)
return ret
|