xref: /XiangShan/scripts/statistics.py (revision c6d439803a044ea209139672b25e35fe8d7f4aa0)
1*c6d43980SLemover#***************************************************************************************
2*c6d43980SLemover# Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3*c6d43980SLemover#
4*c6d43980SLemover# XiangShan is licensed under Mulan PSL v2.
5*c6d43980SLemover# You can use this software according to the terms and conditions of the Mulan PSL v2.
6*c6d43980SLemover# You may obtain a copy of Mulan PSL v2 at:
7*c6d43980SLemover#          http://license.coscl.org.cn/MulanPSL2
8*c6d43980SLemover#
9*c6d43980SLemover# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
10*c6d43980SLemover# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
11*c6d43980SLemover# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
12*c6d43980SLemover#
13*c6d43980SLemover# See the Mulan PSL v2 for more details.
14*c6d43980SLemover#***************************************************************************************
15*c6d43980SLemover
161831da28Slinjiaweiimport os
171831da28Slinjiaweiimport argparse
181831da28Slinjiawei
191831da28Slinjiaweidef printMap(mp):
201831da28Slinjiawei    len_key = max(map(lambda s: len(s), mp.keys()))
211831da28Slinjiawei    len_value = max(map(lambda v: len(str(v)), mp.values()))
221831da28Slinjiawei    pattern = "{:<" +str(len_key) + "} {:<" +str(len_value)+ "} {:<7}%"
231831da28Slinjiawei    total = sum(mp.values())
241831da28Slinjiawei    for k,v in sorted(mp.items(), key=lambda x:x[1], reverse=True):
251831da28Slinjiawei        print(
261831da28Slinjiawei            pattern.format(k, v, round(v*100.0/total, 3))
271831da28Slinjiawei        )
281831da28Slinjiawei
291831da28Slinjiawei
301831da28Slinjiaweidef analyzeVerilog(filename):
31cba8f453SLinJiawei    mymap = {}
32cba8f453SLinJiawei    last = ""
331831da28Slinjiawei    with open(filename, "r") as f:
34cba8f453SLinJiawei        line = f.readline()
35cba8f453SLinJiawei        cnt = 0
36cba8f453SLinJiawei        while(line):
37cba8f453SLinJiawei            if "module " in line:
38cba8f453SLinJiawei                if last!="" :
39cba8f453SLinJiawei                    mymap[last] = cnt
401831da28Slinjiawei                last = line[7:-2]
41cba8f453SLinJiawei                cnt = 1
42cba8f453SLinJiawei            else:
43cba8f453SLinJiawei                cnt = cnt + 1
44cba8f453SLinJiawei            line = f.readline()
458a8250e2SLinJiawei        mymap[last] = cnt
461831da28Slinjiawei        printMap(mymap)
471831da28Slinjiawei
481831da28SlinjiaweilogLevels = ['ALL', 'DEBUG', 'INFO', 'WARN', 'ERROR']
491831da28Slinjiawei
501831da28Slinjiaweidef listToStr(lst):
511831da28Slinjiawei    acc = ''
521831da28Slinjiawei    for l in lst:
531831da28Slinjiawei        acc += '|' + str(l) if acc else str(l)
541831da28Slinjiawei    return acc
551831da28Slinjiawei
561831da28Slinjiaweidef lineStrip(line):
571831da28Slinjiawei    return line.replace('\n', '')
581831da28Slinjiawei
591831da28Slinjiaweidef getNumLogLines(filename, modules, ll=logLevels):
601831da28Slinjiawei    cmd = "grep -E '\[({0}).*\]\[time=.*\] ({1}):' {2} | wc -l".format(
611831da28Slinjiawei        listToStr(ll),
621831da28Slinjiawei        listToStr(modules),
631831da28Slinjiawei        filename
641831da28Slinjiawei    )
651831da28Slinjiawei    res = os.popen(cmd)
661831da28Slinjiawei    return int(lineStrip(res.readline()), 10)
671831da28Slinjiawei
681831da28Slinjiaweidef analyzeLog(filename):
691831da28Slinjiawei    cmd = "grep -E '\[time=.*\]' {0} ".format(filename) + " | awk -F '(:)' {'print $1'} | awk  {'print $NF'} | sort | uniq"
701831da28Slinjiawei    res = os.popen(cmd)
711831da28Slinjiawei    modules = list(map(lineStrip, res.readlines()))
721831da28Slinjiawei    mymap = {}
731831da28Slinjiawei    for m in modules:
741831da28Slinjiawei        mymap[m] = getNumLogLines(filename, [m])
751831da28Slinjiawei    printMap(mymap)
761831da28Slinjiawei
771831da28Slinjiaweidef main():
781831da28Slinjiawei    parser = argparse.ArgumentParser()
791831da28Slinjiawei    parser.add_argument("-v", "--verilogFile", help="verilog file path", type=str)
801831da28Slinjiawei    parser.add_argument("-l", "--logFile", help="log file path", type=str)
811831da28Slinjiawei    args = parser.parse_args()
821831da28Slinjiawei
831831da28Slinjiawei    if args.verilogFile:
841831da28Slinjiawei        analyzeVerilog(args.verilogFile)
851831da28Slinjiawei
861831da28Slinjiawei    if args.logFile:
871831da28Slinjiawei        analyzeLog(args.logFile)
881831da28Slinjiawei
891831da28Slinjiawei    if not args.verilogFile and not args.logFile:
901831da28Slinjiawei        parser.print_help()
911831da28Slinjiawei
921831da28Slinjiaweiif __name__ == '__main__':
931831da28Slinjiawei    main()
941831da28Slinjiawei
95