__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