adevs
adevs_models.h
1 
31 #ifndef __adevs_models_h_
32 #define __adevs_models_h_
33 #include "adevs_time.h"
34 #include "adevs_bag.h"
35 #include "adevs_set.h"
36 #include "adevs_exception.h"
37 #include <cstdlib>
38 
39 namespace adevs
40 {
41 
42 /*
43  * Declare network and atomic model so types can be used as the type of
44  * parent in the basic Devs model and for type ID functions.
45  */
46 template <class X, class T> class Network;
47 template <class X, class T> class Atomic;
48 template <class X, class T> class Schedule;
49 template <class X, class T> class Simulator;
50 
51 /*
52  * Constant indicating no processor assignment for the model. This is used by the
53  * parallel simulator
54  */
55 #define ADEVS_NOT_ASSIGNED_TO_PROCESSOR -1
56 
63 template <class X, class T = double> class Devs
64 {
65  public:
67  Devs():
68  parent(NULL),
69  proc(ADEVS_NOT_ASSIGNED_TO_PROCESSOR)
70  {
71  }
73  virtual ~Devs()
74  {
75  }
81  virtual Network<X,T>* typeIsNetwork() { return NULL; }
83  virtual Atomic<X,T>* typeIsAtomic() { return NULL; }
88  const Network<X,T>* getParent() const { return parent; }
89  Network<X,T>* getParent() { return parent; }
96  void setParent(Network<X,T>* parent) { this->parent = parent; }
110  virtual bool model_transition() { return false; }
118  virtual T lookahead() { return adevs_zero<T>(); }
125  void setProc(int proc) { this->proc = proc; }
130  int getProc() { return proc; }
131 
132  private:
133  Network<X,T>* parent;
134  int proc;
135 };
136 
142 template <class X, class T = double> class Event
143 {
144  public:
146  Event():
147  model(NULL),
148  value()
149  {
150  }
158  Event(Devs<X,T>* model, const X& value):
159  model(model),
160  value(value)
161  {
162  }
164  Event(const Event<X,T>& src):
165  model(src.model),
166  value(src.value)
167  {
168  }
170  const Event<X,T>& operator=(const Event<X,T>& src)
171  {
172  model = src.model;
173  value = src.value;
174  return *this;
175  }
179  X value;
182  {
183  }
184 };
185 
189 template <class X, class T = double> class Atomic: public Devs<X,T>
190 {
191  public:
194  Devs<X,T>()
195  {
196  tL = adevs_zero<T>();
197  tL_cp = adevs_sentinel<T>();
198  x = y = NULL;
199  q_index = 0; // The Schedule requires this to be zero
200  }
202  virtual void delta_int() = 0;
208  virtual void delta_ext(T e, const Bag<X>& xb) = 0;
213  virtual void delta_conf(const Bag<X>& xb) = 0;
218  virtual void output_func(Bag<X>& yb) = 0;
223  virtual T ta() = 0;
230  virtual void gc_output(Bag<X>& g) = 0;
240  virtual void beginLookahead()
241  {
242  method_not_supported_exception ns("beginLookahead",this);
243  throw ns;
244  }
251  virtual void endLookahead(){}
253  virtual ~Atomic(){}
255  Atomic<X,T>* typeIsAtomic() { return this; }
256  protected:
263  T getLastEventTime() const { return tL; }
264 
265  private:
266 
267  friend class Simulator<X,T>;
268  friend class Schedule<X,T>;
269 
270  // Time of last event
271  T tL;
272  // Index in the priority queue
273  unsigned int q_index;
274  // Input and output event bags
275  Bag<X> *x, *y;
276  // When did the model start checkpointing?
277  T tL_cp;
278 };
279 
283 template <class X, class T = double> class Network: public Devs<X,T>
284 {
285  public:
288  Devs<X,T>()
289  {
290  }
297  virtual void getComponents(Set<Devs<X,T>*>& c) = 0;
309  virtual void route(const X& value, Devs<X,T>* model, Bag<Event<X,T> >& r) = 0;
314  virtual ~Network()
315  {
316  }
318  Network<X,T>* typeIsNetwork() { return this; }
319 };
320 
321 } // end of namespace
322 
323 #endif
Atomic< X, T > * typeIsAtomic()
Returns a pointer to this model.
Definition: adevs_models.h:255
Definition: adevs_models.h:49
virtual void route(const X &value, Devs< X, T > *model, Bag< Event< X, T > > &r)=0
Definition: adevs_set.h:42
Event()
Constructor. Sets the model to NULL.
Definition: adevs_models.h:146
Devs< X, T > * model
The model associated with the event.
Definition: adevs_models.h:177
Definition: adevs_models.h:46
virtual void endLookahead()
Definition: adevs_models.h:251
virtual void gc_output(Bag< X > &g)=0
int getProc()
Definition: adevs_models.h:130
virtual void delta_int()=0
Internal transition function.
~Event()
Destructor.
Definition: adevs_models.h:181
virtual void getComponents(Set< Devs< X, T > * > &c)=0
virtual T lookahead()
Definition: adevs_models.h:118
const Event< X, T > & operator=(const Event< X, T > &src)
Assignment operator.
Definition: adevs_models.h:170
void setParent(Network< X, T > *parent)
Definition: adevs_models.h:96
Atomic()
The constructor should place the model into its initial state.
Definition: adevs_models.h:193
Network< X, T > * typeIsNetwork()
Returns a pointer to this model.
Definition: adevs_models.h:318
Definition: adevs_models.h:48
Event(const Event< X, T > &src)
Copy constructor.
Definition: adevs_models.h:164
Definition: adevs_exception.h:80
virtual void output_func(Bag< X > &yb)=0
virtual Network< X, T > * typeIsNetwork()
Definition: adevs_models.h:81
virtual T ta()=0
T getLastEventTime() const
Definition: adevs_models.h:263
X value
The value associated with the event.
Definition: adevs_models.h:179
virtual bool model_transition()
Definition: adevs_models.h:110
virtual void beginLookahead()
Definition: adevs_models.h:240
virtual ~Devs()
Destructor.
Definition: adevs_models.h:73
virtual Atomic< X, T > * typeIsAtomic()
Returns NULL if this is not an atomic model; returns itself otherwise.
Definition: adevs_models.h:83
virtual ~Network()
Definition: adevs_models.h:314
virtual void delta_ext(T e, const Bag< X > &xb)=0
Definition: adevs_models.h:63
Devs()
Default constructor.
Definition: adevs_models.h:67
virtual void delta_conf(const Bag< X > &xb)=0
virtual ~Atomic()
Destructor.
Definition: adevs_models.h:253
void setProc(int proc)
Definition: adevs_models.h:125
Definition: adevs_models.h:142
Definition: adevs_models.h:47
const Network< X, T > * getParent() const
Definition: adevs_models.h:88
Event(Devs< X, T > *model, const X &value)
Definition: adevs_models.h:158
Network()
Constructor.
Definition: adevs_models.h:287