//
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
// 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) {
//
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) {
}
}
+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)
{
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;