stats: better expose statistics to python.
authorNathan Binkert <nate@binkert.org>
Thu, 12 May 2011 18:19:32 +0000 (11:19 -0700)
committerNathan Binkert <nate@binkert.org>
Thu, 12 May 2011 18:19:32 +0000 (11:19 -0700)
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

src/python/SConscript
src/python/m5/stats.py [deleted file]
src/python/m5/stats/__init__.py [new file with mode: 0644]
src/python/swig/stats.i

index 3c410b53116998c90e3409e1d81c38f054c69f32..cbb37d0c5650300987871443fabfb941913c5b87 100644 (file)
@@ -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 (file)
index 24072ae..0000000
+++ /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 (file)
index 0000000..612dbdf
--- /dev/null
@@ -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,
+})
index 72172ae945157d48655816c617ccf9ff9597befd..63539ca839ce2c045ecbed4430270ba025fbbcdb 100644 (file)
 
 %include <std_list.i>
 %include <std_string.i>
+%include <std_vector.i>
+%include <stdint.i>
 
 %{
 #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 <class T>
+inline T
+cast_info(Info *info)
+{
+    return dynamic_cast<T>(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<Stats::Info *>;
+%template(vector_double) vector<double>;
+%template(vector_string) vector<string>;
+%template(vector_DistData) vector<Stats::DistData>;
+}
+
 namespace Stats {
+
+template <class T> T cast_info(Info *info);
+
+%template(dynamic_ScalarInfo) cast_info<ScalarInfo *>;
+%template(dynamic_VectorInfo) cast_info<VectorInfo *>;
+%template(dynamic_DistInfo) cast_info<DistInfo *>;
+%template(dynamic_VectorDistInfo) cast_info<VectorDistInfo *>;
+%template(dynamic_Vector2dInfo) cast_info<Vector2dInfo *>;
+%template(dynamic_FormulaInfo) cast_info<FormulaInfo *>;
+
 void initSimStats();
 void initText(const std::string &filename, bool desc);
 void initMySQL(std::string host, std::string database, std::string user,