sim_object.cc revision 695
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#include <assert.h>
30
31#include "base/callback.hh"
32#include "base/inifile.hh"
33#include "base/misc.hh"
34#include "base/trace.hh"
35#include "sim/configfile.hh"
36#include "sim/host.hh"
37#include "sim/sim_object.hh"
38#include "sim/stats.hh"
39
40using namespace std;
41
42
43////////////////////////////////////////////////////////////////////////
44//
45// SimObject member definitions
46//
47////////////////////////////////////////////////////////////////////////
48
49//
50// static list of all SimObjects, used for initialization etc.
51//
52SimObject::SimObjectList SimObject::simObjectList;
53
54//
55// SimObject constructor: used to maintain static simObjectList
56//
57SimObject::SimObject(const string &_name)
58    : objName(_name)
59{
60    simObjectList.push_back(this);
61}
62
63void
64SimObject::init()
65{
66}
67
68//
69// no default statistics, so nothing to do in base implementation
70//
71void
72SimObject::regStats()
73{
74}
75
76void
77SimObject::regFormulas()
78{
79}
80
81void
82SimObject::resetStats()
83{
84}
85
86//
87// static function:
88//   call regStats() on all SimObjects and then regFormulas() on all
89//   SimObjects.
90//
91struct SimObjectResetCB : public Callback
92{
93    virtual void process() { SimObject::resetAllStats(); }
94};
95
96namespace {
97    static SimObjectResetCB StatResetCB;
98}
99
100void
101SimObject::regAllStats()
102{
103    SimObjectList::iterator i;
104    SimObjectList::iterator end = simObjectList.end();
105
106    /**
107     * @todo change cprintfs to DPRINTFs
108     */
109    for (i = simObjectList.begin(); i != end; ++i) {
110#ifdef STAT_DEBUG
111        cprintf("registering stats for %s\n", (*i)->name());
112#endif
113        (*i)->regStats();
114    }
115
116    for (i = simObjectList.begin(); i != end; ++i) {
117#ifdef STAT_DEBUG
118        cprintf("registering formulas for %s\n", (*i)->name());
119#endif
120        (*i)->regFormulas();
121    }
122
123    Statistics::registerResetCallback(&StatResetCB);
124}
125
126//
127// static function: call init() on all SimObjects.
128//
129void
130SimObject::initAll()
131{
132    SimObjectList::iterator i = simObjectList.begin();
133    SimObjectList::iterator end = simObjectList.end();
134
135    for (; i != end; ++i) {
136        SimObject *obj = *i;
137        obj->init();
138    }
139}
140
141//
142// static function: call resetStats() on all SimObjects.
143//
144void
145SimObject::resetAllStats()
146{
147    SimObjectList::iterator i = simObjectList.begin();
148    SimObjectList::iterator end = simObjectList.end();
149
150    for (; i != end; ++i) {
151        SimObject *obj = *i;
152        obj->resetStats();
153    }
154}
155
156//
157// static function: serialize all SimObjects.
158//
159void
160SimObject::serializeAll(ostream &os)
161{
162    SimObjectList::reverse_iterator ri = simObjectList.rbegin();
163    SimObjectList::reverse_iterator rend = simObjectList.rend();
164
165    for (; ri != rend; ++ri) {
166        SimObject *obj = *ri;
167        obj->nameOut(os);
168        obj->serialize(os);
169   }
170}
171