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