stat_control.cc revision 1696
16242Sgblack@eecs.umich.edu/* 27093Sgblack@eecs.umich.edu * Copyright (c) 2004 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 146242Sgblack@eecs.umich.edu * this software without specific prior written permission. 156242Sgblack@eecs.umich.edu * 166242Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 176242Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 186242Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 196242Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 206242Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 216242Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 226242Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 236242Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 246242Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 256242Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 266242Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276242Sgblack@eecs.umich.edu */ 286242Sgblack@eecs.umich.edu 296242Sgblack@eecs.umich.edu// This file will contain default statistics for the simulator that 306242Sgblack@eecs.umich.edu// don't really belong to a specific simulator object 316242Sgblack@eecs.umich.edu 326242Sgblack@eecs.umich.edu#include <fstream> 336242Sgblack@eecs.umich.edu#include <iostream> 346242Sgblack@eecs.umich.edu#include <list> 356242Sgblack@eecs.umich.edu 366242Sgblack@eecs.umich.edu#include "base/callback.hh" 376242Sgblack@eecs.umich.edu#include "base/hostinfo.hh" 386242Sgblack@eecs.umich.edu#include "base/statistics.hh" 396242Sgblack@eecs.umich.edu#include "base/str.hh" 406242Sgblack@eecs.umich.edu#include "base/time.hh" 416242Sgblack@eecs.umich.edu#include "base/stats/output.hh" 426242Sgblack@eecs.umich.edu#include "cpu/base_cpu.hh" 436242Sgblack@eecs.umich.edu#include "sim/eventq.hh" 446242Sgblack@eecs.umich.edu#include "sim/sim_object.hh" 456242Sgblack@eecs.umich.edu#include "sim/stat_control.hh" 466242Sgblack@eecs.umich.edu#include "sim/root.hh" 476242Sgblack@eecs.umich.edu 486242Sgblack@eecs.umich.eduusing namespace std; 496242Sgblack@eecs.umich.edu 506242Sgblack@eecs.umich.eduStats::Formula hostInstRate; 516242Sgblack@eecs.umich.eduStats::Formula hostTickRate; 526242Sgblack@eecs.umich.eduStats::Value hostMemory; 536242Sgblack@eecs.umich.eduStats::Value hostSeconds; 546242Sgblack@eecs.umich.edu 556242Sgblack@eecs.umich.eduStats::Value simTicks; 566242Sgblack@eecs.umich.eduStats::Value simInsts; 576242Sgblack@eecs.umich.eduStats::Value simFreq; 586242Sgblack@eecs.umich.eduStats::Formula simSeconds; 596242Sgblack@eecs.umich.edu 606242Sgblack@eecs.umich.edunamespace Stats { 616242Sgblack@eecs.umich.edu 626242Sgblack@eecs.umich.eduTime statTime(true); 636242Sgblack@eecs.umich.eduTick startTick; 646242Sgblack@eecs.umich.edu 657111Sgblack@eecs.umich.educlass SimTicksReset : public Callback 666242Sgblack@eecs.umich.edu{ 676242Sgblack@eecs.umich.edu public: 686242Sgblack@eecs.umich.edu void process() 696242Sgblack@eecs.umich.edu { 706735Sgblack@eecs.umich.edu statTime.set(); 716242Sgblack@eecs.umich.edu startTick = curTick; 726242Sgblack@eecs.umich.edu } 736242Sgblack@eecs.umich.edu}; 746723Sgblack@eecs.umich.edu 756242Sgblack@eecs.umich.edudouble 766242Sgblack@eecs.umich.edustatElapsedTime() 776261Sgblack@eecs.umich.edu{ 786403Sgblack@eecs.umich.edu Time now(true); 796403Sgblack@eecs.umich.edu Time elapsed = now - statTime; 806403Sgblack@eecs.umich.edu return elapsed(); 817259Sgblack@eecs.umich.edu} 827259Sgblack@eecs.umich.edu 837259Sgblack@eecs.umich.eduTick 847259Sgblack@eecs.umich.edustatElapsedTicks() 857264Sgblack@eecs.umich.edu{ 867259Sgblack@eecs.umich.edu return curTick - startTick; 877259Sgblack@eecs.umich.edu} 887259Sgblack@eecs.umich.edu 897259Sgblack@eecs.umich.eduSimTicksReset simTicksReset; 907259Sgblack@eecs.umich.edu 917259Sgblack@eecs.umich.eduvoid 927259Sgblack@eecs.umich.eduInitSimStats() 937259Sgblack@eecs.umich.edu{ 947259Sgblack@eecs.umich.edu simInsts 957259Sgblack@eecs.umich.edu .functor(BaseCPU::numSimulatedInstructions) 967259Sgblack@eecs.umich.edu .name("sim_insts") 977259Sgblack@eecs.umich.edu .desc("Number of instructions simulated") 987259Sgblack@eecs.umich.edu .precision(0) 997259Sgblack@eecs.umich.edu .prereq(simInsts) 1007259Sgblack@eecs.umich.edu ; 1017259Sgblack@eecs.umich.edu 1027259Sgblack@eecs.umich.edu simSeconds 1037259Sgblack@eecs.umich.edu .name("sim_seconds") 1047259Sgblack@eecs.umich.edu .desc("Number of seconds simulated") 1057259Sgblack@eecs.umich.edu ; 1067259Sgblack@eecs.umich.edu 1077259Sgblack@eecs.umich.edu simFreq 1087259Sgblack@eecs.umich.edu .scalar(Clock::Frequency) 1097259Sgblack@eecs.umich.edu .name("sim_freq") 1107259Sgblack@eecs.umich.edu .desc("Frequency of simulated ticks") 1117259Sgblack@eecs.umich.edu ; 1127259Sgblack@eecs.umich.edu 1137259Sgblack@eecs.umich.edu simTicks 1147259Sgblack@eecs.umich.edu .functor(statElapsedTicks) 1157259Sgblack@eecs.umich.edu .name("sim_ticks") 1167259Sgblack@eecs.umich.edu .desc("Number of ticks simulated") 1177259Sgblack@eecs.umich.edu ; 1187259Sgblack@eecs.umich.edu 1197259Sgblack@eecs.umich.edu hostInstRate 1207259Sgblack@eecs.umich.edu .name("host_inst_rate") 1217259Sgblack@eecs.umich.edu .desc("Simulator instruction rate (inst/s)") 1227259Sgblack@eecs.umich.edu .precision(0) 1237259Sgblack@eecs.umich.edu .prereq(simInsts) 1247259Sgblack@eecs.umich.edu ; 1257259Sgblack@eecs.umich.edu 1267259Sgblack@eecs.umich.edu hostMemory 1277259Sgblack@eecs.umich.edu .functor(memUsage) 1287259Sgblack@eecs.umich.edu .name("host_mem_usage") 1297259Sgblack@eecs.umich.edu .desc("Number of bytes of host memory used") 1307259Sgblack@eecs.umich.edu .prereq(hostMemory) 1317259Sgblack@eecs.umich.edu ; 1327259Sgblack@eecs.umich.edu 1337259Sgblack@eecs.umich.edu hostSeconds 1347259Sgblack@eecs.umich.edu .functor(statElapsedTime) 1357259Sgblack@eecs.umich.edu .name("host_seconds") 1367259Sgblack@eecs.umich.edu .desc("Real time elapsed on the host") 1377259Sgblack@eecs.umich.edu .precision(2) 1387259Sgblack@eecs.umich.edu ; 1397259Sgblack@eecs.umich.edu 1407259Sgblack@eecs.umich.edu hostTickRate 1417259Sgblack@eecs.umich.edu .name("host_tick_rate") 1427259Sgblack@eecs.umich.edu .desc("Simulator tick rate (ticks/s)") 1437259Sgblack@eecs.umich.edu .precision(0) 1447259Sgblack@eecs.umich.edu ; 1457259Sgblack@eecs.umich.edu 1467259Sgblack@eecs.umich.edu simSeconds = simTicks / simFreq; 1477259Sgblack@eecs.umich.edu hostInstRate = simInsts / hostSeconds; 1487259Sgblack@eecs.umich.edu hostTickRate = simTicks / hostSeconds; 1497259Sgblack@eecs.umich.edu 1507259Sgblack@eecs.umich.edu registerResetCallback(&simTicksReset); 1516735Sgblack@eecs.umich.edu} 1526261Sgblack@eecs.umich.edu 1536261Sgblack@eecs.umich.educlass StatEvent : public Event 1547259Sgblack@eecs.umich.edu{ 1557259Sgblack@eecs.umich.edu protected: 1567259Sgblack@eecs.umich.edu int flags; 1576261Sgblack@eecs.umich.edu Tick repeat; 1587259Sgblack@eecs.umich.edu 1597259Sgblack@eecs.umich.edu public: 1607259Sgblack@eecs.umich.edu StatEvent(int _flags, Tick _when, Tick _repeat); 1617264Sgblack@eecs.umich.edu virtual void process(); 1627259Sgblack@eecs.umich.edu virtual const char *description(); 1637259Sgblack@eecs.umich.edu}; 1647259Sgblack@eecs.umich.edu 1657259Sgblack@eecs.umich.eduStatEvent::StatEvent(int _flags, Tick _when, Tick _repeat) 1667259Sgblack@eecs.umich.edu : Event(&mainEventQueue, Stat_Event_Pri), 1677259Sgblack@eecs.umich.edu flags(_flags), repeat(_repeat) 1687259Sgblack@eecs.umich.edu{ 1697259Sgblack@eecs.umich.edu setFlags(AutoDelete); 1707264Sgblack@eecs.umich.edu schedule(_when); 1717259Sgblack@eecs.umich.edu} 1727259Sgblack@eecs.umich.edu 1736242Sgblack@eecs.umich.educonst char * 1746242Sgblack@eecs.umich.eduStatEvent::description() 1756242Sgblack@eecs.umich.edu{ 1766242Sgblack@eecs.umich.edu return "Statistics dump and/or reset"; 1776242Sgblack@eecs.umich.edu} 1786242Sgblack@eecs.umich.edu 1796242Sgblack@eecs.umich.eduvoid 1806242Sgblack@eecs.umich.eduStatEvent::process() 1816735Sgblack@eecs.umich.edu{ 1826242Sgblack@eecs.umich.edu if (flags & Stats::Dump) 1836242Sgblack@eecs.umich.edu DumpNow(); 1846735Sgblack@eecs.umich.edu 1856242Sgblack@eecs.umich.edu if (flags & Stats::Reset) 1866242Sgblack@eecs.umich.edu reset(); 1876242Sgblack@eecs.umich.edu 1886242Sgblack@eecs.umich.edu if (repeat) 1896242Sgblack@eecs.umich.edu schedule(curTick + repeat); 1906242Sgblack@eecs.umich.edu} 1916242Sgblack@eecs.umich.edu 1926735Sgblack@eecs.umich.edulist<Output *> OutputList; 1936750Sgblack@eecs.umich.edu 1946750Sgblack@eecs.umich.eduvoid 1956750Sgblack@eecs.umich.eduDumpNow() 1966750Sgblack@eecs.umich.edu{ 1977093Sgblack@eecs.umich.edu list<Output *>::iterator i = OutputList.begin(); 1987093Sgblack@eecs.umich.edu list<Output *>::iterator end = OutputList.end(); 1997093Sgblack@eecs.umich.edu for (; i != end; ++i) { 2007093Sgblack@eecs.umich.edu Output *output = *i; 2017093Sgblack@eecs.umich.edu if (!output->valid()) 2027093Sgblack@eecs.umich.edu continue; 2037093Sgblack@eecs.umich.edu 2046735Sgblack@eecs.umich.edu output->output(); 2056735Sgblack@eecs.umich.edu } 2066735Sgblack@eecs.umich.edu} 2076735Sgblack@eecs.umich.edu 2086735Sgblack@eecs.umich.eduvoid 2096735Sgblack@eecs.umich.eduSetupEvent(int flags, Tick when, Tick repeat) 2106735Sgblack@eecs.umich.edu{ 2116735Sgblack@eecs.umich.edu new StatEvent(flags, when, repeat); 2126735Sgblack@eecs.umich.edu} 2136735Sgblack@eecs.umich.edu 2146735Sgblack@eecs.umich.edu/* namespace Stats */ } 2156735Sgblack@eecs.umich.edu 2166735Sgblack@eecs.umich.eduextern "C" void 2176735Sgblack@eecs.umich.edudebugDumpStats() 2186735Sgblack@eecs.umich.edu{ 2196735Sgblack@eecs.umich.edu Stats::DumpNow(); 2206735Sgblack@eecs.umich.edu} 2216735Sgblack@eecs.umich.edu 2226735Sgblack@eecs.umich.edu