2 #include "InputPort.hxx"
3 #include "OutputPort.hxx"
4 #include "InputDataStreamPort.hxx"
5 #include "OutputDataStreamPort.hxx"
8 //#include "TypeCheckerDataStream.hxx"
10 using namespace YACS::ENGINE;
13 DFToDSForLoop::DFToDSForLoop(Loop *loop, const string& name, TypeCode* type):ElementaryNode(""),_nbOfTimeUsed(1)
15 _name="DF2DS For "; _name+=loop->getName(); _name+=" representing port "; _name+=name;
17 // _setOfInputPort.insert(new InputPort("",this,type)); // probleme si constructeur protege, a voir
18 _setOfOutputDataStreamPort.insert(new OutputDataStreamPort("",this,Loop::MappingDF2DS(type)));
21 DFToDSForLoop::~DFToDSForLoop()
25 InputPort *DFToDSForLoop::getInputPort(const string& name) const throw(Exception)
27 set<InputPort *>::iterator it =_setOfInputPort.begin();
31 OutputDataStreamPort *DFToDSForLoop::getOutputDataStreamPort(const string& name) const throw(Exception)
33 set<OutputDataStreamPort *> ::iterator it =_setOfOutputDataStreamPort.begin();
37 void DFToDSForLoop::execute()
42 DSToDFForLoop::DSToDFForLoop(Loop *loop, const string& name, TypeCode* type):ElementaryNode(""),_nbOfTimeUsed(1)
44 _name="DS2DF For "; _name+=loop->getName(); _name+=" representing port "; _name+=name;
46 // _setOfOutputPort.insert(new OutputPort("",this,Loop::MappingDS2DF(type))); // probleme si constructeur protege, a voir
47 _setOfInputDataStreamPort.insert(new InputDataStreamPort("",this,type));
50 DSToDFForLoop::~DSToDFForLoop()
54 OutputPort *DSToDFForLoop::getOutputPort(const string& name) const throw(Exception)
56 set<OutputPort *>::iterator it = _setOfOutputPort.begin();
60 InputDataStreamPort *DSToDFForLoop::getInputDataStreamPort(const string& name) const throw(Exception)
62 set<InputDataStreamPort *>::iterator it = _setOfInputDataStreamPort.begin();
66 void DSToDFForLoop::execute()
71 Loop::Loop(const string& name):ComposedNode(name),_node(0)
80 void Loop::edSetNode(Node *node)
86 void Loop::edAddExtraInputPort(const string& inputPortName, TypeCode* type) throw(Exception)
89 if (edCheckAddPort<InputPort, TypeCode*>(inputPortName,_setOfInputPort,type))
91 //InputPort *ret=edAddPort<InputPort, TypeCode*>(inputPortName,_setOfInputPort,type);
92 ret = getRuntime()->createInputPort(inputPortName, _implementation, this, type);
93 _setOfExtraInputPort.insert(ret);
95 //edAddPort<InputPort,TypeCode*>(inputPortName,_setOfExtraInputPort,type);
98 void Loop::edRemoveExtraInputPort(InputPort *inputPort)
100 edRemovePortTypedFromSet<InputPort>(inputPort,_setOfExtraInputPort);
103 TypeCode* Loop::MappingDF2DS(TypeCode* type) throw(Exception)
110 string what("Loop::MappingDF2DS : unable to perform DataFlow to DataStream traduction for dataflow type ");
111 //what+=Data::edGetTypeInPrintableForm(type);
112 throw Exception(what);
115 TypeCode* Loop::MappingDS2DF(TypeCode* type) throw(Exception)
122 string what("Loop::MappingDS2DF : unable to perform DataStream to DataFlow traduction for datastream type ");
123 //what+=TypeCheckerDataStream::edGetTypeInPrintableForm(type);
124 throw Exception(what);
127 InPort *Loop::buildDelegateOf(InPort *port, const set<ComposedNode *>& pointsOfView)
129 string typeOfPortInstance=port->getNameOfTypeOfCurrentInstance();
130 if(typeOfPortInstance!=InputPort::NAME)
133 if(!isNecessaryToBuildSpecificDelegateDF2DS(pointsOfView))
135 InputPort *portCasted=(InputPort *)port;
136 set<DSToDFForLoop*>::iterator iter;
137 //Determinig if a DSToDFForLoop node has already been created for delegation of 'port'
138 for(iter=_inputsTraducer.begin();iter!=_inputsTraducer.end();iter++)
139 if((*iter)->getOutputPort("")->isAlreadyInSet(portCasted))
141 if(iter==_inputsTraducer.end())
142 {//first time that 'port' is delegated on higher level
143 _inputsTraducer.insert(new DSToDFForLoop(this,portCasted->getName(),Loop::MappingDF2DS(portCasted->edGetType())));
144 iter=_inputsTraducer.end(); iter--;
145 (*iter)->getOutputPort("")->edAddInputPort(portCasted);
146 //WARNING control flow has to be added
147 (*iter)->getOutGate()->edAddInGate(portCasted->getNode()->getInGate());//WARNING HERE MAYBE HAS TO BE IMPROVED - SEPARATE COUNTERS
150 (*iter)->loopHasOneMoreRef();
151 return (*iter)->getInputDataStreamPort("");
154 OutPort *Loop::buildDelegateOf(OutPort *port, const set<ComposedNode *>& pointsOfView)
156 string typeOfPortInstance=port->getNameOfTypeOfCurrentInstance();
157 if(typeOfPortInstance!=OutputPort::NAME)
160 if(!isNecessaryToBuildSpecificDelegateDF2DS(pointsOfView))
162 OutputPort *portCasted=(OutputPort *)port;
163 set<DFToDSForLoop*>::iterator iter;
164 //Determinig if a DFToDSForLoop node has already been created for delegation of 'port'
165 for(iter=_outputsTraducer.begin();iter!=_outputsTraducer.end();iter++)
166 if(portCasted->isAlreadyInSet((*iter)->getInputPort("")))
168 if(iter==_outputsTraducer.end())
169 {//first time that 'port' is delegated on higher level
170 _outputsTraducer.insert(new DFToDSForLoop(this,portCasted->getName(),portCasted->edGetType()));
171 iter=_outputsTraducer.end(); iter--;
172 portCasted->edAddInputPort((*iter)->getInputPort(""));
173 //WARNING control flow has to be added
174 portCasted->getNode()->getOutGate()->edAddInGate((*iter)->getInGate());//WARNING HERE MAYBE HAS TO BE IMPROVED - SEPARATE COUNTERS
177 (*iter)->loopHasOneMoreRef();
178 return (*iter)->getOutputDataStreamPort("");
181 InPort *Loop::getDelegateOf(InPort *port, const set<ComposedNode *>& pointsOfView) throw(Exception)
183 string typeOfPortInstance=port->getNameOfTypeOfCurrentInstance();
184 if(typeOfPortInstance!=InputPort::NAME)
187 if(!isNecessaryToBuildSpecificDelegateDF2DS(pointsOfView))
189 InputPort *portCasted=(InputPort *)port;
190 set<DSToDFForLoop*>::iterator iter;
191 for(iter=_inputsTraducer.begin();iter!=_inputsTraducer.end();iter++)
192 if((*iter)->getOutputPort("")->isAlreadyInSet(portCasted))
194 if(iter==_inputsTraducer.end())
196 string what("Loop::getDelegateOf Port with name "); what+=portCasted->getName(); what+=" not exported by loop "; what+=_name;
197 throw Exception(what);
200 return (*iter)->getInputDataStreamPort("");
203 OutPort *Loop::getDelegateOf(OutPort *port, const set<ComposedNode *>& pointsOfView) throw(Exception)
205 string typeOfPortInstance=port->getNameOfTypeOfCurrentInstance();
206 if(typeOfPortInstance!=OutputPort::NAME)
209 if(!isNecessaryToBuildSpecificDelegateDF2DS(pointsOfView))
211 OutputPort *portCasted=(OutputPort *)port;
212 set<DFToDSForLoop*>::iterator iter;
213 for(iter=_outputsTraducer.begin();iter!=_outputsTraducer.end();iter++)
214 if(portCasted->isAlreadyInSet((*iter)->getInputPort("")))
216 if(iter==_outputsTraducer.end())
218 string what("Loop::getDelegateOf Port with name "); what+=portCasted->getName(); what+=" not exported by loop "; what+=_name;
219 throw Exception(what);
222 return (*iter)->getOutputDataStreamPort("");
225 InPort *Loop::releaseDelegateOf(InPort *port, const set<ComposedNode *>& pointsOfView) throw(Exception)
227 string typeOfPortInstance=port->getNameOfTypeOfCurrentInstance();
228 if(typeOfPortInstance!=InputPort::NAME)
231 if(!isNecessaryToBuildSpecificDelegateDF2DS(pointsOfView))
233 InputPort *portCasted=(InputPort *)port;
234 set<DSToDFForLoop*>::iterator iter;
235 for(iter=_inputsTraducer.begin();iter!=_inputsTraducer.end();iter++)
236 if((*iter)->getOutputPort("")->isAlreadyInSet(portCasted))
238 if(iter==_inputsTraducer.end())
240 string what("Loop::releaseDelegateOf Port with name "); what+=portCasted->getName(); what+=" not exported by loop "; what+=_name;
241 throw Exception(what);
245 InPort *ret=(*iter)->getInputDataStreamPort("");
246 if((*iter)->loopHasOneLessRef())
247 _inputsTraducer.erase(iter);
252 OutPort *Loop::releaseDelegateOf(OutPort *port, const set<ComposedNode *>& pointsOfView) throw(Exception)
254 string typeOfPortInstance=port->getNameOfTypeOfCurrentInstance();
255 if(typeOfPortInstance!=OutputPort::NAME)
258 if(!isNecessaryToBuildSpecificDelegateDF2DS(pointsOfView))
260 OutputPort *portCasted=(OutputPort *)port;
261 set<DFToDSForLoop*>::iterator iter;
262 for(iter=_outputsTraducer.begin();iter!=_outputsTraducer.end();iter++)
263 if(portCasted->isAlreadyInSet((*iter)->getInputPort("")))
265 if(iter==_outputsTraducer.end())
267 string what("Loop::releaseDelegateOf Port with name "); what+=portCasted->getName(); what+=" not exported by loop "; what+=_name;
268 throw Exception(what);
272 OutPort *ret=(*iter)->getOutputDataStreamPort("");
273 if((*iter)->loopHasOneLessRef())
274 _outputsTraducer.erase(iter);
279 void Loop::checkNoCyclePassingThrough(Node *node) throw(Exception)
281 throw Exception("Loop::checkNoCyclePassingThrough : Internal error occured");
285 * @note : States if a DF port must be considered on an upper level in hierarchy as a DS port or not from 'pointsOfView' observers.
287 * - True : a traduction DF->DS has to be done
288 * - False : no traduction needed
290 bool Loop::isNecessaryToBuildSpecificDelegateDF2DS(const set<ComposedNode *>& pointsOfView)
293 for(set<ComposedNode *>::const_iterator iter=pointsOfView.begin();iter!=pointsOfView.end() && !ret;iter++)
294 ret=(*iter)->isRepeatedUnpredictablySeveralTimes();