__init__.py revision 11788:342c0eaab188
112941Sandreas.sandberg@arm.com# Copyright (c) 2007 The Regents of The University of Michigan 29520SAndreas.Sandberg@ARM.com# Copyright (c) 2010 The Hewlett-Packard Development Company 39520SAndreas.Sandberg@ARM.com# All rights reserved. 49520SAndreas.Sandberg@ARM.com# 59520SAndreas.Sandberg@ARM.com# Redistribution and use in source and binary forms, with or without 69520SAndreas.Sandberg@ARM.com# modification, are permitted provided that the following conditions are 79520SAndreas.Sandberg@ARM.com# met: redistributions of source code must retain the above copyright 89520SAndreas.Sandberg@ARM.com# notice, this list of conditions and the following disclaimer; 99520SAndreas.Sandberg@ARM.com# redistributions in binary form must reproduce the above copyright 109520SAndreas.Sandberg@ARM.com# notice, this list of conditions and the following disclaimer in the 119520SAndreas.Sandberg@ARM.com# documentation and/or other materials provided with the distribution; 129520SAndreas.Sandberg@ARM.com# neither the name of the copyright holders nor the names of its 139520SAndreas.Sandberg@ARM.com# contributors may be used to endorse or promote products derived from 149520SAndreas.Sandberg@ARM.com# this software without specific prior written permission. 159520SAndreas.Sandberg@ARM.com# 169520SAndreas.Sandberg@ARM.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179520SAndreas.Sandberg@ARM.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189520SAndreas.Sandberg@ARM.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 199520SAndreas.Sandberg@ARM.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209520SAndreas.Sandberg@ARM.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 219520SAndreas.Sandberg@ARM.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 229520SAndreas.Sandberg@ARM.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239520SAndreas.Sandberg@ARM.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249520SAndreas.Sandberg@ARM.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259520SAndreas.Sandberg@ARM.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 269520SAndreas.Sandberg@ARM.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279520SAndreas.Sandberg@ARM.com# 289520SAndreas.Sandberg@ARM.com# Authors: Nathan Binkert 299520SAndreas.Sandberg@ARM.com 309520SAndreas.Sandberg@ARM.comimport m5 319520SAndreas.Sandberg@ARM.com 329520SAndreas.Sandberg@ARM.comfrom m5 import internal 339520SAndreas.Sandberg@ARM.comfrom m5.objects import Root 349520SAndreas.Sandberg@ARM.comfrom m5.util import attrdict, fatal 359520SAndreas.Sandberg@ARM.com 369520SAndreas.Sandberg@ARM.com# Stat exports 379520SAndreas.Sandberg@ARM.comfrom m5.internal.stats import schedStatEvent as schedEvent 3812564Sgabeblack@google.comfrom m5.internal.stats import periodicStatDump 3912564Sgabeblack@google.com 4012095Sandreas.sandberg@arm.comoutputList = [] 419520SAndreas.Sandberg@ARM.comdef initText(filename, desc=True): 429520SAndreas.Sandberg@ARM.com output = internal.stats.initText(filename, desc) 439520SAndreas.Sandberg@ARM.com outputList.append(output) 4411995Sgabeblack@google.com 459520SAndreas.Sandberg@ARM.comdef initSimStats(): 469520SAndreas.Sandberg@ARM.com internal.stats.initSimStats() 479520SAndreas.Sandberg@ARM.com internal.stats.registerPythonStatsHandlers() 489520SAndreas.Sandberg@ARM.com 499520SAndreas.Sandberg@ARM.comnames = [] 509520SAndreas.Sandberg@ARM.comstats_dict = {} 519520SAndreas.Sandberg@ARM.comstats_list = [] 529520SAndreas.Sandberg@ARM.comdef enable(): 539520SAndreas.Sandberg@ARM.com '''Enable the statistics package. Before the statistics package is 549520SAndreas.Sandberg@ARM.com enabled, all statistics must be created and initialized and once 559520SAndreas.Sandberg@ARM.com the package is enabled, no more statistics can be created.''' 569520SAndreas.Sandberg@ARM.com 579520SAndreas.Sandberg@ARM.com global stats_list 589520SAndreas.Sandberg@ARM.com stats_list = list(internal.stats.statsList()) 5911688Sandreas.hansson@arm.com 609520SAndreas.Sandberg@ARM.com for stat in stats_list: 619520SAndreas.Sandberg@ARM.com if not stat.check() or not stat.baseCheck(): 6212941Sandreas.sandberg@arm.com fatal("statistic '%s' (%d) was not properly initialized " \ 6312941Sandreas.sandberg@arm.com "by a regStats() function\n", stat.name, stat.id) 6412941Sandreas.sandberg@arm.com 6512941Sandreas.sandberg@arm.com if not (stat.flags & flags.display): 6612941Sandreas.sandberg@arm.com stat.name = "__Stat%06d" % stat.id 6712941Sandreas.sandberg@arm.com 6812941Sandreas.sandberg@arm.com def less(stat1, stat2): 6912941Sandreas.sandberg@arm.com v1 = stat1.name.split('.') 7012941Sandreas.sandberg@arm.com v2 = stat2.name.split('.') 7112941Sandreas.sandberg@arm.com return v1 < v2 7213012Sandreas.sandberg@arm.com 7312941Sandreas.sandberg@arm.com stats_list.sort(less) 749520SAndreas.Sandberg@ARM.com for stat in stats_list: 759520SAndreas.Sandberg@ARM.com stats_dict[stat.name] = stat 769520SAndreas.Sandberg@ARM.com stat.enable() 779520SAndreas.Sandberg@ARM.com 7811995Sgabeblack@google.com internal.stats.enable(); 799520SAndreas.Sandberg@ARM.com 809520SAndreas.Sandberg@ARM.comdef prepare(): 8112564Sgabeblack@google.com '''Prepare all stats for data access. This must be done before 829520SAndreas.Sandberg@ARM.com dumping and serialization.''' 839520SAndreas.Sandberg@ARM.com 849520SAndreas.Sandberg@ARM.com for stat in stats_list: 859520SAndreas.Sandberg@ARM.com stat.prepare() 869520SAndreas.Sandberg@ARM.com 8712564Sgabeblack@google.comlastDump = 0 889520SAndreas.Sandberg@ARM.comdef dump(): 899520SAndreas.Sandberg@ARM.com '''Dump all statistics data to the registered outputs''' 9012564Sgabeblack@google.com 919520SAndreas.Sandberg@ARM.com curTick = m5.curTick() 929520SAndreas.Sandberg@ARM.com 939520SAndreas.Sandberg@ARM.com global lastDump 949520SAndreas.Sandberg@ARM.com assert lastDump <= curTick 959520SAndreas.Sandberg@ARM.com if lastDump == curTick: 969520SAndreas.Sandberg@ARM.com return 9712564Sgabeblack@google.com lastDump = curTick 989520SAndreas.Sandberg@ARM.com 999520SAndreas.Sandberg@ARM.com internal.stats.processDumpQueue() 1009520SAndreas.Sandberg@ARM.com 10111995Sgabeblack@google.com prepare() 1029520SAndreas.Sandberg@ARM.com 10311251Sradhika.jagtap@ARM.com for output in outputList: 10411251Sradhika.jagtap@ARM.com if output.valid(): 10511251Sradhika.jagtap@ARM.com output.begin() 10611251Sradhika.jagtap@ARM.com for stat in stats_list: 10711251Sradhika.jagtap@ARM.com stat.visit(output) 10811251Sradhika.jagtap@ARM.com output.end() 10911251Sradhika.jagtap@ARM.com 11011251Sradhika.jagtap@ARM.comdef reset(): 11111251Sradhika.jagtap@ARM.com '''Reset all statistics to the base state''' 11211251Sradhika.jagtap@ARM.com 11311251Sradhika.jagtap@ARM.com # call reset stats on all SimObjects 11411251Sradhika.jagtap@ARM.com root = Root.getInstance() 11511251Sradhika.jagtap@ARM.com if root: 11611251Sradhika.jagtap@ARM.com for obj in root.descendants(): obj.resetStats() 11711251Sradhika.jagtap@ARM.com 11811251Sradhika.jagtap@ARM.com # call any other registered stats reset callbacks 11911251Sradhika.jagtap@ARM.com for stat in stats_list: 12011251Sradhika.jagtap@ARM.com stat.reset() 12111251Sradhika.jagtap@ARM.com 12211251Sradhika.jagtap@ARM.com internal.stats.processResetQueue() 12311251Sradhika.jagtap@ARM.com 12411251Sradhika.jagtap@ARM.comflags = attrdict({ 12511251Sradhika.jagtap@ARM.com 'none' : 0x0000, 12611251Sradhika.jagtap@ARM.com 'init' : 0x0001, 1279520SAndreas.Sandberg@ARM.com 'display' : 0x0002, 1289520SAndreas.Sandberg@ARM.com 'total' : 0x0010, 1299520SAndreas.Sandberg@ARM.com 'pdf' : 0x0020, 13012098Sandreas.sandberg@arm.com 'cdf' : 0x0040, 13112152Sandreas.sandberg@arm.com 'dist' : 0x0080, 13212152Sandreas.sandberg@arm.com 'nozero' : 0x0100, 13312152Sandreas.sandberg@arm.com 'nonan' : 0x0200, 13412152Sandreas.sandberg@arm.com}) 13512152Sandreas.sandberg@arm.com