00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __CMODULE_H
00021 #define __CMODULE_H
00022
00023 #include "defs.h"
00024
00025 #include <time.h>
00026 #include "cobject.h"
00027 #include "ccoroutine.h"
00028 #include "globals.h"
00029 #include "carray.h"
00030 #include "cqueue.h"
00031 #include "cgate.h"
00032 #include "csimul.h"
00033 #include "cdefaultlist.h"
00034
00035
00036 enum {
00037 sENDED,
00038 sREADY
00039 };
00040
00041
00042 enum {
00043 dispSUBMOD=0,
00044 dispENCLOSINGMOD=1,
00045 dispNUMTYPES
00046 };
00047
00048
00049 class cMessage;
00050 class cGate;
00051 class cModulePar;
00052 class cModule;
00053 class cCompoundModule;
00054 class cSimulation;
00055 class cModuleType;
00056
00057
00063
00069 SIM_API void connect(cModule *frm, int frg,
00070 cChannelType *linkp,
00071 cModule *tom, int tog);
00072
00078 SIM_API void connect(cModule *frm, int frg,
00079 cPar *delayp, cPar *errorp, cPar *dataratep,
00080 cModule *tom, int tog);
00082
00091 typedef void (*DisplayStringNotifyFunc)(cModule*,bool,void*);
00092
00093
00094
00106 class SIM_API cModule : public cDefaultList
00107 {
00108 friend class cGate;
00109 friend class cModulePar;
00110 friend class cSimulation;
00111 friend class cModuleType;
00112 friend class cSubModIterator;
00113
00114 public:
00115 static bool pause_in_sendmsg;
00116 static std::string lastmodulefullpath;
00117 static const cModule *lastmodulefullpathmod;
00118
00119 protected:
00120 mutable char *fullname;
00121 cModuleType *mod_type;
00122 int mod_id;
00123
00124
00125
00126
00127 cModule *prevp, *nextp;
00128 cModule *firstsubmodp;
00129 cModule *lastsubmodp;
00130
00131 public:
00132
00133
00134 cArray gatev;
00135 cArray paramv;
00136
00137 protected:
00138 int idx;
00139 int vectsize;
00140
00141 cDisplayString *dispstr;
00142 cDisplayString *bgdispstr;
00143
00144 bool ev_enabled;
00145
00146 short rngmapsize;
00147 int *rngmap;
00148
00149 public:
00150
00151
00152 bool hasDisplayString() {return dispstr!=NULL;}
00153 bool hasBackgroundDisplayString() {return bgdispstr!=NULL;}
00154
00155
00156 void setEvEnabled(bool e) {ev_enabled = e;}
00157 bool isEvEnabled() {return ev_enabled;}
00158
00159
00160 void setRNGMap(short size, int *map) {rngmapsize=size; rngmap=map;}
00161
00162 protected:
00163
00164
00165 virtual void arrived(cMessage *msg,int n,simtime_t t) = 0;
00166
00167
00168 virtual void setId(int n);
00169
00170
00171
00172 virtual void setIndex(int i, int n);
00173
00174
00175
00176 virtual void setModuleType(cModuleType *mtype);
00177
00178
00179 void insertSubmodule(cModule *mod);
00180
00181
00182 void removeSubmodule(cModule *mod);
00183
00184
00185
00186 virtual cGate *createGateObject(const char *gname, char tp);
00187
00188 protected:
00211
00222 virtual void doBuildInside() {}
00223
00228 virtual void initialize(int stage) {if(stage==0) initialize();}
00229
00235 virtual int numInitStages() const {return 1;}
00236
00241 virtual void initialize();
00242
00247 virtual void finish();
00248
00269 virtual void handleParameterChange(const char *parname);
00271
00272 public:
00275
00279 cModule(const cModule& mod);
00280
00288 cModule();
00289
00293 virtual ~cModule();
00294
00299 cModule& operator=(const cModule& mod);
00301
00304
00305
00306
00311 virtual void forEachChild(cVisitor *v);
00312
00316 virtual void setName(const char *s);
00317
00323 virtual const char *fullName() const;
00324
00328 virtual std::string fullPath() const;
00329
00335 virtual const char *fullPath(char *buffer, int bufsize) const;
00337
00340
00345 cGate *addGate(const char *s, char tp, bool isvector=false);
00346
00362 int setGateSize(const char *s, int size);
00363
00367 cPar *addPar(const char *s);
00368
00390 virtual int buildInside();
00392
00395
00400 virtual bool isSimple() const;
00401
00405 cModuleType *moduleType() const {return mod_type;}
00406
00414 int id() const {return mod_id;}
00415
00420 cModule *parentModule() const {return dynamic_cast<cModule *>(owner());}
00421
00425 bool isVector() const {return vectsize>=0;}
00426
00430 int index() const {return idx;}
00431
00436 int size() const {return vectsize<0?1:vectsize;}
00437
00443 cRNG *rng(int k) const {return ev.rng(k<rngmapsize ? rngmap[k] : k);}
00445
00448
00454 int findSubmodule(const char *submodname, int idx=-1);
00455
00461 cModule *submodule(const char *submodname, int idx=-1);
00462
00469 cModule *moduleByRelativePath(const char *path);
00471
00474
00479 int gates() const {return gatev.items();}
00480
00486 cGate *gate(int g) {return (cGate*)gatev[g];}
00487
00493 const cGate *gate(int g) const {return (const cGate*)gatev[g];}
00494
00499 cGate *gate(const char *gatename,int sn=-1);
00500
00504 const cGate *gate(const char *gatename,int sn=-1) const;
00505
00514 int gateSize(const char *gatename) const;
00515
00520 int findGate(const char *gatename, int sn=-1) const;
00521
00525 bool hasGate(const char *gatename, int sn=-1) const {return findGate(gatename,sn)>=0;}
00526
00533 bool checkInternalConnections() const;
00535
00538
00542 int params() const {return paramv.items();}
00543
00548 cPar& par(int p);
00549
00554 cPar& par(const char *parname);
00555
00560 int findPar(const char *parname) const;
00561
00566 cPar& ancestorPar(const char *parname);
00567
00571 bool hasPar(const char *s) const {return findPar(s)>=0;}
00573
00579
00584 virtual void callInitialize();
00585
00590 virtual bool callInitialize(int stage);
00591
00595 virtual void callFinish();
00597
00600
00607 virtual void scheduleStart(simtime_t t) = 0;
00608
00614 virtual void deleteModule();
00615
00637 virtual void changeParentTo(cModule *mod);
00639
00642
00647 cDisplayString& displayString();
00648
00653 cDisplayString& backgroundDisplayString();
00654
00658 void setDisplayString(const char *dispstr, bool immediate=true);
00659
00663 void setBackgroundDisplayString(const char *dispstr, bool immediate=true);
00664
00669 const char *displayString(int type);
00670
00675 void setDisplayString(int type, const char *dispstr, bool immediate=true);
00676
00681 void bubble(const char *text);
00683 };
00684
00685
00686
00694 class SIM_API cCompoundModule : public cModule
00695 {
00696 friend class TCompoundModInspector;
00697
00698 protected:
00699
00700 virtual void arrived(cMessage *msg,int n,simtime_t t);
00701
00702 public:
00705
00709 cCompoundModule(const cCompoundModule& mod);
00710
00715 cCompoundModule();
00716
00720 virtual ~cCompoundModule();
00721
00725 cCompoundModule& operator=(const cCompoundModule& mod);
00727
00730
00735 virtual cPolymorphic *dup() const {return new cCompoundModule(*this);}
00736
00741 virtual std::string info() const;
00743
00746
00751 virtual void scheduleStart(simtime_t t);
00753 };
00754
00755
00756
00769 class SIM_API cSubModIterator
00770 {
00771 private:
00772 cModule *p;
00773
00774 public:
00778 cSubModIterator(const cModule& h) {p = &h ? h.firstsubmodp : NULL;}
00779
00783 void init(const cModule& h) {p = &h ? h.firstsubmodp : NULL;}
00784
00790 cModule *operator()() const {return p;}
00791
00795 bool end() const {return (bool)(p==NULL);}
00796
00802 cModule *operator++(int) {if (!p) return NULL; cModule *t=p; p=p->nextp; return t;}
00803 };
00804
00805
00806
00807 #endif
00808