__init__.py revision 10169
14126SN/A# Copyright (c) 2007 The Regents of The University of Michigan 28295Snate@binkert.org# Copyright (c) 2010 The Hewlett-Packard Development Company 34126SN/A# All rights reserved. 44126SN/A# 54126SN/A# Redistribution and use in source and binary forms, with or without 64126SN/A# modification, are permitted provided that the following conditions are 74126SN/A# met: redistributions of source code must retain the above copyright 84126SN/A# notice, this list of conditions and the following disclaimer; 94126SN/A# redistributions in binary form must reproduce the above copyright 104126SN/A# notice, this list of conditions and the following disclaimer in the 114126SN/A# documentation and/or other materials provided with the distribution; 124126SN/A# neither the name of the copyright holders nor the names of its 134126SN/A# contributors may be used to endorse or promote products derived from 144126SN/A# this software without specific prior written permission. 154126SN/A# 164126SN/A# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 174126SN/A# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 184126SN/A# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 194126SN/A# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 204126SN/A# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 214126SN/A# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 224126SN/A# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 234126SN/A# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 244126SN/A# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 254126SN/A# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 264126SN/A# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274126SN/A# 284126SN/A# Authors: Nathan Binkert 294126SN/A 308296Snate@binkert.orgimport m5 318296Snate@binkert.org 328295Snate@binkert.orgfrom m5 import internal 338295Snate@binkert.orgfrom m5.internal.stats import schedStatEvent as schedEvent 348295Snate@binkert.orgfrom m5.objects import Root 358296Snate@binkert.orgfrom m5.util import attrdict, fatal 364126SN/A 378296Snate@binkert.orgoutputList = [] 386126SN/Adef initText(filename, desc=True): 398296Snate@binkert.org output = internal.stats.initText(filename, desc) 408296Snate@binkert.org outputList.append(output) 414126SN/A 426001SN/Adef initSimStats(): 436001SN/A internal.stats.initSimStats() 446001SN/A 458295Snate@binkert.orgnames = [] 468295Snate@binkert.orgstats_dict = {} 478295Snate@binkert.orgstats_list = [] 488295Snate@binkert.orgraw_stats_list = [] 496001SN/Adef enable(): 508295Snate@binkert.org '''Enable the statistics package. Before the statistics package is 518295Snate@binkert.org enabled, all statistics must be created and initialized and once 528295Snate@binkert.org the package is enabled, no more statistics can be created.''' 538295Snate@binkert.org __dynamic_cast = [] 548295Snate@binkert.org for k, v in internal.stats.__dict__.iteritems(): 558295Snate@binkert.org if k.startswith('dynamic_'): 568295Snate@binkert.org __dynamic_cast.append(v) 578295Snate@binkert.org 588295Snate@binkert.org for stat in internal.stats.statsList(): 598295Snate@binkert.org for cast in __dynamic_cast: 608295Snate@binkert.org val = cast(stat) 618295Snate@binkert.org if val is not None: 628295Snate@binkert.org stats_list.append(val) 638295Snate@binkert.org raw_stats_list.append(val) 648295Snate@binkert.org break 658295Snate@binkert.org else: 668295Snate@binkert.org fatal("unknown stat type %s", stat) 678295Snate@binkert.org 688296Snate@binkert.org for stat in stats_list: 698296Snate@binkert.org if not stat.check() or not stat.baseCheck(): 7010169SCurtis.Dunham@arm.com fatal("statistic '%s' (%d) was not properly initialized " \ 7110169SCurtis.Dunham@arm.com "by a regStats() function\n", stat.name, stat.id) 728296Snate@binkert.org 738296Snate@binkert.org if not (stat.flags & flags.display): 748296Snate@binkert.org stat.name = "__Stat%06d" % stat.id 758296Snate@binkert.org 768295Snate@binkert.org def less(stat1, stat2): 778295Snate@binkert.org v1 = stat1.name.split('.') 788295Snate@binkert.org v2 = stat2.name.split('.') 798295Snate@binkert.org return v1 < v2 808295Snate@binkert.org 818295Snate@binkert.org stats_list.sort(less) 828295Snate@binkert.org for stat in stats_list: 838295Snate@binkert.org stats_dict[stat.name] = stat 848296Snate@binkert.org stat.enable() 858295Snate@binkert.org 868986SAli.Saidi@ARM.com internal.stats.enable(); 878986SAli.Saidi@ARM.com 888296Snate@binkert.orgdef prepare(): 898296Snate@binkert.org '''Prepare all stats for data access. This must be done before 908296Snate@binkert.org dumping and serialization.''' 916001SN/A 928296Snate@binkert.org for stat in stats_list: 938296Snate@binkert.org stat.prepare() 948296Snate@binkert.org 958296Snate@binkert.orglastDump = 0 966001SN/Adef dump(): 978296Snate@binkert.org '''Dump all statistics data to the registered outputs''' 986001SN/A 998296Snate@binkert.org curTick = m5.curTick() 1008296Snate@binkert.org 1018296Snate@binkert.org global lastDump 1028296Snate@binkert.org assert lastDump <= curTick 1038296Snate@binkert.org if lastDump == curTick: 1048296Snate@binkert.org return 1058296Snate@binkert.org lastDump = curTick 1068296Snate@binkert.org 1079042SMitchell.Hayenga@ARM.com internal.stats.processDumpQueue() 1089042SMitchell.Hayenga@ARM.com 1098296Snate@binkert.org prepare() 1108296Snate@binkert.org 1118296Snate@binkert.org for output in outputList: 1128296Snate@binkert.org if output.valid(): 1138296Snate@binkert.org output.begin() 1148296Snate@binkert.org for stat in stats_list: 1158296Snate@binkert.org output.visit(stat) 1168296Snate@binkert.org output.end() 1176001SN/A 1186001SN/Adef reset(): 1198296Snate@binkert.org '''Reset all statistics to the base state''' 1208296Snate@binkert.org 1217527SN/A # call reset stats on all SimObjects 1227527SN/A root = Root.getInstance() 1237802SN/A if root: 1247802SN/A for obj in root.descendants(): obj.resetStats() 1257802SN/A 1267527SN/A # call any other registered stats reset callbacks 1278296Snate@binkert.org for stat in stats_list: 1288296Snate@binkert.org stat.reset() 1298296Snate@binkert.org 1308296Snate@binkert.org internal.stats.processResetQueue() 1318295Snate@binkert.org 1328295Snate@binkert.orgflags = attrdict({ 1338295Snate@binkert.org 'none' : 0x0000, 1348295Snate@binkert.org 'init' : 0x0001, 1358295Snate@binkert.org 'display' : 0x0002, 1368295Snate@binkert.org 'total' : 0x0010, 1378295Snate@binkert.org 'pdf' : 0x0020, 1388295Snate@binkert.org 'cdf' : 0x0040, 1398295Snate@binkert.org 'dist' : 0x0080, 1408295Snate@binkert.org 'nozero' : 0x0100, 1418295Snate@binkert.org 'nonan' : 0x0200, 1428295Snate@binkert.org}) 143