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