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