mirror of
https://github.com/aolofsson/oh.git
synced 2025-01-17 20:02:53 +08:00
65aa1b061c
-ovpsim is a dead end, good bye
113 lines
2.9 KiB
Python
Executable File
113 lines
2.9 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
#############################################################################
|
|
# trace2trace <inputfile> <outputfile>
|
|
#
|
|
# Converts a simulator trace file to the epiphany trace format
|
|
#
|
|
# Formats: spike, cgen
|
|
#
|
|
#############################################################################
|
|
import re
|
|
import sys
|
|
|
|
simulator="spike"
|
|
offset=0xffffffff00000000
|
|
|
|
#Input Arguments
|
|
with open(sys.argv[1], 'r') as f:
|
|
file_content = f.read()
|
|
|
|
fileout=open(sys.argv[2],"w")
|
|
|
|
#RISC-V ABI dictionary
|
|
regs={
|
|
"zero":"r0",
|
|
"ra":"r1",
|
|
"sp":"r2",
|
|
"gp":"r3",
|
|
"tp":"r4",
|
|
"t0":"r5",
|
|
"t1":"r6",
|
|
"t2":"r7",
|
|
"s0":"r8",
|
|
"s1":"r9",
|
|
"a0":"r10",
|
|
"a1":"r11",
|
|
"a2":"r12",
|
|
"a3":"r13",
|
|
"a4":"r14",
|
|
"a5":"r15",
|
|
"a6":"r16",
|
|
"a7":"r17",
|
|
"s2":"r18",
|
|
"s3":"r19",
|
|
"s4":"r20",
|
|
"s5":"r21",
|
|
"s6":"r22",
|
|
"s7":"r23",
|
|
"s8":"r24",
|
|
"s9":"r25",
|
|
"s10":"r26",
|
|
"s11":"r27",
|
|
"t3":"r28",
|
|
"t4":"r29",
|
|
"t5":"r30",
|
|
"t6":"r31",
|
|
"mtvec":"mtvec",
|
|
"pmpaddr0":"pmpaddr0",
|
|
"pmpcfg0":"pmpcfg0",
|
|
"mstatus":"mstatus",
|
|
"mepc":"mepc",
|
|
"mcause":"mcause",
|
|
}
|
|
|
|
|
|
#Reading input file into buffer
|
|
if(simulator=="spike") :
|
|
trap=0
|
|
list=file_content.split('core 0: ') #split based on core 0
|
|
for i in list:
|
|
i=re.sub(r'\n', ' ', i) #combine lines
|
|
i=re.sub(r'x (\d{1})',r'x\1', i) #fix brain dead spike print for regs
|
|
i=re.sub(r'^0x0000000000001(.*)',r'', i) #remove spike boot rom
|
|
if(bool(re.search('trap_user_ecall',i))):#filter out everything after ecall
|
|
trap=1
|
|
#filter empty instructions
|
|
if((bool(re.search('0x',i))) & (trap==0)):
|
|
fields=i.split()
|
|
pc=int(fields[0],16)
|
|
opcode=fields[1]
|
|
asm=fields[2]
|
|
#for j in fields:
|
|
# print (j)
|
|
if(re.search('0x',fields[-2])):
|
|
memaddr="--"
|
|
memdata="--"
|
|
reg="--"
|
|
regdata="--"
|
|
elif(re.search('mem',i)):
|
|
memaddr=fields[-2]
|
|
memdata=fields[-1]
|
|
reg="--"
|
|
regdata="--"
|
|
else:
|
|
reg="x{0:02}".format(int(re.sub(r'x',r'', fields[-2])))
|
|
regdata=fields[-1]
|
|
memaddr="--"
|
|
memdata="--"
|
|
#Remove offsets
|
|
if(pc>=offset):
|
|
pc=pc-offset
|
|
#List of entires
|
|
flist=["0x{0:08x}".format(pc),
|
|
opcode,
|
|
"{:<8}".format(asm),
|
|
"{:<3}".format(reg),
|
|
"{:<10}".format(regdata),
|
|
"{:<10}".format(memaddr),
|
|
"{:<10}".format(memdata)]
|
|
outputstring=' , '.join(flist)
|
|
fileout.write(outputstring + "\n")
|
|
fileout.close()
|
|
|