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 cSimulation;
00110 friend class cModuleType;
00111 friend class cSubModIterator;
00112
00113 public:
00114 static bool pause_in_sendmsg;
00115 static std::string lastmodulefullpath;
00116 static const cModule *lastmodulefullpathmod;
00117
00118 protected:
00119 mutable char *fullname;
00120 cModuleType *mod_type;
00121 int mod_id;
00122
00123
00124
00125
00126 cModule *prevp, *nextp;
00127 cModule *firstsubmodp;
00128 cModule *lastsubmodp;
00129
00130 public:
00131
00132
00133 cArray gatev;
00134 cArray paramv;
00135
00136 protected:
00137 int idx;
00138 int vectsize;
00139
00140 cDisplayString *dispstr;
00141 cDisplayString *bgdispstr;
00142
00143 bool ev_enabled;
00144
00145 short rngmapsize;
00146 int *rngmap;
00147
00148 public:
00149
00150
00151 bool hasDisplayString() {return dispstr!=NULL;}
00152 bool hasBackgroundDisplayString() {return bgdispstr!=NULL;}
00153
00154
00155 void setEvEnabled(bool e) {ev_enabled = e;}
00156 bool isEvEnabled() {return ev_enabled;}
00157
00158
00159 void setRNGMap(short size, int *map) {rngmapsize=size; rngmap=map;}
00160
00161 protected:
00162
00163
00164 virtual void arrived(cMessage *msg,int n,simtime_t t) = 0;
00165
00166
00167 virtual void setId(int n);
00168
00169
00170
00171 virtual void setIndex(int i, int n);
00172
00173
00174
00175 virtual void setModuleType(cModuleType *mtype);
00176
00177
00178 void insertSubmodule(cModule *mod);
00179
00180
00181 void removeSubmodule(cModule *mod);
00182
00183
00184
00185 virtual cGate *createGateObject(const char *gname, char tp);
00186
00187 protected:
00210
00221 virtual void doBuildInside() {}
00222
00227 virtual void initialize(int stage) {if(stage==0) initialize();}
00228
00234 virtual int numInitStages() const {return 1;}
00235
00240 virtual void initialize();
00241
00246 virtual void finish();
00248
00249 public:
00252
00256 cModule(const cModule& mod);
00257
00265 cModule(const char *name, cModule *parentmod);
00266
00270 virtual ~cModule();
00271
00276 cModule& operator=(const cModule& mod);
00278
00281
00282
00283
00288 virtual void forEachChild(cVisitor *v);
00289
00293 virtual void setName(const char *s);
00294
00300 virtual const char *fullName() const;
00301
00305 virtual std::string fullPath() const;
00306
00312 virtual const char *fullPath(char *buffer, int bufsize) const;
00314
00317
00322 cGate *addGate(const char *s, char tp, bool isvector=false);
00323
00339 int setGateSize(const char *s, int size);
00340
00344 cPar *addPar(const char *s);
00345
00367 virtual int buildInside();
00369
00372
00377 virtual bool isSimple() const;
00378
00382 cModuleType *moduleType() const {return mod_type;}
00383
00391 int id() const {return mod_id;}
00392
00397 cModule *parentModule() const {return dynamic_cast<cModule *>(owner());}
00398
00402 bool isVector() const {return vectsize>=0;}
00403
00407 int index() const {return idx;}
00408
00413 int size() const {return vectsize<0?1:vectsize;}
00414
00420 cRNG *rng(int k) const {return ev.rng(k<rngmapsize ? rngmap[k] : k);}
00422
00425
00431 int findSubmodule(const char *submodname, int idx=-1);
00432
00438 cModule *submodule(const char *submodname, int idx=-1);
00439
00446 cModule *moduleByRelativePath(const char *path);
00448
00451
00456 int gates() const {return gatev.items();}
00457
00463 cGate *gate(int g) {return (cGate*)gatev[g];}
00464
00470 const cGate *gate(int g) const {return (const cGate*)gatev[g];}
00471
00476 cGate *gate(const char *gatename,int sn=-1);
00477
00481 const cGate *gate(const char *gatename,int sn=-1) const;
00482
00491 int gateSize(const char *gatename) const;
00492
00497 int findGate(const char *gatename, int sn=-1) const;
00498
00502 bool hasGate(const char *gatename, int sn=-1) const {return findGate(gatename,sn)>=0;}
00503
00510 bool checkInternalConnections() const;
00512
00515
00519 int params() const {return paramv.items();}
00520
00525 cPar& par(int p);
00526
00531 cPar& par(const char *parname);
00532
00537 int findPar(const char *parname) const;
00538
00543 cPar& ancestorPar(const char *parname);
00544
00548 bool hasPar(const char *s) const {return findPar(s)>=0;}
00550
00556
00561 virtual void callInitialize();
00562
00567 virtual bool callInitialize(int stage);
00568
00572 virtual void callFinish();
00574
00577
00584 virtual void scheduleStart(simtime_t t) = 0;
00585
00591 virtual void deleteModule();
00592
00614 virtual void changeParentTo(cModule *mod);
00616
00619
00624 cDisplayString& displayString();
00625
00630 cDisplayString& backgroundDisplayString();
00631
00635 void setDisplayString(const char *dispstr, bool immediate=true);
00636
00640 void setBackgroundDisplayString(const char *dispstr, bool immediate=true);
00641
00646 const char *displayString(int type);
00647
00652 void setDisplayString(int type, const char *dispstr, bool immediate=true);
00653
00658 void bubble(const char *text);
00660 };
00661
00662
00663
00671 class SIM_API cCompoundModule : public cModule
00672 {
00673 friend class TCompoundModInspector;
00674
00675 protected:
00676
00677 virtual void arrived(cMessage *msg,int n,simtime_t t);
00678
00679 public:
00682
00686 cCompoundModule(const cCompoundModule& mod);
00687
00692 cCompoundModule(const char *name, cModule *parentmod);
00693
00697 virtual ~cCompoundModule();
00698
00702 cCompoundModule& operator=(const cCompoundModule& mod);
00704
00707
00712 virtual cObject *dup() const {return new cCompoundModule(*this);}
00713
00718 virtual std::string info() const;
00720
00723
00728 virtual void scheduleStart(simtime_t t);
00730 };
00731
00732
00733
00746 class SIM_API cSubModIterator
00747 {
00748 private:
00749 cModule *p;
00750
00751 public:
00755 cSubModIterator(const cModule& h) {p = &h ? h.firstsubmodp : NULL;}
00756
00760 void init(const cModule& h) {p = &h ? h.firstsubmodp : NULL;}
00761
00767 cModule *operator()() const {return p;}
00768
00772 bool end() const {return (bool)(p==NULL);}
00773
00779 cModule *operator++(int) {if (!p) return NULL; cModule *t=p; p=p->nextp; return t;}
00780 };
00781
00782
00783
00784 #endif
00785