166 lines
5.1 KiB
Python
Executable File
166 lines
5.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import sys
|
|
import signal
|
|
import re
|
|
import time
|
|
|
|
PRINT_BUF = 0x20000 / 4
|
|
|
|
def translator(line):
|
|
if 'core-req-wr' in line:
|
|
# Check rs1_data's last element condition
|
|
rs1_data_start = line.find('addr={') + len('addr={')
|
|
rs1_data_end = line.find('}', rs1_data_start)
|
|
rs1_data_elts = line[rs1_data_start:rs1_data_end].split(', ')
|
|
|
|
byteen_start = line.find('byteen={') + len('byteen={')
|
|
byteen_end = line.find('}', byteen_start)
|
|
byteen_elts = line[byteen_start:byteen_end].split(', ')
|
|
|
|
rs2_data_start = line.find('data={') + len('data={')
|
|
rs2_data_end = line.find('}', rs2_data_start)
|
|
rs2_data_elts = line[rs2_data_start:rs2_data_end].split(', ')
|
|
|
|
# print(rs1_data_last_element)
|
|
for rs1, rs2, byteen in zip(rs1_data_elts, rs2_data_elts, byteen_elts):
|
|
if int(rs1, 16) >> 18 == 0xff0:
|
|
offset = (int(rs1, 16) - PRINT_BUF) % 65536
|
|
if offset < 0 or offset >= 1024:
|
|
continue
|
|
else:
|
|
offset = offset % 16384
|
|
# Extract rs2_data's last element
|
|
|
|
hex_value = rs2[2:] # Remove the '0x' prefix
|
|
if "x" in hex_value:
|
|
continue
|
|
byteen_int = int(byteen, 16)
|
|
hex_value = "0" * (8 - len(hex_value)) + hex_value
|
|
bytes_object = bytes.fromhex(hex_value) # .replace(b"\x00", b"")
|
|
|
|
masked_bytes_list = []
|
|
|
|
assert(len(bytes_object) == 4)
|
|
|
|
for i, byte in enumerate(bytes_object[::-1]):
|
|
if byteen_int & (1 << i):
|
|
masked_bytes_list.append(byte)
|
|
|
|
reversed_bytes = bytes(masked_bytes_list)
|
|
# print(reversed_bytes.decode('utf-8', errors="ignore"))
|
|
try:
|
|
return reversed_bytes.decode('ascii', errors="ignore")
|
|
except UnicodeDecodeError:
|
|
return ""
|
|
|
|
def timestamp_parser(line):
|
|
match = re.match(r"^\s*(\d+):", line)
|
|
if match:
|
|
return match.group(1)
|
|
else:
|
|
return ""
|
|
|
|
sim_started = False
|
|
sim_ended = False
|
|
|
|
def signal_handler(sig, frame):
|
|
if sim_started:
|
|
print("\033[B")
|
|
sys.exit(0)
|
|
|
|
def main():
|
|
signal.signal(signal.SIGINT, signal_handler)
|
|
|
|
curr_timestamp = -1
|
|
prev_timestamp = -1
|
|
curr_clock = time.time()
|
|
prev_clock = time.time()
|
|
re_start_num = re.compile(r"^\s*[0-9]+:")
|
|
|
|
ts_countdown = 100
|
|
global sim_started, sim_ended
|
|
perf_counters = False
|
|
hang_detector = 0
|
|
|
|
# if (len(sys.argv) > 1) and (sys.argv[1] == "started"):
|
|
# sim_started = True
|
|
run_label = sys.argv[1]
|
|
lineno = int(sys.argv[2])
|
|
|
|
print("\033[2J\033[H")
|
|
|
|
for line in sys.stdin:
|
|
line = line.rstrip('\n')
|
|
|
|
if "Chronologic VCS simulator" in line:
|
|
sim_started = True
|
|
|
|
sim_nontrace = re.match(re_start_num, line) is None
|
|
|
|
if "====================CORE" in line:
|
|
perf_counters = True
|
|
if hang_detector >= 8:
|
|
pass
|
|
# print("\n\033[3mpossible hang detected\033[0m\n")
|
|
|
|
if "has no more active warps" in line:
|
|
sim_ended = True
|
|
|
|
if (not sim_started):
|
|
print(line)
|
|
continue
|
|
|
|
if sim_ended:
|
|
if "has no more active warps" not in line:
|
|
sim_ended = False
|
|
else:
|
|
continue
|
|
|
|
if sim_started and (not sim_ended):
|
|
if sim_nontrace:
|
|
if not perf_counters:
|
|
print(line)
|
|
elif line.startswith("dcache stores:"):
|
|
perf_counters = False
|
|
hang_detector += 1
|
|
continue
|
|
else:
|
|
hang_detector = 0
|
|
|
|
if ts_countdown == 0:
|
|
match = re.match(r"^\s*(\d+):", line)
|
|
if match:
|
|
prev_clock = curr_clock
|
|
prev_timestamp = curr_timestamp
|
|
curr_clock = time.time()
|
|
curr_timestamp = match.group(1)
|
|
speed_in_hz = (int(curr_timestamp) - int(prev_timestamp)) / (curr_clock - prev_clock) if curr_clock - prev_clock > 0 else 0
|
|
|
|
# Save cursor position
|
|
print("\033[s", end='')
|
|
# Move cursor to top-left corner, clear line, bold, timestamp, unbold
|
|
print("\033[" + str(lineno) + "H\033[2K\033[1m" + run_label,
|
|
"[TIME]", curr_timestamp, "[SPEED]", int(speed_in_hz), "\033[0m", end='')
|
|
# Restore cursor position
|
|
print("\033[u", end='', flush=True)
|
|
|
|
ts_countdown = 200
|
|
else:
|
|
ts_countdown = 10
|
|
|
|
ts_countdown -= 1
|
|
translated_line = translator(line)
|
|
|
|
if translated_line:
|
|
print(translated_line, end='')
|
|
sys.stdout.flush()
|
|
|
|
print("\033[2J\033[s", end='')
|
|
print("\033[" + str(lineno) + "H\033[2K\033[1m" + run_label, "DONE", "\033[0m", end='')
|
|
print("\033[u", end='', flush=True)
|
|
|
|
if __name__ == '__main__':
|
|
main()
|
|
|