__init__.py revision 8986
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(): 708296Snate@binkert.org fatal("stat check failed for '%s' %d\n", stat.name, stat.id) 718296Snate@binkert.org 728296Snate@binkert.org if not (stat.flags & flags.display): 738296Snate@binkert.org stat.name = "__Stat%06d" % stat.id 748296Snate@binkert.org 758295Snate@binkert.org def less(stat1, stat2): 768295Snate@binkert.org v1 = stat1.name.split('.') 778295Snate@binkert.org v2 = stat2.name.split('.') 788295Snate@binkert.org return v1 < v2 798295Snate@binkert.org 808295Snate@binkert.org stats_list.sort(less) 818295Snate@binkert.org for stat in stats_list: 828295Snate@binkert.org stats_dict[stat.name] = stat 838296Snate@binkert.org stat.enable() 848295Snate@binkert.org 858986SAli.Saidi@ARM.com internal.stats.enable(); 868986SAli.Saidi@ARM.com 878296Snate@binkert.orgdef prepare(): 888296Snate@binkert.org '''Prepare all stats for data access. This must be done before 898296Snate@binkert.org dumping and serialization.''' 906001SN/A 918296Snate@binkert.org for stat in stats_list: 928296Snate@binkert.org stat.prepare() 938296Snate@binkert.org 948296Snate@binkert.orglastDump = 0 956001SN/Adef dump(): 968296Snate@binkert.org '''Dump all statistics data to the registered outputs''' 976001SN/A 988296Snate@binkert.org curTick = m5.curTick() 998296Snate@binkert.org 1008296Snate@binkert.org global lastDump 1018296Snate@binkert.org assert lastDump <= curTick 1028296Snate@binkert.org if lastDump == curTick: 1038296Snate@binkert.org return 1048296Snate@binkert.org lastDump = curTick 1058296Snate@binkert.org 1068296Snate@binkert.org prepare() 1078296Snate@binkert.org 1088296Snate@binkert.org for output in outputList: 1098296Snate@binkert.org if output.valid(): 1108296Snate@binkert.org output.begin() 1118296Snate@binkert.org for stat in stats_list: 1128296Snate@binkert.org output.visit(stat) 1138296Snate@binkert.org output.end() 1146001SN/A 1156001SN/Adef reset(): 1168296Snate@binkert.org '''Reset all statistics to the base state''' 1178296Snate@binkert.org 1187527SN/A # call reset stats on all SimObjects 1197527SN/A root = Root.getInstance() 1207802SN/A if root: 1217802SN/A for obj in root.descendants(): obj.resetStats() 1227802SN/A 1237527SN/A # call any other registered stats reset callbacks 1248296Snate@binkert.org for stat in stats_list: 1258296Snate@binkert.org stat.reset() 1268296Snate@binkert.org 1278296Snate@binkert.org internal.stats.processResetQueue() 1288295Snate@binkert.org 1298295Snate@binkert.orgflags = attrdict({ 1308295Snate@binkert.org 'none' : 0x0000, 1318295Snate@binkert.org 'init' : 0x0001, 1328295Snate@binkert.org 'display' : 0x0002, 1338295Snate@binkert.org 'total' : 0x0010, 1348295Snate@binkert.org 'pdf' : 0x0020, 1358295Snate@binkert.org 'cdf' : 0x0040, 1368295Snate@binkert.org 'dist' : 0x0080, 1378295Snate@binkert.org 'nozero' : 0x0100, 1388295Snate@binkert.org 'nonan' : 0x0200, 1398295Snate@binkert.org}) 140