__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