#include <string>
#include <vector>
+#include "enums/MemoryMode.hh"
#include "params/SimObject.hh"
-#include "sim/eventq.hh"
+#include "sim/drain.hh"
+#include "sim/eventq_impl.hh"
#include "sim/serialize.hh"
class BaseCPU;
class Event;
-
-/*
+class ProbeManager;
+/**
* Abstract superclass for simulation objects. Represents things that
* correspond to physical components and can be specified via the
* config file (CPUs, caches, etc.).
+ *
+ * SimObject initialization is controlled by the instantiate method in
+ * src/python/m5/simulate.py. There are slightly different
+ * initialization paths when starting the simulation afresh and when
+ * loading from a checkpoint. After instantiation and connecting
+ * ports, simulate.py initializes the object using the following call
+ * sequence:
+ *
+ * <ol>
+ * <li>SimObject::init()
+ * <li>SimObject::regStats()
+ * <li><ul>
+ * <li>SimObject::initState() if starting afresh.
+ * <li>SimObject::loadState() if restoring from a checkpoint.
+ * </ul>
+ * <li>SimObject::resetStats()
+ * <li>SimObject::startup()
+ * <li>Drainable::drainResume() if resuming from a checkpoint.
+ * </ol>
+ *
+ * @note Whenever a method is called on all objects in the simulator's
+ * object tree (e.g., init(), startup(), or loadState()), a pre-order
+ * depth-first traversal is performed (see descendants() in
+ * SimObject.py). This has the effect of calling the method on the
+ * parent node <i>before</i> its children.
*/
-class SimObject : public EventManager, public Serializable
+class SimObject : public EventManager, public Serializable, public Drainable
{
- public:
- enum State {
- Running,
- Draining,
- Drained
- };
-
- private:
- State state;
-
- protected:
- void changeState(State new_state) { state = new_state; }
-
- public:
- State getState() { return state; }
-
private:
typedef std::vector<SimObject *> SimObjectList;
- // list of all instantiated simulation objects
+ /** List of all instantiated simulation objects. */
static SimObjectList simObjectList;
+ /** Manager coordinates hooking up probe points with listeners. */
+ ProbeManager *probeManager;
+
protected:
+ /** Cached copy of the object parameters. */
const SimObjectParams *_params;
public:
typedef SimObjectParams Params;
const Params *params() const { return _params; }
SimObject(const Params *_params);
- virtual ~SimObject() {}
+ virtual ~SimObject();
public:
virtual const std::string name() const { return params()->name; }
- // The following SimObject initialization methods are called from
- // the instantiate() method in src/python/m5/simulate.py. See
- // that function for details on how/when these methods are
- // invoked.
-
/**
* init() is called after all C++ SimObjects have been created and
* all ports are connected. Initializations that are independent
* other behaviors, e.g., doing other programmed initializations
* after unserialize(), or complaining if no checkpoint section is
* found.
+ *
+ * @param cp Checkpoint to restore the state from.
*/
virtual void loadState(Checkpoint *cp);
*/
virtual void initState();
- // register statistics for this object
+ /**
+ * Register statistics for this object.
+ */
virtual void regStats();
- virtual void regFormulas();
+
+ /**
+ * Reset statistics associated with this object.
+ */
virtual void resetStats();
+ /**
+ * Register probe points for this object.
+ */
+ virtual void regProbePoints();
+
+ /**
+ * Register probe listeners for this object.
+ */
+ virtual void regProbeListeners();
+
+ /**
+ * Get the probe manager for this object.
+ */
+ ProbeManager *getProbeManager();
+
/**
* startup() is the final initialization call before simulation.
* All state is initialized (including unserialized state, if any,
- * such as the curTick value), so this is the appropriate place to
+ * such as the curTick() value), so this is the appropriate place to
* schedule initial event(s) for objects that need them.
*/
virtual void startup();
- // static: call nameOut() & serialize() on all SimObjects
- static void serializeAll(std::ostream &);
- static void unserializeAll(Checkpoint *cp);
-
- // Methods to drain objects in order to take checkpoints
- // Or switch from timing -> atomic memory model
- // Drain returns 0 if the simobject can drain immediately or
- // the number of times the drain_event's process function will be called
- // before the object will be done draining. Normally this should be 1
- virtual unsigned int drain(Event *drain_event);
- virtual void resume();
- virtual void setMemoryMode(State new_mode);
- virtual void switchOut();
- virtual void takeOverFrom(BaseCPU *cpu);
+ /**
+ * Provide a default implementation of the drain interface that
+ * simply returns 0 (draining completed) and sets the drain state
+ * to Drained.
+ */
+ unsigned int drain(DrainManager *drainManger);
+
+ /**
+ * Serialize all SimObjects in the system.
+ */
+ static void serializeAll(std::ostream &os);
#ifdef DEBUG
public:
static SimObject *find(const char *name);
};
+#ifdef DEBUG
+void debugObjectBreak(const char *objs);
+#endif
+
#endif // __SIM_OBJECT_HH__