xref: /XiangShan/scripts/statistics.py (revision d70a22729e83ef255c566a9eed5c479baa1c6bf4)
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