diff options
Diffstat (limited to 'src/sim/sim_events.cc')
-rw-r--r-- | src/sim/sim_events.cc | 92 |
1 files changed, 58 insertions, 34 deletions
diff --git a/src/sim/sim_events.cc b/src/sim/sim_events.cc index 5380ddd83..5e47adca1 100644 --- a/src/sim/sim_events.cc +++ b/src/sim/sim_events.cc @@ -12,6 +12,8 @@ * modified or unmodified, in source code or in binary form. * * Copyright (c) 2002-2005 The Regents of The University of Michigan + * Copyright (c) 2013 Advanced Micro Devices, Inc. + * Copyright (c) 2013 Mark D. Hill and David A. Wood * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -51,53 +53,71 @@ using namespace std; -SimLoopExitEvent::SimLoopExitEvent() +GlobalSimLoopExitEvent::GlobalSimLoopExitEvent(Tick when, + const std::string &_cause, + int c, Tick r, bool serialize) + : GlobalEvent(when, Sim_Exit_Pri, + IsExitEvent | (serialize ? AutoSerialize : 0)), + cause(_cause), code(c), repeat(r) +{ +} + +const char * +GlobalSimLoopExitEvent::description() const +{ + return "global simulation loop exit"; +} + +// +// handle termination event +// +void +GlobalSimLoopExitEvent::process() +{ + if (repeat) { + schedule(curTick() + repeat); + } +} + +void +exitSimLoop(const std::string &message, int exit_code, Tick when, Tick repeat, + bool serialize) +{ + new GlobalSimLoopExitEvent(when + simQuantum, message, exit_code, repeat, + serialize); +} + +LocalSimLoopExitEvent::LocalSimLoopExitEvent() : Event(Sim_Exit_Pri, IsExitEvent | AutoSerialize), cause(""), code(0), repeat(0) { } -SimLoopExitEvent::SimLoopExitEvent(const std::string &_cause, int c, Tick r, - bool serialize) +LocalSimLoopExitEvent::LocalSimLoopExitEvent(const std::string &_cause, int c, + Tick r, bool serialize) : Event(Sim_Exit_Pri, IsExitEvent | (serialize ? AutoSerialize : 0)), cause(_cause), code(c), repeat(r) { } - // // handle termination event // void -SimLoopExitEvent::process() +LocalSimLoopExitEvent::process() { - // if this got scheduled on a different queue (e.g. the committed - // instruction queue) then make a corresponding event on the main - // queue. - if (!isFlagSet(IsMainQueue)) { - exitSimLoop(cause, code); - setFlags(AutoDelete); - } - - // otherwise do nothing... the IsExitEvent flag takes care of - // exiting the simulation loop and returning this object to Python - - // but if you are doing this on intervals, don't forget to make another - if (repeat) { - assert(isFlagSet(IsMainQueue)); - mainEventQueue.schedule(this, curTick() + repeat); - } + exitSimLoop(cause, 0); } const char * -SimLoopExitEvent::description() const +LocalSimLoopExitEvent::description() const { return "simulation loop exit"; } void -SimLoopExitEvent::serialize(ostream &os) +LocalSimLoopExitEvent::serialize(ostream &os) { paramOut(os, "type", string("SimLoopExitEvent")); Event::serialize(os); @@ -108,7 +128,7 @@ SimLoopExitEvent::serialize(ostream &os) } void -SimLoopExitEvent::unserialize(Checkpoint *cp, const string §ion) +LocalSimLoopExitEvent::unserialize(Checkpoint *cp, const string §ion) { Event::unserialize(cp, section); @@ -117,22 +137,26 @@ SimLoopExitEvent::unserialize(Checkpoint *cp, const string §ion) UNSERIALIZE_SCALAR(repeat); } -Serializable * -SimLoopExitEvent::createForUnserialize(Checkpoint *cp, const string §ion) +void +LocalSimLoopExitEvent::unserialize(Checkpoint *cp, const string §ion, + EventQueue *eventq) { - return new SimLoopExitEvent(); -} + Event::unserialize(cp, section, eventq); -REGISTER_SERIALIZEABLE("SimLoopExitEvent", SimLoopExitEvent) + UNSERIALIZE_SCALAR(cause); + UNSERIALIZE_SCALAR(code); + UNSERIALIZE_SCALAR(repeat); +} -void -exitSimLoop(const std::string &message, int exit_code, Tick when, Tick repeat, - bool serialize) +Serializable * +LocalSimLoopExitEvent::createForUnserialize(Checkpoint *cp, + const string §ion) { - Event *event = new SimLoopExitEvent(message, exit_code, repeat, serialize); - mainEventQueue.schedule(event, when); + return new LocalSimLoopExitEvent(); } +REGISTER_SERIALIZEABLE("LocalSimLoopExitEvent", LocalSimLoopExitEvent) + // // constructor: automatically schedules at specified time // |