]> AND Private Git Repository - blast.git/blobdiff - ReferenceBlock.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
pattern comput done
[blast.git] / ReferenceBlock.cpp
index e09b1188c0dcb8c30b753d23f24a66fae9862bb2..12db4b4a9bc683b99cddea0c3ed0724e7d7e4ae2 100644 (file)
@@ -157,7 +157,7 @@ void ReferenceBlock::loadParameters(QDomElement &elt) throw(Exception) {
         valueStr = "";
     }
     if (contextStr == "user") {
-      param = new BlockParameterUser(this,nameStr,valueStr);
+      param = new BlockParameterUser(this,nameStr,typeStr,valueStr);
     }
     else if (contextStr == "generic") {
       param = new BlockParameterGeneric(this,nameStr,typeStr,valueStr);
@@ -251,11 +251,12 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
     nameStr = eltInput.attribute("iface","none");
     AbstractInterface* dataIface = getIfaceFromName(nameStr);
     if (dataIface == NULL) throw (Exception(BLOCKFILE_CORRUPTED));
-    nameStr = dataIface->getName()+"_ctl";
+    nameStr = dataIface->getName()+"_enb";
     inter = new ReferenceInterface(this,nameStr,"boolean","1",AbstractInterface::Input, AbstractInterface::Control, 1);
     if (!inter->setAssociatedIface(dataIface)) {
       throw (Exception(BLOCKFILE_CORRUPTED));      
     }
+    cout << "created a control input named " << qPrintable(inter->getName()) << endl;
     inputs.append(inter);
   }
   QDomElement eltOutputs = eltInputs.nextSiblingElement("outputs");
@@ -282,11 +283,12 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
     nameStr = eltOutput.attribute("iface","none");
     AbstractInterface* dataIface = getIfaceFromName(nameStr);
     if (dataIface == NULL) throw (Exception(BLOCKFILE_CORRUPTED));
-    nameStr = dataIface->getName()+"_ctl";
+    nameStr = dataIface->getName()+"_enb";
     inter = new ReferenceInterface(this,nameStr,"boolean","1",AbstractInterface::Output, AbstractInterface::Control, 1);
     if (!inter->setAssociatedIface(dataIface)) {
       throw (Exception(BLOCKFILE_CORRUPTED));      
     }
+    cout << "created a control output named " << qPrintable(inter->getName()) << endl;
     outputs.append(inter);
   }
 
@@ -376,22 +378,50 @@ QDataStream& operator<<(QDataStream &out, const ReferenceBlock &b) {
   }
 
   toWrite << b.inputs.size();
+  // firstly write control ifaces
   for(int i=0; i<b.inputs.size(); i++){
     ReferenceInterface *iface = (ReferenceInterface *)(b.inputs.at(i));
-    toWrite << iface->getName();
-    toWrite << iface->getWidth();
-    toWrite << iface->getPurpose();
-    toWrite << iface->getDirection();    
-    toWrite << iface->getMultiplicity();
+    if (iface->getPurpose() == AbstractInterface::Control) {
+      toWrite << iface->getName();
+      toWrite << iface->getWidth();
+      toWrite << iface->getPurpose();
+      toWrite << iface->getDirection();    
+      toWrite << iface->getMultiplicity();
+    }
+  }
+  // secondly, write other ifaces
+  for(int i=0; i<b.inputs.size(); i++){
+    ReferenceInterface *iface = (ReferenceInterface *)(b.inputs.at(i));
+    if (iface->getPurpose() != AbstractInterface::Control) {
+      toWrite << iface->getName();
+      toWrite << iface->getWidth();
+      toWrite << iface->getPurpose();
+      toWrite << iface->getDirection();    
+      toWrite << iface->getMultiplicity();
+    }
   }
   toWrite << b.outputs.size();
+  // firstly write control ifaces
   for(int i=0; i<b.outputs.size(); i++){
     ReferenceInterface *iface = (ReferenceInterface *)(b.outputs.at(i));
-    toWrite << iface->getName();
-    toWrite << iface->getWidth();
-    toWrite << iface->getPurpose();
-    toWrite << iface->getDirection();    
-    toWrite << iface->getMultiplicity();
+    if (iface->getPurpose() == AbstractInterface::Control) {
+      toWrite << iface->getName();
+      toWrite << iface->getWidth();
+      toWrite << iface->getPurpose();
+      toWrite << iface->getDirection();    
+      toWrite << iface->getMultiplicity();
+    }
+  }
+  // secondly, write other ifaces
+  for(int i=0; i<b.outputs.size(); i++){
+    ReferenceInterface *iface = (ReferenceInterface *)(b.outputs.at(i));
+    if (iface->getPurpose() != AbstractInterface::Control) {
+      toWrite << iface->getName();
+      toWrite << iface->getWidth();
+      toWrite << iface->getPurpose();
+      toWrite << iface->getDirection();    
+      toWrite << iface->getMultiplicity();
+    }
   }
   toWrite << b.bidirs.size();
   for(int i=0; i<b.bidirs.size(); i++){
@@ -441,7 +471,7 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) {
     in >> valueStr;
 
     if (contextStr == "user") {
-      p = new BlockParameterUser(&b,nameStr,valueStr);
+      p = new BlockParameterUser(&b,nameStr,typeStr,valueStr);
     }
     else if (contextStr == "generic") {
       p = new BlockParameterGeneric(&b,nameStr,typeStr,valueStr);
@@ -474,12 +504,21 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) {
     in >> txt;
     iface->setWidth(txt);
     in >> val;
-    iface->setPurpose(val);
+    iface->setPurpose(val);    
     in >> val;
     iface->setDirection(val);    
     in >> val;
     iface->setMultiplicity(val);
     b.inputs.append(iface);
+    if (iface->getPurpose() == AbstractInterface::Data) {
+      QString ctlRefName = iface->getName()+"_enb";
+      ReferenceInterface* ctlRefIface = AI_TO_REF(b.getIfaceFromName(ctlRefName));      
+      if (ctlRefIface != NULL) {        
+        if (! ctlRefIface->setAssociatedIface(iface)) {
+          cerr << "Abnormal case while reading a reference block in library" << endl;
+        }      
+      }        
+    }    
   }
 
   b.outputs.clear();
@@ -491,12 +530,21 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) {
     in >> txt;
     iface->setWidth(txt);
     in >> val;
-    iface->setPurpose(val);
+    iface->setPurpose(val);    
     in >> val;
     iface->setDirection(val);
     in >> val;   
     iface->setMultiplicity(val);
     b.outputs.append(iface);
+    if (iface->getPurpose() == AbstractInterface::Data) {
+      QString ctlRefName = iface->getName()+"_enb";      
+      ReferenceInterface* ctlRefIface = AI_TO_REF(b.getIfaceFromName(ctlRefName));      
+      if (ctlRefIface != NULL) {        
+        if (! ctlRefIface->setAssociatedIface(iface)) {
+          cerr << "Abnormal case while reading a reference block in library" << endl;
+        }      
+      }        
+    }    
   }
 
   b.bidirs.clear();
@@ -518,3 +566,8 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) {
 
   return in;
 }
+
+bool ReferenceBlock::computeOutputPattern(int nbExec) {
+  // does strictly nothing
+  return false;
+}