@@ -9,6 +9,9 @@ def parse_pipeline_output(file_path):
99 cycles = []
1010 cycle_blocks = content .split ("--------------------------------" )
1111
12+ current_registers = {f"x{ i } " : 0 for i in range (32 )}
13+ current_memory = {}
14+
1215 # Parse the cycle-by-cycle data
1316 for block in cycle_blocks :
1417 if "Time=" not in block :
@@ -21,6 +24,8 @@ def parse_pipeline_output(file_path):
2124 if cycle_match :
2225 cycle_data ["cycle" ] = int (cycle_match .group (1 ))
2326
27+ # Clear the changed registers from previous cycle
28+ changed_registers = set ()
2429 # Extract IF stage data
2530 pc_match = re .search (r"IF Stage: PC=([0-9a-fA-Fx]+)" , block )
2631 if pc_match :
@@ -85,12 +90,35 @@ def parse_pipeline_output(file_path):
8590 cycle_data ["mem_write" ] = bool (int (control_match .group (4 )))
8691 cycle_data ["alu_src" ] = bool (int (control_match .group (5 )))
8792 cycle_data ["reg_write" ] = bool (int (control_match .group (6 )))
93+
94+ reg_values = {}
95+ reg_matches = re .findall (r"reg\[(\d+)\]=(-?\d+)" , block )
96+ for reg_match in reg_matches :
97+ reg_num = int (reg_match [0 ])
98+ reg_value = int (reg_match [1 ])
99+ reg_name = f"x{ reg_num } "
100+ reg_values [reg_name ] = reg_value
101+
102+ # Update our register tracking
103+ if current_registers .get (reg_name , 0 ) != reg_value :
104+ cycle_data [f"{ reg_name } _changed" ] = True
105+ current_registers [reg_name ] = reg_value
106+
107+ # Copy all current register values to this cycle
108+ for reg , value in current_registers .items ():
109+ cycle_data [reg ] = value
110+
111+ # Mark which registers changed this cycle
112+ for reg_name in changed_registers :
113+ cycle_data [f"{ reg_name } _changed" ] = True
88114
89115 # Extract WB activity (register writes)
90116 wb_match = re .search (r"WB Stage: Writing (-?\d+) to register x(\d+)" , block )
91117 if wb_match :
92118 cycle_data ["reg_write_data" ] = int (wb_match .group (1 ))
93119 cycle_data ["reg_write_rd" ] = int (wb_match .group (2 ))
120+ reg_name = f"x{ int (wb_match .group (2 ))} "
121+ cycle_data [f"{ reg_name } _written" ] = True
94122
95123 # Extract memory access information
96124 mem_read_match = re .search (r"MEM Stage: Reading from address (-?\d+), value=(-?\d+)" , block )
@@ -108,7 +136,6 @@ def parse_pipeline_output(file_path):
108136 cycle_data ["if_stalled" ] = True
109137 cycle_data ["id_stalled" ] = True
110138
111- # Check for load-use hazard keywords
112139 if "hazard detected" in block .lower () or "stalling pipeline" in block .lower ():
113140 cycle_data ["stall" ] = True
114141 cycle_data ["load_hazard" ] = True
@@ -188,10 +215,9 @@ def parse_pipeline_output(file_path):
188215 cycle_data ["flush_occurred" ] = True
189216 cycle_data ["pipeline_recovery" ] = True
190217
191-
192218 cycles .append (cycle_data )
193219
194- # Parse final register and memory state
220+ # Process final memory and register state
195221 final_registers = {}
196222 final_memory = {}
197223
@@ -215,7 +241,7 @@ def parse_pipeline_output(file_path):
215241 mem_value = int (match [1 ])
216242 final_memory [f"mem_{ mem_addr } " ] = mem_value
217243
218- # Add the final register and memory values to the last cycle
244+ # Ensure we have all register values in the last cycle
219245 if cycles and final_registers :
220246 for reg_name , reg_value in final_registers .items ():
221247 cycles [- 1 ][reg_name ] = reg_value
0 commit comments