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 MealyAtomic;
49 template <class X, class T> class Schedule;
50 template <class X, class T> class Simulator;
51 
52 /*
53  * Constant indicating no processor assignment for the model. This is used by the
54  * parallel simulator
55  */
56 #define ADEVS_NOT_ASSIGNED_TO_PROCESSOR -1
57 
64 template <class X, class T = double> class Devs
65 {
66  public:
68  Devs():
69  parent(NULL),
70  proc(ADEVS_NOT_ASSIGNED_TO_PROCESSOR)
71  {
72  }
74  virtual ~Devs()
75  {
76  }
82  virtual Network<X,T>* typeIsNetwork() { return NULL; }
84  virtual Atomic<X,T>* typeIsAtomic() { return NULL; }
86  virtual MealyAtomic<X,T>* typeIsMealyAtomic() { return NULL; }
91  const Network<X,T>* getParent() const { return parent; }
92  Network<X,T>* getParent() { return parent; }
99  void setParent(Network<X,T>* parent) { this->parent = parent; }
113  virtual bool model_transition() { return false; }
121  virtual T lookahead() { return adevs_zero<T>(); }
128  void setProc(int proc) { this->proc = proc; }
133  int getProc() { return proc; }
134 
135  private:
136  Network<X,T>* parent;
137  int proc;
138 };
139 
145 template <class X, class T = double> class Event
146 {
147  public:
149  Event():
150  model(NULL),
151  value()
152  {
153  }
161  Event(Devs<X,T>* model, const X& value):
162  model(model),
163  value(value)
164  {
165  }
167  Event(const Event<X,T>& src):
168  model(src.model),
169  value(src.value)
170  {
171  }
173  const Event<X,T>& operator=(const Event<X,T>& src)
174  {
175  model = src.model;
176  value = src.value;
177  return *this;
178  }
182  X value;
185  {
186  }
187 };
188 
192 template <class X, class T = double> class Atomic: public Devs<X,T>
193 {
194  public:
197  Devs<X,T>()
198  {
199  tL = adevs_zero<T>();
200  tL_cp = adevs_sentinel<T>();
201  x = y = NULL;
202  q_index = 0; // The Schedule requires this to be zero
203  }
205  virtual void delta_int() = 0;
211  virtual void delta_ext(T e, const Bag<X>& xb) = 0;
216  virtual void delta_conf(const Bag<X>& xb) = 0;
221  virtual void output_func(Bag<X>& yb) = 0;
226  virtual T ta() = 0;
233  virtual void gc_output(Bag<X>& g) = 0;
243  virtual void beginLookahead()
244  {
245  method_not_supported_exception ns("beginLookahead",this);
246  throw ns;
247  }
254  virtual void endLookahead(){}
256  virtual ~Atomic(){}
258  Atomic<X,T>* typeIsAtomic() { return this; }
259  protected:
266  T getLastEventTime() const { return tL; }
267 
268  private:
269 
270  friend class Simulator<X,T>;
271  friend class Schedule<X,T>;
272 
273  // Time of last event
274  T tL;
275  // Index in the priority queue
276  unsigned int q_index;
277  // Input and output event bags
278  Bag<X> *x, *y;
279  // When did the model start checkpointing?
280  T tL_cp;
281 };
282 
291 template <class X, class T = double> class MealyAtomic:
292  public Atomic<X,T>
293 {
294  public:
295  MealyAtomic<X,T>():Atomic<X,T>(),imm(false){}
301  virtual void output_func(T e, const Bag<X>& xb, Bag<X>& yb) = 0;
306  virtual void output_func(const Bag<X>& xb, Bag<X>& yb) = 0;
307  virtual ~MealyAtomic(){}
308 
309  private:
310 
311  friend class Simulator<X,T>;
312 
313  bool imm;
314 };
315 
319 template <class X, class T = double> class Network: public Devs<X,T>
320 {
321  public:
324  Devs<X,T>()
325  {
326  }
333  virtual void getComponents(Set<Devs<X,T>*>& c) = 0;
345  virtual void route(const X& value, Devs<X,T>* model, Bag<Event<X,T> >& r) = 0;
350  virtual ~Network()
351  {
352  }
354  Network<X,T>* typeIsNetwork() { return this; }
355 };
356 
357 } // end of namespace
358 
359 #endif
Atomic< X, T > * typeIsAtomic()
Returns a pointer to this model.
Definition: adevs_models.h:258
Definition: adevs_models.h:50
Definition: adevs_set.h:42
Event()
Constructor. Sets the model to NULL.
Definition: adevs_models.h:149
Devs< X, T > * model
The model associated with the event.
Definition: adevs_models.h:180
Definition: adevs_models.h:46
virtual void endLookahead()
Definition: adevs_models.h:254
int getProc()
Definition: adevs_models.h:133
~Event()
Destructor.
Definition: adevs_models.h:184
virtual T lookahead()
Definition: adevs_models.h:121
const Event< X, T > & operator=(const Event< X, T > &src)
Assignment operator.
Definition: adevs_models.h:173
void setParent(Network< X, T > *parent)
Definition: adevs_models.h:99
Atomic()
The constructor should place the model into its initial state.
Definition: adevs_models.h:196
Network< X, T > * typeIsNetwork()
Returns a pointer to this model.
Definition: adevs_models.h:354
virtual MealyAtomic< X, T > * typeIsMealyAtomic()
Returns NULL if this is not a mealy atomic model; returns itself otherwise.
Definition: adevs_models.h:86
Definition: adevs_models.h:49
Event(const Event< X, T > &src)
Copy constructor.
Definition: adevs_models.h:167
Definition: adevs_exception.h:80
virtual Network< X, T > * typeIsNetwork()
Definition: adevs_models.h:82
T getLastEventTime() const
Definition: adevs_models.h:266
X value
The value associated with the event.
Definition: adevs_models.h:182
Definition: adevs_fmi.h:56
virtual bool model_transition()
Definition: adevs_models.h:113
virtual void beginLookahead()
Definition: adevs_models.h:243
virtual ~Devs()
Destructor.
Definition: adevs_models.h:74
virtual Atomic< X, T > * typeIsAtomic()
Returns NULL if this is not an atomic model; returns itself otherwise.
Definition: adevs_models.h:84
virtual ~Network()
Definition: adevs_models.h:350
Definition: adevs_models.h:64
Devs()
Default constructor.
Definition: adevs_models.h:68
virtual ~Atomic()
Destructor.
Definition: adevs_models.h:256
void setProc(int proc)
Definition: adevs_models.h:128
Definition: adevs_models.h:145
MealyAtomic< X, T > * typeIsMealyAtomic()
Returns NULL if this is not a mealy atomic model; returns itself otherwise.
Definition: adevs_models.h:296
Definition: adevs_models.h:47
const Network< X, T > * getParent() const
Definition: adevs_models.h:91
Event(Devs< X, T > *model, const X &value)
Definition: adevs_models.h:161
Network()
Constructor.
Definition: adevs_models.h:323
Definition: adevs_models.h:48