statistics.cc revision 14205
12SN/A/* 214205Sandreas.sandberg@arm.com * Copyright (c) 2019 Arm Limited 314205Sandreas.sandberg@arm.com * All rights reserved. 414205Sandreas.sandberg@arm.com * 514205Sandreas.sandberg@arm.com * The license below extends only to copyright in the software and shall 614205Sandreas.sandberg@arm.com * not be construed as granting a license to any other intellectual 714205Sandreas.sandberg@arm.com * property including but not limited to intellectual property relating 814205Sandreas.sandberg@arm.com * to a hardware implementation of the functionality of the software 914205Sandreas.sandberg@arm.com * licensed hereunder. You may use the software subject to the license 1014205Sandreas.sandberg@arm.com * terms below provided that you ensure that this notice is replicated 1114205Sandreas.sandberg@arm.com * unmodified and in its entirety in all distributions of the software, 1214205Sandreas.sandberg@arm.com * modified or unmodified, in source code or in binary form. 1314205Sandreas.sandberg@arm.com * 141762SN/A * Copyright (c) 2003-2005 The Regents of The University of Michigan 152SN/A * All rights reserved. 162SN/A * 172SN/A * Redistribution and use in source and binary forms, with or without 182SN/A * modification, are permitted provided that the following conditions are 192SN/A * met: redistributions of source code must retain the above copyright 202SN/A * notice, this list of conditions and the following disclaimer; 212SN/A * redistributions in binary form must reproduce the above copyright 222SN/A * notice, this list of conditions and the following disclaimer in the 232SN/A * documentation and/or other materials provided with the distribution; 242SN/A * neither the name of the copyright holders nor the names of its 252SN/A * contributors may be used to endorse or promote products derived from 262SN/A * this software without specific prior written permission. 272SN/A * 282SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 292SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 302SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 312SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 322SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 332SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 342SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 352SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 362SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 372SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 382SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 392665Ssaidi@eecs.umich.edu * 402665Ssaidi@eecs.umich.edu * Authors: Nathan Binkert 412SN/A */ 422SN/A 4311793Sbrandon.potter@amd.com#include "base/statistics.hh" 4411793Sbrandon.potter@amd.com 458229Snate@binkert.org#include <fstream> 462SN/A#include <iomanip> 472SN/A#include <list> 482SN/A#include <map> 492SN/A#include <string> 502SN/A 51148SN/A#include "base/callback.hh" 5256SN/A#include "base/cprintf.hh" 535889Snate@binkert.org#include "base/debug.hh" 54441SN/A#include "base/hostinfo.hh" 5512334Sgabeblack@google.com#include "base/logging.hh" 5656SN/A#include "base/str.hh" 57441SN/A#include "base/time.hh" 58433SN/A#include "base/trace.hh" 592SN/A 602SN/Ausing namespace std; 612SN/A 62729SN/Anamespace Stats { 63388SN/A 648243Sbradley.danofsky@amd.comstd::string Info::separatorString = "::"; 655887Snate@binkert.org 665887Snate@binkert.org// We wrap these in a function to make sure they're built in time. 675887Snate@binkert.orglist<Info *> & 685887Snate@binkert.orgstatsList() 69388SN/A{ 705887Snate@binkert.org static list<Info *> the_list; 715887Snate@binkert.org return the_list; 72388SN/A} 73388SN/A 745887Snate@binkert.orgMapType & 755887Snate@binkert.orgstatsMap() 76441SN/A{ 775887Snate@binkert.org static MapType the_map; 785887Snate@binkert.org return the_map; 79441SN/A} 80441SN/A 81388SN/Avoid 8214205Sandreas.sandberg@arm.comInfoAccess::setInfo(Group *parent, Info *info) 83388SN/A{ 8414205Sandreas.sandberg@arm.com panic_if(statsMap().find(this) != statsMap().end() || 8514205Sandreas.sandberg@arm.com _info != nullptr, 8614205Sandreas.sandberg@arm.com "shouldn't register stat twice!"); 8714205Sandreas.sandberg@arm.com 8814205Sandreas.sandberg@arm.com // New-style stats are reachable through the hierarchy and 8914205Sandreas.sandberg@arm.com // shouldn't be added to the global lists. 9014205Sandreas.sandberg@arm.com if (parent) { 9114205Sandreas.sandberg@arm.com _info = info; 9214205Sandreas.sandberg@arm.com return; 9314205Sandreas.sandberg@arm.com } 945887Snate@binkert.org 955887Snate@binkert.org statsList().push_back(info); 965887Snate@binkert.org 975887Snate@binkert.org#ifndef NDEBUG 985887Snate@binkert.org pair<MapType::iterator, bool> result = 995887Snate@binkert.org#endif 1005887Snate@binkert.org statsMap().insert(make_pair(this, info)); 1015887Snate@binkert.org assert(result.second && "this should never fail"); 1025887Snate@binkert.org assert(statsMap().find(this) != statsMap().end()); 103388SN/A} 104388SN/A 105388SN/Avoid 1065889Snate@binkert.orgInfoAccess::setParams(const StorageParams *params) 1075889Snate@binkert.org{ 1085889Snate@binkert.org info()->storageParams = params; 1095889Snate@binkert.org} 1105889Snate@binkert.org 1115889Snate@binkert.orgvoid 1125886Snate@binkert.orgInfoAccess::setInit() 113388SN/A{ 1146130Snate@binkert.org info()->flags.set(init); 115388SN/A} 116388SN/A 1175886Snate@binkert.orgInfo * 1185886Snate@binkert.orgInfoAccess::info() 119388SN/A{ 12014205Sandreas.sandberg@arm.com if (_info) { 12114205Sandreas.sandberg@arm.com // New-style stats 12214205Sandreas.sandberg@arm.com return _info; 12314205Sandreas.sandberg@arm.com } else { 12414205Sandreas.sandberg@arm.com // Legacy stats 12514205Sandreas.sandberg@arm.com MapType::const_iterator i = statsMap().find(this); 12614205Sandreas.sandberg@arm.com assert(i != statsMap().end()); 12714205Sandreas.sandberg@arm.com return (*i).second; 12814205Sandreas.sandberg@arm.com } 129388SN/A} 130388SN/A 1315886Snate@binkert.orgconst Info * 1325886Snate@binkert.orgInfoAccess::info() const 1335886Snate@binkert.org{ 13414205Sandreas.sandberg@arm.com if (_info) { 13514205Sandreas.sandberg@arm.com // New-style stats 13614205Sandreas.sandberg@arm.com return _info; 13714205Sandreas.sandberg@arm.com } else { 13814205Sandreas.sandberg@arm.com // Legacy stats 13914205Sandreas.sandberg@arm.com MapType::const_iterator i = statsMap().find(this); 14014205Sandreas.sandberg@arm.com assert(i != statsMap().end()); 14114205Sandreas.sandberg@arm.com return (*i).second; 14214205Sandreas.sandberg@arm.com } 1435886Snate@binkert.org} 1445886Snate@binkert.org 1455889Snate@binkert.orgStorageParams::~StorageParams() 1465889Snate@binkert.org{ 1475889Snate@binkert.org} 1485889Snate@binkert.org 1496026Snate@binkert.orgNameMapType & 1506026Snate@binkert.orgnameMap() 1516026Snate@binkert.org{ 1526026Snate@binkert.org static NameMapType the_map; 1536026Snate@binkert.org return the_map; 1546026Snate@binkert.org} 1556026Snate@binkert.org 1565889Snate@binkert.orgint Info::id_count = 0; 1575889Snate@binkert.org 1585889Snate@binkert.orgint debug_break_id = -1; 1595889Snate@binkert.org 1605886Snate@binkert.orgInfo::Info() 1615889Snate@binkert.org : flags(none), precision(-1), prereq(0), storageParams(NULL) 162582SN/A{ 1635889Snate@binkert.org id = id_count++; 1645889Snate@binkert.org if (debug_break_id >= 0 and debug_break_id == id) 1658231Snate@binkert.org Debug::breakpoint(); 166582SN/A} 167582SN/A 1685886Snate@binkert.orgInfo::~Info() 169388SN/A{ 170388SN/A} 171388SN/A 1728248Snate@binkert.orgbool 1738248Snate@binkert.orgvalidateStatName(const string &name) 1748248Snate@binkert.org{ 1758248Snate@binkert.org if (name.empty()) 1768248Snate@binkert.org return false; 1778248Snate@binkert.org 1788248Snate@binkert.org vector<string> vec; 1798248Snate@binkert.org tokenize(vec, name, '.'); 1808248Snate@binkert.org vector<string>::const_iterator item = vec.begin(); 1818248Snate@binkert.org while (item != vec.end()) { 1828248Snate@binkert.org if (item->empty()) 1838248Snate@binkert.org return false; 1848248Snate@binkert.org 1858248Snate@binkert.org string::const_iterator c = item->begin(); 1868248Snate@binkert.org 1878248Snate@binkert.org // The first character is different 1888248Snate@binkert.org if (!isalpha(*c) && *c != '_') 1898248Snate@binkert.org return false; 1908248Snate@binkert.org 1918248Snate@binkert.org // The rest of the characters have different rules. 1928248Snate@binkert.org while (++c != item->end()) { 1938248Snate@binkert.org if (!isalnum(*c) && *c != '_') 1948248Snate@binkert.org return false; 1958248Snate@binkert.org } 1968248Snate@binkert.org 1978248Snate@binkert.org ++item; 1988248Snate@binkert.org } 1998248Snate@binkert.org 2008248Snate@binkert.org return true; 2018248Snate@binkert.org} 2028248Snate@binkert.org 2036026Snate@binkert.orgvoid 2046026Snate@binkert.orgInfo::setName(const string &name) 2056026Snate@binkert.org{ 2068248Snate@binkert.org if (!validateStatName(name)) 2078248Snate@binkert.org panic("invalid stat name '%s'", name); 2088248Snate@binkert.org 2096026Snate@binkert.org pair<NameMapType::iterator, bool> p = 2106026Snate@binkert.org nameMap().insert(make_pair(name, this)); 2116026Snate@binkert.org 2126026Snate@binkert.org Info *other = p.first->second; 2136026Snate@binkert.org bool result = p.second; 21411320Ssteve.reinhardt@amd.com 2156026Snate@binkert.org if (!result) { 21611666Stushar@ece.gatech.edu // using other->name instead of just name to avoid a compiler 21711666Stushar@ece.gatech.edu // warning. They should be the same. 2186026Snate@binkert.org panic("same statistic name used twice! name=%s\n", other->name); 2196026Snate@binkert.org } 2206026Snate@binkert.org 2216026Snate@binkert.org this->name = name; 2226026Snate@binkert.org} 2236026Snate@binkert.org 2242SN/Abool 2255886Snate@binkert.orgInfo::less(Info *stat1, Info *stat2) 2262SN/A{ 227388SN/A const string &name1 = stat1->name; 228388SN/A const string &name2 = stat2->name; 2292SN/A 2302SN/A vector<string> v1; 2312SN/A vector<string> v2; 2322SN/A 2332SN/A tokenize(v1, name1, '.'); 2342SN/A tokenize(v2, name2, '.'); 2352SN/A 2365599Snate@binkert.org size_type last = min(v1.size(), v2.size()) - 1; 2375599Snate@binkert.org for (off_type i = 0; i < last; ++i) 2382SN/A if (v1[i] != v2[i]) 2392SN/A return v1[i] < v2[i]; 2402SN/A 2412SN/A // Special compare for last element. 2422SN/A if (v1[last] == v2[last]) 2432SN/A return v1.size() < v2.size(); 2442SN/A else 2452SN/A return v1[last] < v2[last]; 2462SN/A 2472SN/A return false; 2482SN/A} 2492SN/A 250388SN/Abool 2515886Snate@binkert.orgInfo::baseCheck() const 2522SN/A{ 2536000Snate@binkert.org if (!(flags & Stats::init)) { 254582SN/A#ifdef DEBUG 255695SN/A cprintf("this is stat number %d\n", id); 256388SN/A#endif 25711681Spowerjg@cs.wisc.edu panic("Not all stats have been initialized.\n" 25811681Spowerjg@cs.wisc.edu "You may need to add <ParentClass>::regStats() to a" 25914205Sandreas.sandberg@arm.com " new SimObject's regStats() function. Name: %s", 26014205Sandreas.sandberg@arm.com name); 261388SN/A return false; 262388SN/A } 2632SN/A 2647462Snate@binkert.org if ((flags & display) && name.empty()) { 265388SN/A panic("all printable stats must be named"); 266388SN/A return false; 267388SN/A } 2682SN/A 269388SN/A return true; 2702SN/A} 2712SN/A 2726001Snate@binkert.orgvoid 2736001Snate@binkert.orgInfo::enable() 2746001Snate@binkert.org{ 2756001Snate@binkert.org} 2766001Snate@binkert.org 2776001Snate@binkert.orgvoid 2786128Snate@binkert.orgVectorInfo::enable() 2796001Snate@binkert.org{ 2806001Snate@binkert.org size_type s = size(); 2816001Snate@binkert.org if (subnames.size() < s) 2826001Snate@binkert.org subnames.resize(s); 2836001Snate@binkert.org if (subdescs.size() < s) 2846001Snate@binkert.org subdescs.resize(s); 2856001Snate@binkert.org} 2866001Snate@binkert.org 2876001Snate@binkert.orgvoid 2886128Snate@binkert.orgVectorDistInfo::enable() 2896001Snate@binkert.org{ 2906001Snate@binkert.org size_type s = size(); 2916001Snate@binkert.org if (subnames.size() < s) 2926001Snate@binkert.org subnames.resize(s); 2936001Snate@binkert.org if (subdescs.size() < s) 2946001Snate@binkert.org subdescs.resize(s); 2956001Snate@binkert.org} 2966001Snate@binkert.org 2976001Snate@binkert.orgvoid 2986128Snate@binkert.orgVector2dInfo::enable() 2996001Snate@binkert.org{ 3006001Snate@binkert.org if (subnames.size() < x) 3016001Snate@binkert.org subnames.resize(x); 3026001Snate@binkert.org if (subdescs.size() < x) 3036001Snate@binkert.org subdescs.resize(x); 3046001Snate@binkert.org if (y_subnames.size() < y) 3056001Snate@binkert.org y_subnames.resize(y); 3066001Snate@binkert.org} 307695SN/A 3087831Snate@binkert.orgvoid 3097831Snate@binkert.orgHistStor::grow_out() 3107831Snate@binkert.org{ 3117831Snate@binkert.org int size = cvec.size(); 3127831Snate@binkert.org int zero = size / 2; // round down! 3137831Snate@binkert.org int top_half = zero + (size - zero + 1) / 2; // round up! 3147831Snate@binkert.org int bottom_half = (size - zero) / 2; // round down! 3157831Snate@binkert.org 3167831Snate@binkert.org // grow down 3177831Snate@binkert.org int low_pair = zero - 1; 3187831Snate@binkert.org for (int i = zero - 1; i >= bottom_half; i--) { 3197831Snate@binkert.org cvec[i] = cvec[low_pair]; 3207831Snate@binkert.org if (low_pair - 1 >= 0) 3217831Snate@binkert.org cvec[i] += cvec[low_pair - 1]; 3227831Snate@binkert.org low_pair -= 2; 3237831Snate@binkert.org } 3247831Snate@binkert.org assert(low_pair == 0 || low_pair == -1 || low_pair == -2); 3257831Snate@binkert.org 3267831Snate@binkert.org for (int i = bottom_half - 1; i >= 0; i--) 3277831Snate@binkert.org cvec[i] = Counter(); 3287831Snate@binkert.org 3297831Snate@binkert.org // grow up 3307831Snate@binkert.org int high_pair = zero; 3317831Snate@binkert.org for (int i = zero; i < top_half; i++) { 3327831Snate@binkert.org cvec[i] = cvec[high_pair]; 3337831Snate@binkert.org if (high_pair + 1 < size) 3347831Snate@binkert.org cvec[i] += cvec[high_pair + 1]; 3357831Snate@binkert.org high_pair += 2; 3367831Snate@binkert.org } 3377831Snate@binkert.org assert(high_pair == size || high_pair == size + 1); 3387831Snate@binkert.org 3397831Snate@binkert.org for (int i = top_half; i < size; i++) 3407831Snate@binkert.org cvec[i] = Counter(); 3417831Snate@binkert.org 3427831Snate@binkert.org max_bucket *= 2; 3437831Snate@binkert.org min_bucket *= 2; 3447831Snate@binkert.org bucket_size *= 2; 3457831Snate@binkert.org} 3467831Snate@binkert.org 3477831Snate@binkert.orgvoid 3487831Snate@binkert.orgHistStor::grow_convert() 3497831Snate@binkert.org{ 3507831Snate@binkert.org int size = cvec.size(); 3517831Snate@binkert.org int half = (size + 1) / 2; // round up! 3527831Snate@binkert.org //bool even = (size & 1) == 0; 3537831Snate@binkert.org 3547831Snate@binkert.org int pair = size - 1; 3557831Snate@binkert.org for (int i = size - 1; i >= half; --i) { 3567831Snate@binkert.org cvec[i] = cvec[pair]; 3577831Snate@binkert.org if (pair - 1 >= 0) 3587831Snate@binkert.org cvec[i] += cvec[pair - 1]; 3597831Snate@binkert.org pair -= 2; 3607831Snate@binkert.org } 3617831Snate@binkert.org 3627831Snate@binkert.org for (int i = half - 1; i >= 0; i--) 3637831Snate@binkert.org cvec[i] = Counter(); 3647831Snate@binkert.org 3657831Snate@binkert.org min_bucket = -max_bucket;// - (even ? bucket_size : 0); 3667831Snate@binkert.org bucket_size *= 2; 3677831Snate@binkert.org} 3687831Snate@binkert.org 3697831Snate@binkert.orgvoid 3707831Snate@binkert.orgHistStor::grow_up() 3717831Snate@binkert.org{ 3727831Snate@binkert.org int size = cvec.size(); 3737831Snate@binkert.org int half = (size + 1) / 2; // round up! 3747831Snate@binkert.org 3757831Snate@binkert.org int pair = 0; 3767831Snate@binkert.org for (int i = 0; i < half; i++) { 3777831Snate@binkert.org cvec[i] = cvec[pair]; 3787831Snate@binkert.org if (pair + 1 < size) 3797831Snate@binkert.org cvec[i] += cvec[pair + 1]; 3807831Snate@binkert.org pair += 2; 3817831Snate@binkert.org } 3827831Snate@binkert.org assert(pair == size || pair == size + 1); 3837831Snate@binkert.org 3847831Snate@binkert.org for (int i = half; i < size; i++) 3857831Snate@binkert.org cvec[i] = Counter(); 3867831Snate@binkert.org 3877831Snate@binkert.org max_bucket *= 2; 3887831Snate@binkert.org bucket_size *= 2; 3897831Snate@binkert.org} 3907831Snate@binkert.org 39110011Snilay@cs.wisc.eduvoid 39210011Snilay@cs.wisc.eduHistStor::add(HistStor *hs) 39310011Snilay@cs.wisc.edu{ 39410011Snilay@cs.wisc.edu int b_size = hs->size(); 39510011Snilay@cs.wisc.edu assert(size() == b_size); 39610011Snilay@cs.wisc.edu assert(min_bucket == hs->min_bucket); 39710011Snilay@cs.wisc.edu 39810011Snilay@cs.wisc.edu sum += hs->sum; 39910011Snilay@cs.wisc.edu logs += hs->logs; 40010011Snilay@cs.wisc.edu squares += hs->squares; 40110011Snilay@cs.wisc.edu samples += hs->samples; 40210011Snilay@cs.wisc.edu 40311321Ssteve.reinhardt@amd.com while (bucket_size > hs->bucket_size) 40410011Snilay@cs.wisc.edu hs->grow_up(); 40511321Ssteve.reinhardt@amd.com while (bucket_size < hs->bucket_size) 40610011Snilay@cs.wisc.edu grow_up(); 40710011Snilay@cs.wisc.edu 40810011Snilay@cs.wisc.edu for (uint32_t i = 0; i < b_size; i++) 40910011Snilay@cs.wisc.edu cvec[i] += hs->cvec[i]; 41010011Snilay@cs.wisc.edu} 41110011Snilay@cs.wisc.edu 41214205Sandreas.sandberg@arm.comFormula::Formula(Group *parent, const char *name, const char *desc) 41314205Sandreas.sandberg@arm.com : DataWrapVec<Formula, FormulaInfoProxy>(parent, name, desc) 41414205Sandreas.sandberg@arm.com 415388SN/A{ 416388SN/A} 417388SN/A 41814205Sandreas.sandberg@arm.com 41914205Sandreas.sandberg@arm.com 42014205Sandreas.sandberg@arm.comFormula::Formula(Group *parent, const char *name, const char *desc, 42114205Sandreas.sandberg@arm.com const Temp &r) 42214205Sandreas.sandberg@arm.com : DataWrapVec<Formula, FormulaInfoProxy>(parent, name, desc) 423388SN/A{ 42414205Sandreas.sandberg@arm.com *this = r; 425388SN/A} 426388SN/A 427388SN/Aconst Formula & 42814205Sandreas.sandberg@arm.comFormula::operator=(const Temp &r) 429388SN/A{ 430388SN/A assert(!root && "Can't change formulas"); 43110491Sandreas.hansson@arm.com root = r.getNodePtr(); 4327461Snate@binkert.org setInit(); 433388SN/A assert(size()); 434388SN/A return *this; 435388SN/A} 436388SN/A 437388SN/Aconst Formula & 438388SN/AFormula::operator+=(Temp r) 439388SN/A{ 440388SN/A if (root) 441695SN/A root = NodePtr(new BinaryNode<std::plus<Result> >(root, r)); 4427461Snate@binkert.org else { 44310491Sandreas.hansson@arm.com root = r.getNodePtr(); 4447461Snate@binkert.org setInit(); 4457461Snate@binkert.org } 4467461Snate@binkert.org 447388SN/A assert(size()); 448388SN/A return *this; 449388SN/A} 450388SN/A 4519857Snilay@cs.wisc.educonst Formula & 4529857Snilay@cs.wisc.eduFormula::operator/=(Temp r) 4539857Snilay@cs.wisc.edu{ 4549857Snilay@cs.wisc.edu assert (root); 4559857Snilay@cs.wisc.edu root = NodePtr(new BinaryNode<std::divides<Result> >(root, r)); 4569857Snilay@cs.wisc.edu 4579857Snilay@cs.wisc.edu assert(size()); 4589857Snilay@cs.wisc.edu return *this; 4599857Snilay@cs.wisc.edu} 4609857Snilay@cs.wisc.edu 46114205Sandreas.sandberg@arm.com 462142SN/Avoid 4636000Snate@binkert.orgFormula::result(VResult &vec) const 4646000Snate@binkert.org{ 4656000Snate@binkert.org if (root) 4666000Snate@binkert.org vec = root->result(); 4676000Snate@binkert.org} 4686000Snate@binkert.org 4696000Snate@binkert.orgResult 4706000Snate@binkert.orgFormula::total() const 4716000Snate@binkert.org{ 4726000Snate@binkert.org return root ? root->total() : 0.0; 4736000Snate@binkert.org} 4746000Snate@binkert.org 4756000Snate@binkert.orgsize_type 4766000Snate@binkert.orgFormula::size() const 4776000Snate@binkert.org{ 4786000Snate@binkert.org if (!root) 4796000Snate@binkert.org return 0; 4806000Snate@binkert.org else 4816000Snate@binkert.org return root->size(); 4826000Snate@binkert.org} 4836000Snate@binkert.org 4846000Snate@binkert.orgvoid 4856000Snate@binkert.orgFormula::reset() 4866000Snate@binkert.org{ 4876000Snate@binkert.org} 4886000Snate@binkert.org 4896000Snate@binkert.orgbool 4906000Snate@binkert.orgFormula::zero() const 4916000Snate@binkert.org{ 4926000Snate@binkert.org VResult vec; 4936000Snate@binkert.org result(vec); 4946227Snate@binkert.org for (VResult::size_type i = 0; i < vec.size(); ++i) 4956000Snate@binkert.org if (vec[i] != 0.0) 4966000Snate@binkert.org return false; 4976000Snate@binkert.org return true; 4986000Snate@binkert.org} 4996000Snate@binkert.org 5006000Snate@binkert.orgstring 5016000Snate@binkert.orgFormula::str() const 5026000Snate@binkert.org{ 5036000Snate@binkert.org return root ? root->str() : ""; 5046000Snate@binkert.org} 5056000Snate@binkert.org 50610453SAndrew.Bardsley@arm.comHandler resetHandler = NULL; 50710453SAndrew.Bardsley@arm.comHandler dumpHandler = NULL; 50810453SAndrew.Bardsley@arm.com 50910453SAndrew.Bardsley@arm.comvoid 51010453SAndrew.Bardsley@arm.comregisterHandlers(Handler reset_handler, Handler dump_handler) 51110453SAndrew.Bardsley@arm.com{ 51210453SAndrew.Bardsley@arm.com resetHandler = reset_handler; 51310453SAndrew.Bardsley@arm.com dumpHandler = dump_handler; 51410453SAndrew.Bardsley@arm.com} 51510453SAndrew.Bardsley@arm.com 5169042SMitchell.Hayenga@ARM.comCallbackQueue dumpQueue; 517695SN/ACallbackQueue resetQueue; 5182SN/A 519456SN/Avoid 52010453SAndrew.Bardsley@arm.comprocessResetQueue() 52110453SAndrew.Bardsley@arm.com{ 52210453SAndrew.Bardsley@arm.com resetQueue.process(); 52310453SAndrew.Bardsley@arm.com} 52410453SAndrew.Bardsley@arm.com 52510453SAndrew.Bardsley@arm.comvoid 52610453SAndrew.Bardsley@arm.comprocessDumpQueue() 52710453SAndrew.Bardsley@arm.com{ 52810453SAndrew.Bardsley@arm.com dumpQueue.process(); 52910453SAndrew.Bardsley@arm.com} 53010453SAndrew.Bardsley@arm.com 53110453SAndrew.Bardsley@arm.comvoid 532394SN/AregisterResetCallback(Callback *cb) 533148SN/A{ 534148SN/A resetQueue.add(cb); 535148SN/A} 536148SN/A 5378986SAli.Saidi@ARM.combool _enabled = false; 5388986SAli.Saidi@ARM.com 5398986SAli.Saidi@ARM.combool 5408986SAli.Saidi@ARM.comenabled() 5418986SAli.Saidi@ARM.com{ 5428986SAli.Saidi@ARM.com return _enabled; 5438986SAli.Saidi@ARM.com} 5448986SAli.Saidi@ARM.com 5458986SAli.Saidi@ARM.comvoid 5468986SAli.Saidi@ARM.comenable() 5478986SAli.Saidi@ARM.com{ 5488986SAli.Saidi@ARM.com if (_enabled) 5498986SAli.Saidi@ARM.com fatal("Stats are already enabled"); 5508986SAli.Saidi@ARM.com 5518986SAli.Saidi@ARM.com _enabled = true; 5528986SAli.Saidi@ARM.com} 5538986SAli.Saidi@ARM.com 5549042SMitchell.Hayenga@ARM.comvoid 55510453SAndrew.Bardsley@arm.comdump() 55610453SAndrew.Bardsley@arm.com{ 55710453SAndrew.Bardsley@arm.com if (dumpHandler) 55810453SAndrew.Bardsley@arm.com dumpHandler(); 55910453SAndrew.Bardsley@arm.com else 56010453SAndrew.Bardsley@arm.com fatal("No registered Stats::dump handler"); 56110453SAndrew.Bardsley@arm.com} 56210453SAndrew.Bardsley@arm.com 56310453SAndrew.Bardsley@arm.comvoid 56410453SAndrew.Bardsley@arm.comreset() 56510453SAndrew.Bardsley@arm.com{ 56610453SAndrew.Bardsley@arm.com if (resetHandler) 56710453SAndrew.Bardsley@arm.com resetHandler(); 56810453SAndrew.Bardsley@arm.com else 56910453SAndrew.Bardsley@arm.com fatal("No registered Stats::reset handler"); 57010453SAndrew.Bardsley@arm.com} 57110453SAndrew.Bardsley@arm.com 57210453SAndrew.Bardsley@arm.comvoid 5739042SMitchell.Hayenga@ARM.comregisterDumpCallback(Callback *cb) 5749042SMitchell.Hayenga@ARM.com{ 5759042SMitchell.Hayenga@ARM.com dumpQueue.add(cb); 5769042SMitchell.Hayenga@ARM.com} 5779042SMitchell.Hayenga@ARM.com 5787811Ssteve.reinhardt@amd.com} // namespace Stats 5798296Snate@binkert.org 5808296Snate@binkert.orgvoid 5818296Snate@binkert.orgdebugDumpStats() 5828296Snate@binkert.org{ 5838296Snate@binkert.org Stats::dump(); 5848296Snate@binkert.org} 585