text.cc revision 6129
17093Sgblack@eecs.umich.edu/*
212498Sgiacomo.travaglini@arm.com * Copyright (c) 2004-2005 The Regents of The University of Michigan
37093Sgblack@eecs.umich.edu * All rights reserved.
47093Sgblack@eecs.umich.edu *
57093Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
67093Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
77093Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
87093Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
97093Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
107093Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
117093Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
127093Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
137093Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
147093Sgblack@eecs.umich.edu * this software without specific prior written permission.
156253Sgblack@eecs.umich.edu *
166253Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
176253Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
186253Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
196253Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
206253Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
216253Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
226253Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
236253Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
246253Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
256253Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
266253Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276253Sgblack@eecs.umich.edu *
286253Sgblack@eecs.umich.edu * Authors: Nathan Binkert
296253Sgblack@eecs.umich.edu */
306253Sgblack@eecs.umich.edu
316253Sgblack@eecs.umich.edu#if defined(__APPLE__)
326253Sgblack@eecs.umich.edu#define _GLIBCPP_USE_C99 1
336253Sgblack@eecs.umich.edu#endif
346253Sgblack@eecs.umich.edu
356253Sgblack@eecs.umich.edu#if defined(__sun)
366253Sgblack@eecs.umich.edu#include <math.h>
376253Sgblack@eecs.umich.edu#endif
386253Sgblack@eecs.umich.edu
396253Sgblack@eecs.umich.edu#include <cassert>
406253Sgblack@eecs.umich.edu#ifdef __SUNPRO_CC
416253Sgblack@eecs.umich.edu#include <math.h>
426253Sgblack@eecs.umich.edu#endif
436253Sgblack@eecs.umich.edu#include <cmath>
446253Sgblack@eecs.umich.edu#include <iostream>
4510474Sandreas.hansson@arm.com#include <sstream>
4610474Sandreas.hansson@arm.com#include <fstream>
477640Sgblack@eecs.umich.edu#include <string>
487692SAli.Saidi@ARM.com
4910037SARM gem5 Developers#include "base/cast.hh"
506253Sgblack@eecs.umich.edu#include "base/misc.hh"
5112234Sgabeblack@google.com#include "base/str.hh"
526253Sgblack@eecs.umich.edu#include "base/stats/info.hh"
538737Skoansin.tan@gmail.com#include "base/stats/text.hh"
548782Sgblack@eecs.umich.edu#include "base/stats/visit.hh"
556253Sgblack@eecs.umich.edu
566253Sgblack@eecs.umich.eduusing namespace std;
576253Sgblack@eecs.umich.edu
587424Sgblack@eecs.umich.edu#ifndef NAN
597148Sgblack@eecs.umich.edufloat __nan();
606254Sgblack@eecs.umich.edu/** Define Not a number. */
616254Sgblack@eecs.umich.edu#define NAN (__nan())
6210037SARM gem5 Developers/** Need to define __nan() */
6310037SARM gem5 Developers#define __M5_NAN
6410037SARM gem5 Developers#endif
656255Sgblack@eecs.umich.edu
666255Sgblack@eecs.umich.edu#ifdef __M5_NAN
676255Sgblack@eecs.umich.edufloat
686255Sgblack@eecs.umich.edu__nan()
696254Sgblack@eecs.umich.edu{
706255Sgblack@eecs.umich.edu    union {
716255Sgblack@eecs.umich.edu        uint32_t ui;
726255Sgblack@eecs.umich.edu        float f;
736255Sgblack@eecs.umich.edu    } nan;
746254Sgblack@eecs.umich.edu
7510037SARM gem5 Developers    nan.ui = 0x7fc00000;
7610037SARM gem5 Developers    return nan.f;
7710037SARM gem5 Developers}
7810037SARM gem5 Developers#endif
7910037SARM gem5 Developers
807193Sgblack@eecs.umich.edunamespace Stats {
817424Sgblack@eecs.umich.edu
827193Sgblack@eecs.umich.edustd::list<Info *> &statsList();
837193Sgblack@eecs.umich.edu
847193Sgblack@eecs.umich.eduText::Text()
857193Sgblack@eecs.umich.edu    : mystream(false), stream(NULL), descriptions(false)
867193Sgblack@eecs.umich.edu{
877226Sgblack@eecs.umich.edu}
887193Sgblack@eecs.umich.edu
897226Sgblack@eecs.umich.eduText::Text(std::ostream &stream)
907193Sgblack@eecs.umich.edu    : mystream(false), stream(NULL), descriptions(false)
917193Sgblack@eecs.umich.edu{
927193Sgblack@eecs.umich.edu    open(stream);
937193Sgblack@eecs.umich.edu}
947193Sgblack@eecs.umich.edu
957193Sgblack@eecs.umich.eduText::Text(const std::string &file)
967193Sgblack@eecs.umich.edu    : mystream(false), stream(NULL), descriptions(false)
977424Sgblack@eecs.umich.edu{
987226Sgblack@eecs.umich.edu    open(file);
997226Sgblack@eecs.umich.edu}
1007226Sgblack@eecs.umich.edu
1017226Sgblack@eecs.umich.edu
1027226Sgblack@eecs.umich.eduText::~Text()
1037226Sgblack@eecs.umich.edu{
1047226Sgblack@eecs.umich.edu    if (mystream) {
1057226Sgblack@eecs.umich.edu        assert(stream);
1067226Sgblack@eecs.umich.edu        delete stream;
1077226Sgblack@eecs.umich.edu    }
1087226Sgblack@eecs.umich.edu}
1097226Sgblack@eecs.umich.edu
1107226Sgblack@eecs.umich.eduvoid
1117226Sgblack@eecs.umich.eduText::open(std::ostream &_stream)
1127226Sgblack@eecs.umich.edu{
1137219Sgblack@eecs.umich.edu    if (stream)
1147424Sgblack@eecs.umich.edu        panic("stream already set!");
1157219Sgblack@eecs.umich.edu
1167219Sgblack@eecs.umich.edu    mystream = false;
1177219Sgblack@eecs.umich.edu    stream = &_stream;
1187226Sgblack@eecs.umich.edu    if (!valid())
1197226Sgblack@eecs.umich.edu        fatal("Unable to open output stream for writing\n");
1207219Sgblack@eecs.umich.edu}
1217219Sgblack@eecs.umich.edu
1227219Sgblack@eecs.umich.eduvoid
1237219Sgblack@eecs.umich.eduText::open(const std::string &file)
1247219Sgblack@eecs.umich.edu{
1257219Sgblack@eecs.umich.edu    if (stream)
1267219Sgblack@eecs.umich.edu        panic("stream already set!");
1277219Sgblack@eecs.umich.edu
1287219Sgblack@eecs.umich.edu    mystream = true;
1297219Sgblack@eecs.umich.edu    stream = new ofstream(file.c_str(), ios::trunc);
1307424Sgblack@eecs.umich.edu    if (!valid())
1317226Sgblack@eecs.umich.edu        fatal("Unable to open statistics file for writing\n");
1327226Sgblack@eecs.umich.edu}
1337226Sgblack@eecs.umich.edu
1347226Sgblack@eecs.umich.edubool
1357226Sgblack@eecs.umich.eduText::valid() const
1367226Sgblack@eecs.umich.edu{
1377226Sgblack@eecs.umich.edu    return stream != NULL && stream->good();
1387226Sgblack@eecs.umich.edu}
1397226Sgblack@eecs.umich.edu
1407226Sgblack@eecs.umich.eduvoid
1417226Sgblack@eecs.umich.eduText::output()
1427226Sgblack@eecs.umich.edu{
1437226Sgblack@eecs.umich.edu    ccprintf(*stream, "\n---------- Begin Simulation Statistics ----------\n");
1447226Sgblack@eecs.umich.edu    list<Info *>::const_iterator i, end = statsList().end();
1456254Sgblack@eecs.umich.edu    for (i = statsList().begin(); i != end; ++i)
1467148Sgblack@eecs.umich.edu        (*i)->visit(*this);
1477148Sgblack@eecs.umich.edu    ccprintf(*stream, "\n---------- End Simulation Statistics   ----------\n");
1486254Sgblack@eecs.umich.edu    stream->flush();
1496253Sgblack@eecs.umich.edu}
15010037SARM gem5 Developers
15110037SARM gem5 Developersbool
15210037SARM gem5 DevelopersText::noOutput(const Info &info)
15310037SARM gem5 Developers{
15410037SARM gem5 Developers    if (!(info.flags & print))
1556254Sgblack@eecs.umich.edu        return true;
1566253Sgblack@eecs.umich.edu
1576254Sgblack@eecs.umich.edu    if (info.prereq && info.prereq->zero())
1586254Sgblack@eecs.umich.edu        return true;
15913759Sgiacomo.gabrielli@arm.com
16013759Sgiacomo.gabrielli@arm.com    return false;
16112104Snathanael.premillieu@arm.com}
16213759Sgiacomo.gabrielli@arm.com
16313759Sgiacomo.gabrielli@arm.comstring
16413759Sgiacomo.gabrielli@arm.comValueToString(Result value, int precision)
16512104Snathanael.premillieu@arm.com{
16612104Snathanael.premillieu@arm.com    stringstream val;
1676262Sgblack@eecs.umich.edu
1686262Sgblack@eecs.umich.edu    if (!isnan(value)) {
16910037SARM gem5 Developers        if (precision != -1)
17010037SARM gem5 Developers            val.precision(precision);
17110037SARM gem5 Developers        else if (value == rint(value))
17210037SARM gem5 Developers            val.precision(0);
17310037SARM gem5 Developers
17410037SARM gem5 Developers        val.unsetf(ios::showpoint);
17510037SARM gem5 Developers        val.setf(ios::fixed);
1766263Sgblack@eecs.umich.edu        val << value;
1776263Sgblack@eecs.umich.edu    } else {
1786263Sgblack@eecs.umich.edu        val << "no_value";
1797142Sgblack@eecs.umich.edu    }
1807142Sgblack@eecs.umich.edu
1817142Sgblack@eecs.umich.edu    return val.str();
18210037SARM gem5 Developers}
18310037SARM gem5 Developers
18410037SARM gem5 Developersstruct ScalarPrint
18513369Syuetsu.kodama@riken.jp{
1866253Sgblack@eecs.umich.edu    Result value;
1876306Sgblack@eecs.umich.edu    string name;
1887142Sgblack@eecs.umich.edu    string desc;
1897142Sgblack@eecs.umich.edu    StatFlags flags;
1907142Sgblack@eecs.umich.edu    bool descriptions;
19111371Snathanael.premillieu@arm.com    int precision;
1926264Sgblack@eecs.umich.edu    Result pdf;
1937720Sgblack@eecs.umich.edu    Result cdf;
19412616Sgabeblack@google.com
1957720Sgblack@eecs.umich.edu    void operator()(ostream &stream) const;
1967720Sgblack@eecs.umich.edu};
1977720Sgblack@eecs.umich.edu
1987720Sgblack@eecs.umich.eduvoid
19912616Sgabeblack@google.comScalarPrint::operator()(ostream &stream) const
20012616Sgabeblack@google.com{
2016748Sgblack@eecs.umich.edu    if ((flags & nozero && value == 0.0) ||
2027424Sgblack@eecs.umich.edu        (flags & nonan && isnan(value)))
20310037SARM gem5 Developers        return;
20410037SARM gem5 Developers
2056748Sgblack@eecs.umich.edu    stringstream pdfstr, cdfstr;
20610037SARM gem5 Developers
20710037SARM gem5 Developers    if (!isnan(pdf))
20810037SARM gem5 Developers        ccprintf(pdfstr, "%.2f%%", pdf * 100.0);
20910037SARM gem5 Developers
2106748Sgblack@eecs.umich.edu    if (!isnan(cdf))
2116748Sgblack@eecs.umich.edu        ccprintf(cdfstr, "%.2f%%", cdf * 100.0);
2126748Sgblack@eecs.umich.edu
2136748Sgblack@eecs.umich.edu    ccprintf(stream, "%-40s %12s %10s %10s", name,
2146748Sgblack@eecs.umich.edu             ValueToString(value, precision), pdfstr, cdfstr);
2156748Sgblack@eecs.umich.edu
2166748Sgblack@eecs.umich.edu    if (descriptions) {
2176748Sgblack@eecs.umich.edu        if (!desc.empty())
2186748Sgblack@eecs.umich.edu            ccprintf(stream, " # %s", desc);
2196748Sgblack@eecs.umich.edu    }
2206748Sgblack@eecs.umich.edu    stream << endl;
2216748Sgblack@eecs.umich.edu}
22210037SARM gem5 Developers
22310037SARM gem5 Developersstruct VectorPrint
2246748Sgblack@eecs.umich.edu{
2256748Sgblack@eecs.umich.edu    string name;
2266748Sgblack@eecs.umich.edu    string desc;
2276748Sgblack@eecs.umich.edu    vector<string> subnames;
22810037SARM gem5 Developers    vector<string> subdescs;
22910037SARM gem5 Developers    StatFlags flags;
23010037SARM gem5 Developers    bool descriptions;
23110037SARM gem5 Developers    int precision;
23210037SARM gem5 Developers    VResult vec;
23310037SARM gem5 Developers    Result total;
23410037SARM gem5 Developers
23510037SARM gem5 Developers    void operator()(ostream &stream) const;
23612788Sgiacomo.travaglini@arm.com};
23710037SARM gem5 Developers
23810037SARM gem5 Developersvoid
23910037SARM gem5 DevelopersVectorPrint::operator()(std::ostream &stream) const
24010037SARM gem5 Developers{
24110037SARM gem5 Developers    size_type _size = vec.size();
24210037SARM gem5 Developers    Result _total = 0.0;
24310037SARM gem5 Developers
24410037SARM gem5 Developers    if (flags & (pdf | cdf)) {
24510037SARM gem5 Developers        for (off_type i = 0; i < _size; ++i) {
24610037SARM gem5 Developers            _total += vec[i];
24710037SARM gem5 Developers        }
24810037SARM gem5 Developers    }
24910037SARM gem5 Developers
25010037SARM gem5 Developers    string base = name + "::";
25110037SARM gem5 Developers
25210037SARM gem5 Developers    ScalarPrint print;
25310037SARM gem5 Developers    print.name = name;
25410037SARM gem5 Developers    print.desc = desc;
25510037SARM gem5 Developers    print.precision = precision;
25610037SARM gem5 Developers    print.descriptions = descriptions;
25710037SARM gem5 Developers    print.flags = flags;
25810037SARM gem5 Developers    print.pdf = NAN;
25910037SARM gem5 Developers    print.cdf = NAN;
26010037SARM gem5 Developers
26110037SARM gem5 Developers    bool havesub = !subnames.empty();
26210037SARM gem5 Developers
26310037SARM gem5 Developers    if (_size == 1) {
26410037SARM gem5 Developers        print.value = vec[0];
26510037SARM gem5 Developers        print(stream);
26610037SARM gem5 Developers        return;
26710037SARM gem5 Developers    }
26810037SARM gem5 Developers
2697317Sgblack@eecs.umich.edu    for (off_type i = 0; i < _size; ++i) {
2707317Sgblack@eecs.umich.edu        if (havesub && (i >= subnames.size() || subnames[i].empty()))
2717317Sgblack@eecs.umich.edu            continue;
2726748Sgblack@eecs.umich.edu
2736748Sgblack@eecs.umich.edu        print.name = base + (havesub ? subnames[i] : to_string(i));
2746748Sgblack@eecs.umich.edu        print.desc = subdescs.empty() ? desc : subdescs[i];
2756748Sgblack@eecs.umich.edu        print.value = vec[i];
2766748Sgblack@eecs.umich.edu
27710037SARM gem5 Developers        if (_total && flags & pdf) {
2786748Sgblack@eecs.umich.edu            print.pdf = vec[i] / _total;
2796748Sgblack@eecs.umich.edu            print.cdf += print.pdf;
2807424Sgblack@eecs.umich.edu        }
2816748Sgblack@eecs.umich.edu
2826748Sgblack@eecs.umich.edu        print(stream);
2836748Sgblack@eecs.umich.edu    }
2846748Sgblack@eecs.umich.edu
2856748Sgblack@eecs.umich.edu    if (flags & ::Stats::total) {
2866748Sgblack@eecs.umich.edu        print.pdf = NAN;
2876748Sgblack@eecs.umich.edu        print.cdf = NAN;
2886748Sgblack@eecs.umich.edu        print.name = base + "total";
2896748Sgblack@eecs.umich.edu        print.desc = desc;
2906748Sgblack@eecs.umich.edu        print.value = total;
2916748Sgblack@eecs.umich.edu        print(stream);
2926748Sgblack@eecs.umich.edu    }
2936748Sgblack@eecs.umich.edu}
2946748Sgblack@eecs.umich.edu
2956748Sgblack@eecs.umich.edustruct DistPrint
2966748Sgblack@eecs.umich.edu{
2977093Sgblack@eecs.umich.edu    string name;
2987424Sgblack@eecs.umich.edu    string desc;
29912234Sgabeblack@google.com    StatFlags flags;
3007147Sgblack@eecs.umich.edu    bool descriptions;
3017720Sgblack@eecs.umich.edu    int precision;
3027147Sgblack@eecs.umich.edu
3037147Sgblack@eecs.umich.edu    Counter min;
3047424Sgblack@eecs.umich.edu    Counter max;
30512234Sgabeblack@google.com    Counter bucket_size;
3067093Sgblack@eecs.umich.edu    size_type size;
3077720Sgblack@eecs.umich.edu    bool fancy;
3087720Sgblack@eecs.umich.edu
3097720Sgblack@eecs.umich.edu    const DistData &data;
3107093Sgblack@eecs.umich.edu
3117094Sgblack@eecs.umich.edu    DistPrint(const Text *text, const DistInfo &info);
3127296Sgblack@eecs.umich.edu    DistPrint(const Text *text, const VectorDistInfo &info, int i);
3137424Sgblack@eecs.umich.edu    void init(const Text *text, const Info &info, const DistParams *params);
3147296Sgblack@eecs.umich.edu    void operator()(ostream &stream) const;
3157296Sgblack@eecs.umich.edu};
3167296Sgblack@eecs.umich.edu
3177296Sgblack@eecs.umich.eduDistPrint::DistPrint(const Text *text, const DistInfo &info)
3187296Sgblack@eecs.umich.edu    : data(info.data)
3197296Sgblack@eecs.umich.edu{
3207296Sgblack@eecs.umich.edu    init(text, info, safe_cast<const DistParams *>(info.storageParams));
3217296Sgblack@eecs.umich.edu}
3227296Sgblack@eecs.umich.edu
3237639Sgblack@eecs.umich.eduDistPrint::DistPrint(const Text *text, const VectorDistInfo &info, int i)
3247639Sgblack@eecs.umich.edu    : data(info.data[i])
3257639Sgblack@eecs.umich.edu{
3267639Sgblack@eecs.umich.edu    init(text, info, safe_cast<const DistParams *>(info.storageParams));
3277639Sgblack@eecs.umich.edu
3287639Sgblack@eecs.umich.edu    name = info.name + "_" +
3297639Sgblack@eecs.umich.edu        (info.subnames[i].empty() ? (to_string(i)) : info.subnames[i]);
3307639Sgblack@eecs.umich.edu
3317639Sgblack@eecs.umich.edu    if (!info.subdescs[i].empty())
3327639Sgblack@eecs.umich.edu        desc = info.subdescs[i];
3337639Sgblack@eecs.umich.edu}
3347639Sgblack@eecs.umich.edu
3357639Sgblack@eecs.umich.eduvoid
3367639Sgblack@eecs.umich.eduDistPrint::init(const Text *text, const Info &info, const DistParams *params)
3377639Sgblack@eecs.umich.edu{
3387639Sgblack@eecs.umich.edu    name = info.name;
3397639Sgblack@eecs.umich.edu    desc = info.desc;
3407639Sgblack@eecs.umich.edu    flags = info.flags;
3417639Sgblack@eecs.umich.edu    precision = info.precision;
3427639Sgblack@eecs.umich.edu    descriptions = text->descriptions;
3437639Sgblack@eecs.umich.edu
3447639Sgblack@eecs.umich.edu    fancy = params->fancy;
3457148Sgblack@eecs.umich.edu    min = params->min;
3467424Sgblack@eecs.umich.edu    max = params->max;
34712234Sgabeblack@google.com    bucket_size = params->bucket_size;
3487094Sgblack@eecs.umich.edu    size = params->buckets;
3497720Sgblack@eecs.umich.edu}
3507720Sgblack@eecs.umich.edu
3517720Sgblack@eecs.umich.eduvoid
3527094Sgblack@eecs.umich.eduDistPrint::operator()(ostream &stream) const
3537148Sgblack@eecs.umich.edu{
3547148Sgblack@eecs.umich.edu    Result stdev = NAN;
3557148Sgblack@eecs.umich.edu    if (data.samples)
3567424Sgblack@eecs.umich.edu        stdev = sqrt((data.samples * data.squares - data.sum * data.sum) /
35712234Sgabeblack@google.com                     (data.samples * (data.samples - 1.0)));
3587148Sgblack@eecs.umich.edu
3597720Sgblack@eecs.umich.edu    if (fancy) {
3607720Sgblack@eecs.umich.edu        ScalarPrint print;
3617720Sgblack@eecs.umich.edu        string base = name + "::";
3627148Sgblack@eecs.umich.edu
3637640Sgblack@eecs.umich.edu        print.precision = precision;
3647640Sgblack@eecs.umich.edu        print.flags = flags;
3657640Sgblack@eecs.umich.edu        print.descriptions = descriptions;
3667640Sgblack@eecs.umich.edu        print.desc = desc;
36710474Sandreas.hansson@arm.com        print.pdf = NAN;
36810474Sandreas.hansson@arm.com        print.cdf = NAN;
3697640Sgblack@eecs.umich.edu
37010037SARM gem5 Developers        print.name = base + "mean";
37112403Sgiacomo.travaglini@arm.com        print.value = data.samples ? data.sum / data.samples : NAN;
37212403Sgiacomo.travaglini@arm.com        print(stream);
37312403Sgiacomo.travaglini@arm.com
37412403Sgiacomo.travaglini@arm.com        print.name = base + "stdev";
37512403Sgiacomo.travaglini@arm.com        print.value = stdev;
37611513Sandreas.sandberg@arm.com        print(stream);
37712789Sgiacomo.travaglini@arm.com
37812789Sgiacomo.travaglini@arm.com        print.name = "**Ignore: " + base + "TOT";
37912789Sgiacomo.travaglini@arm.com        print.value = data.samples;
38012789Sgiacomo.travaglini@arm.com        print(stream);
38112789Sgiacomo.travaglini@arm.com        return;
38212789Sgiacomo.travaglini@arm.com    }
38312789Sgiacomo.travaglini@arm.com
38412789Sgiacomo.travaglini@arm.com    assert(size == data.cvec.size());
38511513Sandreas.sandberg@arm.com
38611513Sandreas.sandberg@arm.com    Result total = 0.0;
38711513Sandreas.sandberg@arm.com
38811513Sandreas.sandberg@arm.com    total += data.underflow;
38911513Sandreas.sandberg@arm.com    for (off_type i = 0; i < size; ++i)
39011513Sandreas.sandberg@arm.com        total += data.cvec[i];
39111513Sandreas.sandberg@arm.com    total += data.overflow;
39211513Sandreas.sandberg@arm.com
39311513Sandreas.sandberg@arm.com    string base = name + "::";
39411513Sandreas.sandberg@arm.com
39511513Sandreas.sandberg@arm.com    ScalarPrint print;
39611513Sandreas.sandberg@arm.com    print.desc = desc;
39711513Sandreas.sandberg@arm.com    print.flags = flags;
39811513Sandreas.sandberg@arm.com    print.descriptions = descriptions;
39911513Sandreas.sandberg@arm.com    print.precision = precision;
40011513Sandreas.sandberg@arm.com    print.pdf = NAN;
40111513Sandreas.sandberg@arm.com    print.cdf = NAN;
40211513Sandreas.sandberg@arm.com
40311513Sandreas.sandberg@arm.com    print.name = base + "samples";
40411513Sandreas.sandberg@arm.com    print.value = data.samples;
40511513Sandreas.sandberg@arm.com    print(stream);
40611513Sandreas.sandberg@arm.com
40711513Sandreas.sandberg@arm.com    print.name = base + "min_value";
40811513Sandreas.sandberg@arm.com    print.value = data.min_val;
40911513Sandreas.sandberg@arm.com    print(stream);
41011513Sandreas.sandberg@arm.com
41111513Sandreas.sandberg@arm.com    print.name = base + "underflows";
41211513Sandreas.sandberg@arm.com    print.value = data.underflow;
41311513Sandreas.sandberg@arm.com    if (total) {
41411513Sandreas.sandberg@arm.com        print.pdf = data.underflow / total;
41511513Sandreas.sandberg@arm.com        print.cdf += print.pdf;
41611513Sandreas.sandberg@arm.com    }
41711513Sandreas.sandberg@arm.com    print(stream);
41811513Sandreas.sandberg@arm.com
41911513Sandreas.sandberg@arm.com    for (off_type i = 0; i < size; ++i) {
42011513Sandreas.sandberg@arm.com        stringstream namestr;
42111513Sandreas.sandberg@arm.com        namestr << base;
42211513Sandreas.sandberg@arm.com
42311513Sandreas.sandberg@arm.com        Counter low = i * bucket_size + min;
42411513Sandreas.sandberg@arm.com        Counter high = ::min(low + bucket_size, max);
42511514Sandreas.sandberg@arm.com        namestr << low;
42612403Sgiacomo.travaglini@arm.com        if (low < high)
42712403Sgiacomo.travaglini@arm.com            namestr << "-" << high;
42812403Sgiacomo.travaglini@arm.com
42912403Sgiacomo.travaglini@arm.com        print.name = namestr.str();
43012403Sgiacomo.travaglini@arm.com        print.value = data.cvec[i];
43112403Sgiacomo.travaglini@arm.com        if (total) {
43212403Sgiacomo.travaglini@arm.com            print.pdf = data.cvec[i] / total;
43312403Sgiacomo.travaglini@arm.com            print.cdf += print.pdf;
43412403Sgiacomo.travaglini@arm.com        }
43512403Sgiacomo.travaglini@arm.com        print(stream);
43612403Sgiacomo.travaglini@arm.com    }
43712403Sgiacomo.travaglini@arm.com
43812403Sgiacomo.travaglini@arm.com    print.name = base + "overflows";
43912403Sgiacomo.travaglini@arm.com    print.value = data.overflow;
44012403Sgiacomo.travaglini@arm.com    if (total) {
44112403Sgiacomo.travaglini@arm.com        print.pdf = data.overflow / total;
44212403Sgiacomo.travaglini@arm.com        print.cdf += print.pdf;
44312403Sgiacomo.travaglini@arm.com    } else {
44412403Sgiacomo.travaglini@arm.com        print.pdf = NAN;
44512403Sgiacomo.travaglini@arm.com        print.cdf = NAN;
44612403Sgiacomo.travaglini@arm.com    }
44712403Sgiacomo.travaglini@arm.com    print(stream);
44812403Sgiacomo.travaglini@arm.com
44912498Sgiacomo.travaglini@arm.com    print.pdf = NAN;
45012498Sgiacomo.travaglini@arm.com    print.cdf = NAN;
45112498Sgiacomo.travaglini@arm.com
45212498Sgiacomo.travaglini@arm.com    print.name = base + "total";
45312498Sgiacomo.travaglini@arm.com    print.value = total;
45412498Sgiacomo.travaglini@arm.com    print(stream);
45512498Sgiacomo.travaglini@arm.com
45612498Sgiacomo.travaglini@arm.com    print.name = base + "max_value";
45712498Sgiacomo.travaglini@arm.com    print.value = data.max_val;
45812498Sgiacomo.travaglini@arm.com    print(stream);
45912498Sgiacomo.travaglini@arm.com
46012498Sgiacomo.travaglini@arm.com    print.name = base + "mean";
46112498Sgiacomo.travaglini@arm.com    print.value = data.sum / data.samples;
46212498Sgiacomo.travaglini@arm.com    print(stream);
46312498Sgiacomo.travaglini@arm.com
46412498Sgiacomo.travaglini@arm.com    print.name = base + "stdev";
46512498Sgiacomo.travaglini@arm.com    print.value = stdev;
46612498Sgiacomo.travaglini@arm.com    print(stream);
46712498Sgiacomo.travaglini@arm.com}
46812498Sgiacomo.travaglini@arm.com
46912498Sgiacomo.travaglini@arm.comvoid
47012498Sgiacomo.travaglini@arm.comText::visit(const ScalarInfo &info)
47112498Sgiacomo.travaglini@arm.com{
47212498Sgiacomo.travaglini@arm.com    if (noOutput(info))
47313759Sgiacomo.gabrielli@arm.com        return;
47413759Sgiacomo.gabrielli@arm.com
47513759Sgiacomo.gabrielli@arm.com    ScalarPrint print;
47613759Sgiacomo.gabrielli@arm.com    print.value = info.result();
47713759Sgiacomo.gabrielli@arm.com    print.name = info.name;
47813759Sgiacomo.gabrielli@arm.com    print.desc = info.desc;
47913759Sgiacomo.gabrielli@arm.com    print.flags = info.flags;
48013759Sgiacomo.gabrielli@arm.com    print.descriptions = descriptions;
48113759Sgiacomo.gabrielli@arm.com    print.precision = info.precision;
48213759Sgiacomo.gabrielli@arm.com    print.pdf = NAN;
48313759Sgiacomo.gabrielli@arm.com    print.cdf = NAN;
48413759Sgiacomo.gabrielli@arm.com
48513759Sgiacomo.gabrielli@arm.com    print(*stream);
48613759Sgiacomo.gabrielli@arm.com}
48713759Sgiacomo.gabrielli@arm.com
48813759Sgiacomo.gabrielli@arm.comvoid
48913759Sgiacomo.gabrielli@arm.comText::visit(const VectorInfo &info)
49011514Sandreas.sandberg@arm.com{
49111514Sandreas.sandberg@arm.com    if (noOutput(info))
49211514Sandreas.sandberg@arm.com        return;
49311514Sandreas.sandberg@arm.com
49412498Sgiacomo.travaglini@arm.com    size_type size = info.size();
49511514Sandreas.sandberg@arm.com    VectorPrint print;
49611514Sandreas.sandberg@arm.com
49711514Sandreas.sandberg@arm.com    print.name = info.name;
49812498Sgiacomo.travaglini@arm.com    print.desc = info.desc;
49912498Sgiacomo.travaglini@arm.com    print.flags = info.flags;
50012498Sgiacomo.travaglini@arm.com    print.descriptions = descriptions;
50112498Sgiacomo.travaglini@arm.com    print.precision = info.precision;
50212498Sgiacomo.travaglini@arm.com    print.vec = info.result();
50312498Sgiacomo.travaglini@arm.com    print.total = info.total();
50412498Sgiacomo.travaglini@arm.com
50512498Sgiacomo.travaglini@arm.com    if (!info.subnames.empty()) {
50612498Sgiacomo.travaglini@arm.com        for (off_type i = 0; i < size; ++i) {
50712498Sgiacomo.travaglini@arm.com            if (!info.subnames[i].empty()) {
50812498Sgiacomo.travaglini@arm.com                print.subnames = info.subnames;
50910037SARM gem5 Developers                print.subnames.resize(size);
51010037SARM gem5 Developers                for (off_type i = 0; i < size; ++i) {
51110037SARM gem5 Developers                    if (!info.subnames[i].empty() &&
51212249Sgiacomo.travaglini@arm.com                        !info.subdescs[i].empty()) {
51312249Sgiacomo.travaglini@arm.com                        print.subdescs = info.subdescs;
51412249Sgiacomo.travaglini@arm.com                        print.subdescs.resize(size);
51512249Sgiacomo.travaglini@arm.com                        break;
51612249Sgiacomo.travaglini@arm.com                    }
51712249Sgiacomo.travaglini@arm.com                }
51812399Sgiacomo.travaglini@arm.com                break;
51912399Sgiacomo.travaglini@arm.com            }
52012399Sgiacomo.travaglini@arm.com        }
52112399Sgiacomo.travaglini@arm.com    }
52212399Sgiacomo.travaglini@arm.com
52312399Sgiacomo.travaglini@arm.com    print(*stream);
52412399Sgiacomo.travaglini@arm.com}
52512399Sgiacomo.travaglini@arm.com
52612399Sgiacomo.travaglini@arm.comvoid
52712399Sgiacomo.travaglini@arm.comText::visit(const Vector2dInfo &info)
52812399Sgiacomo.travaglini@arm.com{
52912399Sgiacomo.travaglini@arm.com    if (noOutput(info))
53012399Sgiacomo.travaglini@arm.com        return;
53112399Sgiacomo.travaglini@arm.com
53212399Sgiacomo.travaglini@arm.com    bool havesub = false;
53312399Sgiacomo.travaglini@arm.com    VectorPrint print;
53412399Sgiacomo.travaglini@arm.com
53512401Sgiacomo.travaglini@arm.com    print.subnames = info.y_subnames;
53612399Sgiacomo.travaglini@arm.com    print.flags = info.flags;
53712614Sgabeblack@google.com    print.descriptions = descriptions;
53812614Sgabeblack@google.com    print.precision = info.precision;
53912614Sgabeblack@google.com
54012614Sgabeblack@google.com    if (!info.subnames.empty()) {
54112614Sgabeblack@google.com        for (off_type i = 0; i < info.x; ++i)
54212614Sgabeblack@google.com            if (!info.subnames[i].empty())
54313759Sgiacomo.gabrielli@arm.com                havesub = true;
54413759Sgiacomo.gabrielli@arm.com    }
54513759Sgiacomo.gabrielli@arm.com
54613759Sgiacomo.gabrielli@arm.com    VResult tot_vec(info.y);
54713759Sgiacomo.gabrielli@arm.com    Result super_total = 0.0;
54813759Sgiacomo.gabrielli@arm.com    for (off_type i = 0; i < info.x; ++i) {
54913759Sgiacomo.gabrielli@arm.com        if (havesub && (i >= info.subnames.size() || info.subnames[i].empty()))
55013759Sgiacomo.gabrielli@arm.com            continue;
55113759Sgiacomo.gabrielli@arm.com
55213759Sgiacomo.gabrielli@arm.com        off_type iy = i * info.y;
55313759Sgiacomo.gabrielli@arm.com        VResult yvec(info.y);
55413759Sgiacomo.gabrielli@arm.com
55513759Sgiacomo.gabrielli@arm.com        Result total = 0.0;
55613759Sgiacomo.gabrielli@arm.com        for (off_type j = 0; j < info.y; ++j) {
55713759Sgiacomo.gabrielli@arm.com            yvec[j] = info.cvec[iy + j];
5587094Sgblack@eecs.umich.edu            tot_vec[j] += yvec[j];
5596253Sgblack@eecs.umich.edu            total += yvec[j];
5606253Sgblack@eecs.umich.edu            super_total += yvec[j];
5616253Sgblack@eecs.umich.edu        }
562
563        print.name = info.name + "_" +
564            (havesub ? info.subnames[i] : to_string(i));
565        print.desc = info.desc;
566        print.vec = yvec;
567        print.total = total;
568        print(*stream);
569    }
570
571    if ((info.flags & ::Stats::total) && (info.x > 1)) {
572        print.name = info.name;
573        print.desc = info.desc;
574        print.vec = tot_vec;
575        print.total = super_total;
576        print(*stream);
577    }
578}
579
580void
581Text::visit(const DistInfo &info)
582{
583    if (noOutput(info))
584        return;
585
586    DistPrint print(this, info);
587    print(*stream);
588}
589
590void
591Text::visit(const VectorDistInfo &info)
592{
593    if (noOutput(info))
594        return;
595
596    for (off_type i = 0; i < info.size(); ++i) {
597        DistPrint print(this, info, i);
598        print(*stream);
599    }
600}
601
602void
603Text::visit(const FormulaInfo &info)
604{
605    visit((const VectorInfo &)info);
606}
607
608bool
609initText(const string &filename, bool desc)
610{
611    static Text text;
612    static bool connected = false;
613
614    if (connected)
615        return false;
616
617    extern list<Output *> OutputList;
618
619    text.open(*simout.find(filename));
620    text.descriptions = desc;
621    OutputList.push_back(&text);
622    connected = true;
623
624    return true;
625}
626
627/* namespace Stats */ }
628