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