cpu: Add support for scheduling multiple inst/load stop events
authorAndreas Sandberg <andreas@sandberg.pp.se>
Tue, 11 Jun 2013 07:18:25 +0000 (09:18 +0200)
committerAndreas Sandberg <andreas@sandberg.pp.se>
Tue, 11 Jun 2013 07:18:25 +0000 (09:18 +0200)
Currently, the only way to get a CPU to stop after a fixed number of
instructions/loads is to set a property on the CPU that causes a
SimLoopExitEvent to be scheduled when the CPU is constructed. This is
clearly not ideal in cases where the simulation script wants the CPU
to stop at multiple instruction counts (e.g., SimPoint generation).

This changeset adds the methods scheduleInstStop() and
scheduleLoadStop() to the BaseCPU. These methods are exported to
Python and are designed to be used from the simulation script. By
using these methods instead of the old properties, a simulation script
can schedule a stop at any point during simulation or schedule
multiple stops. The number of instructions specified when scheduling a
stop is relative to the current point of execution.

src/cpu/BaseCPU.py
src/cpu/base.cc
src/cpu/base.hh

index b98ddee6efff047d4cc538ead610f41de81182b8..f52c6b11f8c518f04f886ec1c792725d8f532e1a 100644 (file)
@@ -99,6 +99,8 @@ class BaseCPU(MemObject):
     bool switchedOut();
     void flushTLBs();
     Counter totalInsts();
+    void scheduleInstStop(ThreadID tid, Counter insts, const char *cause);
+    void scheduleLoadStop(ThreadID tid, Counter loads, const char *cause);
 ''')
 
     @classmethod
index c7c1dadda5ef6c757128d9b66c874310b6f26dc3..5b76f3f7c0366e8b3ecadab7fda62b78551a2451 100644 (file)
@@ -147,10 +147,8 @@ BaseCPU::BaseCPU(Params *p, bool is_checker)
     //
     if (p->max_insts_any_thread != 0) {
         const char *cause = "a thread reached the max instruction count";
-        for (ThreadID tid = 0; tid < numThreads; ++tid) {
-            Event *event = new SimLoopExitEvent(cause, 0);
-            comInstEventQueue[tid]->schedule(event, p->max_insts_any_thread);
-        }
+        for (ThreadID tid = 0; tid < numThreads; ++tid)
+            scheduleInstStop(tid, p->max_insts_any_thread, cause);
     }
 
     // Set up instruction-count-based termination events for SimPoints
@@ -159,10 +157,8 @@ BaseCPU::BaseCPU(Params *p, bool is_checker)
     // exitting the simulation loop.
     if (!p->simpoint_start_insts.empty()) {
         const char *cause = "simpoint starting point found";
-        for (size_t i = 0; i < p->simpoint_start_insts.size(); ++i) {
-            Event *event = new SimLoopExitEvent(cause, 0);
-            comInstEventQueue[0]->schedule(event, p->simpoint_start_insts[i]);
-        }
+        for (size_t i = 0; i < p->simpoint_start_insts.size(); ++i)
+            scheduleInstStop(0, p->simpoint_start_insts[i], cause);
     }
 
     if (p->max_insts_all_threads != 0) {
@@ -189,10 +185,8 @@ BaseCPU::BaseCPU(Params *p, bool is_checker)
     //
     if (p->max_loads_any_thread != 0) {
         const char *cause = "a thread reached the max load count";
-        for (ThreadID tid = 0; tid < numThreads; ++tid) {
-            Event *event = new SimLoopExitEvent(cause, 0);
-            comLoadEventQueue[tid]->schedule(event, p->max_loads_any_thread);
-        }
+        for (ThreadID tid = 0; tid < numThreads; ++tid)
+            scheduleLoadStop(tid, p->max_loads_any_thread, cause);
     }
 
     if (p->max_loads_all_threads != 0) {
@@ -571,6 +565,25 @@ BaseCPU::unserialize(Checkpoint *cp, const std::string &section)
     }
 }
 
+void
+BaseCPU::scheduleInstStop(ThreadID tid, Counter insts, const char *cause)
+{
+    const Tick now(comInstEventQueue[tid]->getCurTick());
+    Event *event(new SimLoopExitEvent(cause, 0));
+
+    comInstEventQueue[tid]->schedule(event, now + insts);
+}
+
+void
+BaseCPU::scheduleLoadStop(ThreadID tid, Counter loads, const char *cause)
+{
+    const Tick now(comLoadEventQueue[tid]->getCurTick());
+    Event *event(new SimLoopExitEvent(cause, 0));
+
+    comLoadEventQueue[tid]->schedule(event, now + loads);
+}
+
+
 void
 BaseCPU::traceFunctionsInternal(Addr pc)
 {
index 65f596132f04d890ca7b1dfae2a669babaea4cfd..0a360076460d4e61ed092223b1f2d27b9d8fce3b 100644 (file)
@@ -395,6 +395,36 @@ class BaseCPU : public MemObject
 
     virtual Counter totalOps() const = 0;
 
+    /**
+     * Schedule an event that exits the simulation loops after a
+     * predefined number of instructions.
+     *
+     * This method is usually called from the configuration script to
+     * get an exit event some time in the future. It is typically used
+     * when the script wants to simulate for a specific number of
+     * instructions rather than ticks.
+     *
+     * @param tid Thread monitor.
+     * @param insts Number of instructions into the future.
+     * @param cause Cause to signal in the exit event.
+     */
+    void scheduleInstStop(ThreadID tid, Counter insts, const char *cause);
+
+    /**
+     * Schedule an event that exits the simulation loops after a
+     * predefined number of load operations.
+     *
+     * This method is usually called from the configuration script to
+     * get an exit event some time in the future. It is typically used
+     * when the script wants to simulate for a specific number of
+     * loads rather than ticks.
+     *
+     * @param tid Thread monitor.
+     * @param loads Number of load instructions into the future.
+     * @param cause Cause to signal in the exit event.
+     */
+    void scheduleLoadStop(ThreadID tid, Counter loads, const char *cause);
+
     // Function tracing
   private:
     bool functionTracingEnabled;