orca-sim
Public Member Functions | Private Member Functions | Private Attributes | List of all members
orcasim::base::Engine Class Reference

This class implements an event queue to schedule and execute hardware modules. More...

#include <Engine.hpp>

Public Member Functions

 Engine ()
 Default constructor, takes no parameters. More...
 
SimulationTime Run (SimulationTime time=100000)
 Executes the simulator until the internal clock reaches <time> cycles. More...
 
SimulationTime GetGlobalTime ()
 Gets the current global time. More...
 
SimulationTime GetEpochs ()
 Gets the number of cycles to simulate before reseting the simulation clock. More...
 
SimulationTime NextEpoch ()
 Resets the simulation clock and advance simulation to the next epoch. More...
 
void Schedule (const Event &e)
 Adds an event to the simulation queue. More...
 
 ~Engine ()
 Destructor. More...
 

Private Member Functions

void executeNext ()
 execute event at top of event queue More...
 

Private Attributes

SimulationTime _epochs
 number of cycles to simulate before reseting the queue More...
 
std::priority_queue< Event_queue
 queue that stores all events More...
 
SimulationTime _globalTime
 The global clock, stores current simulation time. More...
 
SimulationTime _timeout
 max time the simulation can reach More...
 

Detailed Description

This class implements an event queue to schedule and execute hardware modules.

The <priority_queue> from the std lib is used to sort elements by time.

Definition at line 46 of file Engine.hpp.

Constructor & Destructor Documentation

§ Engine()

Engine::Engine ( )

Default constructor, takes no parameters.

Defaul constructor.

Definition at line 34 of file Engine.cpp.

34  {
35  _queue = std::priority_queue<Event>();
36  _globalTime = 0;
37  _epochs = 0;
38  _timeout = 1;
39 }
std::priority_queue< Event > _queue
queue that stores all events
Definition: Engine.hpp:52
SimulationTime _timeout
max time the simulation can reach
Definition: Engine.hpp:58
SimulationTime _globalTime
The global clock, stores current simulation time.
Definition: Engine.hpp:55
SimulationTime _epochs
number of cycles to simulate before reseting the queue
Definition: Engine.hpp:49

§ ~Engine()

Engine::~Engine ( )

Destructor.

Dtor.

Definition at line 135 of file Engine.cpp.

135  {
136  // nothing to do
137 }

Member Function Documentation

§ executeNext()

void orcasim::base::Engine::executeNext ( )
private

execute event at top of event queue

§ GetEpochs()

SimulationTime Engine::GetEpochs ( )

Gets the number of cycles to simulate before reseting the simulation clock.

Returns
value of __epochs

Definition at line 115 of file Engine.cpp.

115  {
116  return _epochs;
117 }
SimulationTime _epochs
number of cycles to simulate before reseting the queue
Definition: Engine.hpp:49

§ GetGlobalTime()

SimulationTime Engine::GetGlobalTime ( )

Gets the current global time.

Returns
value of _globalTime

Definition at line 110 of file Engine.cpp.

110  {
111  return _globalTime;
112 }
SimulationTime _globalTime
The global clock, stores current simulation time.
Definition: Engine.hpp:55

§ NextEpoch()

SimulationTime Engine::NextEpoch ( )

Resets the simulation clock and advance simulation to the next epoch.

Generate the next epoch for a simulation session.

Returns
The time in which the simulation clock was before advancing to the next epoch.
?

Definition at line 81 of file Engine.cpp.

81  {
82  // get the number of elements scheduled
83  int queue_size = static_cast<int>(_queue.size());
84 
85  // time that amount of time
86  SimulationTime discount = _globalTime - 1;
87 
88  // create a new queue and reschedule events
89  Event tmp_queue[queue_size];
90 
91  // store events in an array so that we can update
92  // them without messing up with the priority queue
93  for (int i = 0; i < queue_size; i++) {
94  tmp_queue[i] = _queue.top();
95  tmp_queue[i].time -= discount;
96 
97  _queue.pop();
98  }
99 
100  // put update events back in simulator's queue
101  for (int i = 0; i < queue_size; i++)
102  _queue.push(tmp_queue[i]);
103 
104  // update epochs counters
105  _epochs++;
106 
107  return _globalTime;
108 }
std::priority_queue< Event > _queue
queue that stores all events
Definition: Engine.hpp:52
SimulationTime _globalTime
The global clock, stores current simulation time.
Definition: Engine.hpp:55
uint32_t SimulationTime
SimulationTime _epochs
number of cycles to simulate before reseting the queue
Definition: Engine.hpp:49

§ Run()

SimulationTime Engine::Run ( SimulationTime  time = 100000)

Executes the simulator until the internal clock reaches <time> cycles.

Runs an epoch of simulation.

Parameters
timeMaximum cycles to simulate
Returns
the time in which the clock ended the simulation.
Parameters
timeNumber of cycles to run
Returns
the time in which the last event was executed. Should roughly correspond to <time>.

Definition at line 46 of file Engine.cpp.

46  {
47  _globalTime = 0;
48  _timeout = time;
49 
50  while (_globalTime <= _timeout) {
51  #ifdef ORCA_BASE_CHECK_FOR_EMPTY_QUEUE
52  if (_queue.size() <= 0) {
53  throw std::runtime_error("Simulation queue is empty");
54  }
55  #endif
56 
57  // get next event to be processed. Since we use a priority
58  // queue to store events, the event nealy in time will be
59  // popped first
60  Event e = _queue.top();
61  _queue.pop();
62 
63  // update global time
64  _globalTime = e.time;
65 
66  // schedule current event to be executed after a certain number
67  // cycles, defined in the correspondent Run method
68  e.time += e.timedModel->Run();
69 
70  // push event back to the queue
71  _queue.push(e);
72  }
73 
74  // return point in time in which the last event was executed
75  return _globalTime;
76 }
std::priority_queue< Event > _queue
queue that stores all events
Definition: Engine.hpp:52
SimulationTime _timeout
max time the simulation can reach
Definition: Engine.hpp:58
SimulationTime _globalTime
The global clock, stores current simulation time.
Definition: Engine.hpp:55

§ Schedule()

void Engine::Schedule ( const Event e)

Adds an event to the simulation queue.

Schedule an event to run in a certain period of time.

Parameters
eEvent to be added
eEvent to run.

Definition at line 122 of file Engine.cpp.

122  {
123  #ifdef URSA_ZERO_TIME_CHECKING
124  if (e.time == 0) {
125  throw std::runtime_error("Simulator: unable to schedule "
126  + e.timedModel->GetName() + " to run in the past. " +
127  "Events must be scheduled to run with time > 0.");
128  }
129  #endif
130  _queue.push(e);
131 }
std::priority_queue< Event > _queue
queue that stores all events
Definition: Engine.hpp:52

Member Data Documentation

§ _epochs

SimulationTime orcasim::base::Engine::_epochs
private

number of cycles to simulate before reseting the queue

Definition at line 49 of file Engine.hpp.

§ _globalTime

SimulationTime orcasim::base::Engine::_globalTime
private

The global clock, stores current simulation time.

Definition at line 55 of file Engine.hpp.

§ _queue

std::priority_queue<Event> orcasim::base::Engine::_queue
private

queue that stores all events

Definition at line 52 of file Engine.hpp.

§ _timeout

SimulationTime orcasim::base::Engine::_timeout
private

max time the simulation can reach

Definition at line 58 of file Engine.hpp.


The documentation for this class was generated from the following files: