Class implementing the BufferManager module that parses the TTEthernet XML configuration and configures the buffers. More...
#include <BufferManager.h>
Protected Member Functions | |
virtual void | initialize (int stage) |
Is called in initialization phase. | |
virtual int | numInitStages () const |
Returns the numer of initializaiton stages this module needs. | |
virtual void | handleMessage (cMessage *msg) |
Deletes the module when it receives a message. |
Class implementing the BufferManager module that parses the TTEthernet XML configuration and configures the buffers.
The class requires the following libraries:
The parsing is done in the second stage (stage=1) in the initialization phase. The module registers a self message to delete itself when the simulation starts.
Definition at line 45 of file BufferManager.h.
void TTEthernetModel::BufferManager::handleMessage | ( | cMessage * | msg | ) | [protected, virtual] |
Deletes the module when it receives a message.
param msg the incoming delete message
Definition at line 285 of file BufferManager.cc.
void TTEthernetModel::BufferManager::initialize | ( | int | stage | ) | [protected, virtual] |
Is called in initialization phase.
The module parses when stage==1
stage | the stages. Module parses when stage==1, otherwise it does nothing. |
Definition at line 38 of file BufferManager.cc.
00039 { 00040 if (stage == 1) 00041 { 00042 unsigned int xPosition = 0; 00043 unsigned int yPosition = 0; 00044 00045 ConfigurationUtils::getPreloadedMMR(); 00046 ecorecpp::ModelRepository *mr = ecorecpp::ModelRepository::_instance(); 00047 ConfigurationUtils::resolveCommonAliases(mr); 00048 ::ecore::EObject *eobj = mr->getByFilename(getParentModule()->par("network_configuration")); 00049 assert(eobj); 00050 NetworkConfig *nc = ::ecore::instanceOf<NetworkConfig>(eobj); 00051 assert(nc); 00052 DeviceSpecification *dc = ConfigurationUtils::getDeviceSpecification(getParentModule()->par("device_name"), nc); 00053 EList<VirtualLinkSchedule>& vlSchedulesList = dc->getVlSchedules()->getVlSchedule(); 00054 for (unsigned int i = 0; i < vlSchedulesList.size(); i++) 00055 { 00056 VirtualLinkSchedule_ptr vls = vlSchedulesList.get(i); 00057 EList<CTIncoming>& incomingList = vls->getIncoming(); 00058 for (unsigned int j = 0; j < incomingList.size(); j++) 00059 { 00060 CTIncoming_ptr incoming = incomingList.get(j); 00061 cModuleType *moduleType; 00062 cModule* newCTCModule; 00063 if (incoming->eClass()->getName() == "TTIncoming") 00064 { 00065 Device_Specification::TTIncoming *ttincoming = incoming->as<Device_Specification::TTIncoming> (); 00066 moduleType = cModuleType::get("ttethernet.ctc.TTIncoming"); 00067 std::string ctcName = vls->getRefVirtualLink()->getVlid().c_str(); 00068 ctcName.append("_CTC"); 00069 newCTCModule = moduleType->create(ctcName.c_str(), getParentModule()); 00070 //parameters 00071 newCTCModule->par("receive_window_start") = ConfigurationUtils::time2ticks( 00072 ttincoming->getReceiveWindowStart(), 00073 getParentModule()->getSubmodule("tteScheduler")->par("tick").doubleValue()); 00074 newCTCModule->par("receive_window_end") = ConfigurationUtils::time2ticks( 00075 ttincoming->getReceiveWindowEnd(), 00076 getParentModule()->getSubmodule("tteScheduler")->par("tick").doubleValue()); 00077 newCTCModule->par("permanence_pit") = ConfigurationUtils::time2ticks( 00078 ttincoming->getPermanencePit(), 00079 getParentModule()->getSubmodule("tteScheduler")->par("tick").doubleValue()); 00080 } 00081 else if (incoming->eClass()->getName() == "RCIncoming") 00082 { 00083 Device_Specification::RCIncoming *rcincoming = incoming->as<Device_Specification::RCIncoming> (); 00084 moduleType = cModuleType::get("ttethernet.ctc.RCIncoming"); 00085 std::string ctcName = vls->getRefVirtualLink()->getVlid().c_str(); 00086 ctcName.append("_CTC"); 00087 newCTCModule = moduleType->create(ctcName.c_str(), getParentModule()); 00088 //parameters 00089 newCTCModule->par("bag") = ConfigurationUtils::time2ticks(rcincoming->getRefBagAccount()->getBag(), 00090 getParentModule()->getSubmodule("tteScheduler")->par("tick").doubleValue()); 00091 newCTCModule->par("jitter") = ConfigurationUtils::time2ticks( 00092 rcincoming->getRefBagAccount()->getJitter(), 00093 getParentModule()->getSubmodule("tteScheduler")->par("tick").doubleValue()); 00094 } 00095 else 00096 { 00097 continue; 00098 } 00099 newCTCModule->finalizeParameters(); 00100 newCTCModule->buildInside(); 00101 newCTCModule->callInitialize(); 00102 newCTCModule->getDisplayString().setTagArg("p", 0, X_POS_GUIBUFFER+200*xPosition); 00103 newCTCModule->getDisplayString().setTagArg("p", 1, Y_POS_GUIBUFFER+60*yPosition); 00104 00105 cModule* newModule; 00106 //Create Outgoing Buffers 00107 EList<Outgoing>& outgoingList = incoming->getOutgoing(); 00108 for (unsigned int k = 0; k < outgoingList.size(); k++) 00109 { 00110 Outgoing_ptr outgoing = outgoingList.get(k); 00111 if (outgoing->eClass()->getName() == "TTOutgoing") 00112 { 00113 TTOutgoing_ptr ttoutgoing = outgoing->as<TTOutgoing> (); 00114 //TODO: This may be wrong! What is the difference between incoming and outgoing buffer depth 00115 if (incoming->getBufferDepth() > 0) 00116 { 00117 moduleType = cModuleType::get("ttethernet.buffer.TTQueueBuffer"); 00118 } 00119 else 00120 { 00121 moduleType = cModuleType::get("ttethernet.buffer.TTDoubleBuffer"); 00122 } 00123 00124 newModule = moduleType->create(vls->getRefVirtualLink()->getVlid().c_str(), getParentModule()); 00125 //parameters 00126 newModule->par("sendWindowStart") = ConfigurationUtils::time2ticks( 00127 ttoutgoing->getSendWindowStart(), 00128 getParentModule()->getSubmodule("tteScheduler")->par("tick").doubleValue()); 00129 newModule->par("sendWindowEnd") = ConfigurationUtils::time2ticks( 00130 ttoutgoing->getSendWindowEnd(), 00131 getParentModule()->getSubmodule("tteScheduler")->par("tick").doubleValue()); 00132 00133 } 00134 else if (outgoing->eClass()->getName() == "RCOutgoing") 00135 { 00136 RCOutgoing_ptr rcoutgoing = outgoing->as<RCOutgoing> (); 00137 //TODO: This may be wrong! What is the difference between incoming and outgoing buffer depth 00138 if (incoming->getBufferDepth() > 0) 00139 { 00140 moduleType = cModuleType::get("ttethernet.buffer.RCQueueBuffer"); 00141 } 00142 else 00143 { 00144 moduleType = cModuleType::get("ttethernet.buffer.RCDoubleBuffer"); 00145 } 00146 00147 newModule = moduleType->create(vls->getRefVirtualLink()->getVlid().c_str(), getParentModule()); 00148 //parameters 00149 newModule->par("max_dispatch_delay") = ConfigurationUtils::time2ticks( 00150 rcoutgoing->getMaxDispatchDelay(), 00151 getParentModule()->getSubmodule("tteScheduler")->par("tick").doubleValue()); 00152 newModule->par("bag") = ConfigurationUtils::time2ticks( 00153 rcoutgoing->getRefBagAccount()->getBag(), 00154 getParentModule()->getSubmodule("tteScheduler")->par("tick").doubleValue()); 00155 newModule->par("jitter") = ConfigurationUtils::time2ticks( 00156 rcoutgoing->getRefBagAccount()->getJitter(), 00157 getParentModule()->getSubmodule("tteScheduler")->par("tick").doubleValue()); 00158 00159 } 00160 else 00161 { 00162 continue; 00163 } 00164 //Set CT ID, marker and mask 00165 newModule->par("ct_id") = ConfigurationUtils::getVLid(vls->getRefVirtualLink(), nc->getRefMappings()); 00166 if (dc->eClass()->getName() == "Switch") 00167 { 00168 Switch *sw = dc->as<Switch> (); 00169 if (sw->getConfig()) 00170 { 00171 newModule->par("ct_marker") = ConfigurationUtils::mac2long(sw->getConfig()->getCtMarker()); 00172 newModule->par("ct_mask") = ConfigurationUtils::mac2long(sw->getConfig()->getCtMask()); 00173 } 00174 } 00175 else if (dc->eClass()->getName() == "EndSystem") 00176 { 00177 EndSystem *es = dc->as<EndSystem> (); 00178 if (es->getConfig()) 00179 { 00180 newModule->par("ct_marker") = ConfigurationUtils::mac2long(es->getConfig()->getCtMarker()); 00181 newModule->par("ct_mask") = ConfigurationUtils::mac2long(es->getConfig()->getCtMask()); 00182 } 00183 } 00184 00185 //Register Incoming at Ports 00186 //destination Ports 00187 EList<Port>& incomingportList = incoming->getRefInPort(); 00188 for (unsigned int l = 0; l < incomingportList.size(); l++) 00189 { 00190 Port_ptr incomingport = incomingportList.get(l); 00191 string portName = ConfigurationUtils::getPortName(incomingport, nc->getRefMappings()); 00192 int ctID = ConfigurationUtils::getVLid(vls->getRefVirtualLink(), nc->getRefMappings()); 00193 if (portName.find("PHY") != string::npos) 00194 { 00195 Port_ptr incomingport = incomingportList.get(l); 00196 int iport = ConfigurationUtils::getPortSerialNumber(incomingport, nc->getRefMappings()); 00197 if (iport >= 0) 00198 ((TTEInput*) getParentModule()->getSubmodule("phy", iport)->getSubmodule("tteInput"))->addIncoming( 00199 ctID, (Incoming*) newCTCModule); 00200 } 00201 else if (portName == "SYNC") 00202 { 00203 00204 } 00205 else if (portName == "HOST") 00206 { 00207 // ((TTEApplicationBase*) getParentModule()->getSubmodule("tteApp"))->addIncoming( 00208 // ctID, (Incoming*) newCTCModule); 00209 ((TTEApplicationBase*) getParentModule()->getSubmodule("tteApp"))->addBuffer( 00210 ctID, (Buffer*) newModule); 00211 } 00212 else 00213 { 00214 00215 } 00216 } 00217 00218 //destination Ports 00219 EList<Port>& outgoingportList = outgoing->getRefOutPort(); 00220 for (unsigned int m = 0; m < outgoingportList.size(); m++) 00221 { 00222 Port_ptr outgoingport = outgoingportList.get(m); 00223 string portName = ConfigurationUtils::getPortName(outgoingport, nc->getRefMappings()); 00224 int ctID = ConfigurationUtils::getVLid(vls->getRefVirtualLink(), nc->getRefMappings()); 00225 int oport = ConfigurationUtils::getPortSerialNumber(outgoingport, nc->getRefMappings()); 00226 cModule *destModule; 00227 //TODO fix parsing of porttype attribute and use it 00228 if (portName.find("PHY") != string::npos) 00229 { 00230 destModule = getParentModule()->getSubmodule("phy", oport); 00231 if (outgoing->eClass()->getName() == "TTOutgoing") 00232 { 00233 TTBuffer *ttbuffer = dynamic_cast<TTBuffer*> (newModule); 00234 ttbuffer->addDestinationGate(destModule->gate("TTin")); 00235 if (((TTEOutput *) destModule->getSubmodule("tteOutput"))) 00236 { 00237 ((TTEOutput *) destModule->getSubmodule("tteOutput"))->registerTTBuffer(ttbuffer); 00238 } 00239 } 00240 else if (outgoing->eClass()->getName() == "RCOutgoing") 00241 { 00242 ((TTEthernetModel::Buffer*) newModule)->addDestinationGate(destModule->gate("RCin")); 00243 } 00244 } 00245 else if (portName == "SYNC") 00246 { 00247 destModule = getParentModule()->getSubmodule("sync", oport); 00248 } 00249 else if (portName == "HOST") 00250 { 00251 destModule = getParentModule()->getSubmodule("tteApp", oport); 00252 ((TTEApplicationBase*) destModule)->addBuffer(ctID, (Buffer*) newModule); 00253 } 00254 else 00255 { 00256 ev << portName << ":" << oport << endl << endl; 00257 continue; 00258 } 00259 00260 } 00261 00262 //generate connections 00263 newCTCModule->gate("out")->connectTo(newModule->gate("in")); 00264 00265 newModule->finalizeParameters(); 00266 newModule->buildInside(); 00267 newModule->callInitialize(); 00268 newModule->getDisplayString().setTagArg("p", 0, X_POS_GUIBUFFER+100+200*xPosition); 00269 newModule->getDisplayString().setTagArg("p", 1, Y_POS_GUIBUFFER+15+60*yPosition); 00270 00271 yPosition++; 00272 if(yPosition>=4){ 00273 xPosition++; 00274 yPosition=0; 00275 } 00276 } 00277 00278 } 00279 } 00280 //Generate start message to delete module 00281 scheduleAt(simTime(), new cMessage("Delete Module")); 00282 } 00283 }
int TTEthernetModel::BufferManager::numInitStages | ( | ) | const [protected, virtual] |
Returns the numer of initializaiton stages this module needs.
Definition at line 33 of file BufferManager.cc.