00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __adevs_models_h_
00021 #define __adevs_models_h_
00022 #include "adevs_time.h"
00023 #include "adevs_bag.h"
00024 #include "adevs_set.h"
00025 #include "adevs_exception.h"
00026 #include <cstdlib>
00027
00028 namespace adevs
00029 {
00030
00031
00032
00033
00034
00035 template <class X, class T> class Network;
00036 template <class X, class T> class Atomic;
00037 template <class X, class T> class Schedule;
00038 template <class X, class T> class Simulator;
00039
00040
00041
00042
00043
00044 #define ADEVS_NOT_ASSIGNED_TO_PROCESSOR -1
00045
00052 template <class X, class T = double> class Devs
00053 {
00054 public:
00056 Devs():
00057 parent(NULL),
00058 proc(ADEVS_NOT_ASSIGNED_TO_PROCESSOR)
00059 {
00060 }
00062 virtual ~Devs()
00063 {
00064 }
00070 virtual Network<X,T>* typeIsNetwork() { return NULL; }
00072 virtual Atomic<X,T>* typeIsAtomic() { return NULL; }
00077 const Network<X,T>* getParent() const { return parent; }
00078 Network<X,T>* getParent() { return parent; }
00085 void setParent(Network<X,T>* parent) { this->parent = parent; }
00098 virtual bool model_transition() { return false; }
00106 virtual T lookahead() { return adevs_zero<T>(); }
00113 void setProc(int proc) { this->proc = proc; }
00118 int getProc() { return proc; }
00119
00120 private:
00121 Network<X,T>* parent;
00122 int proc;
00123 };
00124
00130 template <class X, class T = double> class Event
00131 {
00132 public:
00134 Event():
00135 model(NULL),
00136 value()
00137 {
00138 }
00146 Event(Devs<X,T>* model, const X& value):
00147 model(model),
00148 value(value)
00149 {
00150 }
00152 Event(const Event<X,T>& src):
00153 model(src.model),
00154 value(src.value)
00155 {
00156 }
00158 const Event<X,T>& operator=(const Event<X,T>& src)
00159 {
00160 model = src.model;
00161 value = src.value;
00162 return *this;
00163 }
00165 Devs<X,T>* model;
00167 X value;
00169 ~Event()
00170 {
00171 }
00172 };
00173
00177 template <class X, class T = double> class Atomic: public Devs<X,T>
00178 {
00179 public:
00181 Atomic():
00182 Devs<X,T>()
00183 {
00184 tL = adevs_zero<T>();
00185 tL_cp = adevs_sentinel<T>();
00186 x = y = NULL;
00187 q_index = 0;
00188 }
00190 virtual void delta_int() = 0;
00196 virtual void delta_ext(T e, const Bag<X>& xb) = 0;
00201 virtual void delta_conf(const Bag<X>& xb) = 0;
00206 virtual void output_func(Bag<X>& yb) = 0;
00211 virtual T ta() = 0;
00218 virtual void gc_output(Bag<X>& g) = 0;
00228 virtual void beginLookahead()
00229 {
00230 method_not_supported_exception ns("beginLookahead",this);
00231 throw ns;
00232 }
00239 virtual void endLookahead(){}
00241 virtual ~Atomic(){}
00243 Atomic<X,T>* typeIsAtomic() { return this; }
00244 protected:
00251 T getLastEventTime() const { return tL; }
00252
00253 private:
00254
00255 friend class Simulator<X,T>;
00256 friend class Schedule<X,T>;
00257
00258
00259 T tL;
00260
00261 unsigned int q_index;
00262
00263 Bag<X> *x, *y;
00264
00265 T tL_cp;
00266 };
00267
00271 template <class X, class T = double> class Network: public Devs<X,T>
00272 {
00273 public:
00275 Network():
00276 Devs<X,T>()
00277 {
00278 }
00285 virtual void getComponents(Set<Devs<X,T>*>& c) = 0;
00297 virtual void route(const X& value, Devs<X,T>* model, Bag<Event<X,T> >& r) = 0;
00302 virtual ~Network()
00303 {
00304 }
00306 Network<X,T>* typeIsNetwork() { return this; }
00307 };
00308
00309 }
00310
00311 #endif