X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fsim%2Fsimulate.cc;h=5e69f0ff45590f3e93fa34a33167b3d47f99a2e2;hb=0ed3c84c7b05d7d3c9d5f0e3f1c05c20afef93b9;hp=55cbb50a94240aec3d7d3b6aef6e20d1ae7592f2;hpb=047f77102b5e5d63549663ee94cd799cdcf63516;p=gem5.git diff --git a/src/sim/simulate.cc b/src/sim/simulate.cc index 55cbb50a9..5e69f0ff4 100644 --- a/src/sim/simulate.cc +++ b/src/sim/simulate.cc @@ -31,13 +31,13 @@ #include "base/misc.hh" #include "base/pollevent.hh" -#include "sim/stat_control.hh" +#include "base/types.hh" #include "sim/async.hh" #include "sim/eventq.hh" -#include "sim/host.hh" #include "sim/sim_events.hh" #include "sim/sim_exit.hh" #include "sim/simulate.hh" +#include "sim/stat_control.hh" /** Simulate for num_cycles additional cycles. If num_cycles is -1 * (the default), do not limit simulation; some other event must @@ -47,28 +47,29 @@ SimLoopExitEvent * simulate(Tick num_cycles) { - warn("Entering event queue @ %d. Starting simulation...\n", curTick); + inform("Entering event queue @ %d. Starting simulation...\n", curTick()); if (num_cycles < 0) fatal("simulate: num_cycles must be >= 0 (was %d)\n", num_cycles); - else if (curTick + num_cycles < 0) //Overflow + else if (curTick() + num_cycles < 0) //Overflow num_cycles = MaxTick; else - num_cycles = curTick + num_cycles; + num_cycles = curTick() + num_cycles; - Event *limit_event; - limit_event = schedExitSimLoop("simulate() limit reached", num_cycles); + Event *limit_event = + new SimLoopExitEvent("simulate() limit reached", 0); + mainEventQueue.schedule(limit_event, num_cycles); while (1) { // there should always be at least one event (the SimLoopExitEvent // we just scheduled) in the queue assert(!mainEventQueue.empty()); - assert(curTick <= mainEventQueue.nextTick() && + assert(curTick() <= mainEventQueue.nextTick() && "event scheduled in the past"); // forward current cycle to the time of the first event on the // queue - curTick = mainEventQueue.nextTick(); + curTick(mainEventQueue.nextTick()); Event *exit_event = mainEventQueue.serviceOne(); if (exit_event != NULL) { // hit some kind of exit event; return to Python @@ -82,8 +83,8 @@ simulate(Tick num_cycles) // if we didn't hit limit_event, delete it if (se_event != limit_event) { assert(limit_event->scheduled()); - limit_event->deschedule(); - delete limit_event; + limit_event->squash(); + hack_once("be nice to actually delete the event here"); } return se_event; @@ -92,10 +93,9 @@ simulate(Tick num_cycles) if (async_event) { async_event = false; if (async_statdump || async_statreset) { + Stats::schedStatEvent(async_statdump, async_statreset); async_statdump = false; async_statreset = false; - - Stats::StatEvent(async_statdump, async_statreset); } if (async_exit) {