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