00001
00031 #ifndef __adevs_models_h_
00032 #define __adevs_models_h_
00033 #include "adevs_time.h"
00034 #include "adevs_bag.h"
00035 #include "adevs_set.h"
00036 #include "adevs_exception.h"
00037 #include <cstdlib>
00038
00039 namespace adevs
00040 {
00041
00042
00043
00044
00045
00046 template <class X, class T> class Network;
00047 template <class X, class T> class Atomic;
00048 template <class X, class T> class Schedule;
00049 template <class X, class T> class Simulator;
00050
00051
00052
00053
00054
00055 #define ADEVS_NOT_ASSIGNED_TO_PROCESSOR -1
00056
00063 template <class X, class T = double> class Devs
00064 {
00065 public:
00067 Devs():
00068 parent(NULL),
00069 proc(ADEVS_NOT_ASSIGNED_TO_PROCESSOR)
00070 {
00071 }
00073 virtual ~Devs()
00074 {
00075 }
00081 virtual Network<X,T>* typeIsNetwork() { return NULL; }
00083 virtual Atomic<X,T>* typeIsAtomic() { return NULL; }
00088 const Network<X,T>* getParent() const { return parent; }
00089 Network<X,T>* getParent() { return parent; }
00096 void setParent(Network<X,T>* parent) { this->parent = parent; }
00110 virtual bool model_transition() { return false; }
00118 virtual T lookahead() { return adevs_zero<T>(); }
00125 void setProc(int proc) { this->proc = proc; }
00130 int getProc() { return proc; }
00131
00132 private:
00133 Network<X,T>* parent;
00134 int proc;
00135 };
00136
00142 template <class X, class T = double> class Event
00143 {
00144 public:
00146 Event():
00147 model(NULL),
00148 value()
00149 {
00150 }
00158 Event(Devs<X,T>* model, const X& value):
00159 model(model),
00160 value(value)
00161 {
00162 }
00164 Event(const Event<X,T>& src):
00165 model(src.model),
00166 value(src.value)
00167 {
00168 }
00170 const Event<X,T>& operator=(const Event<X,T>& src)
00171 {
00172 model = src.model;
00173 value = src.value;
00174 return *this;
00175 }
00177 Devs<X,T>* model;
00179 X value;
00181 ~Event()
00182 {
00183 }
00184 };
00185
00189 template <class X, class T = double> class Atomic: public Devs<X,T>
00190 {
00191 public:
00193 Atomic():
00194 Devs<X,T>()
00195 {
00196 tL = adevs_zero<T>();
00197 tL_cp = adevs_sentinel<T>();
00198 x = y = NULL;
00199 q_index = 0;
00200 }
00202 virtual void delta_int() = 0;
00208 virtual void delta_ext(T e, const Bag<X>& xb) = 0;
00213 virtual void delta_conf(const Bag<X>& xb) = 0;
00218 virtual void output_func(Bag<X>& yb) = 0;
00223 virtual T ta() = 0;
00230 virtual void gc_output(Bag<X>& g) = 0;
00240 virtual void beginLookahead()
00241 {
00242 method_not_supported_exception ns("beginLookahead",this);
00243 throw ns;
00244 }
00251 virtual void endLookahead(){}
00253 virtual ~Atomic(){}
00255 Atomic<X,T>* typeIsAtomic() { return this; }
00256 protected:
00263 T getLastEventTime() const { return tL; }
00264
00265 private:
00266
00267 friend class Simulator<X,T>;
00268 friend class Schedule<X,T>;
00269
00270
00271 T tL;
00272
00273 unsigned int q_index;
00274
00275 Bag<X> *x, *y;
00276
00277 T tL_cp;
00278 };
00279
00283 template <class X, class T = double> class Network: public Devs<X,T>
00284 {
00285 public:
00287 Network():
00288 Devs<X,T>()
00289 {
00290 }
00297 virtual void getComponents(Set<Devs<X,T>*>& c) = 0;
00309 virtual void route(const X& value, Devs<X,T>* model, Bag<Event<X,T> >& r) = 0;
00314 virtual ~Network()
00315 {
00316 }
00318 Network<X,T>* typeIsNetwork() { return this; }
00319 };
00320
00321 }
00322
00323 #endif