merge m5 with linux for the event and binning lifting
[gem5.git] / sim / stat_control.cc
1 /*
2 * Copyright (c) 2003 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;
9 * redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution;
12 * neither the name of the copyright holders nor the names of its
13 * contributors may be used to endorse or promote products derived from
14 * this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 // This file will contain default statistics for the simulator that
30 // don't really belong to a specific simulator object
31
32 #include <fstream>
33 #include <iostream>
34 #include <list>
35
36 #include "base/callback.hh"
37 #include "base/hostinfo.hh"
38 #include "base/statistics.hh"
39 #include "base/str.hh"
40 #include "base/time.hh"
41 #include "base/stats/output.hh"
42 #include "cpu/base_cpu.hh"
43 #include "sim/eventq.hh"
44 #include "sim/sim_object.hh"
45 #include "sim/stat_control.hh"
46 #include "sim/universe.hh"
47
48 using namespace std;
49
50 Statistics::Formula hostInstRate;
51 Statistics::Formula hostTickRate;
52 Statistics::Value hostMemory;
53 Statistics::Value hostSeconds;
54
55 Statistics::Value simTicks;
56 Statistics::Value simInsts;
57 Statistics::Value simFreq;
58 Statistics::Formula simSeconds;
59
60 namespace Statistics {
61
62 Time statTime(true);
63 Tick startTick;
64
65 class SimTicksReset : public Callback
66 {
67 public:
68 void process()
69 {
70 statTime.set();
71 startTick = curTick;
72 }
73 };
74
75 double
76 statElapsedTime()
77 {
78 Time now(true);
79 Time elapsed = now - statTime;
80 return elapsed();
81 }
82
83 SimTicksReset simTicksReset;
84
85 void
86 InitSimStats()
87 {
88 simInsts
89 .functor(BaseCPU::numSimulatedInstructions)
90 .name("sim_insts")
91 .desc("Number of instructions simulated")
92 .precision(0)
93 .prereq(simInsts)
94 ;
95
96 simSeconds
97 .name("sim_seconds")
98 .desc("Number of seconds simulated")
99 ;
100
101 simFreq
102 .scalar(ticksPerSecond)
103 .name("sim_freq")
104 .desc("Frequency of simulated ticks")
105 ;
106
107 simTicks
108 .scalar(curTick)
109 .name("sim_ticks")
110 .desc("Number of ticks simulated")
111 ;
112
113 hostInstRate
114 .name("host_inst_rate")
115 .desc("Simulator instruction rate (inst/s)")
116 .precision(0)
117 .prereq(simInsts)
118 ;
119
120 hostMemory
121 .functor(memUsage)
122 .name("host_mem_usage")
123 .desc("Number of bytes of host memory used")
124 .prereq(hostMemory)
125 ;
126
127 hostSeconds
128 .functor(statElapsedTime)
129 .name("host_seconds")
130 .desc("Real time elapsed on the host")
131 .precision(2)
132 ;
133
134 hostTickRate
135 .name("host_tick_rate")
136 .desc("Simulator tick rate (ticks/s)")
137 .precision(0)
138 ;
139
140 simSeconds = simTicks / simFreq;
141 hostInstRate = simInsts / hostSeconds;
142 hostTickRate = simTicks / hostSeconds;
143
144 registerResetCallback(&simTicksReset);
145 }
146
147 class StatEvent : public Event
148 {
149 protected:
150 int flags;
151 Tick repeat;
152
153 public:
154 StatEvent(int _flags, Tick _when, Tick _repeat);
155 virtual void process();
156 virtual const char *description();
157 };
158
159 StatEvent::StatEvent(int _flags, Tick _when, Tick _repeat)
160 : Event(&mainEventQueue, Stat_Event_Pri),
161 flags(_flags), repeat(_repeat)
162 {
163 setFlags(AutoDelete);
164 schedule(_when);
165 }
166
167 const char *
168 StatEvent::description()
169 {
170 return "Statistics dump and/or reset";
171 }
172
173 void
174 StatEvent::process()
175 {
176 if (flags & Statistics::Dump)
177 DumpNow();
178
179 if (flags & Statistics::Reset)
180 reset();
181
182 if (repeat)
183 schedule(curTick + repeat);
184 }
185
186 list<Output *> OutputList;
187
188 void
189 DumpNow()
190 {
191 list<Output *>::iterator i = OutputList.begin();
192 list<Output *>::iterator end = OutputList.end();
193 for (; i != end; ++i) {
194 Output *output = *i;
195 if (!output->valid())
196 continue;
197
198 output->output();
199 }
200 }
201
202 void
203 SetupEvent(int flags, Tick when, Tick repeat)
204 {
205 new StatEvent(flags, when, repeat);
206 }
207
208 /* namespace Statistics */ }
209
210 extern "C" void
211 debugDumpStats()
212 {
213 Statistics::DumpNow();
214 }
215