text.cc revision 6004:97660425ff39
18839Sandreas.hansson@arm.com/*
28839Sandreas.hansson@arm.com * Copyright (c) 2004-2005 The Regents of The University of Michigan
38839Sandreas.hansson@arm.com * All rights reserved.
48839Sandreas.hansson@arm.com *
58839Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
68839Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are
78839Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
88839Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
98839Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
108839Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
118839Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
128839Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its
133101Sstever@eecs.umich.edu * contributors may be used to endorse or promote products derived from
148579Ssteve.reinhardt@amd.com * this software without specific prior written permission.
153101Sstever@eecs.umich.edu *
163101Sstever@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173101Sstever@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183101Sstever@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193101Sstever@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203101Sstever@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213101Sstever@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223101Sstever@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233101Sstever@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243101Sstever@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253101Sstever@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263101Sstever@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273101Sstever@eecs.umich.edu *
283101Sstever@eecs.umich.edu * Authors: Nathan Binkert
293101Sstever@eecs.umich.edu */
303101Sstever@eecs.umich.edu
313101Sstever@eecs.umich.edu#if defined(__APPLE__)
323101Sstever@eecs.umich.edu#define _GLIBCPP_USE_C99 1
333101Sstever@eecs.umich.edu#endif
343101Sstever@eecs.umich.edu
353101Sstever@eecs.umich.edu#if defined(__sun)
363101Sstever@eecs.umich.edu#include <math.h>
373101Sstever@eecs.umich.edu#endif
383101Sstever@eecs.umich.edu
393101Sstever@eecs.umich.edu#include <iostream>
403101Sstever@eecs.umich.edu#include <sstream>
413101Sstever@eecs.umich.edu#include <fstream>
427778Sgblack@eecs.umich.edu#include <string>
438839Sandreas.hansson@arm.com
443101Sstever@eecs.umich.edu#include "base/misc.hh"
453101Sstever@eecs.umich.edu#include "base/statistics.hh"
463101Sstever@eecs.umich.edu#include "base/stats/text.hh"
473101Sstever@eecs.umich.edu#include "base/stats/visit.hh"
483101Sstever@eecs.umich.edu
493101Sstever@eecs.umich.eduusing namespace std;
503101Sstever@eecs.umich.edu
513101Sstever@eecs.umich.edu#ifndef NAN
523101Sstever@eecs.umich.edufloat __nan();
533101Sstever@eecs.umich.edu/** Define Not a number. */
543101Sstever@eecs.umich.edu#define NAN (__nan())
553101Sstever@eecs.umich.edu/** Need to define __nan() */
563101Sstever@eecs.umich.edu#define __M5_NAN
573101Sstever@eecs.umich.edu#endif
583101Sstever@eecs.umich.edu
593101Sstever@eecs.umich.edu#ifdef __M5_NAN
603101Sstever@eecs.umich.edufloat
613101Sstever@eecs.umich.edu__nan()
623885Sbinkertn@umich.edu{
633885Sbinkertn@umich.edu    union {
644762Snate@binkert.org        uint32_t ui;
653885Sbinkertn@umich.edu        float f;
663885Sbinkertn@umich.edu    } nan;
677528Ssteve.reinhardt@amd.com
683885Sbinkertn@umich.edu    nan.ui = 0x7fc00000;
694380Sbinkertn@umich.edu    return nan.f;
704167Sbinkertn@umich.edu}
713102Sstever@eecs.umich.edu#endif
723101Sstever@eecs.umich.edu
734762Snate@binkert.orgnamespace Stats {
744762Snate@binkert.org
754762Snate@binkert.orgText::Text()
764762Snate@binkert.org    : mystream(false), stream(NULL), compat(false), descriptions(false)
774762Snate@binkert.org{
784762Snate@binkert.org}
794762Snate@binkert.org
804762Snate@binkert.orgText::Text(std::ostream &stream)
814762Snate@binkert.org    : mystream(false), stream(NULL), compat(false), descriptions(false)
825033Smilesck@eecs.umich.edu{
835033Smilesck@eecs.umich.edu    open(stream);
845033Smilesck@eecs.umich.edu}
855033Smilesck@eecs.umich.edu
865033Smilesck@eecs.umich.eduText::Text(const std::string &file)
875033Smilesck@eecs.umich.edu    : mystream(false), stream(NULL), compat(false), descriptions(false)
885033Smilesck@eecs.umich.edu{
895033Smilesck@eecs.umich.edu    open(file);
905033Smilesck@eecs.umich.edu}
915033Smilesck@eecs.umich.edu
923101Sstever@eecs.umich.edu
933101Sstever@eecs.umich.eduText::~Text()
943101Sstever@eecs.umich.edu{
955033Smilesck@eecs.umich.edu    if (mystream) {
963101Sstever@eecs.umich.edu        assert(stream);
978596Ssteve.reinhardt@amd.com        delete stream;
988596Ssteve.reinhardt@amd.com    }
998596Ssteve.reinhardt@amd.com}
1008596Ssteve.reinhardt@amd.com
1017673Snate@binkert.orgvoid
1027673Snate@binkert.orgText::open(std::ostream &_stream)
1037673Snate@binkert.org{
1047673Snate@binkert.org    if (stream)
1058596Ssteve.reinhardt@amd.com        panic("stream already set!");
1068596Ssteve.reinhardt@amd.com
1078596Ssteve.reinhardt@amd.com    mystream = false;
1087673Snate@binkert.org    stream = &_stream;
1097673Snate@binkert.org    if (!valid())
1107673Snate@binkert.org        fatal("Unable to open output stream for writing\n");
1113101Sstever@eecs.umich.edu}
1123101Sstever@eecs.umich.edu
1133101Sstever@eecs.umich.eduvoid
1143101Sstever@eecs.umich.eduText::open(const std::string &file)
1153101Sstever@eecs.umich.edu{
1163101Sstever@eecs.umich.edu    if (stream)
1173101Sstever@eecs.umich.edu        panic("stream already set!");
1183101Sstever@eecs.umich.edu
1193101Sstever@eecs.umich.edu    mystream = true;
1203101Sstever@eecs.umich.edu    stream = new ofstream(file.c_str(), ios::trunc);
1213101Sstever@eecs.umich.edu    if (!valid())
1223101Sstever@eecs.umich.edu        fatal("Unable to open statistics file for writing\n");
1233101Sstever@eecs.umich.edu}
1243101Sstever@eecs.umich.edu
1253101Sstever@eecs.umich.edubool
1263101Sstever@eecs.umich.eduText::valid() const
1273101Sstever@eecs.umich.edu{
1283101Sstever@eecs.umich.edu    return stream != NULL && stream->good();
1293101Sstever@eecs.umich.edu}
1303101Sstever@eecs.umich.edu
1313101Sstever@eecs.umich.eduvoid
1323101Sstever@eecs.umich.eduText::output()
1333101Sstever@eecs.umich.edu{
1343101Sstever@eecs.umich.edu    ccprintf(*stream, "\n---------- Begin Simulation Statistics ----------\n");
1353101Sstever@eecs.umich.edu    list<Info *>::const_iterator i, end = statsList().end();
1363101Sstever@eecs.umich.edu    for (i = statsList().begin(); i != end; ++i)
1373101Sstever@eecs.umich.edu        (*i)->visit(*this);
1383101Sstever@eecs.umich.edu    ccprintf(*stream, "\n---------- End Simulation Statistics   ----------\n");
1393101Sstever@eecs.umich.edu    stream->flush();
1403101Sstever@eecs.umich.edu}
1413101Sstever@eecs.umich.edu
1423101Sstever@eecs.umich.edubool
1433101Sstever@eecs.umich.eduText::noOutput(const Info &info)
1443101Sstever@eecs.umich.edu{
1453101Sstever@eecs.umich.edu    if (!(info.flags & print))
1463101Sstever@eecs.umich.edu        return true;
1473101Sstever@eecs.umich.edu
1483101Sstever@eecs.umich.edu    if (info.prereq && info.prereq->zero())
1493101Sstever@eecs.umich.edu        return true;
1503101Sstever@eecs.umich.edu
1513101Sstever@eecs.umich.edu    return false;
1523101Sstever@eecs.umich.edu}
1533101Sstever@eecs.umich.edu
1543101Sstever@eecs.umich.edustring
1553101Sstever@eecs.umich.eduValueToString(Result value, int precision, bool compat)
1563101Sstever@eecs.umich.edu{
1575033Smilesck@eecs.umich.edu    stringstream val;
1586656Snate@binkert.org
1595033Smilesck@eecs.umich.edu    if (!isnan(value)) {
1605033Smilesck@eecs.umich.edu        if (precision != -1)
1615033Smilesck@eecs.umich.edu            val.precision(precision);
1623101Sstever@eecs.umich.edu        else if (value == rint(value))
1633101Sstever@eecs.umich.edu            val.precision(0);
1643101Sstever@eecs.umich.edu
1653101Sstever@eecs.umich.edu        val.unsetf(ios::showpoint);
1663101Sstever@eecs.umich.edu        val.setf(ios::fixed);
1673101Sstever@eecs.umich.edu        val << value;
1683101Sstever@eecs.umich.edu    } else {
1693101Sstever@eecs.umich.edu        val << (compat ? "<err: div-0>" : "no value");
1703101Sstever@eecs.umich.edu    }
1713101Sstever@eecs.umich.edu
1723101Sstever@eecs.umich.edu    return val.str();
1733101Sstever@eecs.umich.edu}
1743101Sstever@eecs.umich.edu
1753102Sstever@eecs.umich.edustruct ScalarPrint
1763101Sstever@eecs.umich.edu{
1773101Sstever@eecs.umich.edu    Result value;
1783101Sstever@eecs.umich.edu    string name;
1797673Snate@binkert.org    string desc;
1808607Sgblack@eecs.umich.edu    StatFlags flags;
1817673Snate@binkert.org    bool compat;
1823101Sstever@eecs.umich.edu    bool descriptions;
1837673Snate@binkert.org    int precision;
1847673Snate@binkert.org    Result pdf;
1853101Sstever@eecs.umich.edu    Result cdf;
1867673Snate@binkert.org
1877673Snate@binkert.org    void operator()(ostream &stream) const;
1883101Sstever@eecs.umich.edu};
1893101Sstever@eecs.umich.edu
1903101Sstever@eecs.umich.eduvoid
1913101Sstever@eecs.umich.eduScalarPrint::operator()(ostream &stream) const
1923101Sstever@eecs.umich.edu{
1933101Sstever@eecs.umich.edu    if ((flags & nozero && value == 0.0) ||
1945033Smilesck@eecs.umich.edu        (flags & nonan && isnan(value)))
1955475Snate@binkert.org        return;
1965475Snate@binkert.org
1975475Snate@binkert.org    stringstream pdfstr, cdfstr;
1985475Snate@binkert.org
1993101Sstever@eecs.umich.edu    if (!isnan(pdf))
2003101Sstever@eecs.umich.edu        ccprintf(pdfstr, "%.2f%%", pdf * 100.0);
2013101Sstever@eecs.umich.edu
2024762Snate@binkert.org    if (!isnan(cdf))
2034762Snate@binkert.org        ccprintf(cdfstr, "%.2f%%", cdf * 100.0);
2044762Snate@binkert.org
2053101Sstever@eecs.umich.edu    if (compat && flags & __substat) {
2068460SAli.Saidi@ARM.com        ccprintf(stream, "%32s %12s %10s %10s", name,
2078459SAli.Saidi@ARM.com                 ValueToString(value, precision, compat), pdfstr, cdfstr);
2088459SAli.Saidi@ARM.com    } else {
2098459SAli.Saidi@ARM.com        ccprintf(stream, "%-40s %12s %10s %10s", name,
2103101Sstever@eecs.umich.edu                 ValueToString(value, precision, compat), pdfstr, cdfstr);
2117528Ssteve.reinhardt@amd.com    }
2127528Ssteve.reinhardt@amd.com
2137528Ssteve.reinhardt@amd.com    if (descriptions) {
2147528Ssteve.reinhardt@amd.com        if (!desc.empty())
2157528Ssteve.reinhardt@amd.com            ccprintf(stream, " # %s", desc);
2167528Ssteve.reinhardt@amd.com    }
2173101Sstever@eecs.umich.edu    stream << endl;
2187528Ssteve.reinhardt@amd.com}
2197528Ssteve.reinhardt@amd.com
2207528Ssteve.reinhardt@amd.comstruct VectorPrint
2217528Ssteve.reinhardt@amd.com{
2227528Ssteve.reinhardt@amd.com    string name;
2237528Ssteve.reinhardt@amd.com    string desc;
2247528Ssteve.reinhardt@amd.com    vector<string> subnames;
2257528Ssteve.reinhardt@amd.com    vector<string> subdescs;
2267528Ssteve.reinhardt@amd.com    StatFlags flags;
2277528Ssteve.reinhardt@amd.com    bool compat;
2288321Ssteve.reinhardt@amd.com    bool descriptions;
2298321Ssteve.reinhardt@amd.com    int precision;
2307528Ssteve.reinhardt@amd.com    VResult vec;
2317528Ssteve.reinhardt@amd.com    Result total;
2327528Ssteve.reinhardt@amd.com
2337528Ssteve.reinhardt@amd.com    void operator()(ostream &stream) const;
2347528Ssteve.reinhardt@amd.com};
2357528Ssteve.reinhardt@amd.com
2367528Ssteve.reinhardt@amd.comvoid
2377528Ssteve.reinhardt@amd.comVectorPrint::operator()(std::ostream &stream) const
2387528Ssteve.reinhardt@amd.com{
2397528Ssteve.reinhardt@amd.com    size_type _size = vec.size();
2407528Ssteve.reinhardt@amd.com    Result _total = 0.0;
2417528Ssteve.reinhardt@amd.com
2427528Ssteve.reinhardt@amd.com    if (flags & (pdf | cdf)) {
2433101Sstever@eecs.umich.edu        for (off_type i = 0; i < _size; ++i) {
2448664SAli.Saidi@ARM.com            _total += vec[i];
2458664SAli.Saidi@ARM.com        }
2468664SAli.Saidi@ARM.com    }
2478664SAli.Saidi@ARM.com
2488664SAli.Saidi@ARM.com    string base = name + (compat ? "_" : "::");
2498664SAli.Saidi@ARM.com
2503101Sstever@eecs.umich.edu    ScalarPrint print;
2513101Sstever@eecs.umich.edu    print.name = name;
2523101Sstever@eecs.umich.edu    print.desc = desc;
2533101Sstever@eecs.umich.edu    print.compat = compat;
2543101Sstever@eecs.umich.edu    print.precision = precision;
2553101Sstever@eecs.umich.edu    print.descriptions = descriptions;
2563101Sstever@eecs.umich.edu    print.flags = flags;
2573101Sstever@eecs.umich.edu    print.pdf = NAN;
2584762Snate@binkert.org    print.cdf = NAN;
2594762Snate@binkert.org
2604762Snate@binkert.org    bool havesub = !subnames.empty();
2614762Snate@binkert.org
2627528Ssteve.reinhardt@amd.com    if (_size == 1) {
2634762Snate@binkert.org        print.value = vec[0];
2644762Snate@binkert.org        print(stream);
2654762Snate@binkert.org    } else if (!compat) {
2668596Ssteve.reinhardt@amd.com        for (off_type i = 0; i < _size; ++i) {
2678596Ssteve.reinhardt@amd.com            if (havesub && (i >= subnames.size() || subnames[i].empty()))
2688596Ssteve.reinhardt@amd.com                continue;
2697673Snate@binkert.org
2708596Ssteve.reinhardt@amd.com            print.name = base + (havesub ? subnames[i] : to_string(i));
2714762Snate@binkert.org            print.desc = subdescs.empty() ? desc : subdescs[i];
2727673Snate@binkert.org            print.value = vec[i];
2738596Ssteve.reinhardt@amd.com
2747675Snate@binkert.org            if (_total && (flags & pdf)) {
2757675Snate@binkert.org                print.pdf = vec[i] / _total;
2767675Snate@binkert.org                print.cdf += print.pdf;
2777675Snate@binkert.org            }
2788656Sandreas.hansson@arm.com
2798656Sandreas.hansson@arm.com            print(stream);
2808656Sandreas.hansson@arm.com        }
2817675Snate@binkert.org
2827675Snate@binkert.org        if (flags & ::Stats::total) {
2837673Snate@binkert.org            print.name = base + "total";
2847675Snate@binkert.org            print.desc = desc;
2857675Snate@binkert.org            print.value = total;
2867675Snate@binkert.org            print(stream);
2877675Snate@binkert.org        }
2887675Snate@binkert.org    } else {
2897673Snate@binkert.org        if (flags & ::Stats::total) {
2907675Snate@binkert.org            print.value = total;
2917675Snate@binkert.org            print(stream);
2927675Snate@binkert.org        }
2937675Snate@binkert.org
2947675Snate@binkert.org        Result _pdf = 0.0;
2957675Snate@binkert.org        Result _cdf = 0.0;
2967675Snate@binkert.org        if (flags & dist) {
2977675Snate@binkert.org            ccprintf(stream, "%s.start_dist\n", name);
2987675Snate@binkert.org            for (off_type i = 0; i < _size; ++i) {
2997675Snate@binkert.org                print.name = havesub ? subnames[i] : to_string(i);
3007675Snate@binkert.org                print.desc = subdescs.empty() ? desc : subdescs[i];
3017675Snate@binkert.org                print.flags |= __substat;
3027675Snate@binkert.org                print.value = vec[i];
3037675Snate@binkert.org
3047675Snate@binkert.org                if (_total) {
3057675Snate@binkert.org                    _pdf = vec[i] / _total;
3067673Snate@binkert.org                    _cdf += _pdf;
3077673Snate@binkert.org                }
3083101Sstever@eecs.umich.edu
3097675Snate@binkert.org                if (flags & pdf)
3107675Snate@binkert.org                    print.pdf = _pdf;
3117673Snate@binkert.org                if (flags & cdf)
3127673Snate@binkert.org                    print.cdf = _cdf;
3137673Snate@binkert.org
3143101Sstever@eecs.umich.edu                print(stream);
3157673Snate@binkert.org            }
3167673Snate@binkert.org            ccprintf(stream, "%s.end_dist\n", name);
3173101Sstever@eecs.umich.edu        } else {
3183101Sstever@eecs.umich.edu            for (off_type i = 0; i < _size; ++i) {
3193101Sstever@eecs.umich.edu                if (havesub && subnames[i].empty())
3203101Sstever@eecs.umich.edu                    continue;
3213101Sstever@eecs.umich.edu
3223101Sstever@eecs.umich.edu                print.name = base;
3233101Sstever@eecs.umich.edu                print.name += havesub ? subnames[i] : to_string(i);
3243101Sstever@eecs.umich.edu                print.desc = subdescs.empty() ? desc : subdescs[i];
3253101Sstever@eecs.umich.edu                print.value = vec[i];
3263101Sstever@eecs.umich.edu
3273101Sstever@eecs.umich.edu                if (_total) {
3283101Sstever@eecs.umich.edu                    _pdf = vec[i] / _total;
3293101Sstever@eecs.umich.edu                    _cdf += _pdf;
3303101Sstever@eecs.umich.edu                } else {
3313101Sstever@eecs.umich.edu                    _pdf = _cdf = NAN;
3325033Smilesck@eecs.umich.edu                }
3335033Smilesck@eecs.umich.edu
3343101Sstever@eecs.umich.edu                if (flags & pdf) {
3353101Sstever@eecs.umich.edu                    print.pdf = _pdf;
3363101Sstever@eecs.umich.edu                    print.cdf = _cdf;
3373101Sstever@eecs.umich.edu                }
3383101Sstever@eecs.umich.edu
3393101Sstever@eecs.umich.edu                print(stream);
3403101Sstever@eecs.umich.edu            }
3413101Sstever@eecs.umich.edu        }
3423101Sstever@eecs.umich.edu    }
3433101Sstever@eecs.umich.edu}
3443101Sstever@eecs.umich.edu
3453101Sstever@eecs.umich.edustruct DistPrint
3463101Sstever@eecs.umich.edu{
3473101Sstever@eecs.umich.edu    string name;
3483101Sstever@eecs.umich.edu    string desc;
3493101Sstever@eecs.umich.edu    StatFlags flags;
3503101Sstever@eecs.umich.edu    bool compat;
3513101Sstever@eecs.umich.edu    bool descriptions;
3523101Sstever@eecs.umich.edu    int precision;
3533101Sstever@eecs.umich.edu
3543101Sstever@eecs.umich.edu    Counter min;
3553101Sstever@eecs.umich.edu    Counter max;
3563101Sstever@eecs.umich.edu    Counter bucket_size;
3573101Sstever@eecs.umich.edu    size_type size;
3583101Sstever@eecs.umich.edu    bool fancy;
3597673Snate@binkert.org
3607673Snate@binkert.org    const DistData &data;
3617673Snate@binkert.org
3627673Snate@binkert.org    DistPrint(const DistInfoBase &info);
3637673Snate@binkert.org    DistPrint(const VectorDistInfoBase &info, int i);
3647673Snate@binkert.org    void init(const Info &info, const DistParams *params);
3657673Snate@binkert.org    void operator()(ostream &stream) const;
3667673Snate@binkert.org};
3674762Snate@binkert.org
3684762Snate@binkert.orgDistPrint::DistPrint(const DistInfoBase &info)
3694762Snate@binkert.org    : data(info.data)
3703101Sstever@eecs.umich.edu{
3713101Sstever@eecs.umich.edu    init(info, safe_cast<const DistParams *>(info.storageParams));
3723101Sstever@eecs.umich.edu}
3733101Sstever@eecs.umich.edu
3743101Sstever@eecs.umich.eduDistPrint::DistPrint(const VectorDistInfoBase &info, int i)
3753101Sstever@eecs.umich.edu    : data(info.data[i])
3763101Sstever@eecs.umich.edu{
3773101Sstever@eecs.umich.edu    init(info, safe_cast<const DistParams *>(info.storageParams));
3783101Sstever@eecs.umich.edu
3793101Sstever@eecs.umich.edu    name = info.name + "_" +
3803101Sstever@eecs.umich.edu        (info.subnames[i].empty() ? (to_string(i)) : info.subnames[i]);
3813714Sstever@eecs.umich.edu
3823714Sstever@eecs.umich.edu    if (!info.subdescs[i].empty())
3833714Sstever@eecs.umich.edu        desc = info.subdescs[i];
3843714Sstever@eecs.umich.edu}
3853714Sstever@eecs.umich.edu
3863714Sstever@eecs.umich.eduvoid
3873101Sstever@eecs.umich.eduDistPrint::init(const Info &info, const DistParams *params)
3883101Sstever@eecs.umich.edu{
3893101Sstever@eecs.umich.edu    name = info.name;
3903101Sstever@eecs.umich.edu    desc = info.desc;
3913101Sstever@eecs.umich.edu    flags = info.flags;
3923101Sstever@eecs.umich.edu    compat = compat;
3933101Sstever@eecs.umich.edu    descriptions = descriptions;
3943101Sstever@eecs.umich.edu    precision = info.precision;
3953101Sstever@eecs.umich.edu
3963101Sstever@eecs.umich.edu    fancy = params->fancy;
3973101Sstever@eecs.umich.edu    min = params->min;
3983101Sstever@eecs.umich.edu    max = params->max;
3993101Sstever@eecs.umich.edu    bucket_size = params->bucket_size;
4003101Sstever@eecs.umich.edu    size = params->buckets;
4013101Sstever@eecs.umich.edu}
4023101Sstever@eecs.umich.edu
4033101Sstever@eecs.umich.eduvoid
4043101Sstever@eecs.umich.eduDistPrint::operator()(ostream &stream) const
4053101Sstever@eecs.umich.edu{
4063101Sstever@eecs.umich.edu    Result stdev = NAN;
4073101Sstever@eecs.umich.edu    if (data.samples)
4083101Sstever@eecs.umich.edu        stdev = sqrt((data.samples * data.squares - data.sum * data.sum) /
4093101Sstever@eecs.umich.edu                     (data.samples * (data.samples - 1.0)));
4103101Sstever@eecs.umich.edu
4113101Sstever@eecs.umich.edu    if (fancy) {
4125033Smilesck@eecs.umich.edu        ScalarPrint print;
4133101Sstever@eecs.umich.edu        string base = name + (compat ? "_" : "::");
4143101Sstever@eecs.umich.edu
4153101Sstever@eecs.umich.edu        print.precision = precision;
4163101Sstever@eecs.umich.edu        print.flags = flags;
4173101Sstever@eecs.umich.edu        print.compat = compat;
4183101Sstever@eecs.umich.edu        print.descriptions = descriptions;
4193101Sstever@eecs.umich.edu        print.desc = desc;
4203101Sstever@eecs.umich.edu        print.pdf = NAN;
4213101Sstever@eecs.umich.edu        print.cdf = NAN;
4223101Sstever@eecs.umich.edu
4233101Sstever@eecs.umich.edu        print.name = base + "mean";
4243101Sstever@eecs.umich.edu        print.value = data.samples ? data.sum / data.samples : NAN;
4255822Ssaidi@eecs.umich.edu        print(stream);
4265822Ssaidi@eecs.umich.edu
4273101Sstever@eecs.umich.edu        print.name = base + "stdev";
4283101Sstever@eecs.umich.edu        print.value = stdev;
4293101Sstever@eecs.umich.edu        print(stream);
4303101Sstever@eecs.umich.edu
4313101Sstever@eecs.umich.edu        print.name = "**Ignore: " + base + "TOT";
4323101Sstever@eecs.umich.edu        print.value = data.samples;
4333101Sstever@eecs.umich.edu        print(stream);
4343101Sstever@eecs.umich.edu        return;
4353101Sstever@eecs.umich.edu    }
4363101Sstever@eecs.umich.edu
4373101Sstever@eecs.umich.edu    assert(size == data.cvec.size());
4383101Sstever@eecs.umich.edu
4393101Sstever@eecs.umich.edu    Result total = 0.0;
4403101Sstever@eecs.umich.edu
4413101Sstever@eecs.umich.edu    total += data.underflow;
4423101Sstever@eecs.umich.edu    for (off_type i = 0; i < size; ++i)
4433101Sstever@eecs.umich.edu        total += data.cvec[i];
4443101Sstever@eecs.umich.edu    total += data.overflow;
4453101Sstever@eecs.umich.edu
4463101Sstever@eecs.umich.edu    string base = name + (compat ? "." : "::");
4473101Sstever@eecs.umich.edu
4483102Sstever@eecs.umich.edu    ScalarPrint print;
4493714Sstever@eecs.umich.edu    print.desc = compat ? "" : desc;
4503101Sstever@eecs.umich.edu    print.flags = flags;
4513714Sstever@eecs.umich.edu    print.compat = compat;
4523714Sstever@eecs.umich.edu    print.descriptions = descriptions;
4533714Sstever@eecs.umich.edu    print.precision = precision;
4543101Sstever@eecs.umich.edu    print.pdf = NAN;
4553101Sstever@eecs.umich.edu    print.cdf = NAN;
4567673Snate@binkert.org
4577673Snate@binkert.org    if (compat) {
4587673Snate@binkert.org        ccprintf(stream, "%-42s", base + "start_dist");
4597673Snate@binkert.org        if (descriptions && !desc.empty())
4607673Snate@binkert.org            ccprintf(stream, "                     # %s", desc);
4617673Snate@binkert.org        stream << endl;
4627673Snate@binkert.org    }
4637673Snate@binkert.org
4647673Snate@binkert.org    print.name = base + "samples";
4657673Snate@binkert.org    print.value = data.samples;
4667673Snate@binkert.org    print(stream);
4674762Snate@binkert.org
4684762Snate@binkert.org    print.name = base + "min_value";
4694762Snate@binkert.org    print.value = data.min_val;
4703101Sstever@eecs.umich.edu    print(stream);
4713101Sstever@eecs.umich.edu
4723101Sstever@eecs.umich.edu    if (!compat || data.underflow > 0.0) {
4733101Sstever@eecs.umich.edu        print.name = base + "underflows";
4743101Sstever@eecs.umich.edu        print.value = data.underflow;
4753101Sstever@eecs.umich.edu        if (!compat && total) {
4763101Sstever@eecs.umich.edu            print.pdf = data.underflow / total;
4773101Sstever@eecs.umich.edu            print.cdf += print.pdf;
4783101Sstever@eecs.umich.edu        }
4793101Sstever@eecs.umich.edu        print(stream);
4803101Sstever@eecs.umich.edu    }
4813101Sstever@eecs.umich.edu
4823101Sstever@eecs.umich.edu    if (!compat) {
4833101Sstever@eecs.umich.edu        for (off_type i = 0; i < size; ++i) {
4843101Sstever@eecs.umich.edu            stringstream namestr;
4853101Sstever@eecs.umich.edu            namestr << base;
4863101Sstever@eecs.umich.edu
4873101Sstever@eecs.umich.edu            Counter low = i * bucket_size + min;
4883101Sstever@eecs.umich.edu            Counter high = ::min(low + bucket_size, max);
4893101Sstever@eecs.umich.edu            namestr << low;
4904446Sbinkertn@umich.edu            if (low < high)
4913101Sstever@eecs.umich.edu                namestr << "-" << high;
4925468Snate@binkert.org
4935468Snate@binkert.org            print.name = namestr.str();
4945468Snate@binkert.org            print.value = data.cvec[i];
4955468Snate@binkert.org            if (total) {
4965468Snate@binkert.org                print.pdf = data.cvec[i] / total;
4975468Snate@binkert.org                print.cdf += print.pdf;
4985468Snate@binkert.org            }
4994762Snate@binkert.org            print(stream);
5004762Snate@binkert.org        }
5014762Snate@binkert.org    } else {
5023101Sstever@eecs.umich.edu        Counter _min;
5033101Sstever@eecs.umich.edu        Result _pdf;
5043101Sstever@eecs.umich.edu        Result _cdf = 0.0;
5053101Sstever@eecs.umich.edu
5063101Sstever@eecs.umich.edu        print.flags = flags | __substat;
5073101Sstever@eecs.umich.edu
5083101Sstever@eecs.umich.edu        for (off_type i = 0; i < size; ++i) {
5093101Sstever@eecs.umich.edu            if ((flags & nozero && data.cvec[i] == 0.0) ||
5103102Sstever@eecs.umich.edu                (flags & nonan && isnan(data.cvec[i])))
5113101Sstever@eecs.umich.edu                continue;
5123101Sstever@eecs.umich.edu
5133101Sstever@eecs.umich.edu            _min = i * bucket_size + min;
5144168Sbinkertn@umich.edu            _pdf = data.cvec[i] / total * 100.0;
5153101Sstever@eecs.umich.edu            _cdf += _pdf;
5163101Sstever@eecs.umich.edu
5173101Sstever@eecs.umich.edu
5183101Sstever@eecs.umich.edu            print.name = ValueToString(_min, 0, compat);
5193101Sstever@eecs.umich.edu            print.value = data.cvec[i];
5203101Sstever@eecs.umich.edu            print.pdf = (flags & pdf) ? _pdf : NAN;
5213102Sstever@eecs.umich.edu            print.cdf = (flags & cdf) ? _cdf : NAN;
5223101Sstever@eecs.umich.edu            print(stream);
5233101Sstever@eecs.umich.edu        }
5243101Sstever@eecs.umich.edu
5253101Sstever@eecs.umich.edu        print.flags = flags;
5263101Sstever@eecs.umich.edu    }
5273101Sstever@eecs.umich.edu
5283101Sstever@eecs.umich.edu    if (!compat || data.overflow > 0.0) {
5293101Sstever@eecs.umich.edu        print.name = base + "overflows";
5303101Sstever@eecs.umich.edu        print.value = data.overflow;
5313101Sstever@eecs.umich.edu        if (!compat && total) {
5323101Sstever@eecs.umich.edu            print.pdf = data.overflow / total;
5333102Sstever@eecs.umich.edu            print.cdf += print.pdf;
5343101Sstever@eecs.umich.edu        } else {
5353101Sstever@eecs.umich.edu            print.pdf = NAN;
5363101Sstever@eecs.umich.edu            print.cdf = NAN;
5373584Ssaidi@eecs.umich.edu        }
5383584Ssaidi@eecs.umich.edu        print(stream);
5393584Ssaidi@eecs.umich.edu    }
5403584Ssaidi@eecs.umich.edu
5413584Ssaidi@eecs.umich.edu    print.pdf = NAN;
5423101Sstever@eecs.umich.edu    print.cdf = NAN;
5433101Sstever@eecs.umich.edu
5445033Smilesck@eecs.umich.edu    if (!compat) {
5453101Sstever@eecs.umich.edu        print.name = base + "total";
5463101Sstever@eecs.umich.edu        print.value = total;
5473101Sstever@eecs.umich.edu        print(stream);
5483101Sstever@eecs.umich.edu    }
5493101Sstever@eecs.umich.edu
5503101Sstever@eecs.umich.edu    print.name = base + "max_value";
5513101Sstever@eecs.umich.edu    print.value = data.max_val;
5523101Sstever@eecs.umich.edu    print(stream);
5533101Sstever@eecs.umich.edu
5543101Sstever@eecs.umich.edu    if (!compat && data.samples != 0) {
5553101Sstever@eecs.umich.edu        print.name = base + "mean";
5563101Sstever@eecs.umich.edu        print.value = data.sum / data.samples;
5573101Sstever@eecs.umich.edu        print(stream);
5583101Sstever@eecs.umich.edu
5593101Sstever@eecs.umich.edu        print.name = base + "stdev";
5603101Sstever@eecs.umich.edu        print.value = stdev;
5613101Sstever@eecs.umich.edu        print(stream);
5623101Sstever@eecs.umich.edu    }
5633101Sstever@eecs.umich.edu
5643101Sstever@eecs.umich.edu    if (compat)
5653101Sstever@eecs.umich.edu        ccprintf(stream, "%send_dist\n\n", base);
5663101Sstever@eecs.umich.edu}
5673101Sstever@eecs.umich.edu
5683101Sstever@eecs.umich.eduvoid
5693101Sstever@eecs.umich.eduText::visit(const ScalarInfoBase &info)
5703101Sstever@eecs.umich.edu{
5713101Sstever@eecs.umich.edu    if (noOutput(info))
5723101Sstever@eecs.umich.edu        return;
5733101Sstever@eecs.umich.edu
5745219Ssaidi@eecs.umich.edu    ScalarPrint print;
5755219Ssaidi@eecs.umich.edu    print.value = info.result();
5765219Ssaidi@eecs.umich.edu    print.name = info.name;
5773101Sstever@eecs.umich.edu    print.desc = info.desc;
5783101Sstever@eecs.umich.edu    print.flags = info.flags;
5793101Sstever@eecs.umich.edu    print.compat = compat;
5803101Sstever@eecs.umich.edu    print.descriptions = descriptions;
5813101Sstever@eecs.umich.edu    print.precision = info.precision;
5823101Sstever@eecs.umich.edu    print.pdf = NAN;
5833101Sstever@eecs.umich.edu    print.cdf = NAN;
5843101Sstever@eecs.umich.edu
5853101Sstever@eecs.umich.edu    print(*stream);
5863101Sstever@eecs.umich.edu}
5873101Sstever@eecs.umich.edu
5883101Sstever@eecs.umich.eduvoid
5893101Sstever@eecs.umich.eduText::visit(const VectorInfoBase &info)
5903101Sstever@eecs.umich.edu{
5913101Sstever@eecs.umich.edu    if (noOutput(info))
5923101Sstever@eecs.umich.edu        return;
5937673Snate@binkert.org
5947673Snate@binkert.org    size_type size = info.size();
5957675Snate@binkert.org    VectorPrint print;
5967673Snate@binkert.org
5977675Snate@binkert.org    print.name = info.name;
5987675Snate@binkert.org    print.desc = info.desc;
5997675Snate@binkert.org    print.flags = info.flags;
6007675Snate@binkert.org    print.compat = compat;
6017675Snate@binkert.org    print.descriptions = descriptions;
6027673Snate@binkert.org    print.precision = info.precision;
6033101Sstever@eecs.umich.edu    print.vec = info.result();
6043101Sstever@eecs.umich.edu    print.total = info.total();
6057673Snate@binkert.org
6064762Snate@binkert.org    if (!info.subnames.empty()) {
6077675Snate@binkert.org        for (off_type i = 0; i < size; ++i) {
6084762Snate@binkert.org            if (!info.subnames[i].empty()) {
6094762Snate@binkert.org                print.subnames = info.subnames;
6104762Snate@binkert.org                print.subnames.resize(size);
6114762Snate@binkert.org                for (off_type i = 0; i < size; ++i) {
6124762Snate@binkert.org                    if (!info.subnames[i].empty() &&
6133101Sstever@eecs.umich.edu                        !info.subdescs[i].empty()) {
6143101Sstever@eecs.umich.edu                        print.subdescs = info.subdescs;
6153101Sstever@eecs.umich.edu                        print.subdescs.resize(size);
6167673Snate@binkert.org                        break;
6174762Snate@binkert.org                    }
6187675Snate@binkert.org                }
6194762Snate@binkert.org                break;
6204762Snate@binkert.org            }
6214762Snate@binkert.org        }
6224762Snate@binkert.org    }
6234762Snate@binkert.org
6243101Sstever@eecs.umich.edu    print(*stream);
6253101Sstever@eecs.umich.edu}
6263101Sstever@eecs.umich.edu
6273101Sstever@eecs.umich.eduvoid
6283101Sstever@eecs.umich.eduText::visit(const Vector2dInfoBase &info)
6293101Sstever@eecs.umich.edu{
6303101Sstever@eecs.umich.edu    if (noOutput(info))
6313101Sstever@eecs.umich.edu        return;
6323102Sstever@eecs.umich.edu
6333101Sstever@eecs.umich.edu    bool havesub = false;
6343101Sstever@eecs.umich.edu    VectorPrint print;
6353101Sstever@eecs.umich.edu
6364762Snate@binkert.org    print.subnames = info.y_subnames;
6374762Snate@binkert.org    print.flags = info.flags;
6384762Snate@binkert.org    print.compat = compat;
6393101Sstever@eecs.umich.edu    print.descriptions = descriptions;
6403101Sstever@eecs.umich.edu    print.precision = info.precision;
6413101Sstever@eecs.umich.edu
6423101Sstever@eecs.umich.edu    if (!info.subnames.empty()) {
6433101Sstever@eecs.umich.edu        for (off_type i = 0; i < info.x; ++i)
6443101Sstever@eecs.umich.edu            if (!info.subnames[i].empty())
6453101Sstever@eecs.umich.edu                havesub = true;
6463101Sstever@eecs.umich.edu    }
6473101Sstever@eecs.umich.edu
6483101Sstever@eecs.umich.edu    VResult tot_vec(info.y);
6493101Sstever@eecs.umich.edu    Result super_total = 0.0;
6503101Sstever@eecs.umich.edu    for (off_type i = 0; i < info.x; ++i) {
6513101Sstever@eecs.umich.edu        if (havesub && (i >= info.subnames.size() || info.subnames[i].empty()))
6523101Sstever@eecs.umich.edu            continue;
6533101Sstever@eecs.umich.edu
6543101Sstever@eecs.umich.edu        off_type iy = i * info.y;
6553101Sstever@eecs.umich.edu        VResult yvec(info.y);
6563101Sstever@eecs.umich.edu
6573101Sstever@eecs.umich.edu        Result total = 0.0;
6583101Sstever@eecs.umich.edu        for (off_type j = 0; j < info.y; ++j) {
6594380Sbinkertn@umich.edu            yvec[j] = info.cvec[iy + j];
6604380Sbinkertn@umich.edu            tot_vec[j] += yvec[j];
6614380Sbinkertn@umich.edu            total += yvec[j];
6623101Sstever@eecs.umich.edu            super_total += yvec[j];
6634380Sbinkertn@umich.edu        }
6644380Sbinkertn@umich.edu
6654380Sbinkertn@umich.edu        print.name = info.name + "_" +
6663101Sstever@eecs.umich.edu            (havesub ? info.subnames[i] : to_string(i));
6673101Sstever@eecs.umich.edu        print.desc = info.desc;
6683101Sstever@eecs.umich.edu        print.vec = yvec;
6697673Snate@binkert.org        print.total = total;
6707673Snate@binkert.org        print(*stream);
6717673Snate@binkert.org    }
6727673Snate@binkert.org
6737673Snate@binkert.org    if ((info.flags & ::Stats::total) && (info.x > 1)) {
6747673Snate@binkert.org        print.name = info.name;
6757673Snate@binkert.org        print.desc = info.desc;
6767673Snate@binkert.org        print.vec = tot_vec;
6777673Snate@binkert.org        print.total = super_total;
6783101Sstever@eecs.umich.edu        print(*stream);
6793101Sstever@eecs.umich.edu    }
6803101Sstever@eecs.umich.edu}
6813101Sstever@eecs.umich.edu
6823101Sstever@eecs.umich.eduvoid
6833101Sstever@eecs.umich.eduText::visit(const DistInfoBase &info)
6843101Sstever@eecs.umich.edu{
6853101Sstever@eecs.umich.edu    if (noOutput(info))
6863101Sstever@eecs.umich.edu        return;
6873101Sstever@eecs.umich.edu
6883101Sstever@eecs.umich.edu    DistPrint print(info);
6893101Sstever@eecs.umich.edu    print(*stream);
6903101Sstever@eecs.umich.edu}
6917743Sgblack@eecs.umich.edu
6923101Sstever@eecs.umich.eduvoid
6933101Sstever@eecs.umich.eduText::visit(const VectorDistInfoBase &info)
6943101Sstever@eecs.umich.edu{
6953101Sstever@eecs.umich.edu    if (noOutput(info))
6963101Sstever@eecs.umich.edu        return;
6973101Sstever@eecs.umich.edu
6984380Sbinkertn@umich.edu    for (off_type i = 0; i < info.size(); ++i) {
6993101Sstever@eecs.umich.edu        DistPrint print(info, i);
7003101Sstever@eecs.umich.edu        print(*stream);
7014762Snate@binkert.org    }
7027677Snate@binkert.org}
7034762Snate@binkert.org
7044762Snate@binkert.orgvoid
7054380Sbinkertn@umich.eduText::visit(const FormulaInfoBase &info)
7064380Sbinkertn@umich.edu{
7073101Sstever@eecs.umich.edu    visit((const VectorInfoBase &)info);
7087777Sgblack@eecs.umich.edu}
7097777Sgblack@eecs.umich.edu
7107777Sgblack@eecs.umich.edubool
7117777Sgblack@eecs.umich.eduinitText(const string &filename, bool desc, bool compat)
7127777Sgblack@eecs.umich.edu{
7137777Sgblack@eecs.umich.edu    static Text text;
7147777Sgblack@eecs.umich.edu    static bool connected = false;
7157777Sgblack@eecs.umich.edu
7167777Sgblack@eecs.umich.edu    if (connected)
7177777Sgblack@eecs.umich.edu        return false;
7187777Sgblack@eecs.umich.edu
7197777Sgblack@eecs.umich.edu    extern list<Output *> OutputList;
7207777Sgblack@eecs.umich.edu
7217777Sgblack@eecs.umich.edu    text.open(*simout.find(filename));
7227777Sgblack@eecs.umich.edu    text.descriptions = desc;
7237777Sgblack@eecs.umich.edu    text.compat = compat;
7247777Sgblack@eecs.umich.edu    OutputList.push_back(&text);
7257777Sgblack@eecs.umich.edu    connected = true;
7267777Sgblack@eecs.umich.edu
7277777Sgblack@eecs.umich.edu    return true;
7287777Sgblack@eecs.umich.edu}
7297777Sgblack@eecs.umich.edu
7307777Sgblack@eecs.umich.edu/* namespace Stats */ }
7318579Ssteve.reinhardt@amd.com