blob: 0bfca79768be91d7c7f7bf52cc3bee56841c15f1 [file] [log] [blame]
#!/usr/bin/python
import sys
# import trace generator for D$
from trace_gen import TraceGen
name = str(sys.argv[1])
infile = open(name + ".spike", "r")
outfile = open(name + ".tr", "w")
print("# Trace format: wait (4bit)_padding(124 bit)\n")
print("# send (4bit)_size(4 bit)_address(56 bit)_data(64 bit)\n")
print("# recv (4bit)_size(4 bit)_padding(56 bit)_data(64 bit)\n")
msg = []
lines = infile.readlines()
jal_op = "1101111"
jalr_op = "1100111"
branch_op = "1100011"
# TODO: More elegant solution
skip_unbooted = True
boot_pc = "0x0000000080000124"
tg = TraceGen(addr_width_p=56, data_width_p=64)
for i in xrange(len(lines)-2):
line = lines[i].rstrip("\n\r").split()
stld_line = lines[i+1].rstrip("\n\r").split()
if(len(line) != 0):
if("ecall" in line):
break
if(line[0] == "core" and line[2][:2] == "0x"):
pc = line[2]
instr = line[3][1:-1]
if skip_unbooted and boot_pc != pc:
continue
skip_unbooted = False
op_string = lines[i+1].rstrip("\n\r").split()[0]
# Send a fetch instruction
tg.send_load(0, 15, int(pc, 16))
tg.recv_data(int(instr, 16))
if op_string not in ["lb", "lbu", "lh", "lhu", "lw", "lwu", "ld", "sb", "sh", "sw", "sd"]:
tg.nop()
continue
addr = int(lines[i+5].rstrip("\n\r").split()[1], 16)
data = int(lines[i+5].rstrip("\n\r").split()[3], 16)
if op_string == "lb":
signed = 1
size = 1
tg.send_load(signed, size, addr)
tg.recv_data(data)
elif op_string == "lbu":
signed = 0
size = 1
tg.send_load(signed, size, addr)
tg.recv_data(data)
elif op_string == "lh":
signed = 1
size = 2
tg.send_load(signed, size, addr)
tg.recv_data(data)
elif op_string == "lhu":
signed = 0
size = 2
tg.send_load(signed, size, addr)
tg.recv_data(data)
elif op_string == "lw":
signed = 1
size = 4
tg.send_load(signed, size, addr)
tg.recv_data(data)
elif op_string == "lwu":
signed = 0
size = 4
tg.send_load(signed, size, addr)
tg.recv_data(data)
elif op_string == "ld":
signed = 0
size = 8
tg.send_load(signed, size, addr)
tg.recv_data(data)
elif op_string == "sb":
size = 1
tg.send_store(size, addr, data)
tg.recv_data(0)
elif op_string == "sh":
size = 2
tg.send_store(size, addr, data)
tg.recv_data(0)
elif op_string == "sw":
size = 4
tg.send_store(size, addr, data)
tg.recv_data(0)
elif op_string == "sd":
size = 8
tg.send_store(size, addr, data)
tg.recv_data(0)
tg.test_done()