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

Private GIT Repository
start modifying read/write blocks and project to take into account control ifaces
[blast.git] / ReferenceBlock.cpp
index 93f7c41c3f1a40fdb07c970bbbc169540804c681..05fd29a785e921fbf1f42fa1ae6869ca1249ef99 100644 (file)
@@ -68,6 +68,14 @@ void ReferenceBlock::load(QDomElement &elt) throw(Exception) {
   try {
     loadInterfaces(eltInter);
   }
   try {
     loadInterfaces(eltInter);
   }
+  catch(int err) {
+    throw(err);
+  }
+
+  // create interfaces that correspond to a wishbone parameter, if any.
+  try {
+    createInterfaceForParameters();    
+  }
   catch(int err) {
     throw(err);
   }  
   catch(int err) {
     throw(err);
   }  
@@ -161,11 +169,16 @@ void ReferenceBlock::loadParameters(QDomElement &elt) throw(Exception) {
       int duration = 0;
       QString wbValue = "";
       QStringList listWb = wbStr.split(",");
       int duration = 0;
       QString wbValue = "";
       QStringList listWb = wbStr.split(",");
+      cout << "wb param has:";
+      foreach(QString s, listWb) {
+        cout << qPrintable(s) << " | ";
+      }
+      cout << endl;
 
       if (listWb.at(0) == "r") {
         access = BlockParameter::Read;
       }
 
       if (listWb.at(0) == "r") {
         access = BlockParameter::Read;
       }
-      else if (wbStr == "w") {
+      else if (listWb.at(0) == "w") {
         access = BlockParameter::Write;
         bool ok;
         wbValue = listWb.at(1).toInt(&ok);
         access = BlockParameter::Write;
         bool ok;
         wbValue = listWb.at(1).toInt(&ok);
@@ -211,6 +224,7 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
   if ((elt.isNull()) || (elt.tagName() != "interfaces")) throw (Exception(BLOCKFILE_CORRUPTED));
 
   QDomElement eltInputs = elt.firstChildElement("inputs");
   if ((elt.isNull()) || (elt.tagName() != "interfaces")) throw (Exception(BLOCKFILE_CORRUPTED));
 
   QDomElement eltInputs = elt.firstChildElement("inputs");
+  // getting each input
   QDomNodeList listNodeInputs = eltInputs.elementsByTagName("input");
   for(int i=0;i<listNodeInputs.size();i++) {
     QDomNode node = listNodeInputs.at(i);
   QDomNodeList listNodeInputs = eltInputs.elementsByTagName("input");
   for(int i=0;i<listNodeInputs.size();i++) {
     QDomNode node = listNodeInputs.at(i);
@@ -229,7 +243,22 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
     inter = new ReferenceInterface(this,nameStr,typeStr,widthStr,AbstractInterface::Input, purpose, mult);
     inputs.append(inter);
   }
     inter = new ReferenceInterface(this,nameStr,typeStr,widthStr,AbstractInterface::Input, purpose, mult);
     inputs.append(inter);
   }
-
+  // getting each control
+  QDomNodeList listNodeInCtl = eltInputs.elementsByTagName("control");
+  for(int i=0;i<listNodeInCtl.size();i++) {
+    QDomNode node = listNodeInCtl.at(i);
+    QDomElement eltInput = node.toElement();
+    nameStr = eltInput.attribute("iface","none");
+    AbstractInterface* dataIface = getIfaceFromName(nameStr);
+    if (dataIface == NULL) throw (Exception(BLOCKFILE_CORRUPTED));
+    nameStr = dataIface->getName()+"_ctl";
+    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");
   QDomNodeList listNodeOutputs = eltOutputs.elementsByTagName("output");
   for(int i=0;i<listNodeOutputs.size();i++) {
   QDomElement eltOutputs = eltInputs.nextSiblingElement("outputs");
   QDomNodeList listNodeOutputs = eltOutputs.elementsByTagName("output");
   for(int i=0;i<listNodeOutputs.size();i++) {
@@ -238,7 +267,7 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
     nameStr = eltOutput.attribute("name","none");
     typeStr = eltOutput.attribute("type","none");
     widthStr = eltOutput.attribute("width","none");
     nameStr = eltOutput.attribute("name","none");
     typeStr = eltOutput.attribute("type","none");
     widthStr = eltOutput.attribute("width","none");
-    purposeStr = eltOutput.attribute("type","none");
+    purposeStr = eltOutput.attribute("purpose","none");
     purpose = ReferenceInterface::translatePurpose(purposeStr);
     multStr = eltOutput.attribute("multiplicity","none");
     mult = ReferenceInterface::translateMultiplicity(multStr);
     purpose = ReferenceInterface::translatePurpose(purposeStr);
     multStr = eltOutput.attribute("multiplicity","none");
     mult = ReferenceInterface::translateMultiplicity(multStr);
@@ -246,6 +275,22 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
     inter = new ReferenceInterface(this,nameStr,typeStr,widthStr,AbstractInterface::Output, purpose, mult);
     outputs.append(inter);
   }
     inter = new ReferenceInterface(this,nameStr,typeStr,widthStr,AbstractInterface::Output, purpose, mult);
     outputs.append(inter);
   }
+  // getting each control
+  QDomNodeList listNodeOutCtl = eltOutputs.elementsByTagName("control");
+  for(int i=0;i<listNodeOutCtl.size();i++) {
+    QDomNode node = listNodeOutCtl.at(i);
+    QDomElement eltOutput = node.toElement();
+    nameStr = eltOutput.attribute("iface","none");
+    AbstractInterface* dataIface = getIfaceFromName(nameStr);
+    if (dataIface == NULL) throw (Exception(BLOCKFILE_CORRUPTED));
+    nameStr = dataIface->getName()+"_ctl";
+    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);
+  }
 
   QDomElement eltBidirs = eltInputs.nextSiblingElement("bidirs");
   QDomNodeList listNodeBidirs = eltBidirs.elementsByTagName("bidir");
 
   QDomElement eltBidirs = eltInputs.nextSiblingElement("bidirs");
   QDomNodeList listNodeBidirs = eltBidirs.elementsByTagName("bidir");
@@ -255,7 +300,7 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
     nameStr = eltBidir.attribute("name","none");
     typeStr = eltBidir.attribute("type","none");
     widthStr = eltBidir.attribute("width","none");
     nameStr = eltBidir.attribute("name","none");
     typeStr = eltBidir.attribute("type","none");
     widthStr = eltBidir.attribute("width","none");
-    purposeStr = eltBidir.attribute("type","none");
+    purposeStr = eltBidir.attribute("purpose","none");
     purpose = ReferenceInterface::translatePurpose(purposeStr);
     multStr = eltBidir.attribute("multiplicity","none");
     mult = ReferenceInterface::translateMultiplicity(multStr);
     purpose = ReferenceInterface::translatePurpose(purposeStr);
     multStr = eltBidir.attribute("multiplicity","none");
     mult = ReferenceInterface::translateMultiplicity(multStr);
@@ -265,8 +310,31 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
   }
 }
 
   }
 }
 
-void ReferenceBlock::parametersValidation(QList<AbstractBlock *> *checkedBlocks, QList<AbstractBlock *> *blocksToConfigure)
-{
+void ReferenceBlock::createInterfaceForParameters() throw(Exception){
+  ReferenceInterface* iface = NULL;
+  foreach(BlockParameter* param, params) {
+    
+    if (param->isWishboneParameter()) {
+      
+      BlockParameterWishbone* p = (BlockParameterWishbone*)param;      
+      cout << "creating interface for parameter wb " << qPrintable(p->getName()) << endl;
+      
+      if (p->getWBAccess() == BlockParameter::Read) {
+        iface = new ReferenceInterface(this,p->getName(),p->getTypeString(),p->getWidth(), AbstractInterface::Output, AbstractInterface::Wishbone,1);
+        outputs.append(iface);        
+      }
+      else if (p->getWBAccess() == BlockParameter::Write) {
+        iface = new ReferenceInterface(this,p->getName(),p->getTypeString(),p->getWidth(), AbstractInterface::Input, AbstractInterface::Wishbone,1);
+        inputs.append(iface);                
+      }
+      else {
+        throw (Exception(BLOCKFILE_CORRUPTED));
+      }
+    }
+  }
+}
+
+void ReferenceBlock::parametersValidation(QList<AbstractBlock *> *checkedBlocks, QList<AbstractBlock *> *blocksToConfigure) {
     return;
 }
 
     return;
 }
 
@@ -310,22 +378,50 @@ QDataStream& operator<<(QDataStream &out, const ReferenceBlock &b) {
   }
 
   toWrite << b.inputs.size();
   }
 
   toWrite << b.inputs.size();
+  // firstly write control ifaces
   for(int i=0; i<b.inputs.size(); i++){
     ReferenceInterface *iface = (ReferenceInterface *)(b.inputs.at(i));
   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();
   }
   toWrite << b.outputs.size();
+  // firstly write control ifaces
   for(int i=0; i<b.outputs.size(); i++){
     ReferenceInterface *iface = (ReferenceInterface *)(b.outputs.at(i));
   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++){
   }
   toWrite << b.bidirs.size();
   for(int i=0; i<b.bidirs.size(); i++){
@@ -408,12 +504,21 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) {
     in >> txt;
     iface->setWidth(txt);
     in >> val;
     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);
     in >> val;
     iface->setDirection(val);    
     in >> val;
     iface->setMultiplicity(val);
     b.inputs.append(iface);
+    if (iface->getPurpose() == AbstractInterface::Data) {
+      QString ctlRefName = iface->getName()+"_ctl";
+      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();
   }
 
   b.outputs.clear();
@@ -425,12 +530,21 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) {
     in >> txt;
     iface->setWidth(txt);
     in >> val;
     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);
     in >> val;
     iface->setDirection(val);
     in >> val;   
     iface->setMultiplicity(val);
     b.outputs.append(iface);
+    if (iface->getPurpose() == AbstractInterface::Data) {
+      QString ctlRefName = iface->getName()+"_ctl";      
+      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();
   }
 
   b.bidirs.clear();