simulate.cc revision 9174:2171e04a2ee5
110428Sandreas.hansson@arm.com/* 210428Sandreas.hansson@arm.com * Copyright (c) 2006 The Regents of The University of Michigan 310428Sandreas.hansson@arm.com * All rights reserved. 410428Sandreas.hansson@arm.com * 510428Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 610428Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 710428Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 810428Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 910428Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 1010428Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 1110428Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 1210428Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 1310428Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 1410428Sandreas.hansson@arm.com * this software without specific prior written permission. 1510428Sandreas.hansson@arm.com * 1610428Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1710428Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1810428Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1910428Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2010428Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2110428Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2210428Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2310428Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2410428Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2510428Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2610428Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2710428Sandreas.hansson@arm.com * 2810428Sandreas.hansson@arm.com * Authors: Nathan Binkert 2910428Sandreas.hansson@arm.com * Steve Reinhardt 3010428Sandreas.hansson@arm.com */ 3110428Sandreas.hansson@arm.com 3210428Sandreas.hansson@arm.com#include "base/misc.hh" 3310428Sandreas.hansson@arm.com#include "base/pollevent.hh" 3410428Sandreas.hansson@arm.com#include "base/types.hh" 3510428Sandreas.hansson@arm.com#include "sim/async.hh" 3610428Sandreas.hansson@arm.com#include "sim/eventq.hh" 3710428Sandreas.hansson@arm.com#include "sim/sim_events.hh" 3810428Sandreas.hansson@arm.com#include "sim/sim_exit.hh" 3910428Sandreas.hansson@arm.com#include "sim/simulate.hh" 4010428Sandreas.hansson@arm.com#include "sim/stat_control.hh" 4110428Sandreas.hansson@arm.com 4210428Sandreas.hansson@arm.com/** Simulate for num_cycles additional cycles. If num_cycles is -1 4310428Sandreas.hansson@arm.com * (the default), do not limit simulation; some other event must 4410428Sandreas.hansson@arm.com * terminate the loop. Exported to Python via SWIG. 4510428Sandreas.hansson@arm.com * @return The SimLoopExitEvent that caused the loop to exit. 4610428Sandreas.hansson@arm.com */ 4710428Sandreas.hansson@arm.comSimLoopExitEvent * 4810428Sandreas.hansson@arm.comsimulate(Tick num_cycles) 4911555Sjungma@eit.uni-kl.de{ 5010428Sandreas.hansson@arm.com inform("Entering event queue @ %d. Starting simulation...\n", curTick()); 5110428Sandreas.hansson@arm.com 5210428Sandreas.hansson@arm.com if (num_cycles < MaxTick - curTick()) 5310428Sandreas.hansson@arm.com num_cycles = curTick() + num_cycles; 5410428Sandreas.hansson@arm.com else // counter would roll over or be set to MaxTick anyhow 5510428Sandreas.hansson@arm.com num_cycles = MaxTick; 5610428Sandreas.hansson@arm.com 5710428Sandreas.hansson@arm.com Event *limit_event = 5810428Sandreas.hansson@arm.com new SimLoopExitEvent("simulate() limit reached", 0); 5910428Sandreas.hansson@arm.com mainEventQueue.schedule(limit_event, num_cycles); 6010428Sandreas.hansson@arm.com 6110428Sandreas.hansson@arm.com while (1) { 6210428Sandreas.hansson@arm.com // there should always be at least one event (the SimLoopExitEvent 6310428Sandreas.hansson@arm.com // we just scheduled) in the queue 6410428Sandreas.hansson@arm.com assert(!mainEventQueue.empty()); 6510428Sandreas.hansson@arm.com assert(curTick() <= mainEventQueue.nextTick() && 6610428Sandreas.hansson@arm.com "event scheduled in the past"); 6710428Sandreas.hansson@arm.com 6810428Sandreas.hansson@arm.com // forward current cycle to the time of the first event on the 6910428Sandreas.hansson@arm.com // queue 7010428Sandreas.hansson@arm.com curTick(mainEventQueue.nextTick()); 7110428Sandreas.hansson@arm.com Event *exit_event = mainEventQueue.serviceOne(); 7210428Sandreas.hansson@arm.com if (exit_event != NULL) { 7310428Sandreas.hansson@arm.com // hit some kind of exit event; return to Python 7410428Sandreas.hansson@arm.com // event must be subclass of SimLoopExitEvent... 7510428Sandreas.hansson@arm.com SimLoopExitEvent *se_event; 7610428Sandreas.hansson@arm.com se_event = dynamic_cast<SimLoopExitEvent *>(exit_event); 7711555Sjungma@eit.uni-kl.de 7810428Sandreas.hansson@arm.com if (se_event == NULL) 7910428Sandreas.hansson@arm.com panic("Bogus exit event class!"); 8011555Sjungma@eit.uni-kl.de 8110428Sandreas.hansson@arm.com // if we didn't hit limit_event, delete it 8211555Sjungma@eit.uni-kl.de if (se_event != limit_event) { 8311555Sjungma@eit.uni-kl.de assert(limit_event->scheduled()); 8411555Sjungma@eit.uni-kl.de limit_event->squash(); 8511555Sjungma@eit.uni-kl.de hack_once("be nice to actually delete the event here"); 8611555Sjungma@eit.uni-kl.de } 8711555Sjungma@eit.uni-kl.de 8811555Sjungma@eit.uni-kl.de return se_event; 8910428Sandreas.hansson@arm.com } 9010428Sandreas.hansson@arm.com 9110428Sandreas.hansson@arm.com if (async_event) { 9210428Sandreas.hansson@arm.com async_event = false; 9310428Sandreas.hansson@arm.com if (async_statdump || async_statreset) { 9410428Sandreas.hansson@arm.com Stats::schedStatEvent(async_statdump, async_statreset); 9511555Sjungma@eit.uni-kl.de async_statdump = false; 9610428Sandreas.hansson@arm.com async_statreset = false; 9711555Sjungma@eit.uni-kl.de } 9810428Sandreas.hansson@arm.com 9910428Sandreas.hansson@arm.com if (async_exit) { 10010428Sandreas.hansson@arm.com async_exit = false; 10110428Sandreas.hansson@arm.com exitSimLoop("user interrupt received"); 10210428Sandreas.hansson@arm.com } 10311555Sjungma@eit.uni-kl.de 10410428Sandreas.hansson@arm.com if (async_io || async_alarm) { 10511555Sjungma@eit.uni-kl.de async_io = false; 10610428Sandreas.hansson@arm.com async_alarm = false; 10710428Sandreas.hansson@arm.com pollQueue.service(); 10810428Sandreas.hansson@arm.com } 10910428Sandreas.hansson@arm.com 11010428Sandreas.hansson@arm.com if (async_exception) { 11110428Sandreas.hansson@arm.com async_exception = false; 11210428Sandreas.hansson@arm.com return NULL; 11310428Sandreas.hansson@arm.com } 11410428Sandreas.hansson@arm.com } 11510428Sandreas.hansson@arm.com } 11610428Sandreas.hansson@arm.com 11710428Sandreas.hansson@arm.com // not reached... only exit is return on SimLoopExitEvent 11810428Sandreas.hansson@arm.com} 11910428Sandreas.hansson@arm.com 12010428Sandreas.hansson@arm.com