X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fsim%2Fsim_object.hh;h=9bf95d07f473dd76f2c0ea3ec22bcbb67fd045c3;hb=da0c770943a26cd258fcd9bf608e1c78ff8e6be5;hp=4388ff584b5aecb9ad1294fd6d058974b79f802c;hpb=ea8b347dc5d375572d8d19770024ec8be5fd5017;p=gem5.git
diff --git a/src/sim/sim_object.hh b/src/sim/sim_object.hh
index 4388ff584..9bf95d07f 100644
--- a/src/sim/sim_object.hh
+++ b/src/sim/sim_object.hh
@@ -45,59 +45,68 @@
#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:
+ *
+ *
+ * - SimObject::init()
+ *
- SimObject::regStats()
+ *
+ * - SimObject::initState() if starting afresh.
+ *
- SimObject::loadState() if restoring from a checkpoint.
+ *
+ * - SimObject::resetStats()
+ *
- SimObject::startup()
+ *
- Drainable::drainResume() if resuming from a checkpoint.
+ *
+ *
+ * @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 before 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 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
@@ -114,6 +123,8 @@ class SimObject : public EventManager, public Serializable
* 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);
@@ -124,11 +135,31 @@ class SimObject : public EventManager, public Serializable
*/
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,
@@ -137,19 +168,17 @@ class SimObject : public EventManager, public Serializable
*/
virtual void startup();
- // static: call nameOut() & serialize() on all SimObjects
- static void serializeAll(std::ostream &);
+ /**
+ * 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);
- // 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(Enums::MemoryMode new_mode);
- virtual void switchOut();
- virtual void takeOverFrom(BaseCPU *cpu);
+ /**
+ * Serialize all SimObjects in the system.
+ */
+ static void serializeAll(std::ostream &os);
#ifdef DEBUG
public:
@@ -165,4 +194,8 @@ class SimObject : public EventManager, public Serializable
static SimObject *find(const char *name);
};
+#ifdef DEBUG
+void debugObjectBreak(const char *objs);
+#endif
+
#endif // __SIM_OBJECT_HH__