__init__.py revision 8296
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
424126SN/Adef initMySQL(host, database, user='', passwd='', project='test', name='test',
434126SN/A              sample='0'):
444126SN/A    if not user:
454126SN/A        import getpass
464126SN/A        user = getpass.getuser()
474126SN/A
488296Snate@binkert.org    output = internal.stats.initMySQL(host, database, user, passwd,
498296Snate@binkert.org                                      project, name, sample)
508296Snate@binkert.org    outputList.append(output)
516001SN/A
526001SN/Adef initSimStats():
536001SN/A    internal.stats.initSimStats()
546001SN/A
558295Snate@binkert.orgnames = []
568295Snate@binkert.orgstats_dict = {}
578295Snate@binkert.orgstats_list = []
588295Snate@binkert.orgraw_stats_list = []
596001SN/Adef enable():
608295Snate@binkert.org    '''Enable the statistics package.  Before the statistics package is
618295Snate@binkert.org    enabled, all statistics must be created and initialized and once
628295Snate@binkert.org    the package is enabled, no more statistics can be created.'''
638295Snate@binkert.org    __dynamic_cast = []
648295Snate@binkert.org    for k, v in internal.stats.__dict__.iteritems():
658295Snate@binkert.org        if k.startswith('dynamic_'):
668295Snate@binkert.org            __dynamic_cast.append(v)
678295Snate@binkert.org
688295Snate@binkert.org    for stat in internal.stats.statsList():
698295Snate@binkert.org        for cast in __dynamic_cast:
708295Snate@binkert.org            val = cast(stat)
718295Snate@binkert.org            if val is not None:
728295Snate@binkert.org                stats_list.append(val)
738295Snate@binkert.org                raw_stats_list.append(val)
748295Snate@binkert.org                break
758295Snate@binkert.org        else:
768295Snate@binkert.org            fatal("unknown stat type %s", stat)
778295Snate@binkert.org
788296Snate@binkert.org    for stat in stats_list:
798296Snate@binkert.org        if not stat.check() or not stat.baseCheck():
808296Snate@binkert.org            fatal("stat check failed for '%s' %d\n", stat.name, stat.id)
818296Snate@binkert.org
828296Snate@binkert.org        if not (stat.flags & flags.display):
838296Snate@binkert.org            stat.name = "__Stat%06d" % stat.id
848296Snate@binkert.org
858295Snate@binkert.org    def less(stat1, stat2):
868295Snate@binkert.org        v1 = stat1.name.split('.')
878295Snate@binkert.org        v2 = stat2.name.split('.')
888295Snate@binkert.org        return v1 < v2
898295Snate@binkert.org
908295Snate@binkert.org    stats_list.sort(less)
918295Snate@binkert.org    for stat in stats_list:
928295Snate@binkert.org        stats_dict[stat.name] = stat
938296Snate@binkert.org        stat.enable()
948295Snate@binkert.org
958296Snate@binkert.orgdef prepare():
968296Snate@binkert.org    '''Prepare all stats for data access.  This must be done before
978296Snate@binkert.org    dumping and serialization.'''
986001SN/A
998296Snate@binkert.org    for stat in stats_list:
1008296Snate@binkert.org        stat.prepare()
1018296Snate@binkert.org
1028296Snate@binkert.orglastDump = 0
1036001SN/Adef dump():
1048296Snate@binkert.org    '''Dump all statistics data to the registered outputs'''
1056001SN/A
1068296Snate@binkert.org    curTick = m5.curTick()
1078296Snate@binkert.org
1088296Snate@binkert.org    global lastDump
1098296Snate@binkert.org    assert lastDump <= curTick
1108296Snate@binkert.org    if lastDump == curTick:
1118296Snate@binkert.org        return
1128296Snate@binkert.org    lastDump = curTick
1138296Snate@binkert.org
1148296Snate@binkert.org    prepare()
1158296Snate@binkert.org
1168296Snate@binkert.org    for output in outputList:
1178296Snate@binkert.org        if output.valid():
1188296Snate@binkert.org            output.begin()
1198296Snate@binkert.org            for stat in stats_list:
1208296Snate@binkert.org                output.visit(stat)
1218296Snate@binkert.org            output.end()
1226001SN/A
1236001SN/Adef reset():
1248296Snate@binkert.org    '''Reset all statistics to the base state'''
1258296Snate@binkert.org
1267527SN/A    # call reset stats on all SimObjects
1277527SN/A    root = Root.getInstance()
1287802SN/A    if root:
1297802SN/A        for obj in root.descendants(): obj.resetStats()
1307802SN/A
1317527SN/A    # call any other registered stats reset callbacks
1328296Snate@binkert.org    for stat in stats_list:
1338296Snate@binkert.org        stat.reset()
1348296Snate@binkert.org
1358296Snate@binkert.org    internal.stats.processResetQueue()
1368295Snate@binkert.org
1378295Snate@binkert.orgflags = attrdict({
1388295Snate@binkert.org    'none'    : 0x0000,
1398295Snate@binkert.org    'init'    : 0x0001,
1408295Snate@binkert.org    'display' : 0x0002,
1418295Snate@binkert.org    'total'   : 0x0010,
1428295Snate@binkert.org    'pdf'     : 0x0020,
1438295Snate@binkert.org    'cdf'     : 0x0040,
1448295Snate@binkert.org    'dist'    : 0x0080,
1458295Snate@binkert.org    'nozero'  : 0x0100,
1468295Snate@binkert.org    'nonan'   : 0x0200,
1478295Snate@binkert.org})
148