stat_control.cc revision 8720
1695SN/A/* 21762SN/A * Copyright (c) 2004-2005 The Regents of The University of Michigan 3695SN/A * All rights reserved. 4695SN/A * 5695SN/A * Redistribution and use in source and binary forms, with or without 6695SN/A * modification, are permitted provided that the following conditions are 7695SN/A * met: redistributions of source code must retain the above copyright 8695SN/A * notice, this list of conditions and the following disclaimer; 9695SN/A * redistributions in binary form must reproduce the above copyright 10695SN/A * notice, this list of conditions and the following disclaimer in the 11695SN/A * documentation and/or other materials provided with the distribution; 12695SN/A * neither the name of the copyright holders nor the names of its 13695SN/A * contributors may be used to endorse or promote products derived from 14695SN/A * this software without specific prior written permission. 15695SN/A * 16695SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17695SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18695SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19695SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20695SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21695SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22695SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23695SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24695SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25695SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26695SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272665Ssaidi@eecs.umich.edu * 282665Ssaidi@eecs.umich.edu * Authors: Nathan Binkert 29695SN/A */ 30695SN/A 31695SN/A// This file will contain default statistics for the simulator that 32695SN/A// don't really belong to a specific simulator object 33695SN/A 34695SN/A#include <fstream> 35695SN/A#include <iostream> 36695SN/A#include <list> 37695SN/A 38695SN/A#include "base/callback.hh" 39695SN/A#include "base/hostinfo.hh" 40695SN/A#include "base/statistics.hh" 41695SN/A#include "base/time.hh" 427768SAli.Saidi@ARM.com#include "config/the_isa.hh" 437768SAli.Saidi@ARM.com#if THE_ISA == NO_ISA 447768SAli.Saidi@ARM.com#include "arch/noisa/cpu_dummy.hh" 457768SAli.Saidi@ARM.com#else 461717SN/A#include "cpu/base.hh" 477768SAli.Saidi@ARM.com#endif 487768SAli.Saidi@ARM.com 49695SN/A#include "sim/eventq.hh" 507822Ssteve.reinhardt@amd.com#include "sim/stat_control.hh" 51695SN/A 52695SN/Ausing namespace std; 53695SN/A 54729SN/AStats::Formula simSeconds; 557068Snate@binkert.orgStats::Value simTicks; 568720SAli.Saidi@ARM.comStats::Value finalTick; 577068Snate@binkert.orgStats::Value simFreq; 58695SN/A 59729SN/Anamespace Stats { 60695SN/A 61695SN/ATime statTime(true); 62695SN/ATick startTick; 63695SN/A 644078Sbinkertn@umich.edustruct SimTicksReset : public Callback 65695SN/A{ 66695SN/A void process() 67695SN/A { 687840Snate@binkert.org statTime.setTimer(); 697823Ssteve.reinhardt@amd.com startTick = curTick(); 70695SN/A } 71695SN/A}; 72695SN/A 73695SN/Adouble 74695SN/AstatElapsedTime() 75695SN/A{ 767840Snate@binkert.org Time now; 777840Snate@binkert.org now.setTimer(); 787840Snate@binkert.org 79695SN/A Time elapsed = now - statTime; 807840Snate@binkert.org return elapsed; 81695SN/A} 82695SN/A 831020SN/ATick 841020SN/AstatElapsedTicks() 851020SN/A{ 867823Ssteve.reinhardt@amd.com return curTick() - startTick; 871020SN/A} 881020SN/A 898720SAli.Saidi@ARM.comTick 908720SAli.Saidi@ARM.comstatFinalTick() 918720SAli.Saidi@ARM.com{ 928720SAli.Saidi@ARM.com return curTick(); 938720SAli.Saidi@ARM.com} 948720SAli.Saidi@ARM.com 95695SN/ASimTicksReset simTicksReset; 96695SN/A 975883Snate@binkert.orgstruct Global 985883Snate@binkert.org{ 995883Snate@binkert.org Stats::Formula hostInstRate; 1005883Snate@binkert.org Stats::Formula hostTickRate; 1015883Snate@binkert.org Stats::Value hostMemory; 1025883Snate@binkert.org Stats::Value hostSeconds; 1035883Snate@binkert.org 1045883Snate@binkert.org Stats::Value simInsts; 1055883Snate@binkert.org 1065883Snate@binkert.org Global(); 1075883Snate@binkert.org}; 1085883Snate@binkert.org 1095883Snate@binkert.orgGlobal::Global() 110695SN/A{ 111695SN/A simInsts 112707SN/A .functor(BaseCPU::numSimulatedInstructions) 113695SN/A .name("sim_insts") 114695SN/A .desc("Number of instructions simulated") 115695SN/A .precision(0) 116695SN/A .prereq(simInsts) 117695SN/A ; 118695SN/A 119695SN/A simSeconds 120695SN/A .name("sim_seconds") 121695SN/A .desc("Number of seconds simulated") 122695SN/A ; 123695SN/A 124707SN/A simFreq 1257064Snate@binkert.org .scalar(SimClock::Frequency) 126707SN/A .name("sim_freq") 127707SN/A .desc("Frequency of simulated ticks") 128707SN/A ; 129707SN/A 130695SN/A simTicks 1311020SN/A .functor(statElapsedTicks) 132695SN/A .name("sim_ticks") 133695SN/A .desc("Number of ticks simulated") 134695SN/A ; 135695SN/A 1368720SAli.Saidi@ARM.com finalTick 1378720SAli.Saidi@ARM.com .functor(statFinalTick) 1388720SAli.Saidi@ARM.com .name("final_tick") 1398720SAli.Saidi@ARM.com .desc("Number of ticks from beginning of simulation \ 1408720SAli.Saidi@ARM.com(restored from checkpoints and never reset)") 1418720SAli.Saidi@ARM.com ; 1428720SAli.Saidi@ARM.com 143695SN/A hostInstRate 144695SN/A .name("host_inst_rate") 145695SN/A .desc("Simulator instruction rate (inst/s)") 146695SN/A .precision(0) 147695SN/A .prereq(simInsts) 148695SN/A ; 149695SN/A 150695SN/A hostMemory 151707SN/A .functor(memUsage) 152695SN/A .name("host_mem_usage") 153695SN/A .desc("Number of bytes of host memory used") 154695SN/A .prereq(hostMemory) 155695SN/A ; 156695SN/A 157695SN/A hostSeconds 158707SN/A .functor(statElapsedTime) 159695SN/A .name("host_seconds") 160695SN/A .desc("Real time elapsed on the host") 161695SN/A .precision(2) 162695SN/A ; 163695SN/A 164695SN/A hostTickRate 165695SN/A .name("host_tick_rate") 166695SN/A .desc("Simulator tick rate (ticks/s)") 167695SN/A .precision(0) 168695SN/A ; 169695SN/A 170707SN/A simSeconds = simTicks / simFreq; 171695SN/A hostInstRate = simInsts / hostSeconds; 172695SN/A hostTickRate = simTicks / hostSeconds; 173695SN/A 174695SN/A registerResetCallback(&simTicksReset); 175695SN/A} 176695SN/A 1775883Snate@binkert.orgvoid 1785883Snate@binkert.orginitSimStats() 1795883Snate@binkert.org{ 1805883Snate@binkert.org static Global global; 1815883Snate@binkert.org} 1825883Snate@binkert.org 1837822Ssteve.reinhardt@amd.comclass StatEvent : public Event 184695SN/A{ 1854078Sbinkertn@umich.edu private: 1864078Sbinkertn@umich.edu bool dump; 1874078Sbinkertn@umich.edu bool reset; 188695SN/A Tick repeat; 189695SN/A 190695SN/A public: 1917822Ssteve.reinhardt@amd.com StatEvent(bool _dump, bool _reset, Tick _repeat) 1928581Ssteve.reinhardt@amd.com : Event(Stat_Event_Pri, AutoDelete), 1938581Ssteve.reinhardt@amd.com dump(_dump), reset(_reset), repeat(_repeat) 1944078Sbinkertn@umich.edu { 1954078Sbinkertn@umich.edu } 1964078Sbinkertn@umich.edu 1974078Sbinkertn@umich.edu virtual void 1984078Sbinkertn@umich.edu process() 1994078Sbinkertn@umich.edu { 2004078Sbinkertn@umich.edu if (dump) 2014078Sbinkertn@umich.edu Stats::dump(); 2024078Sbinkertn@umich.edu 2034078Sbinkertn@umich.edu if (reset) 2044078Sbinkertn@umich.edu Stats::reset(); 2054078Sbinkertn@umich.edu 2065606Snate@binkert.org if (repeat) { 2077823Ssteve.reinhardt@amd.com Stats::schedStatEvent(dump, reset, curTick() + repeat, repeat); 2085606Snate@binkert.org } 2094078Sbinkertn@umich.edu } 210695SN/A}; 211695SN/A 2124078Sbinkertn@umich.eduvoid 2137822Ssteve.reinhardt@amd.comschedStatEvent(bool dump, bool reset, Tick when, Tick repeat) 214695SN/A{ 2157822Ssteve.reinhardt@amd.com Event *event = new StatEvent(dump, reset, repeat); 2165606Snate@binkert.org mainEventQueue.schedule(event, when); 217695SN/A} 218695SN/A 2197811Ssteve.reinhardt@amd.com} // namespace Stats 220