示例#1
0
CompleteEventBagModel& EventTable::popEvent()
{
    mCurrentTime = topEvent();

    if (mCurrentTime != infinity) {
	while (not mInternalEventList.empty() and
               mInternalEventList[0]->getTime() == mCurrentTime) {
            if (mInternalEventList[0]->isValid()) {
                Simulator* mdl = mInternalEventList[0]->getModel();
                EventBagModel& bagmodel = mCompleteEventBagModel.getBag(mdl);
                bagmodel.addInternal(mInternalEventList[0]);
            }
            popInternalEvent();
	}

        while (not mExternalEventModel.empty()) {
            Simulator* mdl = (*mExternalEventModel.begin()).first;
            EventBagModel& bagmodel = mCompleteEventBagModel.getBag(mdl);
            bagmodel.addExternal((*mExternalEventModel.begin()).second);
	    mExternalEventModel.erase(mExternalEventModel.begin());
	}

	if (mCompleteEventBagModel.emptyBag())
	  while (not mObservationEventList.empty() and
		 mObservationEventList.front()->getTime() == mCurrentTime) {
	    mCompleteEventBagModel.addState(mObservationEventList.front());
	    popObservationEvent();
	  }
    }
    mCompleteEventBagModel.init();
    return mCompleteEventBagModel;
}
示例#2
0
        void step()
        {
            Event topEvent( popTopEvent() );
            this->time = topEvent.getTime();

            topEvent.fire();
        }
示例#3
0
	void step()
	{

	    // Here I copy construct the top event and use its event
	    // ID to reschedule it.  This is necessary if events can
	    // be created or deleted within fire() and the dynamic
	    // priority queue can reallocate internal data structures.
	    // Most of the cost of using this is optimized away when
	    // the dynamic priority queue has a VolatileIDPolicy.
	    Event topEvent( getTopEvent() );
	    const EventID ID( this->eventPriorityQueue.getTopID() );
	    this->time = topEvent.getTime();

	    // Fire top
	    topEvent.fire();

	    // If the event is rescheduled into the past, remove it.
	    // Otherwise, reuse the event.
	    if( topEvent.getTime() >= getTime() )
	    {
		this->eventPriorityQueue.replace( ID, topEvent );
	    }
	    else
	    {
		this->eventPriorityQueue.pop( ID );
	    }

//	    assert( getNextTime() >= getTime() );

	    // update dependent events
//	    const EventIndexVector&
//		anEventIndexVector( this->eventDependencyArray[ topEventIndex ] );

/*
	    for( typename EventIndexVector::const_iterator 
		     i( anEventIndexVector.begin() );
		 i != anEventIndexVector.end(); ++i )
	    {
		const EventIndex anIndex( *i );

		updateEvent( anIndex, currentTime );
	    }
*/
	}