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