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: + * + *
    + *
  1. SimObject::init() + *
  2. SimObject::regStats() + *
  3. + *
  4. SimObject::resetStats() + *
  5. SimObject::startup() + *
  6. 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__