text.cc revision 8230:845c8eb5ac49
12SN/A/*
29428SAndreas.Sandberg@ARM.com * Copyright (c) 2004-2005 The Regents of The University of Michigan
39920Syasuko.eckert@amd.com * All rights reserved.
48733Sgeoffrey.blake@arm.com *
58733Sgeoffrey.blake@arm.com * Redistribution and use in source and binary forms, with or without
68733Sgeoffrey.blake@arm.com * modification, are permitted provided that the following conditions are
78733Sgeoffrey.blake@arm.com * met: redistributions of source code must retain the above copyright
88733Sgeoffrey.blake@arm.com * notice, this list of conditions and the following disclaimer;
98733Sgeoffrey.blake@arm.com * redistributions in binary form must reproduce the above copyright
108733Sgeoffrey.blake@arm.com * notice, this list of conditions and the following disclaimer in the
118733Sgeoffrey.blake@arm.com * documentation and/or other materials provided with the distribution;
128733Sgeoffrey.blake@arm.com * neither the name of the copyright holders nor the names of its
138733Sgeoffrey.blake@arm.com * contributors may be used to endorse or promote products derived from
148733Sgeoffrey.blake@arm.com * this software without specific prior written permission.
152190SN/A *
162SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272SN/A *
282SN/A * Authors: Nathan Binkert
292SN/A */
302SN/A
312SN/A#if defined(__APPLE__)
322SN/A#define _GLIBCPP_USE_C99 1
332SN/A#endif
342SN/A
352SN/A#if defined(__sun)
362SN/A#include <math.h>
372SN/A#endif
382SN/A
392SN/A#include <cassert>
402665SN/A#ifdef __SUNPRO_CC
412665SN/A#include <math.h>
422SN/A#endif
432SN/A#include <cmath>
442680Sktlim@umich.edu#include <fstream>
452680Sktlim@umich.edu#include <iostream>
462SN/A#include <sstream>
478229Snate@binkert.org#include <string>
487680Sgblack@eecs.umich.edu
497680Sgblack@eecs.umich.edu#include "base/stats/info.hh"
506329Sgblack@eecs.umich.edu#include "base/stats/text.hh"
513453Sgblack@eecs.umich.edu#include "base/stats/visit.hh"
526216Snate@binkert.org#include "base/cast.hh"
536658Snate@binkert.org#include "base/misc.hh"
542SN/A#include "base/str.hh"
552190SN/A
562190SN/Ausing namespace std;
573453Sgblack@eecs.umich.edu
583453Sgblack@eecs.umich.edu#ifndef NAN
599020Sgblack@eecs.umich.edufloat __nan();
606022Sgblack@eecs.umich.edu/** Define Not a number. */
613453Sgblack@eecs.umich.edu#define NAN (__nan())
622190SN/A/** Need to define __nan() */
638887Sgeoffrey.blake@arm.com#define __M5_NAN
647680Sgblack@eecs.umich.edu#endif
652313SN/A
668706Sandreas.hansson@arm.com#ifdef __M5_NAN
678706Sandreas.hansson@arm.comfloat
688706Sandreas.hansson@arm.com__nan()
692190SN/A{
702190SN/A    union {
713548Sgblack@eecs.umich.edu        uint32_t ui;
723548Sgblack@eecs.umich.edu        float f;
733548Sgblack@eecs.umich.edu    } nan;
748902Sandreas.hansson@arm.com
758902Sandreas.hansson@arm.com    nan.ui = 0x7fc00000;
762SN/A    return nan.f;
772680Sktlim@umich.edu}
782680Sktlim@umich.edu#endif
792680Sktlim@umich.edu
802680Sktlim@umich.edunamespace Stats {
812680Sktlim@umich.edu
822680Sktlim@umich.edustd::list<Info *> &statsList();
832680Sktlim@umich.edu
842680Sktlim@umich.eduText::Text()
852680Sktlim@umich.edu    : mystream(false), stream(NULL), descriptions(false)
862680Sktlim@umich.edu{
872680Sktlim@umich.edu}
882682Sktlim@umich.edu
892680Sktlim@umich.eduText::Text(std::ostream &stream)
902680Sktlim@umich.edu    : mystream(false), stream(NULL), descriptions(false)
912680Sktlim@umich.edu{
922680Sktlim@umich.edu    open(stream);
932680Sktlim@umich.edu}
942SN/A
952107SN/AText::Text(const std::string &file)
962107SN/A    : mystream(false), stream(NULL), descriptions(false)
972190SN/A{
982455SN/A    open(file);
992455SN/A}
1009920Syasuko.eckert@amd.com
1012159SN/A
1022SN/AText::~Text()
1036029Ssteve.reinhardt@amd.com{
104246SN/A    if (mystream) {
105246SN/A        assert(stream);
106246SN/A        delete stream;
107246SN/A    }
108246SN/A}
109246SN/A
110246SN/Avoid
1112190SN/AText::open(std::ostream &_stream)
112246SN/A{
113246SN/A    if (stream)
114246SN/A        panic("stream already set!");
115246SN/A
116246SN/A    mystream = false;
117246SN/A    stream = &_stream;
118246SN/A    if (!valid())
1192SN/A        fatal("Unable to open output stream for writing\n");
1202680Sktlim@umich.edu}
1212423SN/A
1222190SN/Avoid
123180SN/AText::open(const std::string &file)
12410110Sandreas.hansson@arm.com{
1252190SN/A    if (stream)
12610110Sandreas.hansson@arm.com        panic("stream already set!");
1275715Shsul@eecs.umich.edu
1285715Shsul@eecs.umich.edu    mystream = true;
1295714Shsul@eecs.umich.edu    stream = new ofstream(file.c_str(), ios::trunc);
13010110Sandreas.hansson@arm.com    if (!valid())
1315714Shsul@eecs.umich.edu        fatal("Unable to open statistics file for writing\n");
1325714Shsul@eecs.umich.edu}
1335714Shsul@eecs.umich.edu
1346022Sgblack@eecs.umich.edubool
1352190SN/AText::valid() const
1366022Sgblack@eecs.umich.edu{
1372521SN/A    return stream != NULL && stream->good();
1388887Sgeoffrey.blake@arm.com}
1398733Sgeoffrey.blake@arm.com
1409020Sgblack@eecs.umich.eduvoid
1418541Sgblack@eecs.umich.eduText::output()
1424997Sgblack@eecs.umich.edu{
1434997Sgblack@eecs.umich.edu    ccprintf(*stream, "\n---------- Begin Simulation Statistics ----------\n");
1443548Sgblack@eecs.umich.edu    list<Info *>::const_iterator i, end = statsList().end();
1452654SN/A    for (i = statsList().begin(); i != end; ++i)
1468852Sandreas.hansson@arm.com        (*i)->visit(*this);
1472521SN/A    ccprintf(*stream, "\n---------- End Simulation Statistics   ----------\n");
1488852Sandreas.hansson@arm.com    stream->flush();
1493673Srdreslin@umich.edu}
1508706Sandreas.hansson@arm.com
1518706Sandreas.hansson@arm.combool
1528706Sandreas.hansson@arm.comText::noOutput(const Info &info)
1538706Sandreas.hansson@arm.com{
1548706Sandreas.hansson@arm.com    if (!info.flags.isSet(display))
1558706Sandreas.hansson@arm.com        return true;
1568706Sandreas.hansson@arm.com
1578799Sgblack@eecs.umich.edu    if (info.prereq && info.prereq->zero())
1588852Sandreas.hansson@arm.com        return true;
1592518SN/A
1602190SN/A    return false;
1612190SN/A}
1622190SN/A
1632159SN/Astring
1642235SN/AValueToString(Result value, int precision)
1652103SN/A{
166393SN/A    stringstream val;
167393SN/A
1689180Sandreas.hansson@arm.com    if (!isnan(value)) {
169393SN/A        if (precision != -1)
170393SN/A            val.precision(precision);
1719180Sandreas.hansson@arm.com        else if (value == rint(value))
172393SN/A            val.precision(0);
173393SN/A
1749180Sandreas.hansson@arm.com        val.unsetf(ios::showpoint);
1752159SN/A        val.setf(ios::fixed);
1762190SN/A        val << value;
1772159SN/A    } else {
1782680Sktlim@umich.edu        val << "no_value";
1792159SN/A    }
1802190SN/A
1812159SN/A    return val.str();
1822313SN/A}
1832235SN/A
1842235SN/Astruct ScalarPrint
1852235SN/A{
1862235SN/A    Result value;
1872235SN/A    string name;
1882254SN/A    string desc;
1892254SN/A    Flags flags;
1902254SN/A    bool descriptions;
1912235SN/A    int precision;
1922680Sktlim@umich.edu    Result pdf;
1932159SN/A    Result cdf;
1942190SN/A
1952159SN/A    void update(Result val, Result total);
1962159SN/A    void operator()(ostream &stream) const;
1972159SN/A};
1982159SN/A
1992190SN/Avoid
2002159SN/AScalarPrint::update(Result val, Result total)
2012455SN/A{
2022159SN/A    value = val;
2032455SN/A    if (total) {
2042159SN/A        pdf = val / total;
2059920Syasuko.eckert@amd.com        cdf += pdf;
2069920Syasuko.eckert@amd.com    }
2072190SN/A}
2082159SN/A
2092455SN/Avoid
2102159SN/AScalarPrint::operator()(ostream &stream) const
2112455SN/A{
2122455SN/A    if ((flags.isSet(nozero) && value == 0.0) ||
2139920Syasuko.eckert@amd.com        (flags.isSet(nonan) && isnan(value)))
2149920Syasuko.eckert@amd.com        return;
2157720Sgblack@eecs.umich.edu
2162159SN/A    stringstream pdfstr, cdfstr;
2177720Sgblack@eecs.umich.edu
2182159SN/A    if (!isnan(pdf))
2198733Sgeoffrey.blake@arm.com        ccprintf(pdfstr, "%.2f%%", pdf * 100.0);
2208733Sgeoffrey.blake@arm.com
2217720Sgblack@eecs.umich.edu    if (!isnan(cdf))
2222159SN/A        ccprintf(cdfstr, "%.2f%%", cdf * 100.0);
2237720Sgblack@eecs.umich.edu
2242159SN/A    ccprintf(stream, "%-40s %12s %10s %10s", name,
2257720Sgblack@eecs.umich.edu             ValueToString(value, precision), pdfstr, cdfstr);
2265260Sksewell@umich.edu
2274172Ssaidi@eecs.umich.edu    if (descriptions) {
2284172Ssaidi@eecs.umich.edu        if (!desc.empty())
2292190SN/A            ccprintf(stream, " # %s", desc);
2302159SN/A    }
2314172Ssaidi@eecs.umich.edu    stream << endl;
2322190SN/A}
2333468Sgblack@eecs.umich.edu
2342190SN/Astruct VectorPrint
2356313Sgblack@eecs.umich.edu{
2366313Sgblack@eecs.umich.edu    string name;
2379920Syasuko.eckert@amd.com    string desc;
23810033SAli.Saidi@ARM.com    vector<string> subnames;
2396313Sgblack@eecs.umich.edu    vector<string> subdescs;
2406221Snate@binkert.org    Flags flags;
2416221Snate@binkert.org    bool descriptions;
2426221Snate@binkert.org    int precision;
2436221Snate@binkert.org    VResult vec;
2446221Snate@binkert.org    Result total;
2454661Sksewell@umich.edu
2466221Snate@binkert.org    void operator()(ostream &stream) const;
2476221Snate@binkert.org};
2486221Snate@binkert.org
2496221Snate@binkert.orgvoid
2504661Sksewell@umich.eduVectorPrint::operator()(std::ostream &stream) const
2512235SN/A{
2522235SN/A    size_type _size = vec.size();
2532190SN/A    Result _total = 0.0;
2542190SN/A
2552190SN/A    if (flags.isSet(pdf | cdf)) {
2562159SN/A        for (off_type i = 0; i < _size; ++i) {
2572235SN/A            _total += vec[i];
2582190SN/A        }
2592190SN/A    }
2602235SN/A
2612190SN/A    string base = name + "::";
2622834Sksewell@umich.edu
2634111Sgblack@eecs.umich.edu    ScalarPrint print;
2644111Sgblack@eecs.umich.edu    print.name = name;
2652834Sksewell@umich.edu    print.desc = desc;
2662834Sksewell@umich.edu    print.precision = precision;
2672834Sksewell@umich.edu    print.descriptions = descriptions;
2682834Sksewell@umich.edu    print.flags = flags;
2692525SN/A    print.pdf = _total ? 0.0 : NAN;
2705217Ssaidi@eecs.umich.edu    print.cdf = _total ? 0.0 : NAN;
2715217Ssaidi@eecs.umich.edu
2729426SAndreas.Sandberg@ARM.com    bool havesub = !subnames.empty();
2739426SAndreas.Sandberg@ARM.com
2749426SAndreas.Sandberg@ARM.com    if (_size == 1) {
2759426SAndreas.Sandberg@ARM.com        print.value = vec[0];
2769426SAndreas.Sandberg@ARM.com        print(stream);
2779426SAndreas.Sandberg@ARM.com        return;
2789426SAndreas.Sandberg@ARM.com    }
2799426SAndreas.Sandberg@ARM.com
2809426SAndreas.Sandberg@ARM.com    for (off_type i = 0; i < _size; ++i) {
2819426SAndreas.Sandberg@ARM.com        if (havesub && (i >= subnames.size() || subnames[i].empty()))
2829426SAndreas.Sandberg@ARM.com            continue;
2839426SAndreas.Sandberg@ARM.com
2849426SAndreas.Sandberg@ARM.com        print.name = base + (havesub ? subnames[i] : to_string(i));
2859426SAndreas.Sandberg@ARM.com        print.desc = subdescs.empty() ? desc : subdescs[i];
2869426SAndreas.Sandberg@ARM.com
2879426SAndreas.Sandberg@ARM.com        print.update(vec[i], _total);
2889426SAndreas.Sandberg@ARM.com        print(stream);
2899426SAndreas.Sandberg@ARM.com    }
2909426SAndreas.Sandberg@ARM.com
2919426SAndreas.Sandberg@ARM.com    if (flags.isSet(::Stats::total)) {
2929426SAndreas.Sandberg@ARM.com        print.pdf = NAN;
2939426SAndreas.Sandberg@ARM.com        print.cdf = NAN;
2949920Syasuko.eckert@amd.com        print.name = base + "total";
2959920Syasuko.eckert@amd.com        print.desc = desc;
2969426SAndreas.Sandberg@ARM.com        print.value = total;
2979426SAndreas.Sandberg@ARM.com        print(stream);
2982159SN/A    }
2992159SN/A}
3002682Sktlim@umich.edu
3012682Sktlim@umich.edustruct DistPrint
3022682Sktlim@umich.edu{
3032682Sktlim@umich.edu    string name;
3042682Sktlim@umich.edu    string desc;
3052682Sktlim@umich.edu    Flags flags;
3062682Sktlim@umich.edu    bool descriptions;
3072682Sktlim@umich.edu    int precision;
3082682Sktlim@umich.edu
3092682Sktlim@umich.edu    const DistData &data;
3102680Sktlim@umich.edu
3112680Sktlim@umich.edu    DistPrint(const Text *text, const DistInfo &info);
3122190SN/A    DistPrint(const Text *text, const VectorDistInfo &info, int i);
3132190SN/A    void init(const Text *text, const Info &info);
3142680Sktlim@umich.edu    void operator()(ostream &stream) const;
3152680Sktlim@umich.edu};
3162159SN/A
3172190SN/ADistPrint::DistPrint(const Text *text, const DistInfo &info)
3182680Sktlim@umich.edu    : data(info.data)
3192SN/A{
3202SN/A    init(text, info);
3212SN/A}
3222680Sktlim@umich.edu
3232SN/ADistPrint::DistPrint(const Text *text, const VectorDistInfo &info, int i)
32410110Sandreas.hansson@arm.com    : data(info.data[i])
3252SN/A{
32610110Sandreas.hansson@arm.com    init(text, info);
3275715Shsul@eecs.umich.edu
32810110Sandreas.hansson@arm.com    name = info.name + "_" +
3295714Shsul@eecs.umich.edu        (info.subnames[i].empty() ? (to_string(i)) : info.subnames[i]);
33010110Sandreas.hansson@arm.com
3315714Shsul@eecs.umich.edu    if (!info.subdescs[i].empty())
3325714Shsul@eecs.umich.edu        desc = info.subdescs[i];
3335714Shsul@eecs.umich.edu}
3346022Sgblack@eecs.umich.edu
3351917SN/Avoid
3366022Sgblack@eecs.umich.eduDistPrint::init(const Text *text, const Info &info)
3372521SN/A{
3388887Sgeoffrey.blake@arm.com    name = info.name;
3398733Sgeoffrey.blake@arm.com    desc = info.desc;
3409020Sgblack@eecs.umich.edu    flags = info.flags;
3418541Sgblack@eecs.umich.edu    precision = info.precision;
3424997Sgblack@eecs.umich.edu    descriptions = text->descriptions;
3434997Sgblack@eecs.umich.edu}
3443548Sgblack@eecs.umich.edu
3453548Sgblack@eecs.umich.eduvoid
3462654SN/ADistPrint::operator()(ostream &stream) const
3478852Sandreas.hansson@arm.com{
3482521SN/A    string base = name + "::";
3498852Sandreas.hansson@arm.com
3503673Srdreslin@umich.edu    ScalarPrint print;
3518706Sandreas.hansson@arm.com    print.precision = precision;
3528799Sgblack@eecs.umich.edu    print.flags = flags;
3538852Sandreas.hansson@arm.com    print.descriptions = descriptions;
3542518SN/A    print.desc = desc;
3552680Sktlim@umich.edu    print.pdf = NAN;
3562SN/A    print.cdf = NAN;
3572680Sktlim@umich.edu
358595SN/A    print.name = base + "samples";
3592680Sktlim@umich.edu    print.value = data.samples;
3602SN/A    print(stream);
3612190SN/A
3622190SN/A    print.name = base + "mean";
3639180Sandreas.hansson@arm.com    print.value = data.samples ? data.sum / data.samples : NAN;
3649180Sandreas.hansson@arm.com    print(stream);
3652SN/A
3662190SN/A    Result stdev = NAN;
3679180Sandreas.hansson@arm.com    if (data.samples)
3682SN/A        stdev = sqrt((data.samples * data.squares - data.sum * data.sum) /
3692190SN/A                     (data.samples * (data.samples - 1.0)));
3709180Sandreas.hansson@arm.com    print.name = base + "stdev";
371217SN/A    print.value = stdev;
3722680Sktlim@umich.edu    print(stream);
3732190SN/A
3742680Sktlim@umich.edu    if (data.type == Deviation)
3752680Sktlim@umich.edu        return;
3762190SN/A
3772680Sktlim@umich.edu    size_t size = data.cvec.size();
3782190SN/A
3792680Sktlim@umich.edu    Result total = 0.0;
3802235SN/A    if (data.type == Dist && data.underflow != NAN)
3812680Sktlim@umich.edu        total += data.underflow;
3822680Sktlim@umich.edu    for (off_type i = 0; i < size; ++i)
3832254SN/A        total += data.cvec[i];
3842680Sktlim@umich.edu    if (data.type == Dist && data.overflow != NAN)
3852680Sktlim@umich.edu        total += data.overflow;
3862SN/A
3872190SN/A    if (total) {
3882680Sktlim@umich.edu        print.pdf = 0.0;
3892SN/A        print.cdf = 0.0;
3902680Sktlim@umich.edu    }
391716SN/A
3922SN/A    if (data.type == Dist && data.underflow != NAN) {
3932SN/A        print.name = base + "underflows";
3942SN/A        print.update(data.underflow, total);
3952SN/A        print(stream);
3962680Sktlim@umich.edu    }
3972SN/A
3982455SN/A    for (off_type i = 0; i < size; ++i) {
3992680Sktlim@umich.edu        stringstream namestr;
4002SN/A        namestr << base;
4012455SN/A
4022680Sktlim@umich.edu        Counter low = i * data.bucket_size + data.min;
4032SN/A        Counter high = ::min(low + data.bucket_size - 1.0, data.max);
4049920Syasuko.eckert@amd.com        namestr << low;
4059920Syasuko.eckert@amd.com        if (low < high)
4069920Syasuko.eckert@amd.com            namestr << "-" << high;
4072SN/A
4082680Sktlim@umich.edu        print.name = namestr.str();
4092SN/A        print.update(data.cvec[i], total);
4102455SN/A        print(stream);
4112680Sktlim@umich.edu    }
4122SN/A
4132455SN/A    if (data.type == Dist && data.overflow != NAN) {
4142680Sktlim@umich.edu        print.name = base + "overflows";
4152SN/A        print.update(data.overflow, total);
4169920Syasuko.eckert@amd.com        print(stream);
4179920Syasuko.eckert@amd.com    }
4189920Syasuko.eckert@amd.com
4197720Sgblack@eecs.umich.edu    print.pdf = NAN;
4202SN/A    print.cdf = NAN;
4217720Sgblack@eecs.umich.edu
4222206SN/A    if (data.type == Dist && data.min_val != NAN) {
4238733Sgeoffrey.blake@arm.com        print.name = base + "min_value";
4248733Sgeoffrey.blake@arm.com        print.value = data.min_val;
4257720Sgblack@eecs.umich.edu        print(stream);
4267720Sgblack@eecs.umich.edu    }
4277720Sgblack@eecs.umich.edu
4285260Sksewell@umich.edu    if (data.type == Dist && data.max_val != NAN) {
4297597Sminkyu.jeong@arm.com        print.name = base + "max_value";
4307597Sminkyu.jeong@arm.com        print.value = data.max_val;
4317597Sminkyu.jeong@arm.com        print(stream);
4327597Sminkyu.jeong@arm.com    }
4337597Sminkyu.jeong@arm.com
4344172Ssaidi@eecs.umich.edu    print.name = base + "total";
4354172Ssaidi@eecs.umich.edu    print.value = total;
4364172Ssaidi@eecs.umich.edu    print(stream);
4372159SN/A}
4382680Sktlim@umich.edu
4392SN/Avoid
4404172Ssaidi@eecs.umich.eduText::visit(const ScalarInfo &info)
4414172Ssaidi@eecs.umich.edu{
4422SN/A    if (noOutput(info))
4433468Sgblack@eecs.umich.edu        return;
4442680Sktlim@umich.edu
4452SN/A    ScalarPrint print;
4466313Sgblack@eecs.umich.edu    print.value = info.result();
4476313Sgblack@eecs.umich.edu    print.name = info.name;
4486313Sgblack@eecs.umich.edu    print.desc = info.desc;
4496313Sgblack@eecs.umich.edu    print.flags = info.flags;
4506313Sgblack@eecs.umich.edu    print.descriptions = descriptions;
4516313Sgblack@eecs.umich.edu    print.precision = info.precision;
4529920Syasuko.eckert@amd.com    print.pdf = NAN;
4539920Syasuko.eckert@amd.com    print.cdf = NAN;
4549920Syasuko.eckert@amd.com
45510033SAli.Saidi@ARM.com    print(*stream);
45610033SAli.Saidi@ARM.com}
45710033SAli.Saidi@ARM.com
4582190SN/Avoid
4592680Sktlim@umich.eduText::visit(const VectorInfo &info)
4602190SN/A{
4612190SN/A    if (noOutput(info))
4622680Sktlim@umich.edu        return;
4632SN/A
4642190SN/A    size_type size = info.size();
4652680Sktlim@umich.edu    VectorPrint print;
4662190SN/A
4674111Sgblack@eecs.umich.edu    print.name = info.name;
4684111Sgblack@eecs.umich.edu    print.desc = info.desc;
4694111Sgblack@eecs.umich.edu    print.flags = info.flags;
4702680Sktlim@umich.edu    print.descriptions = descriptions;
4719426SAndreas.Sandberg@ARM.com    print.precision = info.precision;
4729426SAndreas.Sandberg@ARM.com    print.vec = info.result();
4739426SAndreas.Sandberg@ARM.com    print.total = info.total();
4749426SAndreas.Sandberg@ARM.com
4759426SAndreas.Sandberg@ARM.com    if (!info.subnames.empty()) {
4769426SAndreas.Sandberg@ARM.com        for (off_type i = 0; i < size; ++i) {
4779426SAndreas.Sandberg@ARM.com            if (!info.subnames[i].empty()) {
4789426SAndreas.Sandberg@ARM.com                print.subnames = info.subnames;
4799426SAndreas.Sandberg@ARM.com                print.subnames.resize(size);
4809426SAndreas.Sandberg@ARM.com                for (off_type i = 0; i < size; ++i) {
4819426SAndreas.Sandberg@ARM.com                    if (!info.subnames[i].empty() &&
4829426SAndreas.Sandberg@ARM.com                        !info.subdescs[i].empty()) {
4839426SAndreas.Sandberg@ARM.com                        print.subdescs = info.subdescs;
4849426SAndreas.Sandberg@ARM.com                        print.subdescs.resize(size);
4859426SAndreas.Sandberg@ARM.com                        break;
4869426SAndreas.Sandberg@ARM.com                    }
4879426SAndreas.Sandberg@ARM.com                }
4889426SAndreas.Sandberg@ARM.com                break;
4899920Syasuko.eckert@amd.com            }
4909920Syasuko.eckert@amd.com        }
4919920Syasuko.eckert@amd.com    }
4929920Syasuko.eckert@amd.com
4939920Syasuko.eckert@amd.com    print(*stream);
4949920Syasuko.eckert@amd.com}
4952SN/A
4962SN/Avoid
4979428SAndreas.Sandberg@ARM.comText::visit(const Vector2dInfo &info)
4989428SAndreas.Sandberg@ARM.com{
4999428SAndreas.Sandberg@ARM.com    if (noOutput(info))
5009428SAndreas.Sandberg@ARM.com        return;
5019428SAndreas.Sandberg@ARM.com
5029428SAndreas.Sandberg@ARM.com    bool havesub = false;
5039428SAndreas.Sandberg@ARM.com    VectorPrint print;
5049428SAndreas.Sandberg@ARM.com
5059428SAndreas.Sandberg@ARM.com    print.subnames = info.y_subnames;
5069428SAndreas.Sandberg@ARM.com    print.flags = info.flags;
5079428SAndreas.Sandberg@ARM.com    print.descriptions = descriptions;
5089428SAndreas.Sandberg@ARM.com    print.precision = info.precision;
5099428SAndreas.Sandberg@ARM.com
5109428SAndreas.Sandberg@ARM.com    if (!info.subnames.empty()) {
5119428SAndreas.Sandberg@ARM.com        for (off_type i = 0; i < info.x; ++i)
5129441SAndreas.Sandberg@ARM.com            if (!info.subnames[i].empty())
5139441SAndreas.Sandberg@ARM.com                havesub = true;
5149441SAndreas.Sandberg@ARM.com    }
5159441SAndreas.Sandberg@ARM.com
5169441SAndreas.Sandberg@ARM.com    VResult tot_vec(info.y);
5179441SAndreas.Sandberg@ARM.com    Result super_total = 0.0;
5189441SAndreas.Sandberg@ARM.com    for (off_type i = 0; i < info.x; ++i) {
5199441SAndreas.Sandberg@ARM.com        if (havesub && (i >= info.subnames.size() || info.subnames[i].empty()))
5209441SAndreas.Sandberg@ARM.com            continue;
5219441SAndreas.Sandberg@ARM.com
5229441SAndreas.Sandberg@ARM.com        off_type iy = i * info.y;
5239441SAndreas.Sandberg@ARM.com        VResult yvec(info.y);
5249441SAndreas.Sandberg@ARM.com
5252190SN/A        Result total = 0.0;
526        for (off_type j = 0; j < info.y; ++j) {
527            yvec[j] = info.cvec[iy + j];
528            tot_vec[j] += yvec[j];
529            total += yvec[j];
530            super_total += yvec[j];
531        }
532
533        print.name = info.name + "_" +
534            (havesub ? info.subnames[i] : to_string(i));
535        print.desc = info.desc;
536        print.vec = yvec;
537        print.total = total;
538        print(*stream);
539    }
540
541    if (info.flags.isSet(::Stats::total) && (info.x > 1)) {
542        print.name = info.name;
543        print.desc = info.desc;
544        print.vec = tot_vec;
545        print.total = super_total;
546        print(*stream);
547    }
548}
549
550void
551Text::visit(const DistInfo &info)
552{
553    if (noOutput(info))
554        return;
555
556    DistPrint print(this, info);
557    print(*stream);
558}
559
560void
561Text::visit(const VectorDistInfo &info)
562{
563    if (noOutput(info))
564        return;
565
566    for (off_type i = 0; i < info.size(); ++i) {
567        DistPrint print(this, info, i);
568        print(*stream);
569    }
570}
571
572void
573Text::visit(const FormulaInfo &info)
574{
575    visit((const VectorInfo &)info);
576}
577
578bool
579initText(const string &filename, bool desc)
580{
581    static Text text;
582    static bool connected = false;
583
584    if (connected)
585        return false;
586
587    extern list<Output *> OutputList;
588
589    text.open(*simout.find(filename));
590    text.descriptions = desc;
591    OutputList.push_back(&text);
592    connected = true;
593
594    return true;
595}
596
597} // namespace Stats
598