From: Nathan Binkert Date: Thu, 12 May 2011 18:19:32 +0000 (-0700) Subject: stats: better expose statistics to python. X-Git-Tag: stable_2012_02_02~329 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=35b0c1d3910595875de67a34f6b993047470fd55;p=gem5.git stats: better expose statistics to python. Build a python list and dict of all stats and expose flags properly. --HG-- rename : src/python/m5/stats.py => src/python/m5/stats/__init__.py --- diff --git a/src/python/SConscript b/src/python/SConscript index 3c410b531..cbb37d0c5 100644 --- a/src/python/SConscript +++ b/src/python/SConscript @@ -46,10 +46,10 @@ PySource('m5', 'm5/options.py') PySource('m5', 'm5/params.py') PySource('m5', 'm5/proxy.py') PySource('m5', 'm5/simulate.py') -PySource('m5', 'm5/stats.py') PySource('m5', 'm5/ticks.py') PySource('m5', 'm5/trace.py') PySource('m5.objects', 'm5/objects/__init__.py') +PySource('m5.stats', 'm5/stats/__init__.py') PySource('m5.util', 'm5/util/__init__.py') PySource('m5.util', 'm5/util/attrdict.py') PySource('m5.util', 'm5/util/code_formatter.py') diff --git a/src/python/m5/stats.py b/src/python/m5/stats.py deleted file mode 100644 index 24072aeb0..000000000 --- a/src/python/m5/stats.py +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright (c) 2007 The Regents of The University of Michigan -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer; -# redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution; -# neither the name of the copyright holders nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# Authors: Nathan Binkert - -import internal - -from internal.stats import schedStatEvent as schedEvent -from objects import Root - -def initText(filename, desc=True): - internal.stats.initText(filename, desc) - -def initMySQL(host, database, user='', passwd='', project='test', name='test', - sample='0'): - if not user: - import getpass - user = getpass.getuser() - - internal.stats.initMySQL(host, database, user, passwd, project, name, - sample) - -def initSimStats(): - internal.stats.initSimStats() - -def enable(): - internal.stats.enable() - -def dump(): - # Currently prepare happens in the dump, but we should maybe move - # that out. - - #internal.stats.prepare() - internal.stats.dump() - -def reset(): - # call reset stats on all SimObjects - root = Root.getInstance() - if root: - for obj in root.descendants(): obj.resetStats() - - # call any other registered stats reset callbacks - internal.stats.reset() diff --git a/src/python/m5/stats/__init__.py b/src/python/m5/stats/__init__.py new file mode 100644 index 000000000..612dbdfb5 --- /dev/null +++ b/src/python/m5/stats/__init__.py @@ -0,0 +1,110 @@ +# Copyright (c) 2007 The Regents of The University of Michigan +# Copyright (c) 2010 The Hewlett-Packard Development Company +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer; +# redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution; +# neither the name of the copyright holders nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Authors: Nathan Binkert + +from m5 import internal +from m5.internal.stats import schedStatEvent as schedEvent +from m5.objects import Root +from m5.util import attrdict + +def initText(filename, desc=True): + internal.stats.initText(filename, desc) + +def initMySQL(host, database, user='', passwd='', project='test', name='test', + sample='0'): + if not user: + import getpass + user = getpass.getuser() + + internal.stats.initMySQL(host, database, user, passwd, project, name, + sample) + +def initSimStats(): + internal.stats.initSimStats() + +names = [] +stats_dict = {} +stats_list = [] +raw_stats_list = [] +def enable(): + '''Enable the statistics package. Before the statistics package is + enabled, all statistics must be created and initialized and once + the package is enabled, no more statistics can be created.''' + __dynamic_cast = [] + for k, v in internal.stats.__dict__.iteritems(): + if k.startswith('dynamic_'): + __dynamic_cast.append(v) + + for stat in internal.stats.statsList(): + for cast in __dynamic_cast: + val = cast(stat) + if val is not None: + stats_list.append(val) + raw_stats_list.append(val) + break + else: + fatal("unknown stat type %s", stat) + + def less(stat1, stat2): + v1 = stat1.name.split('.') + v2 = stat2.name.split('.') + return v1 < v2 + + stats_list.sort(less) + for stat in stats_list: + stats_dict[stat.name] = stat + + internal.stats.enable() + +def dump(): + # Currently prepare happens in the dump, but we should maybe move + # that out. + + #internal.stats.prepare() + internal.stats.dump() + +def reset(): + # call reset stats on all SimObjects + root = Root.getInstance() + if root: + for obj in root.descendants(): obj.resetStats() + + # call any other registered stats reset callbacks + internal.stats.reset() + +flags = attrdict({ + 'none' : 0x0000, + 'init' : 0x0001, + 'display' : 0x0002, + 'total' : 0x0010, + 'pdf' : 0x0020, + 'cdf' : 0x0040, + 'dist' : 0x0080, + 'nozero' : 0x0100, + 'nonan' : 0x0200, +}) diff --git a/src/python/swig/stats.i b/src/python/swig/stats.i index 72172ae94..63539ca83 100644 --- a/src/python/swig/stats.i +++ b/src/python/swig/stats.i @@ -32,20 +32,68 @@ %include %include +%include +%include %{ #include "base/stats/mysql.hh" #include "base/stats/text.hh" +#include "base/stats/types.hh" #include "base/statistics.hh" #include "sim/core.hh" #include "sim/stat_control.hh" + +namespace Stats { +template +inline T +cast_info(Info *info) +{ + return dynamic_cast(info); +} + +inline FlagsType +Stats_Info_flags_get(Info *info) +{ + return info->flags; +} + +inline void +Stats_Info_flags_set(Info *info, FlagsType flags) +{ + info->flags = flags; +} + +} // namespace Stats %} +%extend Stats::Info { + short flags; +} + +%ignore Stats::Info::flags; + %import "base/stats/types.hh" %include "base/stats/info.hh" +namespace std { +%template(list_info) list; +%template(vector_double) vector; +%template(vector_string) vector; +%template(vector_DistData) vector; +} + namespace Stats { + +template T cast_info(Info *info); + +%template(dynamic_ScalarInfo) cast_info; +%template(dynamic_VectorInfo) cast_info; +%template(dynamic_DistInfo) cast_info; +%template(dynamic_VectorDistInfo) cast_info; +%template(dynamic_Vector2dInfo) cast_info; +%template(dynamic_FormulaInfo) cast_info; + void initSimStats(); void initText(const std::string &filename, bool desc); void initMySQL(std::string host, std::string database, std::string user,