1import os 2import argparse 3 4def printMap(mp): 5 len_key = max(map(lambda s: len(s), mp.keys())) 6 len_value = max(map(lambda v: len(str(v)), mp.values())) 7 pattern = "{:<" +str(len_key) + "} {:<" +str(len_value)+ "} {:<7}%" 8 total = sum(mp.values()) 9 for k,v in sorted(mp.items(), key=lambda x:x[1], reverse=True): 10 print( 11 pattern.format(k, v, round(v*100.0/total, 3)) 12 ) 13 14 15def analyzeVerilog(filename): 16 mymap = {} 17 last = "" 18 with open(filename, "r") as f: 19 line = f.readline() 20 cnt = 0 21 while(line): 22 if "module " in line: 23 if last!="" : 24 mymap[last] = cnt 25 last = line[7:-2] 26 cnt = 1 27 else: 28 cnt = cnt + 1 29 line = f.readline() 30 mymap[last] = cnt 31 printMap(mymap) 32 33logLevels = ['ALL', 'DEBUG', 'INFO', 'WARN', 'ERROR'] 34 35def listToStr(lst): 36 acc = '' 37 for l in lst: 38 acc += '|' + str(l) if acc else str(l) 39 return acc 40 41def lineStrip(line): 42 return line.replace('\n', '') 43 44def getNumLogLines(filename, modules, ll=logLevels): 45 cmd = "grep -E '\[({0}).*\]\[time=.*\] ({1}):' {2} | wc -l".format( 46 listToStr(ll), 47 listToStr(modules), 48 filename 49 ) 50 res = os.popen(cmd) 51 return int(lineStrip(res.readline()), 10) 52 53def analyzeLog(filename): 54 cmd = "grep -E '\[time=.*\]' {0} ".format(filename) + " | awk -F '(:)' {'print $1'} | awk {'print $NF'} | sort | uniq" 55 res = os.popen(cmd) 56 modules = list(map(lineStrip, res.readlines())) 57 mymap = {} 58 for m in modules: 59 mymap[m] = getNumLogLines(filename, [m]) 60 printMap(mymap) 61 62def main(): 63 parser = argparse.ArgumentParser() 64 parser.add_argument("-v", "--verilogFile", help="verilog file path", type=str) 65 parser.add_argument("-l", "--logFile", help="log file path", type=str) 66 args = parser.parse_args() 67 68 if args.verilogFile: 69 analyzeVerilog(args.verilogFile) 70 71 if args.logFile: 72 analyzeLog(args.logFile) 73 74 if not args.verilogFile and not args.logFile: 75 parser.print_help() 76 77if __name__ == '__main__': 78 main() 79 80