__init__.py revision 11802
110389SAndreas.Sandberg@ARM.com# Copyright (c) 2007 The Regents of The University of Michigan 210389SAndreas.Sandberg@ARM.com# Copyright (c) 2010 The Hewlett-Packard Development Company 310389SAndreas.Sandberg@ARM.com# All rights reserved. 410389SAndreas.Sandberg@ARM.com# 510389SAndreas.Sandberg@ARM.com# Redistribution and use in source and binary forms, with or without 610389SAndreas.Sandberg@ARM.com# modification, are permitted provided that the following conditions are 710389SAndreas.Sandberg@ARM.com# met: redistributions of source code must retain the above copyright 810389SAndreas.Sandberg@ARM.com# notice, this list of conditions and the following disclaimer; 910389SAndreas.Sandberg@ARM.com# redistributions in binary form must reproduce the above copyright 1010389SAndreas.Sandberg@ARM.com# notice, this list of conditions and the following disclaimer in the 1110389SAndreas.Sandberg@ARM.com# documentation and/or other materials provided with the distribution; 1210389SAndreas.Sandberg@ARM.com# neither the name of the copyright holders nor the names of its 1310389SAndreas.Sandberg@ARM.com# contributors may be used to endorse or promote products derived from 1410389SAndreas.Sandberg@ARM.com# this software without specific prior written permission. 1510389SAndreas.Sandberg@ARM.com# 1610389SAndreas.Sandberg@ARM.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1710389SAndreas.Sandberg@ARM.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1810389SAndreas.Sandberg@ARM.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1910389SAndreas.Sandberg@ARM.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2010389SAndreas.Sandberg@ARM.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2110389SAndreas.Sandberg@ARM.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2210389SAndreas.Sandberg@ARM.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2310389SAndreas.Sandberg@ARM.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2410389SAndreas.Sandberg@ARM.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2510389SAndreas.Sandberg@ARM.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2610389SAndreas.Sandberg@ARM.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2710389SAndreas.Sandberg@ARM.com# 2810389SAndreas.Sandberg@ARM.com# Authors: Nathan Binkert 2910389SAndreas.Sandberg@ARM.com 3010389SAndreas.Sandberg@ARM.comimport m5 3110389SAndreas.Sandberg@ARM.com 3210389SAndreas.Sandberg@ARM.comimport _m5.stats 3310389SAndreas.Sandberg@ARM.comfrom m5.objects import Root 3410389SAndreas.Sandberg@ARM.comfrom m5.util import attrdict, fatal 3510389SAndreas.Sandberg@ARM.com 3610389SAndreas.Sandberg@ARM.com# Stat exports 3710389SAndreas.Sandberg@ARM.comfrom _m5.stats import schedStatEvent as schedEvent 3810389SAndreas.Sandberg@ARM.comfrom _m5.stats import periodicStatDump 3910389SAndreas.Sandberg@ARM.com 4011793Sbrandon.potter@amd.comoutputList = [] 4111793Sbrandon.potter@amd.comdef initText(filename, desc=True): 4210389SAndreas.Sandberg@ARM.com output = _m5.stats.initText(filename, desc) 4310389SAndreas.Sandberg@ARM.com outputList.append(output) 4410389SAndreas.Sandberg@ARM.com 4510389SAndreas.Sandberg@ARM.comdef initSimStats(): 4610389SAndreas.Sandberg@ARM.com _m5.stats.initSimStats() 4710389SAndreas.Sandberg@ARM.com _m5.stats.registerPythonStatsHandlers() 4810389SAndreas.Sandberg@ARM.com 4910389SAndreas.Sandberg@ARM.comnames = [] 5012237Sandreas.sandberg@arm.comstats_dict = {} 5110389SAndreas.Sandberg@ARM.comstats_list = [] 5210389SAndreas.Sandberg@ARM.comdef enable(): 5310389SAndreas.Sandberg@ARM.com '''Enable the statistics package. Before the statistics package is 5410389SAndreas.Sandberg@ARM.com enabled, all statistics must be created and initialized and once 5510389SAndreas.Sandberg@ARM.com the package is enabled, no more statistics can be created.''' 5610389SAndreas.Sandberg@ARM.com 5710389SAndreas.Sandberg@ARM.com global stats_list 5812237Sandreas.sandberg@arm.com stats_list = list(_m5.stats.statsList()) 5910389SAndreas.Sandberg@ARM.com 6010389SAndreas.Sandberg@ARM.com for stat in stats_list: 6110389SAndreas.Sandberg@ARM.com if not stat.check() or not stat.baseCheck(): 6210389SAndreas.Sandberg@ARM.com fatal("statistic '%s' (%d) was not properly initialized " \ 6310389SAndreas.Sandberg@ARM.com "by a regStats() function\n", stat.name, stat.id) 6410389SAndreas.Sandberg@ARM.com 6510389SAndreas.Sandberg@ARM.com if not (stat.flags & flags.display): 6610389SAndreas.Sandberg@ARM.com stat.name = "__Stat%06d" % stat.id 6710389SAndreas.Sandberg@ARM.com 6810389SAndreas.Sandberg@ARM.com def less(stat1, stat2): 6910389SAndreas.Sandberg@ARM.com v1 = stat1.name.split('.') 7010389SAndreas.Sandberg@ARM.com v2 = stat2.name.split('.') 7110389SAndreas.Sandberg@ARM.com return v1 < v2 7210389SAndreas.Sandberg@ARM.com 7310389SAndreas.Sandberg@ARM.com stats_list.sort(less) 7410389SAndreas.Sandberg@ARM.com for stat in stats_list: 7510389SAndreas.Sandberg@ARM.com stats_dict[stat.name] = stat 7610389SAndreas.Sandberg@ARM.com stat.enable() 7710389SAndreas.Sandberg@ARM.com 7810389SAndreas.Sandberg@ARM.com _m5.stats.enable(); 7910389SAndreas.Sandberg@ARM.com 8010389SAndreas.Sandberg@ARM.comdef prepare(): 8110389SAndreas.Sandberg@ARM.com '''Prepare all stats for data access. This must be done before 8210389SAndreas.Sandberg@ARM.com dumping and serialization.''' 8310389SAndreas.Sandberg@ARM.com 8412237Sandreas.sandberg@arm.com for stat in stats_list: 8510389SAndreas.Sandberg@ARM.com stat.prepare() 8610389SAndreas.Sandberg@ARM.com 8712237Sandreas.sandberg@arm.comlastDump = 0 8812237Sandreas.sandberg@arm.comdef dump(): 8910389SAndreas.Sandberg@ARM.com '''Dump all statistics data to the registered outputs''' 9010389SAndreas.Sandberg@ARM.com 9110389SAndreas.Sandberg@ARM.com curTick = m5.curTick() 9210389SAndreas.Sandberg@ARM.com 9310389SAndreas.Sandberg@ARM.com global lastDump 9410389SAndreas.Sandberg@ARM.com assert lastDump <= curTick 9510389SAndreas.Sandberg@ARM.com if lastDump == curTick: 9610389SAndreas.Sandberg@ARM.com return 9710389SAndreas.Sandberg@ARM.com lastDump = curTick 9810389SAndreas.Sandberg@ARM.com 9910389SAndreas.Sandberg@ARM.com _m5.stats.processDumpQueue() 10010389SAndreas.Sandberg@ARM.com 10110389SAndreas.Sandberg@ARM.com prepare() 10210389SAndreas.Sandberg@ARM.com 10310389SAndreas.Sandberg@ARM.com for output in outputList: 10410389SAndreas.Sandberg@ARM.com if output.valid(): 10510389SAndreas.Sandberg@ARM.com output.begin() 10610389SAndreas.Sandberg@ARM.com for stat in stats_list: 10710389SAndreas.Sandberg@ARM.com stat.visit(output) 10810389SAndreas.Sandberg@ARM.com output.end() 10910389SAndreas.Sandberg@ARM.com 11010389SAndreas.Sandberg@ARM.comdef reset(): 11112237Sandreas.sandberg@arm.com '''Reset all statistics to the base state''' 11210389SAndreas.Sandberg@ARM.com 11310389SAndreas.Sandberg@ARM.com # call reset stats on all SimObjects 11410389SAndreas.Sandberg@ARM.com root = Root.getInstance() 11510389SAndreas.Sandberg@ARM.com if root: 11610389SAndreas.Sandberg@ARM.com for obj in root.descendants(): obj.resetStats() 11710389SAndreas.Sandberg@ARM.com 11810389SAndreas.Sandberg@ARM.com # call any other registered stats reset callbacks 11910389SAndreas.Sandberg@ARM.com for stat in stats_list: 12010389SAndreas.Sandberg@ARM.com stat.reset() 12110389SAndreas.Sandberg@ARM.com 12210389SAndreas.Sandberg@ARM.com _m5.stats.processResetQueue() 123 124flags = attrdict({ 125 'none' : 0x0000, 126 'init' : 0x0001, 127 'display' : 0x0002, 128 'total' : 0x0010, 129 'pdf' : 0x0020, 130 'cdf' : 0x0040, 131 'dist' : 0x0080, 132 'nozero' : 0x0100, 133 'nonan' : 0x0200, 134}) 135