__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