sim_object.hh revision 10023:91faf6649de0
17090SN/A/* 27090SN/A * Copyright (c) 2001-2005 The Regents of The University of Michigan 37090SN/A * Copyright (c) 2010 Advanced Micro Devices, Inc. 47090SN/A * All rights reserved. 57090SN/A * 67090SN/A * Redistribution and use in source and binary forms, with or without 77090SN/A * modification, are permitted provided that the following conditions are 87090SN/A * met: redistributions of source code must retain the above copyright 97090SN/A * notice, this list of conditions and the following disclaimer; 107090SN/A * redistributions in binary form must reproduce the above copyright 117090SN/A * notice, this list of conditions and the following disclaimer in the 127090SN/A * documentation and/or other materials provided with the distribution; 134486SN/A * neither the name of the copyright holders nor the names of its 144486SN/A * contributors may be used to endorse or promote products derived from 154486SN/A * this software without specific prior written permission. 164486SN/A * 174486SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 184486SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 194486SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 204486SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 214486SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 224486SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 234486SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 244486SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 254486SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 264486SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 274486SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 284486SN/A * 294486SN/A * Authors: Steve Reinhardt 304486SN/A * Nathan Binkert 314486SN/A */ 324486SN/A 334486SN/A/* @file 344486SN/A * User Console Definitions 354486SN/A */ 364486SN/A 374486SN/A#ifndef __SIM_OBJECT_HH__ 384486SN/A#define __SIM_OBJECT_HH__ 397584SAli.Saidi@arm.com 407584SAli.Saidi@arm.com#include <iostream> 417754SWilliam.Wang@arm.com#include <list> 424486SN/A#include <map> 433630SN/A#include <string> 443630SN/A#include <vector> 457587SAli.Saidi@arm.com 468212SAli.Saidi@ARM.com#include "enums/MemoryMode.hh" 475478SN/A#include "params/SimObject.hh" 485478SN/A#include "sim/drain.hh" 497584SAli.Saidi@arm.com#include "sim/eventq_impl.hh" 503630SN/A#include "sim/serialize.hh" 517584SAli.Saidi@arm.com 527584SAli.Saidi@arm.comclass BaseCPU; 537584SAli.Saidi@arm.comclass Event; 547584SAli.Saidi@arm.comclass ProbeManager; 553898SN/A/** 567950SAli.Saidi@ARM.com * Abstract superclass for simulation objects. Represents things that 577950SAli.Saidi@ARM.com * correspond to physical components and can be specified via the 587950SAli.Saidi@ARM.com * config file (CPUs, caches, etc.). 597950SAli.Saidi@ARM.com * 607950SAli.Saidi@ARM.com * SimObject initialization is controlled by the instantiate method in 617950SAli.Saidi@ARM.com * src/python/m5/simulate.py. There are slightly different 627950SAli.Saidi@ARM.com * initialization paths when starting the simulation afresh and when 637950SAli.Saidi@ARM.com * loading from a checkpoint. After instantiation and connecting 647587SAli.Saidi@arm.com * ports, simulate.py initializes the object using the following call 657587SAli.Saidi@arm.com * sequence: 667587SAli.Saidi@arm.com * 677753SWilliam.Wang@arm.com * <ol> 687753SWilliam.Wang@arm.com * <li>SimObject::init() 697753SWilliam.Wang@arm.com * <li>SimObject::regStats() 707753SWilliam.Wang@arm.com * <li><ul> 717587SAli.Saidi@arm.com * <li>SimObject::initState() if starting afresh. 727587SAli.Saidi@arm.com * <li>SimObject::loadState() if restoring from a checkpoint. 738282SAli.Saidi@ARM.com * </ul> 748282SAli.Saidi@ARM.com * <li>SimObject::resetStats() 758282SAli.Saidi@ARM.com * <li>SimObject::startup() 767584SAli.Saidi@arm.com * <li>Drainable::drainResume() if resuming from a checkpoint. 777584SAli.Saidi@arm.com * </ol> 788524SAli.Saidi@ARM.com * 798524SAli.Saidi@ARM.com * @note Whenever a method is called on all objects in the simulator's 808299Schander.sudanthi@arm.com * object tree (e.g., init(), startup(), or loadState()), a pre-order 817584SAli.Saidi@arm.com * depth-first traversal is performed (see descendants() in 827584SAli.Saidi@arm.com * SimObject.py). This has the effect of calling the method on the 837584SAli.Saidi@arm.com * parent node <i>before</i> its children. 847584SAli.Saidi@arm.com */ 857584SAli.Saidi@arm.comclass SimObject : public EventManager, public Serializable, public Drainable 867584SAli.Saidi@arm.com{ 878283SPrakash.Ramrakhyani@arm.com private: 888283SPrakash.Ramrakhyani@arm.com typedef std::vector<SimObject *> SimObjectList; 897584SAli.Saidi@arm.com 907584SAli.Saidi@arm.com /** List of all instantiated simulation objects. */ 917584SAli.Saidi@arm.com static SimObjectList simObjectList; 927584SAli.Saidi@arm.com 937584SAli.Saidi@arm.com /** Manager coordinates hooking up probe points with listeners. */ 947584SAli.Saidi@arm.com ProbeManager *probeManager; 957584SAli.Saidi@arm.com 967584SAli.Saidi@arm.com protected: 977584SAli.Saidi@arm.com /** Cached copy of the object parameters. */ 987584SAli.Saidi@arm.com const SimObjectParams *_params; 997584SAli.Saidi@arm.com 1007584SAli.Saidi@arm.com public: 1017584SAli.Saidi@arm.com typedef SimObjectParams Params; 1027584SAli.Saidi@arm.com const Params *params() const { return _params; } 1037584SAli.Saidi@arm.com SimObject(const Params *_params); 1047584SAli.Saidi@arm.com virtual ~SimObject() {} 1057584SAli.Saidi@arm.com 1067584SAli.Saidi@arm.com public: 1077584SAli.Saidi@arm.com 1087584SAli.Saidi@arm.com virtual const std::string name() const { return params()->name; } 1097584SAli.Saidi@arm.com 1107584SAli.Saidi@arm.com /** 1117584SAli.Saidi@arm.com * init() is called after all C++ SimObjects have been created and 1128512Sgeoffrey.blake@arm.com * all ports are connected. Initializations that are independent 1138512Sgeoffrey.blake@arm.com * of unserialization but rely on a fully instantiated and 1148512Sgeoffrey.blake@arm.com * connected SimObject graph should be done here. 1158512Sgeoffrey.blake@arm.com */ 1168512Sgeoffrey.blake@arm.com virtual void init(); 1178512Sgeoffrey.blake@arm.com 1188512Sgeoffrey.blake@arm.com /** 1197950SAli.Saidi@ARM.com * loadState() is called on each SimObject when restoring from a 1207754SWilliam.Wang@arm.com * checkpoint. The default implementation simply calls 1217950SAli.Saidi@ARM.com * unserialize() if there is a corresponding section in the 1227950SAli.Saidi@ARM.com * checkpoint. However, objects can override loadState() to get 1237950SAli.Saidi@ARM.com * other behaviors, e.g., doing other programmed initializations 1247754SWilliam.Wang@arm.com * after unserialize(), or complaining if no checkpoint section is 1257754SWilliam.Wang@arm.com * found. 1267753SWilliam.Wang@arm.com * 1277753SWilliam.Wang@arm.com * @param cp Checkpoint to restore the state from. 1287753SWilliam.Wang@arm.com */ 1297950SAli.Saidi@ARM.com virtual void loadState(Checkpoint *cp); 1307753SWilliam.Wang@arm.com 1317753SWilliam.Wang@arm.com /** 1327584SAli.Saidi@arm.com * initState() is called on each SimObject when *not* restoring 1337584SAli.Saidi@arm.com * from a checkpoint. This provides a hook for state 1343630SN/A * initializations that are only required for a "cold start". 1353630SN/A */ 1367753SWilliam.Wang@arm.com virtual void initState(); 1377753SWilliam.Wang@arm.com 1387753SWilliam.Wang@arm.com /** 1397584SAli.Saidi@arm.com * Register statistics for this object. 1407584SAli.Saidi@arm.com */ 1417584SAli.Saidi@arm.com virtual void regStats(); 1427584SAli.Saidi@arm.com 1437584SAli.Saidi@arm.com /** 1447584SAli.Saidi@arm.com * Reset statistics associated with this object. 1458512Sgeoffrey.blake@arm.com */ 1467753SWilliam.Wang@arm.com virtual void resetStats(); 1477754SWilliam.Wang@arm.com 1487950SAli.Saidi@ARM.com /** 1498282SAli.Saidi@ARM.com * Register probe points for this object. 1508212SAli.Saidi@ARM.com */ 1518212SAli.Saidi@ARM.com virtual void regProbePoints(); 1528212SAli.Saidi@ARM.com 1538212SAli.Saidi@ARM.com /** 1548212SAli.Saidi@ARM.com * Register probe listeners for this object. 1558212SAli.Saidi@ARM.com */ 1567584SAli.Saidi@arm.com virtual void regProbeListeners(); 1577731SAli.Saidi@ARM.com 1588461SAli.Saidi@ARM.com /** 1598461SAli.Saidi@ARM.com * Get the probe manager for this object. 1607696SAli.Saidi@ARM.com */ 1617696SAli.Saidi@ARM.com ProbeManager *getProbeManager(); 1627696SAli.Saidi@ARM.com 1637696SAli.Saidi@ARM.com /** 1647696SAli.Saidi@ARM.com * startup() is the final initialization call before simulation. 1657696SAli.Saidi@ARM.com * All state is initialized (including unserialized state, if any, 1667696SAli.Saidi@ARM.com * such as the curTick() value), so this is the appropriate place to 1677696SAli.Saidi@ARM.com * schedule initial event(s) for objects that need them. 1687696SAli.Saidi@ARM.com */ 1697696SAli.Saidi@ARM.com virtual void startup(); 1707696SAli.Saidi@ARM.com 1717696SAli.Saidi@ARM.com /** 1727696SAli.Saidi@ARM.com * Provide a default implementation of the drain interface that 1737696SAli.Saidi@ARM.com * simply returns 0 (draining completed) and sets the drain state 1747696SAli.Saidi@ARM.com * to Drained. 1757696SAli.Saidi@ARM.com */ 1767696SAli.Saidi@ARM.com unsigned int drain(DrainManager *drainManger); 1777696SAli.Saidi@ARM.com 1787696SAli.Saidi@ARM.com /** 1797696SAli.Saidi@ARM.com * Serialize all SimObjects in the system. 1807696SAli.Saidi@ARM.com */ 1818282SAli.Saidi@ARM.com static void serializeAll(std::ostream &os); 1828512Sgeoffrey.blake@arm.com 1837696SAli.Saidi@ARM.com#ifdef DEBUG 1847696SAli.Saidi@ARM.com public: 1857696SAli.Saidi@ARM.com bool doDebugBreak; 1867696SAli.Saidi@ARM.com static void debugObjectBreak(const std::string &objs); 1877696SAli.Saidi@ARM.com#endif 1887696SAli.Saidi@ARM.com 1897696SAli.Saidi@ARM.com /** 1907696SAli.Saidi@ARM.com * Find the SimObject with the given name and return a pointer to 1917696SAli.Saidi@ARM.com * it. Primarily used for interactive debugging. Argument is 1927753SWilliam.Wang@arm.com * char* rather than std::string to make it callable from gdb. 1937754SWilliam.Wang@arm.com */ 1947754SWilliam.Wang@arm.com static SimObject *find(const char *name); 1958212SAli.Saidi@ARM.com}; 1967696SAli.Saidi@ARM.com 1977696SAli.Saidi@ARM.com#ifdef DEBUG 1987696SAli.Saidi@ARM.comvoid debugObjectBreak(const char *objs); 1997696SAli.Saidi@ARM.com#endif 2007696SAli.Saidi@ARM.com 2017696SAli.Saidi@ARM.com#endif // __SIM_OBJECT_HH__ 2027696SAli.Saidi@ARM.com