__init__.py revision 11788
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.objects import Root 348296Snate@binkert.orgfrom m5.util import attrdict, fatal 354126SN/A 3611766Sandreas.sandberg@arm.com# Stat exports 3711766Sandreas.sandberg@arm.comfrom m5.internal.stats import schedStatEvent as schedEvent 3811766Sandreas.sandberg@arm.comfrom m5.internal.stats import periodicStatDump 3911766Sandreas.sandberg@arm.com 408296Snate@binkert.orgoutputList = [] 416126SN/Adef initText(filename, desc=True): 428296Snate@binkert.org output = internal.stats.initText(filename, desc) 438296Snate@binkert.org outputList.append(output) 444126SN/A 456001SN/Adef initSimStats(): 466001SN/A internal.stats.initSimStats() 4710453SAndrew.Bardsley@arm.com internal.stats.registerPythonStatsHandlers() 486001SN/A 498295Snate@binkert.orgnames = [] 508295Snate@binkert.orgstats_dict = {} 518295Snate@binkert.orgstats_list = [] 526001SN/Adef enable(): 538295Snate@binkert.org '''Enable the statistics package. Before the statistics package is 548295Snate@binkert.org enabled, all statistics must be created and initialized and once 558295Snate@binkert.org the package is enabled, no more statistics can be created.''' 568295Snate@binkert.org 5711788Sandreas.sandberg@arm.com global stats_list 5811788Sandreas.sandberg@arm.com stats_list = list(internal.stats.statsList()) 598295Snate@binkert.org 608296Snate@binkert.org for stat in stats_list: 618296Snate@binkert.org if not stat.check() or not stat.baseCheck(): 6210169SCurtis.Dunham@arm.com fatal("statistic '%s' (%d) was not properly initialized " \ 6310169SCurtis.Dunham@arm.com "by a regStats() function\n", stat.name, stat.id) 648296Snate@binkert.org 658296Snate@binkert.org if not (stat.flags & flags.display): 668296Snate@binkert.org stat.name = "__Stat%06d" % stat.id 678296Snate@binkert.org 688295Snate@binkert.org def less(stat1, stat2): 698295Snate@binkert.org v1 = stat1.name.split('.') 708295Snate@binkert.org v2 = stat2.name.split('.') 718295Snate@binkert.org return v1 < v2 728295Snate@binkert.org 738295Snate@binkert.org stats_list.sort(less) 748295Snate@binkert.org for stat in stats_list: 758295Snate@binkert.org stats_dict[stat.name] = stat 768296Snate@binkert.org stat.enable() 778295Snate@binkert.org 788986SAli.Saidi@ARM.com internal.stats.enable(); 798986SAli.Saidi@ARM.com 808296Snate@binkert.orgdef prepare(): 818296Snate@binkert.org '''Prepare all stats for data access. This must be done before 828296Snate@binkert.org dumping and serialization.''' 836001SN/A 848296Snate@binkert.org for stat in stats_list: 858296Snate@binkert.org stat.prepare() 868296Snate@binkert.org 878296Snate@binkert.orglastDump = 0 886001SN/Adef dump(): 898296Snate@binkert.org '''Dump all statistics data to the registered outputs''' 906001SN/A 918296Snate@binkert.org curTick = m5.curTick() 928296Snate@binkert.org 938296Snate@binkert.org global lastDump 948296Snate@binkert.org assert lastDump <= curTick 958296Snate@binkert.org if lastDump == curTick: 968296Snate@binkert.org return 978296Snate@binkert.org lastDump = curTick 988296Snate@binkert.org 999042SMitchell.Hayenga@ARM.com internal.stats.processDumpQueue() 1009042SMitchell.Hayenga@ARM.com 1018296Snate@binkert.org prepare() 1028296Snate@binkert.org 1038296Snate@binkert.org for output in outputList: 1048296Snate@binkert.org if output.valid(): 1058296Snate@binkert.org output.begin() 1068296Snate@binkert.org for stat in stats_list: 10711788Sandreas.sandberg@arm.com stat.visit(output) 1088296Snate@binkert.org output.end() 1096001SN/A 1106001SN/Adef reset(): 1118296Snate@binkert.org '''Reset all statistics to the base state''' 1128296Snate@binkert.org 1137527SN/A # call reset stats on all SimObjects 1147527SN/A root = Root.getInstance() 1157802SN/A if root: 1167802SN/A for obj in root.descendants(): obj.resetStats() 1177802SN/A 1187527SN/A # call any other registered stats reset callbacks 1198296Snate@binkert.org for stat in stats_list: 1208296Snate@binkert.org stat.reset() 1218296Snate@binkert.org 1228296Snate@binkert.org internal.stats.processResetQueue() 1238295Snate@binkert.org 1248295Snate@binkert.orgflags = attrdict({ 1258295Snate@binkert.org 'none' : 0x0000, 1268295Snate@binkert.org 'init' : 0x0001, 1278295Snate@binkert.org 'display' : 0x0002, 1288295Snate@binkert.org 'total' : 0x0010, 1298295Snate@binkert.org 'pdf' : 0x0020, 1308295Snate@binkert.org 'cdf' : 0x0040, 1318295Snate@binkert.org 'dist' : 0x0080, 1328295Snate@binkert.org 'nozero' : 0x0100, 1338295Snate@binkert.org 'nonan' : 0x0200, 1348295Snate@binkert.org}) 135