sim_object.cc revision 2499
18914Sandreas.hansson@arm.com/*
210713Sandreas.hansson@arm.com * Copyright (c) 2001-2005 The Regents of The University of Michigan
38914Sandreas.hansson@arm.com * All rights reserved.
48914Sandreas.hansson@arm.com *
58914Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
68914Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are
78914Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
88914Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
98914Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
108914Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
118914Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
128914Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its
138914Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from
148914Sandreas.hansson@arm.com * this software without specific prior written permission.
158914Sandreas.hansson@arm.com *
168914Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
178914Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
188914Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
198914Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
208914Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
218914Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
228914Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
238914Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
248914Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258914Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
268914Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278914Sandreas.hansson@arm.com */
288914Sandreas.hansson@arm.com
298914Sandreas.hansson@arm.com#include <assert.h>
308914Sandreas.hansson@arm.com
318914Sandreas.hansson@arm.com#include "base/callback.hh"
328914Sandreas.hansson@arm.com#include "base/inifile.hh"
338914Sandreas.hansson@arm.com#include "base/match.hh"
348914Sandreas.hansson@arm.com#include "base/misc.hh"
358914Sandreas.hansson@arm.com#include "base/trace.hh"
368914Sandreas.hansson@arm.com#include "base/stats/events.hh"
378914Sandreas.hansson@arm.com#include "sim/configfile.hh"
388914Sandreas.hansson@arm.com#include "sim/host.hh"
398914Sandreas.hansson@arm.com#include "sim/sim_object.hh"
408914Sandreas.hansson@arm.com#include "sim/stats.hh"
418914Sandreas.hansson@arm.com#include "sim/param.hh"
428914Sandreas.hansson@arm.com
438914Sandreas.hansson@arm.comusing namespace std;
448914Sandreas.hansson@arm.com
458914Sandreas.hansson@arm.com
468914Sandreas.hansson@arm.com////////////////////////////////////////////////////////////////////////
478914Sandreas.hansson@arm.com//
488914Sandreas.hansson@arm.com// SimObject member definitions
498914Sandreas.hansson@arm.com//
508914Sandreas.hansson@arm.com////////////////////////////////////////////////////////////////////////
518914Sandreas.hansson@arm.com
528914Sandreas.hansson@arm.com//
538914Sandreas.hansson@arm.com// static list of all SimObjects, used for initialization etc.
548914Sandreas.hansson@arm.com//
558914Sandreas.hansson@arm.comSimObject::SimObjectList SimObject::simObjectList;
568914Sandreas.hansson@arm.com
578914Sandreas.hansson@arm.comnamespace Stats {
588914Sandreas.hansson@arm.com    extern ObjectMatch event_ignore;
598922Swilliam.wang@arm.com}
608914Sandreas.hansson@arm.com
618914Sandreas.hansson@arm.com//
628914Sandreas.hansson@arm.com// SimObject constructor: used to maintain static simObjectList
638914Sandreas.hansson@arm.com//
6410713Sandreas.hansson@arm.comSimObject::SimObject(Params *p)
6510713Sandreas.hansson@arm.com    : _params(p)
668914Sandreas.hansson@arm.com{
6710713Sandreas.hansson@arm.com#ifdef DEBUG
688914Sandreas.hansson@arm.com    doDebugBreak = false;
698922Swilliam.wang@arm.com#endif
708922Swilliam.wang@arm.com
718922Swilliam.wang@arm.com    doRecordEvent = !Stats::event_ignore.match(name());
728922Swilliam.wang@arm.com    simObjectList.push_back(this);
738922Swilliam.wang@arm.com}
748922Swilliam.wang@arm.com
758922Swilliam.wang@arm.com//
768922Swilliam.wang@arm.com// SimObject constructor: used to maintain static simObjectList
778922Swilliam.wang@arm.com//
788922Swilliam.wang@arm.comSimObject::SimObject(const string &_name)
7910713Sandreas.hansson@arm.com    : _params(new Params)
8010713Sandreas.hansson@arm.com{
818922Swilliam.wang@arm.com    _params->name = _name;
828922Swilliam.wang@arm.com#ifdef DEBUG
838922Swilliam.wang@arm.com    doDebugBreak = false;
848922Swilliam.wang@arm.com#endif
859163Sandreas.hansson@arm.com
869163Sandreas.hansson@arm.com    doRecordEvent = !Stats::event_ignore.match(name());
879163Sandreas.hansson@arm.com    simObjectList.push_back(this);
889163Sandreas.hansson@arm.com}
899163Sandreas.hansson@arm.com
909163Sandreas.hansson@arm.comvoid
919163Sandreas.hansson@arm.comSimObject::connect()
9210713Sandreas.hansson@arm.com{
939163Sandreas.hansson@arm.com}
948922Swilliam.wang@arm.com
958922Swilliam.wang@arm.comvoid
9610713Sandreas.hansson@arm.comSimObject::init()
9710713Sandreas.hansson@arm.com{
988922Swilliam.wang@arm.com}
9910713Sandreas.hansson@arm.com
1008922Swilliam.wang@arm.com//
1018922Swilliam.wang@arm.com// no default statistics, so nothing to do in base implementation
10210713Sandreas.hansson@arm.com//
10310713Sandreas.hansson@arm.comvoid
10410713Sandreas.hansson@arm.comSimObject::regStats()
10510713Sandreas.hansson@arm.com{
10610713Sandreas.hansson@arm.com}
10710713Sandreas.hansson@arm.com
10810713Sandreas.hansson@arm.comvoid
1098922Swilliam.wang@arm.comSimObject::regFormulas()
1108922Swilliam.wang@arm.com{
1118922Swilliam.wang@arm.com}
1128922Swilliam.wang@arm.com
1138922Swilliam.wang@arm.comvoid
11410713Sandreas.hansson@arm.comSimObject::resetStats()
11510713Sandreas.hansson@arm.com{
1168922Swilliam.wang@arm.com}
11710713Sandreas.hansson@arm.com
11810713Sandreas.hansson@arm.com//
11910713Sandreas.hansson@arm.com// static function:
12010713Sandreas.hansson@arm.com//   call regStats() on all SimObjects and then regFormulas() on all
12110713Sandreas.hansson@arm.com//   SimObjects.
12210713Sandreas.hansson@arm.com//
1238914Sandreas.hansson@arm.comstruct SimObjectResetCB : public Callback
1248914Sandreas.hansson@arm.com{
1258914Sandreas.hansson@arm.com    virtual void process() { SimObject::resetAllStats(); }
1268914Sandreas.hansson@arm.com};
1278914Sandreas.hansson@arm.com
12810713Sandreas.hansson@arm.comnamespace {
12910713Sandreas.hansson@arm.com    static SimObjectResetCB StatResetCB;
1308914Sandreas.hansson@arm.com}
1318914Sandreas.hansson@arm.com
1328914Sandreas.hansson@arm.comvoid
1338922Swilliam.wang@arm.comSimObject::regAllStats()
13410713Sandreas.hansson@arm.com{
13510713Sandreas.hansson@arm.com    SimObjectList::iterator i;
13610713Sandreas.hansson@arm.com    SimObjectList::iterator end = simObjectList.end();
13710713Sandreas.hansson@arm.com
13810713Sandreas.hansson@arm.com    /**
1398914Sandreas.hansson@arm.com     * @todo change cprintfs to DPRINTFs
1408914Sandreas.hansson@arm.com     */
1418922Swilliam.wang@arm.com    for (i = simObjectList.begin(); i != end; ++i) {
1428914Sandreas.hansson@arm.com#ifdef STAT_DEBUG
1439163Sandreas.hansson@arm.com        cprintf("registering stats for %s\n", (*i)->name());
1449163Sandreas.hansson@arm.com#endif
1459163Sandreas.hansson@arm.com        (*i)->regStats();
1469163Sandreas.hansson@arm.com    }
1479163Sandreas.hansson@arm.com
1489163Sandreas.hansson@arm.com    for (i = simObjectList.begin(); i != end; ++i) {
1499163Sandreas.hansson@arm.com#ifdef STAT_DEBUG
15010713Sandreas.hansson@arm.com        cprintf("registering formulas for %s\n", (*i)->name());
1519163Sandreas.hansson@arm.com#endif
1529163Sandreas.hansson@arm.com        (*i)->regFormulas();
1539163Sandreas.hansson@arm.com    }
1549163Sandreas.hansson@arm.com
1559163Sandreas.hansson@arm.com    Stats::registerResetCallback(&StatResetCB);
1569163Sandreas.hansson@arm.com}
1579163Sandreas.hansson@arm.com
15810722Sstephan.diestelhorst@arm.com//
15910722Sstephan.diestelhorst@arm.com// static function: call connect() on all SimObjects.
16010722Sstephan.diestelhorst@arm.com//
1619163Sandreas.hansson@arm.comvoid
1628914Sandreas.hansson@arm.comSimObject::connectAll()
1638914Sandreas.hansson@arm.com{
16410713Sandreas.hansson@arm.com    SimObjectList::iterator i = simObjectList.begin();
16510713Sandreas.hansson@arm.com    SimObjectList::iterator end = simObjectList.end();
16610713Sandreas.hansson@arm.com
16710713Sandreas.hansson@arm.com    for (; i != end; ++i) {
16810713Sandreas.hansson@arm.com        SimObject *obj = *i;
1698914Sandreas.hansson@arm.com        obj->connect();
17010713Sandreas.hansson@arm.com    }
17110713Sandreas.hansson@arm.com}
1728914Sandreas.hansson@arm.com
1738914Sandreas.hansson@arm.com//
1748914Sandreas.hansson@arm.com// static function: call init() on all SimObjects.
175//
176void
177SimObject::initAll()
178{
179    SimObjectList::iterator i = simObjectList.begin();
180    SimObjectList::iterator end = simObjectList.end();
181
182    for (; i != end; ++i) {
183        SimObject *obj = *i;
184        obj->init();
185    }
186}
187
188//
189// static function: call resetStats() on all SimObjects.
190//
191void
192SimObject::resetAllStats()
193{
194    SimObjectList::iterator i = simObjectList.begin();
195    SimObjectList::iterator end = simObjectList.end();
196
197    for (; i != end; ++i) {
198        SimObject *obj = *i;
199        obj->resetStats();
200    }
201}
202
203//
204// static function: serialize all SimObjects.
205//
206void
207SimObject::serializeAll(ostream &os)
208{
209    SimObjectList::reverse_iterator ri = simObjectList.rbegin();
210    SimObjectList::reverse_iterator rend = simObjectList.rend();
211
212    for (; ri != rend; ++ri) {
213        SimObject *obj = *ri;
214        obj->nameOut(os);
215        obj->serialize(os);
216   }
217}
218
219#ifdef DEBUG
220//
221// static function: flag which objects should have the debugger break
222//
223void
224SimObject::debugObjectBreak(const string &objs)
225{
226    SimObjectList::const_iterator i = simObjectList.begin();
227    SimObjectList::const_iterator end = simObjectList.end();
228
229    ObjectMatch match(objs);
230    for (; i != end; ++i) {
231        SimObject *obj = *i;
232        obj->doDebugBreak = match.match(obj->name());
233   }
234}
235
236extern "C"
237void
238debugObjectBreak(const char *objs)
239{
240    SimObject::debugObjectBreak(string(objs));
241}
242#endif
243
244void
245SimObject::recordEvent(const std::string &stat)
246{
247    if (doRecordEvent)
248        Stats::recordEvent(stat);
249}
250
251DEFINE_SIM_OBJECT_CLASS_NAME("SimObject", SimObject)
252