__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