X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fsim%2Fsim_object.hh;h=995431845c3752fe361d23898c745ee9483676ac;hb=0ed3c84c7b05d7d3c9d5f0e3f1c05c20afef93b9;hp=e0b21782fb6b67dcceb2027bcf5ddf658295f95c;hpb=f64c175f9ae81be3c002a82ea14a2844a7ee100e;p=gem5.git diff --git a/src/sim/sim_object.hh b/src/sim/sim_object.hh index e0b21782f..995431845 100644 --- a/src/sim/sim_object.hh +++ b/src/sim/sim_object.hh @@ -1,5 +1,6 @@ /* * Copyright (c) 2001-2005 The Regents of The University of Michigan + * Copyright (c) 2010 Advanced Micro Devices, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -36,13 +37,15 @@ #ifndef __SIM_OBJECT_HH__ #define __SIM_OBJECT_HH__ -#include +#include #include +#include +#include #include -#include +#include "params/SimObject.hh" +#include "sim/eventq.hh" #include "sim/serialize.hh" -#include "sim/startup.hh" class BaseCPU; class Event; @@ -52,30 +55,22 @@ class Event; * correspond to physical components and can be specified via the * config file (CPUs, caches, etc.). */ -class SimObject : public Serializable, protected StartupCallback +class SimObject : public EventManager, public Serializable { public: - struct Params { - std::string name; - }; - enum State { - Atomic, - Timing, - Quiescing, - QuiescedAtomic, - QuiescedTiming + Running, + Draining, + Drained }; - protected: - Params *_params; + private: State state; + protected: void changeState(State new_state) { state = new_state; } public: - const Params *params() const { return _params; } - State getState() { return state; } private: @@ -84,40 +79,72 @@ class SimObject : public Serializable, protected StartupCallback // list of all instantiated simulation objects static SimObjectList simObjectList; - public: - SimObject(Params *_params); - SimObject(const std::string &_name); + protected: + const SimObjectParams *_params; + public: + typedef SimObjectParams Params; + const Params *params() const { return _params; } + SimObject(const Params *_params); virtual ~SimObject() {} + public: + virtual const std::string name() const { return params()->name; } - // initialization pass of all objects. - // Gets invoked after construction, before unserialize. + // 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 + * of unserialization but rely on a fully instantiated and + * connected SimObject graph should be done here. + */ virtual void init(); - virtual void connect(); - static void initAll(); - static void connectAll(); + + /** + * loadState() is called on each SimObject when restoring from a + * checkpoint. The default implementation simply calls + * unserialize() if there is a corresponding section in the + * checkpoint. However, objects can override loadState() to get + * other behaviors, e.g., doing other programmed initializations + * after unserialize(), or complaining if no checkpoint section is + * found. + */ + virtual void loadState(Checkpoint *cp); + + /** + * initState() is called on each SimObject when *not* restoring + * from a checkpoint. This provides a hook for state + * initializations that are only required for a "cold start". + */ + virtual void initState(); // register statistics for this object virtual void regStats(); virtual void regFormulas(); virtual void resetStats(); - // static: call reg_stats on all SimObjects - static void regAllStats(); - - // static: call resetStats on all SimObjects - static void resetAllStats(); + /** + * 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 + * 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 - // Quiesce returns true if the SimObject cannot quiesce immediately. - virtual bool quiesce(Event *quiesce_event); + // 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(); @@ -129,9 +156,12 @@ class SimObject : public Serializable, protected StartupCallback static void debugObjectBreak(const std::string &objs); #endif - public: - bool doRecordEvent; - void recordEvent(const std::string &stat); + /** + * Find the SimObject with the given name and return a pointer to + * it. Primarily used for interactive debugging. Argument is + * char* rather than std::string to make it callable from gdb. + */ + static SimObject *find(const char *name); }; #endif // __SIM_OBJECT_HH__