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