00001 #ifndef EVSIMENGINE_H_
00002 #define EVSIMENGINE_H_
00003
00004 #include "EvSimNetwork.h"
00005 #include "globals.h"
00006 #include "EvSimObjectPool.h"
00007 #include "EvSimObject.h"
00008 #include "PropagatedUpdateList.h"
00009 #include "ProjectedEventsHeapBuffer.h"
00010 #include "ScheduledEventsQueue.h"
00011 #include "RoutingDelayMap.h"
00012 #include "RandomEngine.h"
00013 #include "SimContext.h"
00014
00015
00017 class EvSimEngine {
00018
00019 public:
00020 EvSimEngine(EvSimNetwork &net, EvSimObjectPool &obj_pool, RoutingDelayMap &delay_map,
00021 EventTargetGroupPool &etg_pool, UpdateLinksMap &upd_links_map) :
00022 obj_pool(obj_pool), delay_map(delay_map), etg_pool(etg_pool),
00023 upd_list(etg_pool, upd_links_map, obj_pool)
00024 {
00025 sim_context = SimContext(&net, this, &proj_events_buf);
00026 sim_random_eng.seed(net.sim_params.rnd_seed);
00027 };
00028
00029 virtual ~EvSimEngine();
00030
00031 void scheduleEvent( global_out_port_id_t port_id, Time t);
00032
00033 void init();
00034
00035 void reset();
00036
00037 void simulate(Time t);
00038
00039 void advance(Time t);
00040
00041 void setRNDSeed(unsigned seed) {
00042 sim_random_eng.seed(seed);
00043 }
00044
00045 void registerProjectedOutputPorts(EvSimObject *obj);
00046
00047 void deliverScheduledEvent(event_target_group_id_t etg, Time time);
00048
00049 protected:
00050
00051 friend class EvSimNetwork;
00052
00053 typedef enum { evProjected, evScheduled } EventType;
00054
00055 Time last_event_time;
00056 Time curr_sim_clock;
00057
00058 EvSimObjectPool &obj_pool;
00059
00060 ProjectedEventsHeapBuffer proj_events_buf;
00061
00062 ScheduledEventsQueue scheduled_events_queue;
00063
00064 RoutingDelayMap & delay_map;
00065
00066 EventTargetGroupPool & etg_pool;
00067
00068 PropagatedUpdateList upd_list;
00069
00070 SimContext sim_context;
00071
00072 void processEmittedEvent(global_out_port_id_t out_port_id, Time time);
00073
00074 MersenneTwister19937 sim_random_eng;
00075 };
00076
00077 inline void EvSimEngine::scheduleEvent( global_out_port_id_t port_id, Time t)
00078 {
00079 processEmittedEvent(port_id, t);
00080 }
00081
00082
00083 extern RandomEngine * global_sim_random_eng;
00084
00085 #endif