Hand merge
[gem5.git] / sim / sim_object.hh
index 141b58e0a18f24dafd41660c03feb0aca0242a6b..db8d4f4d3834eecaf0b692724ebef0796d2643ad 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003 The Regents of The University of Michigan
+ * Copyright (c) 2001-2004 The Regents of The University of Michigan
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #include <vector>
 #include <iostream>
 
-#include "param.hh"
-#include "serialize.hh"
+#include "sim/serialize.hh"
+#include "sim/startup.hh"
 
 /*
  * Abstract superclass for simulation objects.  Represents things that
  * correspond to physical components and can be specified via the
  * config file (CPUs, caches, etc.).
  */
-class SimObject : public Serializeable
+class SimObject : public Serializable, protected StartupCallback
 {
+  public:
+    struct Params {
+        std::string name;
+    };
+
+  protected:
+    Params *_params;
+
+  public:
+    const Params *params() const { return _params; }
+
   private:
     friend class Serializer;
 
@@ -57,204 +68,41 @@ class SimObject : public Serializeable
     static SimObjectList simObjectList;
 
   public:
+    SimObject(Params *_params);
     SimObject(const std::string &_name);
 
     virtual ~SimObject() {}
 
+    virtual const std::string name() const { return params()->name; }
+
+    // initialization pass of all objects.
+    // Gets invoked after construction, before unserialize.
+    virtual void init();
+    static void initAll();
+
     // register statistics for this object
     virtual void regStats();
     virtual void regFormulas();
-
-    // print extra results for this object not covered by registered
-    // statistics (called at end of simulation)
-    virtual void printExtraOutput(std::ostream&);
+    virtual void resetStats();
 
     // static: call reg_stats on all SimObjects
     static void regAllStats();
 
-    // static: call printExtraOutput on all SimObjects
-    static void printAllExtraOutput(std::ostream&);
-};
-
-
-//
-// A SimObjectBuilder serves as an evaluation context for a set of
-// parameters that describe a specific instance of a SimObject.  This
-// evaluation context corresponds to a section in the .ini file (as
-// with the base ParamContext) plus an optional node in the
-// configuration hierarchy (the configNode member) for resolving
-// SimObject references.  SimObjectBuilder is an abstract superclass;
-// derived classes specialize the class for particular subclasses of
-// SimObject (e.g., BaseCache).
-//
-// For typical usage, see the definition of
-// SimObjectClass::createObject().
-//
-class SimObjectBuilder : public ParamContext
-{
-  private:
-    // name of the instance we are creating
-    std::string instanceName;
-
-    // The corresponding node in the configuration hierarchy.
-    // (optional: may be null if the created object is not in the
-    // hierarchy)
-    ConfigNode *configNode;
-
-    // The external SimObject class name (for error messages)
-    std::string simObjClassName;
-
-  public:
-    SimObjectBuilder(const std::string &_configClass,
-                     const std::string &_instanceName,
-                     ConfigNode *_configNode,
-                     const std::string &_simObjClassName)
-        : ParamContext(_configClass, true),
-          instanceName(_instanceName),
-          configNode(_configNode),
-          simObjClassName(_simObjClassName)
-    {
-    }
-
-    virtual ~SimObjectBuilder() {}
-
-    // call parse() on all params in this context to convert string
-    // representations to parameter values
-    virtual void parseParams(IniFile &iniFile);
-
-    // parameter error prolog (override of ParamContext)
-    virtual void printErrorProlog(std::ostream &);
+    // static: call resetStats on all SimObjects
+    static void resetAllStats();
 
-    // generate the name for this SimObject instance (derived from the
-    // configuration hierarchy node label and position)
-    virtual const std::string &getInstanceName() { return instanceName; }
+    // static: call nameOut() & serialize() on all SimObjects
+    static void serializeAll(std::ostream &);
 
-    // return the configuration hierarchy node for this context.
-    virtual ConfigNode *getConfigNode() { return configNode; }
-
-    // Create the actual SimObject corresponding to the parameter
-    // values in this context.  This function is overridden in derived
-    // classes to call a specific constructor for a particular
-    // subclass of SimObject.
-    virtual SimObject *create() = 0;
-};
-
-
-//
-// Handy macros for initializing parameter members of classes derived
-// from SimObjectBuilder.  Assumes that the name of the parameter
-// member object is the same as the textual parameter name seen by the
-// user.  (Note that '#p' is expanded by the preprocessor to '"p"'.)
-//
-#define INIT_PARAM(p, desc)            p(this, #p, desc)
-#define INIT_PARAM_DFLT(p, desc, dflt) p(this, #p, desc, dflt)
-
-//
-// Initialize an enumeration variable... assumes that 'map' is the
-// name of an array of mappings (char * for SimpleEnumParam, or
-// EnumParamMap for MappedEnumParam).
-//
-#define INIT_ENUM_PARAM(p, desc, map)  \
-        p(this, #p, desc, map, sizeof(map)/sizeof(map[0]))
-#define INIT_ENUM_PARAM_DFLT(p, desc, map, dflt)       \
-        p(this, #p, desc, map, sizeof(map)/sizeof(map[0]), dflt)
-
-//
-// An instance of SimObjectClass corresponds to a class derived from
-// SimObject.  The SimObjectClass instance serves to bind the string
-// name (found in the config file) to a function that creates an
-// instance of the appropriate derived class.
-//
-// This would be much cleaner in Smalltalk or Objective-C, where types
-// are first-class objects themselves.
-//
-class SimObjectClass
-{
+#ifdef DEBUG
   public:
-    // Type CreateFunc is a pointer to a function that creates a new
-    // simulation object builder based on a .ini-file parameter
-    // section (specified by the first string argument), a unique name
-    // for the object (specified by the second string argument), and
-    // an optional config hierarchy node (specified by the third
-    // argument).  A pointer to the new SimObjectBuilder is returned.
-    typedef SimObjectBuilder *(*CreateFunc)(const std::string &configClassName,
-                                            const std::string &objName,
-                                            ConfigNode *configNode,
-                                            const std::string &simObjClassName);
-
-    static std::map<std::string,CreateFunc> *classMap;
-
-    // Constructor.  For example:
-    //
-    // SimObjectClass baseCacheClass("BaseCache", newBaseCacheBuilder);
-    //
-    SimObjectClass(const std::string &className, CreateFunc createFunc);
-
-    // create SimObject given name of class and pointer to
-    // configuration hierarchy node
-    static SimObject *createObject(IniFile &configDB,
-                                   const std::string &configClassName,
-                                   const std::string &objName,
-                                   ConfigNode *configNode);
+    bool doDebugBreak;
+    static void debugObjectBreak(const std::string &objs);
+#endif
 
-    // print descriptions of all parameters registered with all
-    // SimObject classes
-    static void describeAllClasses(std::ostream &os);
-};
-
-//
-// Macros to encapsulate the magic of declaring & defining
-// SimObjectBuilder and SimObjectClass objects
-//
-
-#define BEGIN_DECLARE_SIM_OBJECT_PARAMS(OBJ_CLASS)             \
-class OBJ_CLASS##Builder : public SimObjectBuilder             \
-{                                                              \
   public:
-
-#define END_DECLARE_SIM_OBJECT_PARAMS(OBJ_CLASS)               \
-                                                                \
-    OBJ_CLASS##Builder(const std::string &configClass,         \
-                       const std::string &instanceName,                \
-                       ConfigNode *configNode,                 \
-                       const std::string &simObjClassName);    \
-    virtual ~OBJ_CLASS##Builder() {}                           \
-                                                                \
-    OBJ_CLASS *create();                                       \
+    bool doRecordEvent;
+    void recordEvent(const std::string &stat);
 };
 
-#define BEGIN_INIT_SIM_OBJECT_PARAMS(OBJ_CLASS)                                   \
-OBJ_CLASS##Builder::OBJ_CLASS##Builder(const std::string &configClass,    \
-                                       const std::string &instanceName,           \
-                                       ConfigNode *configNode,            \
-                                       const std::string &simObjClassName) \
-    : SimObjectBuilder(configClass, instanceName,                         \
-                       configNode, simObjClassName),
-
-
-#define END_INIT_SIM_OBJECT_PARAMS(OBJ_CLASS)                  \
-{                                                              \
-}
-
-#define CREATE_SIM_OBJECT(OBJ_CLASS)                           \
-OBJ_CLASS *OBJ_CLASS##Builder::create()
-
-#define REGISTER_SIM_OBJECT(CLASS_NAME, OBJ_CLASS)             \
-SimObjectBuilder *                                             \
-new##OBJ_CLASS##Builder(const std::string &configClass,                \
-                        const std::string &instanceName,       \
-                        ConfigNode *configNode,                        \
-                        const std::string &simObjClassName)    \
-{                                                              \
-    return new OBJ_CLASS##Builder(configClass, instanceName,   \
-                                  configNode, simObjClassName);        \
-}                                                              \
-                                                                \
-SimObjectClass the##OBJ_CLASS##Class(CLASS_NAME,               \
-                                     new##OBJ_CLASS##Builder); \
-                                                                \
-/* see param.hh */                                             \
-DEFINE_SIM_OBJECT_CLASS_NAME(CLASS_NAME, OBJ_CLASS)
-
-
 #endif // __SIM_OBJECT_HH__