-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIR_engine.py
More file actions
66 lines (50 loc) · 1.67 KB
/
IR_engine.py
File metadata and controls
66 lines (50 loc) · 1.67 KB
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
class IREngine:
def __init__(self):
self.MAX_STEPS = 10000
self.reset()
def reset(self):
self.program = []
self.registers = {}
self.flags = {}
self.pc = 0
self.steps = 0
def load_program(self, program):
self.reset()
self.program = program
def run(self):
while self.pc < len(self.program):
self.steps += 1
if self.steps > self.MAX_STEPS:
break
instr = self.program[self.pc]
if not isinstance(instr, dict):
self.pc += 1
continue
op = instr.get("opcode")
if op == "LOAD":
self.registers[instr.get("arg1")] = instr.get("arg2")
elif op == "ADD":
self.registers[instr.get("arg3")] = (
self.registers.get(instr.get("arg1"), 0)
+ self.registers.get(instr.get("arg2"), 0)
)
elif op == "CMP":
self.flags["Z"] = (
self.registers.get(instr.get("arg1")) ==
self.registers.get(instr.get("arg2"))
)
elif op == "JZ":
if self.flags.get("Z"):
self.pc = self._find(instr.get("arg1"))
continue
elif op == "JMP":
self.pc = self._find(instr.get("arg1"))
continue
elif op == "HALT":
break
self.pc += 1
def _find(self, label):
for i, ins in enumerate(self.program):
if ins.get("label") == label:
return i
return self.pc + 1