161c161,163
< def _visit_groups(root, visitor):
---
> def _visit_groups(visitor, root=None):
> if root is None:
> root = Root.getInstance()
164c166
< _visit_groups(group, visitor)
---
> _visit_groups(visitor, root=group)
166c168
< def _visit_stats(root, visitor):
---
> def _visit_stats(visitor, root=None):
170c172
< _visit_groups(root, for_each_stat)
---
> _visit_groups(for_each_stat, root=root)
215,216c217,218
< _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())
229c231
< _visit_stats(Root.getInstance(), lambda g, s: s.prepare())
---
> _visit_stats(lambda g, s: s.prepare())
231,233c233
< lastDump = 0
<
< def _dump_to_visitor(visitor):
---
> def _dump_to_visitor(visitor, root=None):
235,236c235,237
< for stat in stats_list:
< stat.visit(visitor)
---
> if root is None:
> for stat in stats_list:
> stat.visit(visitor)
248c249,255
< 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()
249a257
> lastDump = 0
251c259
< def dump():
---
> def dump(root=None):
254,255c262
< curTick = m5.curTick()
<
---
> now = m5.curTick()
257,258c264,270
< assert lastDump <= curTick
< if lastDump == curTick:
---
> assert lastDump <= now
> new_dump = lastDump != now
> lastDump = now
>
> # 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:
260d271
< lastDump = curTick
262c273,276
< _m5.stats.processDumpQueue()
---
> # Only prepare stats the first time we dump them in the same tick.
> if new_dump:
> _m5.stats.processDumpQueue()
> prepare()
264,265d277
< prepare()
<
269c281
< _dump_to_visitor(output)
---
> _dump_to_visitor(output, root=root)