57 lines
1.9 KiB
Python
57 lines
1.9 KiB
Python
|
|
#!/usr/bin/python3
|
||
|
|
|
||
|
|
import os
|
||
|
|
import sys
|
||
|
|
import traceback
|
||
|
|
import re
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
def search_custom_inst(logfile, opcode, funct, xd = 0, xs1 = 0, xs2 = 0, xd_filter = 0, xs1_filter = 0, xs2_filter = 0):
|
||
|
|
lines = logfile.readlines()
|
||
|
|
funct3 = 0
|
||
|
|
if xd != 0:
|
||
|
|
funct3 = funct3 | 0x4
|
||
|
|
if xs1 != 0:
|
||
|
|
funct3 = funct3 | 0x2
|
||
|
|
if xs2 != 0:
|
||
|
|
funct3 = funct3 | 0x1
|
||
|
|
|
||
|
|
for line in lines:
|
||
|
|
inst = re.findall(r"inst=\[[\da-fA-F]{8}\]", line)
|
||
|
|
wreg = re.findall(r"W\[r[\ \d]{2}=[\da-fA-F]{8}\]", line)
|
||
|
|
rreg = re.findall(r"R\[r[\ \d]{2}=[\da-fA-F]{8}\]", line)
|
||
|
|
if len(inst) > 0:
|
||
|
|
inst = int('0x' + inst[0][6:-1], 16)
|
||
|
|
wreg_val = int('0x' + wreg[0][6:-1], 16)
|
||
|
|
rreg1_val = int('0x' + rreg[0][6:-1], 16)
|
||
|
|
rreg2_val = int('0x' + rreg[1][6:-1], 16)
|
||
|
|
ins_opcode = inst & 0x7f
|
||
|
|
#只对R系列的custom0进行解码
|
||
|
|
if opcode == ins_opcode:
|
||
|
|
ins_funct = (inst >> 25) & 0x7f
|
||
|
|
ins_funct3 = (inst >> 12) & 0x7
|
||
|
|
if (ins_funct == funct) and (funct3 == ins_funct3):
|
||
|
|
outline = line.rstrip()
|
||
|
|
if (xs1 != 0) and ((rreg1_val & xs1_filter) != 0):
|
||
|
|
print(outline)
|
||
|
|
if (xd != 0) and ((wreg_val & xd_filter) != 0):
|
||
|
|
print(outline)
|
||
|
|
if (xs2 != 0) and ((rreg2_val & xs2_filter) != 0):
|
||
|
|
print(outline)
|
||
|
|
else:
|
||
|
|
pass
|
||
|
|
|
||
|
|
if __name__ == '__main__':
|
||
|
|
path = sys.argv[0]
|
||
|
|
path = path.split('/')[0:-1]
|
||
|
|
path = '/'.join(path)
|
||
|
|
logfile_path = path + '/../build/cpu1_log.txt'
|
||
|
|
if len(sys.argv) > 1:
|
||
|
|
logfile_path = sys.argv[1]
|
||
|
|
print(logfile_path)
|
||
|
|
|
||
|
|
with open(logfile_path, 'rt') as logfile:
|
||
|
|
search_custom_inst(logfile, 0xb, 0x17, xs1=1, xs1_filter=(1<<7))
|
||
|
|
logfile.close()
|