diff options
author | Nilay Vaish <nilay@cs.wisc.edu> | 2013-06-09 07:29:57 -0500 |
---|---|---|
committer | Nilay Vaish <nilay@cs.wisc.edu> | 2013-06-09 07:29:57 -0500 |
commit | f2b5b4c8cc31068c40fc9da04da6eb20e23bc091 (patch) | |
tree | 8fec04a492db5018327b1dce2091aeb8c9ff0315 /src | |
parent | b5d315518c2de124fd53b6f6dde53d5c55b2c845 (diff) | |
download | gem5-f2b5b4c8cc31068c40fc9da04da6eb20e23bc091.tar.xz |
stats: allow printing vectors on a single line
This patch adds a new flag to specify if the data values for a given vector
should be printed in one line in the stats.txt file. The default behavior
will be to print the data in multiple lines. It makes changes to print
functions to enforce this behavior.
Diffstat (limited to 'src')
-rw-r--r-- | src/base/stats/info.hh | 2 | ||||
-rw-r--r-- | src/base/stats/text.cc | 55 |
2 files changed, 42 insertions, 15 deletions
diff --git a/src/base/stats/info.hh b/src/base/stats/info.hh index 98e811747..b2ba41485 100644 --- a/src/base/stats/info.hh +++ b/src/base/stats/info.hh @@ -57,6 +57,8 @@ const FlagsType dist = 0x0080; const FlagsType nozero = 0x0100; /** Don't print if this is NAN */ const FlagsType nonan = 0x0200; +/** Print all values on a single line. Useful only for histograms. */ +const FlagsType oneline = 0x0400; /** Mask of flags that can't be set directly */ const FlagsType __reserved = init | display; diff --git a/src/base/stats/text.cc b/src/base/stats/text.cc index 870b16f79..86f657e6e 100644 --- a/src/base/stats/text.cc +++ b/src/base/stats/text.cc @@ -194,7 +194,7 @@ struct ScalarPrint Result cdf; void update(Result val, Result total); - void operator()(ostream &stream) const; + void operator()(ostream &stream, bool oneLine = false) const; }; void @@ -208,7 +208,7 @@ ScalarPrint::update(Result val, Result total) } void -ScalarPrint::operator()(ostream &stream) const +ScalarPrint::operator()(ostream &stream, bool oneLine) const { if ((flags.isSet(nozero) && value == 0.0) || (flags.isSet(nonan) && std::isnan(value))) @@ -222,14 +222,19 @@ ScalarPrint::operator()(ostream &stream) const if (!std::isnan(cdf)) ccprintf(cdfstr, "%.2f%%", cdf * 100.0); - ccprintf(stream, "%-40s %12s %10s %10s", name, - ValueToString(value, precision), pdfstr.str(), cdfstr.str()); + if (oneLine) { + ccprintf(stream, " |%12s %10s %10s", + ValueToString(value, precision), pdfstr.str(), cdfstr.str()); + } else { + ccprintf(stream, "%-40s %12s %10s %10s", name, + ValueToString(value, precision), pdfstr.str(), cdfstr.str()); - if (descriptions) { - if (!desc.empty()) - ccprintf(stream, " # %s", desc); + if (descriptions) { + if (!desc.empty()) + ccprintf(stream, " # %s", desc); + } + stream << endl; } - stream << endl; } struct VectorPrint @@ -279,15 +284,31 @@ VectorPrint::operator()(std::ostream &stream) const return; } - for (off_type i = 0; i < _size; ++i) { - if (havesub && (i >= subnames.size() || subnames[i].empty())) - continue; + if ((!flags.isSet(nozero)) || (total != 0)) { + if (flags.isSet(oneline)) { + ccprintf(stream, "%-40s", name); + print.flags = print.flags & (~nozero); + } + + for (off_type i = 0; i < _size; ++i) { + if (havesub && (i >= subnames.size() || subnames[i].empty())) + continue; - print.name = base + (havesub ? subnames[i] : to_string(i)); - print.desc = subdescs.empty() ? desc : subdescs[i]; + print.name = base + (havesub ? subnames[i] : to_string(i)); + print.desc = subdescs.empty() ? desc : subdescs[i]; - print.update(vec[i], _total); - print(stream); + print.update(vec[i], _total); + print(stream, flags.isSet(oneline)); + } + + if (flags.isSet(oneline)) { + if (descriptions) { + if (!desc.empty()) + ccprintf(stream, " # %s", desc); + } + + stream << endl; + } } if (flags.isSet(::Stats::total)) { @@ -298,6 +319,10 @@ VectorPrint::operator()(std::ostream &stream) const print.value = total; print(stream); } + + if (flags.isSet(oneline) && ((!flags.isSet(nozero)) || (total != 0))) { + stream << endl; + } } struct DistPrint |