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 <typename X, typename T> class Network;
47 template <typename X, typename T> class Atomic;
48 template <typename X, typename T> class MealyAtomic;
49 template <typename X, typename T> class Schedule;
50 template <typename X, typename T> class MultiSchedule;
51 template <typename X, typename T> class Simulator;
52 
59 template <typename X, typename T = double> class Devs
60 {
61  public:
63  Devs():
64  parent(NULL)
65  {
66  }
68  virtual ~Devs()
69  {
70  }
76  virtual Network<X,T>* typeIsNetwork() { return NULL; }
78  virtual Atomic<X,T>* typeIsAtomic() { return NULL; }
80  virtual MealyAtomic<X,T>* typeIsMealyAtomic() { return NULL; }
85  const Network<X,T>* getParent() const { return parent; }
86  Network<X,T>* getParent() { return parent; }
93  void setParent(Network<X,T>* parent) { this->parent = parent; }
107  virtual bool model_transition() { return false; }
108  private:
109  Network<X,T>* parent;
110 };
111 
117 template <typename X, typename T = double> class Event
118 {
119  public:
121  Event():
122  model(NULL),
123  value()
124  {
125  }
133  Event(Devs<X,T>* model, const X& value):
134  model(model),
135  value(value)
136  {
137  }
139  Event(const Event<X,T>& src):
140  model(src.model),
141  value(src.value)
142  {
143  }
145  const Event<X,T>& operator=(const Event<X,T>& src)
146  {
147  model = src.model;
148  value = src.value;
149  return *this;
150  }
154  X value;
157  {
158  }
159 };
160 
164 template <typename X, typename T = double> class Atomic: public Devs<X,T>
165 {
166  public:
169  Devs<X,T>(),
170  tL(adevs_zero<T>()),
171  q_index(0), // The Schedule requires this to be zero
172  proc(-1),
173  x(NULL),
174  y(NULL)
175  {
176  }
178  virtual void delta_int() = 0;
184  virtual void delta_ext(T e, const Bag<X>& xb) = 0;
189  virtual void delta_conf(const Bag<X>& xb) = 0;
194  virtual void output_func(Bag<X>& yb) = 0;
199  virtual T ta() = 0;
206  virtual void gc_output(Bag<X>& g) = 0;
208  virtual ~Atomic(){}
210  Atomic<X,T>* typeIsAtomic() { return this; }
211  protected:
218  T getLastEventTime() const { return tL; }
219 
220  private:
221 
222  friend class Simulator<X,T>;
223  friend class Schedule<X,T>;
224  friend class MultiSchedule<X,T>;
225 
226  // Time of last event
227  T tL;
228  // Index in the priority queue
229  unsigned int q_index;
230  // Thread assigned to this model
231  int proc;
232  // Input and output event bags
233  Bag<X> *x, *y;
234 };
235 
244 template <typename X, typename T = double> class MealyAtomic:
245  public Atomic<X,T>
246 {
247  public:
248  MealyAtomic<X,T>():Atomic<X,T>(),imm(false){}
254  virtual void output_func(T e, const Bag<X>& xb, Bag<X>& yb) = 0;
259  virtual void output_func(const Bag<X>& xb, Bag<X>& yb) = 0;
260  virtual ~MealyAtomic(){}
261 
262  private:
263 
264  friend class Simulator<X,T>;
265 
266  bool imm;
267 };
268 
272 template <typename X, typename T = double> class Network: public Devs<X,T>
273 {
274  public:
277  Devs<X,T>()
278  {
279  }
286  virtual void getComponents(Set<Devs<X,T>*>& c) = 0;
298  virtual void route(const X& value, Devs<X,T>* model, Bag<Event<X,T> >& r) = 0;
303  virtual ~Network()
304  {
305  }
307  Network<X,T>* typeIsNetwork() { return this; }
308 };
309 
310 } // end of namespace
311 
312 #endif
Atomic< X, T > * typeIsAtomic()
Returns a pointer to this model.
Definition: adevs_models.h:210
Definition: adevs_models.h:51
Definition: adevs_set.h:42
Event()
Constructor. Sets the model to NULL.
Definition: adevs_models.h:121
Devs< X, T > * model
The model associated with the event.
Definition: adevs_models.h:152
Definition: adevs_models.h:46
Definition: adevs_models.h:50
~Event()
Destructor.
Definition: adevs_models.h:156
const Event< X, T > & operator=(const Event< X, T > &src)
Assignment operator.
Definition: adevs_models.h:145
void setParent(Network< X, T > *parent)
Definition: adevs_models.h:93
Atomic()
The constructor should place the model into its initial state.
Definition: adevs_models.h:168
Network< X, T > * typeIsNetwork()
Returns a pointer to this model.
Definition: adevs_models.h:307
virtual MealyAtomic< X, T > * typeIsMealyAtomic()
Returns NULL if this is not a mealy atomic model; returns itself otherwise.
Definition: adevs_models.h:80
Definition: adevs_models.h:49
Event(const Event< X, T > &src)
Copy constructor.
Definition: adevs_models.h:139
virtual Network< X, T > * typeIsNetwork()
Definition: adevs_models.h:76
T getLastEventTime() const
Definition: adevs_models.h:218
X value
The value associated with the event.
Definition: adevs_models.h:154
Definition: adevs_fmi.h:57
virtual bool model_transition()
Definition: adevs_models.h:107
virtual ~Devs()
Destructor.
Definition: adevs_models.h:68
virtual Atomic< X, T > * typeIsAtomic()
Returns NULL if this is not an atomic model; returns itself otherwise.
Definition: adevs_models.h:78
virtual ~Network()
Definition: adevs_models.h:303
Definition: adevs_models.h:59
Devs()
Default constructor.
Definition: adevs_models.h:63
virtual ~Atomic()
Destructor.
Definition: adevs_models.h:208
Definition: adevs_models.h:117
MealyAtomic< X, T > * typeIsMealyAtomic()
Returns NULL if this is not a mealy atomic model; returns itself otherwise.
Definition: adevs_models.h:249
Definition: adevs_models.h:47
const Network< X, T > * getParent() const
Definition: adevs_models.h:85
Event(Devs< X, T > *model, const X &value)
Definition: adevs_models.h:133
Network()
Constructor.
Definition: adevs_models.h:276
Definition: adevs_models.h:48