Merge ktlim@zizzer:/bk/m5
[gem5.git] / src / sim / sim_object.cc
1 /*
2 * Copyright (c) 2001-2005 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 #include <assert.h>
30
31 #include "base/callback.hh"
32 #include "base/inifile.hh"
33 #include "base/match.hh"
34 #include "base/misc.hh"
35 #include "base/trace.hh"
36 #include "base/stats/events.hh"
37 #include "base/serializer.hh"
38 #include "sim/configfile.hh"
39 #include "sim/host.hh"
40 #include "sim/sim_object.hh"
41 #include "sim/stats.hh"
42 #include "sim/param.hh"
43
44 using namespace std;
45
46
47 ////////////////////////////////////////////////////////////////////////
48 //
49 // SimObject member definitions
50 //
51 ////////////////////////////////////////////////////////////////////////
52
53 //
54 // static list of all SimObjects, used for initialization etc.
55 //
56 SimObject::SimObjectList SimObject::simObjectList;
57
58 namespace Stats {
59 extern ObjectMatch event_ignore;
60 }
61
62 //
63 // SimObject constructor: used to maintain static simObjectList
64 //
65 SimObject::SimObject(Params *p)
66 : _params(p)
67 {
68 #ifdef DEBUG
69 doDebugBreak = false;
70 #endif
71
72 doRecordEvent = !Stats::event_ignore.match(name());
73 simObjectList.push_back(this);
74 }
75
76 //
77 // SimObject constructor: used to maintain static simObjectList
78 //
79 SimObject::SimObject(const string &_name)
80 : _params(new Params)
81 {
82 _params->name = _name;
83 #ifdef DEBUG
84 doDebugBreak = false;
85 #endif
86
87 doRecordEvent = !Stats::event_ignore.match(name());
88 simObjectList.push_back(this);
89 }
90
91 void
92 SimObject::connect()
93 {
94 }
95
96 void
97 SimObject::init()
98 {
99 }
100
101 //
102 // no default statistics, so nothing to do in base implementation
103 //
104 void
105 SimObject::regStats()
106 {
107 }
108
109 void
110 SimObject::regFormulas()
111 {
112 }
113
114 void
115 SimObject::resetStats()
116 {
117 }
118
119 //
120 // static function:
121 // call regStats() on all SimObjects and then regFormulas() on all
122 // SimObjects.
123 //
124 struct SimObjectResetCB : public Callback
125 {
126 virtual void process() { SimObject::resetAllStats(); }
127 };
128
129 namespace {
130 static SimObjectResetCB StatResetCB;
131 }
132
133 void
134 SimObject::regAllStats()
135 {
136 SimObjectList::iterator i;
137 SimObjectList::iterator end = simObjectList.end();
138
139 /**
140 * @todo change cprintfs to DPRINTFs
141 */
142 for (i = simObjectList.begin(); i != end; ++i) {
143 #ifdef STAT_DEBUG
144 cprintf("registering stats for %s\n", (*i)->name());
145 #endif
146 (*i)->regStats();
147 }
148
149 for (i = simObjectList.begin(); i != end; ++i) {
150 #ifdef STAT_DEBUG
151 cprintf("registering formulas for %s\n", (*i)->name());
152 #endif
153 (*i)->regFormulas();
154 }
155
156 Stats::registerResetCallback(&StatResetCB);
157 }
158
159 //
160 // static function: call connect() on all SimObjects.
161 //
162 void
163 SimObject::connectAll()
164 {
165 SimObjectList::iterator i = simObjectList.begin();
166 SimObjectList::iterator end = simObjectList.end();
167
168 for (; i != end; ++i) {
169 SimObject *obj = *i;
170 obj->connect();
171 }
172 }
173
174 //
175 // static function: call init() on all SimObjects.
176 //
177 void
178 SimObject::initAll()
179 {
180 SimObjectList::iterator i = simObjectList.begin();
181 SimObjectList::iterator end = simObjectList.end();
182
183 for (; i != end; ++i) {
184 SimObject *obj = *i;
185 obj->init();
186 }
187 }
188
189 //
190 // static function: call resetStats() on all SimObjects.
191 //
192 void
193 SimObject::resetAllStats()
194 {
195 SimObjectList::iterator i = simObjectList.begin();
196 SimObjectList::iterator end = simObjectList.end();
197
198 for (; i != end; ++i) {
199 SimObject *obj = *i;
200 obj->resetStats();
201 }
202 }
203
204 //
205 // static function: serialize all SimObjects.
206 //
207 void
208 SimObject::serializeAll(ostream &os)
209 {
210 SimObjectList::reverse_iterator ri = simObjectList.rbegin();
211 SimObjectList::reverse_iterator rend = simObjectList.rend();
212
213 for (; ri != rend; ++ri) {
214 SimObject *obj = *ri;
215 obj->nameOut(os);
216 obj->serialize(os);
217 }
218 }
219
220 #ifdef DEBUG
221 //
222 // static function: flag which objects should have the debugger break
223 //
224 void
225 SimObject::debugObjectBreak(const string &objs)
226 {
227 SimObjectList::const_iterator i = simObjectList.begin();
228 SimObjectList::const_iterator end = simObjectList.end();
229
230 ObjectMatch match(objs);
231 for (; i != end; ++i) {
232 SimObject *obj = *i;
233 obj->doDebugBreak = match.match(obj->name());
234 }
235 }
236
237 extern "C"
238 void
239 debugObjectBreak(const char *objs)
240 {
241 SimObject::debugObjectBreak(string(objs));
242 }
243 #endif
244
245 void
246 SimObject::recordEvent(const std::string &stat)
247 {
248 if (doRecordEvent)
249 Stats::recordEvent(stat);
250 }
251
252 void
253 SimObject::drain(Serializer *serializer)
254 {
255 serializer->signalDrained();
256 }
257
258 DEFINE_SIM_OBJECT_CLASS_NAME("SimObject", SimObject)