sim: Move CPU-specific methods from SimObject to the BaseCPU class
authorAndreas Sandberg <Andreas.Sandberg@arm.com>
Tue, 25 Sep 2012 16:49:40 +0000 (11:49 -0500)
committerAndreas Sandberg <Andreas.Sandberg@arm.com>
Tue, 25 Sep 2012 16:49:40 +0000 (11:49 -0500)
src/cpu/BaseCPU.py
src/cpu/base.hh
src/python/m5/SimObject.py
src/python/m5/simulate.py
src/sim/sim_object.cc
src/sim/sim_object.hh

index c27fd1c27db4812728a65715f536c4a52e3212db..6e5f6ff1abbf56fc183083781bec40369a2419e1 100644 (file)
@@ -77,6 +77,22 @@ class BaseCPU(MemObject):
     type = 'BaseCPU'
     abstract = True
 
+    @classmethod
+    def export_method_cxx_predecls(cls, code):
+        code('#include "cpu/base.hh"')
+
+
+    @classmethod
+    def export_methods(cls, code):
+        code('''
+    void switchOut();
+    void takeOverFrom(BaseCPU *cpu);
+''')
+
+    def takeOverFrom(self, old_cpu):
+        self._ccObject.takeOverFrom(old_cpu._ccObject)
+
+
     system = Param.System(Parent.any, "system object")
     cpu_id = Param.Int(-1, "CPU identifier")
     numThreads = Param.Unsigned(1, "number of HW thread contexts")
index 82864ae7baeb4ff8b8dc545da306ebcfd4509b4b..0c1d19856ec721b6a4fc75e37f95fb1eac2a44b4 100644 (file)
@@ -278,13 +278,27 @@ class BaseCPU : public MemObject
 
     void registerThreadContexts();
 
-    /// Prepare for another CPU to take over execution.  When it is
-    /// is ready (drained pipe) it signals the sampler.
+    /**
+     * Prepare for another CPU to take over execution.
+     *
+     * When this method exits, all internal state should have been
+     * flushed. After the method returns, the simulator calls
+     * takeOverFrom() on the new CPU with this CPU as its parameter.
+     */
     virtual void switchOut();
 
-    /// Take over execution from the given CPU.  Used for warm-up and
-    /// sampling.
-    virtual void takeOverFrom(BaseCPU *);
+    /**
+     * Load the state of a CPU from the previous CPU object, invoked
+     * on all new CPUs that are about to be switched in.
+     *
+     * A CPU model implementing this method is expected to initialize
+     * its state from the old CPU and connect its memory (unless they
+     * are already connected) to the memories connected to the old
+     * CPU.
+     *
+     * @param cpu CPU to initialize read state from.
+     */
+    virtual void takeOverFrom(BaseCPU *cpu);
 
     /**
      *  Number of threads we're actually simulating (<= SMT_MAX_THREADS).
index c8227c0674493333a9a4ec4ed32040b300257ace..b63aa22d58457629200e8291c5a5a08b63e2307a 100644 (file)
@@ -602,8 +602,6 @@ class SimObject(object):
 
     unsigned int drain(Event *drain_event);
     void resume();
-    void switchOut();
-    void takeOverFrom(BaseCPU *cpu);
 ''')
 
     # Initialize new instance.  For objects with SimObject-valued
@@ -1050,9 +1048,6 @@ class SimObject(object):
         for portRef in self._port_refs.itervalues():
             portRef.ccConnect()
 
-    def takeOverFrom(self, old_cpu):
-        self._ccObject.takeOverFrom(old_cpu._ccObject)
-
 # Function to provide to C++ so it can look up instances based on paths
 def resolveSimObject(name):
     obj = instanceDict[name]
index 17150cd4f108569c55aabc2af48659c7c4e6f2dc..e95136548d83d650942b7e0ebca5f46a7828531c 100644 (file)
@@ -221,7 +221,7 @@ def switchCpus(cpuList):
 
     # Now all of the CPUs are ready to be switched out
     for old_cpu, new_cpu in cpuList:
-        old_cpu._ccObject.switchOut()
+        old_cpu.switchOut()
 
     for old_cpu, new_cpu in cpuList:
         new_cpu.takeOverFrom(old_cpu)
index 866ce0ce2d23453ba0a0437b07d92f81783b720b..32e936ff227319d268e2581a9b40954b29d01ed6 100644 (file)
@@ -163,19 +163,6 @@ SimObject::resume()
     state = Running;
 }
 
-void
-SimObject::switchOut()
-{
-    panic("Unimplemented!");
-}
-
-void
-SimObject::takeOverFrom(BaseCPU *cpu)
-{
-    panic("Unimplemented!");
-}
-
-
 SimObject *
 SimObject::find(const char *name)
 {
index 4fa2b7f05bb3f69c4996340cf9db4cb6f287354b..c1238e23fd74528df4f34ef08c43f809f563c8c3 100644 (file)
@@ -255,29 +255,6 @@ class SimObject : public EventManager, public Serializable
      */
     virtual void resume();
 
-    /**
-     * Prepare a CPU model to be switched out, invoked on active CPUs
-     * that are about to be replaced.
-     *
-     * @note This should only be implemented in CPU models.
-     */
-    virtual void switchOut();
-
-    /**
-     * Load the state of a CPU from the previous CPU object, invoked
-     * on all new CPUs that are about to be switched in.
-     *
-     * A CPU model implementing this method is expected to initialize
-     * its state from the old CPU and connect its memory (unless they
-     * are already connected) to the memories connected to the old
-     * CPU.
-     *
-     * @note This should only be implemented in CPU models.
-     *
-     * @param cpu CPU to initialize read state from.
-     */
-    virtual void takeOverFrom(BaseCPU *cpu);
-
 #ifdef DEBUG
   public:
     bool doDebugBreak;