Separate the stuff for SimObject from SimObject builder.
authorNathan Binkert <binkertn@umich.edu>
Tue, 21 Oct 2003 00:17:01 +0000 (20:17 -0400)
committerNathan Binkert <binkertn@umich.edu>
Tue, 21 Oct 2003 00:17:01 +0000 (20:17 -0400)
This makes testing a bit easier.

arch/alpha/alpha_memory.cc:
cpu/intr_control.cc:
cpu/memtest/memtest.cc:
cpu/simple_cpu/simple_cpu.cc:
dev/alpha_console.cc:
dev/console.cc:
dev/disk_image.cc:
dev/etherbus.cc:
dev/etherdump.cc:
dev/etherlink.cc:
dev/ethertap.cc:
dev/simple_disk.cc:
kern/tru64/tru64_system.cc:
sim/main.cc:
sim/prog.cc:
    Need to include builder.hh
    sort #includes
sim/sim_object.cc:
sim/sim_object.hh:
    Separate the SimObjectBuilder stuff into its own file

--HG--
extra : convert_revision : e8395e0cc6ae1f180f9cd6f100795a1ac44aeed5

19 files changed:
arch/alpha/alpha_memory.cc
cpu/intr_control.cc
cpu/memtest/memtest.cc
cpu/simple_cpu/simple_cpu.cc
dev/alpha_console.cc
dev/console.cc
dev/disk_image.cc
dev/etherbus.cc
dev/etherdump.cc
dev/etherlink.cc
dev/ethertap.cc
dev/simple_disk.cc
kern/tru64/tru64_system.cc
sim/builder.cc [new file with mode: 0644]
sim/builder.hh [new file with mode: 0644]
sim/main.cc
sim/prog.cc
sim/sim_object.cc
sim/sim_object.hh

index 669fe92bb91bf5e3162be842f534a085a23e224a..83dd5accf48404160e16db51a300768d3b0b2709 100644 (file)
 #include <string>
 #include <vector>
 
-#include "targetarch/alpha_memory.hh"
-#include "targetarch/ev5.hh"
-#include "cpu/exec_context.hh"
-#include "base/trace.hh"
 #include "base/inifile.hh"
 #include "base/str.hh"
+#include "base/trace.hh"
+#include "cpu/exec_context.hh"
+#include "sim/builder.hh"
+#include "targetarch/alpha_memory.hh"
+#include "targetarch/ev5.hh"
 
 using namespace std;
 
index bce427eea1ff6a74083cf703f1bb12cf3c32bb4f..037b00ef4d40c33f8e5198cc371e31220edbfbc6 100644 (file)
@@ -31,6 +31,7 @@
 
 #include "cpu/base_cpu.hh"
 #include "cpu/intr_control.hh"
+#include "sim/builder.hh"
 #include "sim/sim_object.hh"
 
 using namespace std;
index 6292911cd95cde6db7a444859cbd1ec53cc96c54..e67a129d2953363459fb01367b07bbf3f60db8a4 100644 (file)
 #include <iomanip>
 #include <vector>
 
-#include "cpu/memtest/memtest.hh"
 #include "base/misc.hh"
-#include "sim/sim_events.hh"
-#include "mem/functional_mem/main_memory.hh"
-#include "mem/cache/base_cache.hh"
-
 #include "base/statistics.hh"
+#include "cpu/memtest/memtest.hh"
+#include "mem/cache/base_cache.hh"
+#include "mem/functional_mem/main_memory.hh"
+#include "sim/builder.hh"
+#include "sim/sim_events.hh"
 #include "sim/sim_stats.hh"
 
 using namespace std;
index 20790bfb627d4b0d8eed4b714801e0070697fc01..3c9be172f179e7b95dc497acb6590a9d8accdaed 100644 (file)
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <cmath>
+#include <cstdio>
+#include <cstdlib>
 #include <iostream>
 #include <iomanip>
 #include <list>
 #include <sstream>
 #include <string>
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-
-#include "sim/host.hh"
 #include "base/cprintf.hh"
+#include "base/inifile.hh"
+#include "base/loader/symtab.hh"
 #include "base/misc.hh"
-#include "cpu/full_cpu/smt.hh"
-
-#include "sim/annotation.hh"
-#include "cpu/exec_context.hh"
+#include "base/pollevent.hh"
+#include "base/range.hh"
+#include "base/trace.hh"
 #include "cpu/base_cpu.hh"
-#include "sim/debug.hh"
+#include "cpu/exec_context.hh"
+#include "cpu/exetrace.hh"
+#include "cpu/full_cpu/smt.hh"
 #include "cpu/simple_cpu/simple_cpu.hh"
-#include "base/inifile.hh"
-#include "mem/mem_interface.hh"
-#include "mem/base_mem.hh"
 #include "cpu/static_inst.hh"
+#include "mem/base_mem.hh"
+#include "mem/mem_interface.hh"
+#include "sim/annotation.hh"
+#include "sim/builder.hh"
+#include "sim/debug.hh"
+#include "sim/host.hh"
+#include "sim/sim_events.hh"
+#include "sim/sim_object.hh"
+#include "sim/sim_stats.hh"
 
 #ifdef FULL_SYSTEM
+#include "base/remote_gdb.hh"
+#include "dev/alpha_access.h"
+#include "dev/pciareg.h"
 #include "mem/functional_mem/memory_control.hh"
 #include "mem/functional_mem/physical_memory.hh"
-#include "targetarch/alpha_memory.hh"
 #include "sim/system.hh"
+#include "targetarch/alpha_memory.hh"
+#include "targetarch/vtophys.hh"
 #else // !FULL_SYSTEM
+#include "eio/eio.hh"
 #include "mem/functional_mem/functional_memory.hh"
 #include "sim/prog.hh"
-#include "eio/eio.hh"
 #endif // FULL_SYSTEM
 
-#include "cpu/exetrace.hh"
-#include "base/trace.hh"
-#include "sim/sim_events.hh"
-#include "base/pollevent.hh"
-#include "sim/sim_object.hh"
-#include "sim/sim_stats.hh"
-
-#include "base/range.hh"
-#include "base/loader/symtab.hh"
-
-#ifdef FULL_SYSTEM
-#include "targetarch/vtophys.hh"
-#include "dev/pciareg.h"
-#include "base/remote_gdb.hh"
-#include "dev/alpha_access.h"
-#endif
-
-
 using namespace std;
 
 SimpleCPU::CacheCompletionEvent::CacheCompletionEvent(SimpleCPU *_cpu)
index 526ef0b3c56db2d4309aa1d447662bca282a3ada..b917d7a9666b7eb30c15c40013403d3fea4ef393 100644 (file)
  * System Console Definition
  */
 
-#include <stddef.h>
-#include <stdio.h>
-
+#include <cstddef>
+#include <cstdio>
 #include <string>
 
-#include "dev/alpha_console.hh"
+#include "base/inifile.hh"
+#include "base/str.hh" // for to_number()
+#include "base/trace.hh"
 #include "cpu/base_cpu.hh"
-#include "dev/console.hh"
 #include "cpu/exec_context.hh"
-#include "mem/functional_mem/memory_control.hh"
+#include "dev/alpha_console.hh"
+#include "dev/console.hh"
 #include "dev/simple_disk.hh"
 #include "dev/tlaser_clock.hh"
+#include "mem/functional_mem/memory_control.hh"
+#include "sim/builder.hh"
 #include "sim/system.hh"
-#include "base/trace.hh"
-#include "base/inifile.hh"
-#include "base/str.hh" // for to_number()
 
 using namespace std;
 
index 976118e2f7dd2b14628d83a834d0c0069979f9d3..168907417bb4bf0c83d77f02a5afab324234e15c 100644 (file)
 #include <string>
 
 #include "base/misc.hh"
-#include "targetarch/ev5.hh"
-
-#include "dev/console.hh"
 #include "base/socket.hh"
 #include "base/trace.hh"
+#include "dev/console.hh"
 #include "mem/functional_mem/memory_control.hh"
+#include "sim/builder.hh"
+#include "targetarch/ev5.hh"
 
 using namespace std;
 
index 0a3955ed1833bacd9279bf243460f7674af87fe0..78599f8d72ee0c4d308432c31da48e06b39e41ea 100644 (file)
 #include <sys/types.h>
 #include <sys/uio.h>
 #include <errno.h>
-#include <string.h>
 #include <unistd.h>
 
 #include <cstdio>
+#include <cstring>
 #include <fstream>
 #include <string>
 
-#include "dev/disk_image.hh"
+#include "base/callback.hh"
 #include "base/misc.hh"
 #include "base/trace.hh"
+#include "dev/disk_image.hh"
+#include "sim/builder.hh"
 #include "sim/sim_exit.hh"
-#include "base/callback.hh"
 
 using namespace std;
 
index fa1d842723cad462baaf9d746056ac17238c0593..3f6036f72ae10d6f4f9b72f2b2c0fe64c456f7cf 100644 (file)
  * Device module for modelling an ethernet hub
  */
 
+#include <cmath>
 #include <deque>
 #include <string>
 #include <vector>
 
-#include <math.h>
-
+#include "base/trace.hh"
 #include "dev/etherbus.hh"
 #include "dev/etherdump.hh"
 #include "dev/etherint.hh"
 #include "dev/etherpkt.hh"
-#include "base/trace.hh"
+#include "sim/builder.hh"
 #include "sim/universe.hh"
 
 using namespace std;
index dcca0e45833b7e84346e6d25882b43eaafc36e0a..60dc1559dd42687ddeb984120389f22c7aed4ec5 100644 (file)
@@ -34,8 +34,8 @@
 
 #include <string>
 
-#include "sim/universe.hh"
 #include "dev/etherdump.hh"
+#include "sim/builder.hh"
 #include "sim/universe.hh"
 
 using std::string;
index 699e9f331ba1215f821ad7f48a7da20364771cd5..e5665c7b14bfda58e1d04469c1413644354d2d90 100644 (file)
  * Device module for modelling a fixed bandwidth full duplex ethernet link
  */
 
+#include <cmath>
 #include <deque>
 #include <string>
 #include <vector>
 
-#include <math.h>
-
-#include "dev/etherlink.hh"
+#include "base/trace.hh"
 #include "dev/etherdump.hh"
 #include "dev/etherint.hh"
+#include "dev/etherlink.hh"
 #include "dev/etherpkt.hh"
-#include "base/trace.hh"
+#include "sim/builder.hh"
 #include "sim/universe.hh"
 
 using namespace std;
index e12c07c264151adb812819417ef45b1a631ca496..b99d46ce5771d7d35998a11bcfe510810c1e4444 100644 (file)
 #include <deque>
 #include <string>
 
+#include "base/misc.hh"
+#include "base/pollevent.hh"
+#include "base/socket.hh"
+#include "base/trace.hh"
 #include "dev/etherdump.hh"
 #include "dev/etherint.hh"
 #include "dev/etherpkt.hh"
 #include "dev/ethertap.hh"
-#include "base/pollevent.hh"
-#include "base/socket.hh"
-#include "base/trace.hh"
-#include "base/misc.hh"
+#include "sim/builder.hh"
 
 using namespace std;
 
index d26cf44ea182ebe2c85dcd187a662e2f3b456762..aa6ff5b38a396c788bd98c069023cb872a375022 100644 (file)
  * Simple disk interface for the system console
  */
 
-#include <string>
-
 #include <sys/types.h>
 #include <sys/uio.h>
 #include <fcntl.h>
-#include <string.h>
 #include <unistd.h>
 
-#include "dev/disk_image.hh"
+#include <cstring>
+#include <string>
+
 #include "base/misc.hh"
-#include "mem/functional_mem/physical_memory.hh"
-#include "dev/simple_disk.hh"
 #include "base/trace.hh"
+#include "dev/disk_image.hh"
+#include "dev/simple_disk.hh"
+#include "mem/functional_mem/physical_memory.hh"
+#include "sim/builder.hh"
 
 using namespace std;
 
index 02b6c4fae5f7914ecc38be751bef1937f60ee0c4..b31b82644fddcf8443cd97b1431cd9a7e8b0cbf6 100644 (file)
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include "base/remote_gdb.hh"
-#include "base/trace.hh"
 #include "base/loader/aout_object.hh"
 #include "base/loader/ecoff_object.hh"
 #include "base/loader/object_file.hh"
 #include "base/loader/symtab.hh"
+#include "base/remote_gdb.hh"
+#include "base/trace.hh"
 #include "cpu/exec_context.hh"
 #include "kern/tru64/tru64_events.hh"
 #include "kern/tru64/tru64_system.hh"
 #include "mem/functional_mem/memory_control.hh"
 #include "mem/functional_mem/physical_memory.hh"
+#include "sim/builder.hh"
 #include "targetarch/isa_traits.hh"
 #include "targetarch/vtophys.hh"
 
diff --git a/sim/builder.cc b/sim/builder.cc
new file mode 100644 (file)
index 0000000..fa435d3
--- /dev/null
@@ -0,0 +1,191 @@
+/*
+ * Copyright (c) 2003 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <assert.h>
+
+#include "base/inifile.hh"
+#include "base/misc.hh"
+#include "sim/builder.hh"
+#include "sim/configfile.hh"
+#include "sim/host.hh"
+#include "sim/sim_object.hh"
+#include "sim/sim_stats.hh"
+
+using namespace std;
+
+///////////////////////////////////////////
+//
+// SimObjectBuilder member definitions
+//
+///////////////////////////////////////////
+
+// override ParamContext::parseParams() to check params based on
+// instance name first.  If not found, then check based on iniSection
+// (as in default ParamContext implementation).
+void
+SimObjectBuilder::parseParams(IniFile &iniFile)
+{
+    iniFilePtr = &iniFile;     // set object member
+
+    ParamList::iterator i;
+
+    for (i = paramList->begin(); i != paramList->end(); ++i) {
+        string string_value;
+
+        if (iniFile.findDefault(instanceName, (*i)->name, string_value)) {
+            (*i)->parse(string_value);
+        }
+        else if (iniFile.findDefault(iniSection, (*i)->name, string_value)) {
+            (*i)->parse(string_value);
+        }
+    }
+}
+
+
+void
+SimObjectBuilder::printErrorProlog(ostream &os)
+{
+    os << "Error creating object '" << getInstanceName()
+       << "' of type '" << simObjClassName
+       << "', section '" << iniSection << "':" << endl;
+}
+
+
+////////////////////////////////////////////////////////////////////////
+//
+// SimObjectClass member definitions
+//
+////////////////////////////////////////////////////////////////////////
+
+// Map of class names to SimObjectBuilder creation functions.  Need to
+// make this a pointer so we can force initialization on the first
+// reference; otherwise, some SimObjectClass constructors may be invoked
+// before the classMap constructor.
+map<string,SimObjectClass::CreateFunc> *SimObjectClass::classMap = NULL;
+
+// SimObjectClass constructor: add mapping to classMap
+SimObjectClass::SimObjectClass(const string &className, CreateFunc createFunc)
+{
+    if (classMap == NULL)
+        classMap = new map<string,SimObjectClass::CreateFunc>();
+
+    if ((*classMap)[className])
+    {
+        cerr << "Error: simulation object class " << className << " redefined"
+             << endl;
+        fatal("");
+    }
+
+    // add className --> createFunc to class map
+    (*classMap)[className] = createFunc;
+}
+
+
+//
+//
+SimObject *
+SimObjectClass::createObject(IniFile &configDB,
+                             const string &configClassName,
+                             const string &objName,
+                             ConfigNode *configNode)
+{
+    // find simulation object class name from configuration class
+    // (specified by 'type=' parameter)
+    string simObjClassName;
+
+    if (!configDB.findDefault(configClassName, "type", simObjClassName)) {
+        cerr << "Configuration class '" << configClassName << "' not found."
+             << endl;
+        abort();
+    }
+
+    // look up className to get appropriate createFunc
+    if (classMap->find(simObjClassName) == classMap->end()) {
+        cerr << "Simulator object class '" << simObjClassName << "' not found."
+             << endl;
+        abort();
+    }
+
+    CreateFunc createFunc = (*classMap)[simObjClassName];
+
+    // call createFunc with config hierarchy node to get object
+    // builder instance (context with parameters for object creation)
+    SimObjectBuilder *objectBuilder = (*createFunc)(configClassName,
+                                                    objName, configNode,
+                                                    simObjClassName);
+
+    assert(objectBuilder != NULL);
+
+    // parse all parameters in context to generate parameter values
+    objectBuilder->parseParams(configDB);
+
+    // now create the actual simulation object
+    SimObject *object = objectBuilder->create();
+
+    assert(object != NULL);
+
+    // echo object parameters to stats file (for documenting the
+    // config used to generate the associated stats)
+    *statStream << "[" << object->name() << "]" << endl;
+    *statStream << "type=" << simObjClassName << endl;
+    objectBuilder->showParams(*statStream);
+    *statStream << endl;
+
+    // done with the SimObjectBuilder now
+    delete objectBuilder;
+
+    return object;
+}
+
+
+//
+// static method:
+//
+void
+SimObjectClass::describeAllClasses(ostream &os)
+{
+    map<string,CreateFunc>::iterator iter;
+
+    for (iter = classMap->begin(); iter != classMap->end(); ++iter) {
+        const string &className = iter->first;
+        CreateFunc createFunc = iter->second;
+
+        os << "[" << className << "]\n";
+
+        // create dummy object builder just to instantiate parameters
+        SimObjectBuilder *objectBuilder = (*createFunc)("", "", NULL, "");
+
+        // now get the object builder to describe ite params
+        objectBuilder->describeParams(os);
+
+        os << endl;
+
+        // done with the object builder now
+        delete objectBuilder;
+    }
+}
diff --git a/sim/builder.hh b/sim/builder.hh
new file mode 100644 (file)
index 0000000..0364276
--- /dev/null
@@ -0,0 +1,221 @@
+/*
+ * Copyright (c) 2003 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __BUILDER_HH__
+#define __BUILDER_HH__
+
+#include <map>
+#include <list>
+#include <vector>
+#include <iostream>
+
+#include "sim/param.hh"
+
+class SimObject;
+
+//
+// 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 &);
+
+    // generate the name for this SimObject instance (derived from the
+    // configuration hierarchy node label and position)
+    virtual const std::string &getInstanceName() { return instanceName; }
+
+    // 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
+{
+  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);
+
+    // 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();                                       \
+};
+
+#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 // __BUILDER_HH__
index ae4b5af77f5a70413027e1fa18a793ab5b0ca023..ce9ef581948ce0d0a8ecdda5e5eead83a50a27b7 100644 (file)
 #include <string>
 #include <vector>
 
-#include "sim/host.hh"
-#include "base/misc.hh"
-
 #include "base/copyright.hh"
 #include "base/inifile.hh"
-#include "sim/configfile.hh"
+#include "base/misc.hh"
 #include "base/pollevent.hh"
 #include "base/statistics.hh"
+#include "cpu/base_cpu.hh"
+#include "cpu/full_cpu/smt.hh"
+#include "sim/async.hh"
+#include "sim/builder.hh"
+#include "sim/configfile.hh"
+#include "sim/host.hh"
 #include "sim/sim_events.hh"
 #include "sim/sim_exit.hh"
 #include "sim/sim_object.hh"
 #include "sim/sim_stats.hh"
 #include "sim/sim_time.hh"
-#include "cpu/full_cpu/smt.hh"
-
-#include "cpu/base_cpu.hh"
-#include "sim/async.hh"
 
 using namespace std;
 
index c52d51f631d755178b54d1deab01d8ba1776734e..275e1551bf00f6d9c31083d7d37db677357fb1fd 100644 (file)
 
 #include <unistd.h>
 #include <fcntl.h>
-#include <stdio.h>
 
+#include <cstdio>
 #include <string>
 
-#include "mem/functional_mem/main_memory.hh"
-#include "sim/prog.hh"
-
-#include "eio/eio.hh"
 #include "base/intmath.hh"
-#include "cpu/full_cpu/thread.hh"
-#include "sim/fake_syscall.hh"
 #include "base/loader/object_file.hh"
+#include "base/statistics.hh"
 #include "cpu/exec_context.hh"
 #include "cpu/full_cpu/smt.hh"
-
-#include "base/statistics.hh"
+#include "cpu/full_cpu/thread.hh"
+#include "eio/eio.hh"
+#include "mem/functional_mem/main_memory.hh"
+#include "sim/builder.hh"
+#include "sim/fake_syscall.hh"
+#include "sim/prog.hh"
 #include "sim/sim_stats.hh"
 
 using namespace std;
index 955c43bb8a113849ad643c35e2b34f5b961df0bd..1ddb15c8267831a4bee34505d3d757141a50e4e5 100644 (file)
@@ -121,155 +121,3 @@ SimObject::printAllExtraOutput(ostream &os)
         (*i)->printExtraOutput(os);
    }
 }
-
-///////////////////////////////////////////
-//
-// SimObjectBuilder member definitions
-//
-///////////////////////////////////////////
-
-// override ParamContext::parseParams() to check params based on
-// instance name first.  If not found, then check based on iniSection
-// (as in default ParamContext implementation).
-void
-SimObjectBuilder::parseParams(IniFile &iniFile)
-{
-    iniFilePtr = &iniFile;     // set object member
-
-    ParamList::iterator i;
-
-    for (i = paramList->begin(); i != paramList->end(); ++i) {
-        string string_value;
-
-        if (iniFile.findDefault(instanceName, (*i)->name, string_value)) {
-            (*i)->parse(string_value);
-        }
-        else if (iniFile.findDefault(iniSection, (*i)->name, string_value)) {
-            (*i)->parse(string_value);
-        }
-    }
-}
-
-
-void
-SimObjectBuilder::printErrorProlog(ostream &os)
-{
-    os << "Error creating object '" << getInstanceName()
-       << "' of type '" << simObjClassName
-       << "', section '" << iniSection << "':" << endl;
-}
-
-
-////////////////////////////////////////////////////////////////////////
-//
-// SimObjectClass member definitions
-//
-////////////////////////////////////////////////////////////////////////
-
-// Map of class names to SimObjectBuilder creation functions.  Need to
-// make this a pointer so we can force initialization on the first
-// reference; otherwise, some SimObjectClass constructors may be invoked
-// before the classMap constructor.
-map<string,SimObjectClass::CreateFunc> *SimObjectClass::classMap = NULL;
-
-// SimObjectClass constructor: add mapping to classMap
-SimObjectClass::SimObjectClass(const string &className, CreateFunc createFunc)
-{
-    if (classMap == NULL)
-        classMap = new map<string,SimObjectClass::CreateFunc>();
-
-    if ((*classMap)[className])
-    {
-        cerr << "Error: simulation object class " << className << " redefined"
-             << endl;
-        fatal("");
-    }
-
-    // add className --> createFunc to class map
-    (*classMap)[className] = createFunc;
-}
-
-
-//
-//
-SimObject *
-SimObjectClass::createObject(IniFile &configDB,
-                             const string &configClassName,
-                             const string &objName,
-                             ConfigNode *configNode)
-{
-    // find simulation object class name from configuration class
-    // (specified by 'type=' parameter)
-    string simObjClassName;
-
-    if (!configDB.findDefault(configClassName, "type", simObjClassName)) {
-        cerr << "Configuration class '" << configClassName << "' not found."
-             << endl;
-        abort();
-    }
-
-    // look up className to get appropriate createFunc
-    if (classMap->find(simObjClassName) == classMap->end()) {
-        cerr << "Simulator object class '" << simObjClassName << "' not found."
-             << endl;
-        abort();
-    }
-
-    CreateFunc createFunc = (*classMap)[simObjClassName];
-
-    // call createFunc with config hierarchy node to get object
-    // builder instance (context with parameters for object creation)
-    SimObjectBuilder *objectBuilder = (*createFunc)(configClassName,
-                                                    objName, configNode,
-                                                    simObjClassName);
-
-    assert(objectBuilder != NULL);
-
-    // parse all parameters in context to generate parameter values
-    objectBuilder->parseParams(configDB);
-
-    // now create the actual simulation object
-    SimObject *object = objectBuilder->create();
-
-    assert(object != NULL);
-
-    // echo object parameters to stats file (for documenting the
-    // config used to generate the associated stats)
-    *statStream << "[" << object->name() << "]" << endl;
-    *statStream << "type=" << simObjClassName << endl;
-    objectBuilder->showParams(*statStream);
-    *statStream << endl;
-
-    // done with the SimObjectBuilder now
-    delete objectBuilder;
-
-    return object;
-}
-
-
-//
-// static method:
-//
-void
-SimObjectClass::describeAllClasses(ostream &os)
-{
-    map<string,CreateFunc>::iterator iter;
-
-    for (iter = classMap->begin(); iter != classMap->end(); ++iter) {
-        const string &className = iter->first;
-        CreateFunc createFunc = iter->second;
-
-        os << "[" << className << "]\n";
-
-        // create dummy object builder just to instantiate parameters
-        SimObjectBuilder *objectBuilder = (*createFunc)("", "", NULL, "");
-
-        // now get the object builder to describe ite params
-        objectBuilder->describeParams(os);
-
-        os << endl;
-
-        // done with the object builder now
-        delete objectBuilder;
-    }
-}
index 7f71d185230293a2b5dba0071ab866bd79fb07a5..6c15fc88f1ad8baf7a521ddcc97cbe6ef0ce805a 100644 (file)
@@ -76,185 +76,4 @@ class SimObject : public Serializeable
     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 &);
-
-    // generate the name for this SimObject instance (derived from the
-    // configuration hierarchy node label and position)
-    virtual const std::string &getInstanceName() { return instanceName; }
-
-    // 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
-{
-  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);
-
-    // 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();                                       \
-};
-
-#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__