forked from Github_Repos/cvw
100 lines
3.4 KiB
Python
Executable File
100 lines
3.4 KiB
Python
Executable File
#! /usr/bin/python3
|
|
import sys, os
|
|
|
|
################
|
|
# Helper Funcs #
|
|
################
|
|
|
|
def tokenize(string):
|
|
tokens = []
|
|
token = ''
|
|
whitespace = 0
|
|
prevWhitespace = 0
|
|
for char in string:
|
|
prevWhitespace = whitespace
|
|
whitespace = char in ' \t\n'
|
|
if (whitespace):
|
|
if ((not prevWhitespace) and (token != '')):
|
|
tokens.append(token)
|
|
token = ''
|
|
else:
|
|
token = token + char
|
|
return tokens
|
|
|
|
#############
|
|
# Main Code #
|
|
#############
|
|
print("Begin parsing CPU state.")
|
|
|
|
# Parse Args
|
|
if len(sys.argv) != 2:
|
|
sys.exit('Error parseState.py expects 1 arg:\n parseState.py <path_to_checkpoint_dir>')
|
|
outDir = sys.argv[1]+'/'
|
|
stateGDBpath = outDir+'stateGDB.txt'
|
|
if not os.path.exists(stateGDBpath):
|
|
sys.exit('Error input file '+stateGDBpath+'not found')
|
|
|
|
singleCSRs = ['pc','mip','mie','mscratch','mcause','mepc','mtvec','medeleg','mideleg','sscratch','scause','sepc','stvec','sedeleg','sideleg','satp','mstatus','priv','sie','sip','sstatus']
|
|
# priv (current privilege mode) isn't technically a CSR but we can log it with the same machinery
|
|
thirtyTwoBitCSRs = ['mcounteren','scounteren']
|
|
listCSRs = ['hpmcounter','pmpaddr']
|
|
pmpcfg = ['pmpcfg']
|
|
|
|
# Initialize List CSR files to empty
|
|
# (because later we'll open them in append mode)
|
|
for csr in listCSRs+pmpcfg:
|
|
outFileName = 'checkpoint-'+csr.upper()
|
|
outFile = open(outDir+outFileName, 'w')
|
|
outFile.close()
|
|
|
|
# Initial State for Main Loop
|
|
currState = 'regFile'
|
|
regFileIndex = 0
|
|
outFileName = 'checkpoint-RF'
|
|
outFile = open(outDir+outFileName, 'w')
|
|
|
|
# Main Loop
|
|
with open(stateGDBpath, 'r') as stateGDB:
|
|
for line in stateGDB:
|
|
line = tokenize(line)
|
|
name = line[0]
|
|
val = line[1][2:]
|
|
if (currState == 'regFile'):
|
|
if (regFileIndex == 0 and name != 'zero'):
|
|
print('Whoops! Expected regFile registers to come first, starting with zero')
|
|
exit(1)
|
|
if (name != 'zero'):
|
|
# Wally doesn't need to know zero=0
|
|
outFile.write(val+'\n')
|
|
regFileIndex += 1
|
|
if (regFileIndex == 32):
|
|
outFile.close()
|
|
currState = 'CSRs'
|
|
elif (currState == 'CSRs'):
|
|
if name in singleCSRs:
|
|
outFileName = 'checkpoint-'+name.upper()
|
|
outFile = open(outDir+outFileName, 'w')
|
|
outFile.write(val+'\n')
|
|
outFile.close()
|
|
elif name in thirtyTwoBitCSRs:
|
|
outFileName = 'checkpoint-'+name.upper()
|
|
outFile = open(outDir+outFileName, 'w')
|
|
val = int(val,16) & 0xffffffff
|
|
outFile.write(hex(val)[2:]+'\n')
|
|
outFile.close()
|
|
elif name.strip('0123456789') in listCSRs:
|
|
outFileName = 'checkpoint-'+name.upper().strip('0123456789')
|
|
outFile = open(outDir+outFileName, 'a')
|
|
outFile.write(val+'\n')
|
|
outFile.close()
|
|
elif name.strip('0123456789') in pmpcfg:
|
|
outFileName = 'checkpoint-'+name.upper().strip('0123456789')
|
|
outFile = open(outDir+outFileName, 'a')
|
|
fourPmp = int(val,16)
|
|
for i in range(0,4):
|
|
byte = (fourPmp >> 8*i) & 0xff
|
|
outFile.write(hex(byte)[2:]+'\n')
|
|
outFile.close()
|
|
|
|
print("Finished parsing CPU state!")
|