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