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