summaryrefslogtreecommitdiff
path: root/src/python
diff options
context:
space:
mode:
Diffstat (limited to 'src/python')
-rw-r--r--src/python/m5/SimObject.py7
-rw-r--r--src/python/m5/stats/__init__.py58
2 files changed, 42 insertions, 23 deletions
diff --git a/src/python/m5/SimObject.py b/src/python/m5/SimObject.py
index 3d2f123b9..37a13a39a 100644
--- a/src/python/m5/SimObject.py
+++ b/src/python/m5/SimObject.py
@@ -1413,6 +1413,13 @@ class SimObject(object):
return self._name
return ppath + "." + self._name
+ def path_list(self):
+ if self._parent:
+ return self._parent.path_list() + [ self._name, ]
+ else:
+ # Don't include the root node
+ return []
+
def __str__(self):
return self.path()
diff --git a/src/python/m5/stats/__init__.py b/src/python/m5/stats/__init__.py
index d9174d387..14801447d 100644
--- a/src/python/m5/stats/__init__.py
+++ b/src/python/m5/stats/__init__.py
@@ -158,16 +158,18 @@ def initSimStats():
_m5.stats.initSimStats()
_m5.stats.registerPythonStatsHandlers()
-def _visit_groups(root, visitor):
+def _visit_groups(visitor, root=None):
+ if root is None:
+ root = Root.getInstance()
for group in root.getStatGroups().values():
visitor(group)
- _visit_groups(group, visitor)
+ _visit_groups(visitor, root=group)
-def _visit_stats(root, visitor):
+def _visit_stats(visitor, root=None):
def for_each_stat(g):
for stat in g.getStats():
visitor(g, stat)
- _visit_groups(root, for_each_stat)
+ _visit_groups(for_each_stat, root=root)
def _bindStatHierarchy(root):
def _bind_obj(name, obj):
@@ -212,8 +214,8 @@ def enable():
# New stats
- _visit_stats(Root.getInstance(), check_stat)
- _visit_stats(Root.getInstance(), lambda g, s: s.enable())
+ _visit_stats(check_stat)
+ _visit_stats(lambda g, s: s.enable())
_m5.stats.enable();
@@ -226,14 +228,13 @@ def prepare():
stat.prepare()
# New stats
- _visit_stats(Root.getInstance(), lambda g, s: s.prepare())
+ _visit_stats(lambda g, s: s.prepare())
-lastDump = 0
-
-def _dump_to_visitor(visitor):
+def _dump_to_visitor(visitor, root=None):
# Legacy stats
- for stat in stats_list:
- stat.visit(visitor)
+ if root is None:
+ for stat in stats_list:
+ stat.visit(visitor)
# New stats
def dump_group(group):
@@ -245,28 +246,39 @@ def _dump_to_visitor(visitor):
dump_group(g)
visitor.endGroup()
- dump_group(Root.getInstance())
+ if root is not None:
+ for p in root.path_list():
+ visitor.beginGroup(p)
+ dump_group(root if root is not None else Root.getInstance())
+ if root is not None:
+ for p in reversed(root.path_list()):
+ visitor.endGroup()
+lastDump = 0
-def dump():
+def dump(root=None):
'''Dump all statistics data to the registered outputs'''
- curTick = m5.curTick()
-
+ now = m5.curTick()
global lastDump
- assert lastDump <= curTick
- if lastDump == curTick:
- return
- lastDump = curTick
+ assert lastDump <= now
+ new_dump = lastDump != now
+ lastDump = now
- _m5.stats.processDumpQueue()
+ # Don't allow multiple global stat dumps in the same tick. It's
+ # still possible to dump a multiple sub-trees.
+ if not new_dump and root is None:
+ return
- prepare()
+ # Only prepare stats the first time we dump them in the same tick.
+ if new_dump:
+ _m5.stats.processDumpQueue()
+ prepare()
for output in outputList:
if output.valid():
output.begin()
- _dump_to_visitor(output)
+ _dump_to_visitor(output, root=root)
output.end()
def reset():