simulate.cc revision 9356
17405SAli.Saidi@ARM.com/* 27405SAli.Saidi@ARM.com * Copyright (c) 2006 The Regents of The University of Michigan 37405SAli.Saidi@ARM.com * All rights reserved. 47405SAli.Saidi@ARM.com * 57405SAli.Saidi@ARM.com * Redistribution and use in source and binary forms, with or without 67405SAli.Saidi@ARM.com * modification, are permitted provided that the following conditions are 77405SAli.Saidi@ARM.com * met: redistributions of source code must retain the above copyright 87405SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer; 97405SAli.Saidi@ARM.com * redistributions in binary form must reproduce the above copyright 107405SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer in the 117405SAli.Saidi@ARM.com * documentation and/or other materials provided with the distribution; 127405SAli.Saidi@ARM.com * neither the name of the copyright holders nor the names of its 137405SAli.Saidi@ARM.com * contributors may be used to endorse or promote products derived from 147405SAli.Saidi@ARM.com * this software without specific prior written permission. 157405SAli.Saidi@ARM.com * 167405SAli.Saidi@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 177405SAli.Saidi@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 187405SAli.Saidi@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 197405SAli.Saidi@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 207405SAli.Saidi@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 217405SAli.Saidi@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 227405SAli.Saidi@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 237405SAli.Saidi@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 247405SAli.Saidi@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 257405SAli.Saidi@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 267405SAli.Saidi@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 277405SAli.Saidi@ARM.com * 287405SAli.Saidi@ARM.com * Authors: Nathan Binkert 297405SAli.Saidi@ARM.com * Steve Reinhardt 307405SAli.Saidi@ARM.com */ 317405SAli.Saidi@ARM.com 327405SAli.Saidi@ARM.com#include "base/misc.hh" 337405SAli.Saidi@ARM.com#include "base/pollevent.hh" 347405SAli.Saidi@ARM.com#include "base/types.hh" 357405SAli.Saidi@ARM.com#include "sim/async.hh" 367405SAli.Saidi@ARM.com#include "sim/eventq_impl.hh" 377405SAli.Saidi@ARM.com#include "sim/sim_events.hh" 387405SAli.Saidi@ARM.com#include "sim/sim_exit.hh" 397405SAli.Saidi@ARM.com#include "sim/simulate.hh" 407405SAli.Saidi@ARM.com#include "sim/stat_control.hh" 417405SAli.Saidi@ARM.com 427405SAli.Saidi@ARM.com/** Simulate for num_cycles additional cycles. If num_cycles is -1 437405SAli.Saidi@ARM.com * (the default), do not limit simulation; some other event must 447405SAli.Saidi@ARM.com * terminate the loop. Exported to Python via SWIG. 457405SAli.Saidi@ARM.com * @return The SimLoopExitEvent that caused the loop to exit. 467427Sgblack@eecs.umich.edu */ 477427Sgblack@eecs.umich.eduSimLoopExitEvent * 487427Sgblack@eecs.umich.edusimulate(Tick num_cycles) 497427Sgblack@eecs.umich.edu{ 507427Sgblack@eecs.umich.edu inform("Entering event queue @ %d. Starting simulation...\n", curTick()); 517427Sgblack@eecs.umich.edu 527427Sgblack@eecs.umich.edu if (num_cycles < MaxTick - curTick()) 537427Sgblack@eecs.umich.edu num_cycles = curTick() + num_cycles; 547427Sgblack@eecs.umich.edu else // counter would roll over or be set to MaxTick anyhow 557427Sgblack@eecs.umich.edu num_cycles = MaxTick; 567427Sgblack@eecs.umich.edu 577427Sgblack@eecs.umich.edu Event *limit_event = 587604SGene.Wu@arm.com new SimLoopExitEvent("simulate() limit reached", 0); 597427Sgblack@eecs.umich.edu mainEventQueue.schedule(limit_event, num_cycles); 607427Sgblack@eecs.umich.edu 617427Sgblack@eecs.umich.edu while (1) { 627427Sgblack@eecs.umich.edu // there should always be at least one event (the SimLoopExitEvent 637427Sgblack@eecs.umich.edu // we just scheduled) in the queue 647427Sgblack@eecs.umich.edu assert(!mainEventQueue.empty()); 657427Sgblack@eecs.umich.edu assert(curTick() <= mainEventQueue.nextTick() && 667427Sgblack@eecs.umich.edu "event scheduled in the past"); 677427Sgblack@eecs.umich.edu 687427Sgblack@eecs.umich.edu Event *exit_event = mainEventQueue.serviceOne(); 697427Sgblack@eecs.umich.edu if (exit_event != NULL) { 707427Sgblack@eecs.umich.edu // hit some kind of exit event; return to Python 717427Sgblack@eecs.umich.edu // event must be subclass of SimLoopExitEvent... 727427Sgblack@eecs.umich.edu SimLoopExitEvent *se_event; 737427Sgblack@eecs.umich.edu se_event = dynamic_cast<SimLoopExitEvent *>(exit_event); 747427Sgblack@eecs.umich.edu 757427Sgblack@eecs.umich.edu if (se_event == NULL) 767427Sgblack@eecs.umich.edu panic("Bogus exit event class!"); 777427Sgblack@eecs.umich.edu 787427Sgblack@eecs.umich.edu // if we didn't hit limit_event, delete it 797427Sgblack@eecs.umich.edu if (se_event != limit_event) { 807427Sgblack@eecs.umich.edu assert(limit_event->scheduled()); 817427Sgblack@eecs.umich.edu limit_event->squash(); 827427Sgblack@eecs.umich.edu hack_once("be nice to actually delete the event here"); 837427Sgblack@eecs.umich.edu } 847427Sgblack@eecs.umich.edu 857427Sgblack@eecs.umich.edu return se_event; 867427Sgblack@eecs.umich.edu } 877427Sgblack@eecs.umich.edu 887427Sgblack@eecs.umich.edu if (async_event) { 897427Sgblack@eecs.umich.edu async_event = false; 907427Sgblack@eecs.umich.edu if (async_statdump || async_statreset) { 917427Sgblack@eecs.umich.edu Stats::schedStatEvent(async_statdump, async_statreset); 927427Sgblack@eecs.umich.edu async_statdump = false; 937427Sgblack@eecs.umich.edu async_statreset = false; 947427Sgblack@eecs.umich.edu } 957427Sgblack@eecs.umich.edu 967427Sgblack@eecs.umich.edu if (async_exit) { 977427Sgblack@eecs.umich.edu async_exit = false; 987427Sgblack@eecs.umich.edu exitSimLoop("user interrupt received"); 997427Sgblack@eecs.umich.edu } 1007427Sgblack@eecs.umich.edu 1017427Sgblack@eecs.umich.edu if (async_io || async_alarm) { 1027427Sgblack@eecs.umich.edu async_io = false; 1037427Sgblack@eecs.umich.edu async_alarm = false; 1047427Sgblack@eecs.umich.edu pollQueue.service(); 1057427Sgblack@eecs.umich.edu } 1067427Sgblack@eecs.umich.edu 1077427Sgblack@eecs.umich.edu if (async_exception) { 1087427Sgblack@eecs.umich.edu async_exception = false; 1097427Sgblack@eecs.umich.edu return NULL; 1107436Sdam.sunwoo@arm.com } 1117436Sdam.sunwoo@arm.com } 1127436Sdam.sunwoo@arm.com } 1137436Sdam.sunwoo@arm.com 1147436Sdam.sunwoo@arm.com // not reached... only exit is return on SimLoopExitEvent 1157436Sdam.sunwoo@arm.com} 1167436Sdam.sunwoo@arm.com 1177436Sdam.sunwoo@arm.com