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 Simulator;
51 
58 template <typename X, typename T = double> class Devs
59 {
60  public:
62  Devs():
63  parent(NULL)
64  {
65  }
67  virtual ~Devs()
68  {
69  }
75  virtual Network<X,T>* typeIsNetwork() { return NULL; }
77  virtual Atomic<X,T>* typeIsAtomic() { return NULL; }
79  virtual MealyAtomic<X,T>* typeIsMealyAtomic() { return NULL; }
84  const Network<X,T>* getParent() const { return parent; }
85  Network<X,T>* getParent() { return parent; }
92  void setParent(Network<X,T>* parent) { this->parent = parent; }
106  virtual bool model_transition() { return false; }
107  private:
108  Network<X,T>* parent;
109 };
110 
116 template <typename X, typename T = double> class Event
117 {
118  public:
120  Event():
121  model(NULL),
122  value()
123  {
124  }
132  Event(Devs<X,T>* model, const X& value):
133  model(model),
134  value(value)
135  {
136  }
138  Event(const Event<X,T>& src):
139  model(src.model),
140  value(src.value)
141  {
142  }
144  const Event<X,T>& operator=(const Event<X,T>& src)
145  {
146  model = src.model;
147  value = src.value;
148  return *this;
149  }
153  X value;
156  {
157  }
158 };
159 
163 template <typename X, typename T = double> class Atomic: public Devs<X,T>
164 {
165  public:
168  Devs<X,T>(),
169  tL(adevs_zero<T>()),
170  q_index(0), // The Schedule requires this to be zero
171  proc(-1),
172  x(NULL),
173  y(NULL)
174  {
175  }
177  virtual void delta_int() = 0;
183  virtual void delta_ext(T e, const Bag<X>& xb) = 0;
188  virtual void delta_conf(const Bag<X>& xb) = 0;
193  virtual void output_func(Bag<X>& yb) = 0;
198  virtual T ta() = 0;
205  virtual void gc_output(Bag<X>& g) = 0;
207  virtual ~Atomic(){}
209  Atomic<X,T>* typeIsAtomic() { return this; }
210  protected:
217  T getLastEventTime() const { return tL; }
218 
219  private:
220 
221  friend class Simulator<X,T>;
222  friend class Schedule<X,T>;
223 
224  // Time of last event
225  T tL;
226  // Index in the priority queue
227  unsigned int q_index;
228  // Thread assigned to this model
229  int proc;
230  // Input and output event bags
231  Bag<X> *x, *y;
232 };
233 
242 template <typename X, typename T = double> class MealyAtomic:
243  public Atomic<X,T>
244 {
245  public:
246  MealyAtomic<X,T>():Atomic<X,T>(),imm(false){}
252  virtual void output_func(T e, const Bag<X>& xb, Bag<X>& yb) = 0;
257  virtual void output_func(const Bag<X>& xb, Bag<X>& yb) = 0;
258  virtual ~MealyAtomic(){}
259 
260  private:
261 
262  friend class Simulator<X,T>;
263 
264  bool imm;
265 };
266 
270 template <typename X, typename T = double> class Network: public Devs<X,T>
271 {
272  public:
275  Devs<X,T>()
276  {
277  }
284  virtual void getComponents(Set<Devs<X,T>*>& c) = 0;
296  virtual void route(const X& value, Devs<X,T>* model, Bag<Event<X,T> >& r) = 0;
301  virtual ~Network()
302  {
303  }
305  Network<X,T>* typeIsNetwork() { return this; }
306 };
307 
308 } // end of namespace
309 
310 #endif
Atomic< X, T > * typeIsAtomic()
Returns a pointer to this model.
Definition: adevs_models.h:209
Definition: adevs_models.h:50
Definition: adevs_set.h:42
Event()
Constructor. Sets the model to NULL.
Definition: adevs_models.h:120
Devs< X, T > * model
The model associated with the event.
Definition: adevs_models.h:151
Definition: adevs_models.h:46
~Event()
Destructor.
Definition: adevs_models.h:155
const Event< X, T > & operator=(const Event< X, T > &src)
Assignment operator.
Definition: adevs_models.h:144
void setParent(Network< X, T > *parent)
Definition: adevs_models.h:92
Atomic()
The constructor should place the model into its initial state.
Definition: adevs_models.h:167
Network< X, T > * typeIsNetwork()
Returns a pointer to this model.
Definition: adevs_models.h:305
virtual MealyAtomic< X, T > * typeIsMealyAtomic()
Returns NULL if this is not a mealy atomic model; returns itself otherwise.
Definition: adevs_models.h:79
Definition: adevs_models.h:49
Event(const Event< X, T > &src)
Copy constructor.
Definition: adevs_models.h:138
virtual Network< X, T > * typeIsNetwork()
Definition: adevs_models.h:75
T getLastEventTime() const
Definition: adevs_models.h:217
X value
The value associated with the event.
Definition: adevs_models.h:153
Definition: adevs_fmi.h:57
virtual bool model_transition()
Definition: adevs_models.h:106
virtual ~Devs()
Destructor.
Definition: adevs_models.h:67
virtual Atomic< X, T > * typeIsAtomic()
Returns NULL if this is not an atomic model; returns itself otherwise.
Definition: adevs_models.h:77
virtual ~Network()
Definition: adevs_models.h:301
Definition: adevs_models.h:58
Devs()
Default constructor.
Definition: adevs_models.h:62
virtual ~Atomic()
Destructor.
Definition: adevs_models.h:207
Definition: adevs_models.h:116
MealyAtomic< X, T > * typeIsMealyAtomic()
Returns NULL if this is not a mealy atomic model; returns itself otherwise.
Definition: adevs_models.h:247
Definition: adevs_models.h:47
const Network< X, T > * getParent() const
Definition: adevs_models.h:84
Event(Devs< X, T > *model, const X &value)
Definition: adevs_models.h:132
Network()
Constructor.
Definition: adevs_models.h:274
Definition: adevs_models.h:48