From 9260d34ae49fb28d72d7d2e56ddb2eb33e1dc629 Mon Sep 17 00:00:00 2001 From: Sam Hadow Date: Fri, 5 Apr 2024 09:37:11 +0200 Subject: [PATCH] comments --- src/ram.py | 47 ++++++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/src/ram.py b/src/ram.py index 75d2d60..605aa0f 100644 --- a/src/ram.py +++ b/src/ram.py @@ -9,7 +9,7 @@ class Ram(object): def read_register(self, type_register, index, ref_origin=None, ref_target=None): ''' - Read from a register + Read from a register, return the value ''' if type_register == "i": # input return self.input_registers[index] @@ -48,6 +48,10 @@ class Ram(object): self.write_register(value, ref_target, target_index) def op(self, type_op, r1, r2, r3): + ''' + Arithmetic operation (addition, subtraction, division, multiplication) + r3 = r1 op r2 + ''' self.current += 1 if type_op == 'ADD': value_1 = self.read_register(*r1) @@ -71,6 +75,9 @@ class Ram(object): self.write_register(value_3, *r3) def op_ctrl(self, type_op, z, r1=None, r2=None): + ''' + Control operation (Jump, Jump if equal, Jump if less) + ''' if type_op == 'JUMP': if isinstance(z, int): self.current += z @@ -92,12 +99,19 @@ class Ram(object): self.current += 1 def execute(self): + ''' + Run machine to completion + ''' while self.current < len(self.instr): print(self.current) print(*self.instr[self.current]['args']) self.instr[self.current]['op'](self, *self.instr[self.current]['args']) def generate_graph(self): + ''' + Return precedance graph edges between instructions + (instr1, instr2) exists if instr2 is reachable from instr1 in 1 step + ''' graph_edges = [] n_instr = len(self.instr) for (n,instr) in enumerate(self.instr): @@ -114,6 +128,9 @@ class Ram(object): return graph_edges def accessible_instr(self): + ''' + Return a list of accessible instructions in a machine + ''' graph_edges = self.generate_graph() accessible_from_instr = dict() for edge in graph_edges: @@ -133,32 +150,12 @@ class Ram(object): return sorted(accessible) def remove_unreachable_instr(self): + ''' + Remove dead code in a machine (unreachable instructions) + Print all the instructions still in the machine after + ''' accessible = self.accessible_instr() new_instr = [instr for (i,instr) in enumerate(self.instr) if i in accessible] for instr in new_instr: print(instr) self.instr = new_instr - - - - -### example -# input_registers = [10, 5, 1] -# -# instructions = [ -# {'op': Ram.op, 'args': ('ADD', ('i', 0), ('value', 1), ('o', 2))}, -# {'op': Ram.op, 'args': ('ADD', ('value', 0), ('@', 2, 'i', 'i'), ('o', 1))}, -# ] - -# input_registers = [10, 5, 1, 2, 4] -# instructions = [ {"op": Ram.op, "args": ('ADD', ('i', 0), ('value', 1), ('r', 0))}, -# {"op": Ram.op, "args": ('SUB', ('i', 1), ('value', 3), ('r', 1))}, -# {"op": Ram.op, "args": ('MULT', ('r', 1), ('r', 0), ('o', 1))}, -# ] - - -# ram = Ram(instructions, input_registers) - -# ram.execute() - -# print("Result:", ram.output_registers)