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

Private GIT Repository
finished testbench generation
[blast.git] / ReferenceBlock.cpp
index c2d9bffdfefbb4dccd3b40385f86ede7762ee97b..56a34dbe9b8d9939a866177f1f78c93a96ce7165 100644 (file)
@@ -8,22 +8,17 @@
 #include "BlockParameterWishbone.h"
 #include "Parameters.h"
 
-ReferenceBlock::ReferenceBlock(const QString _xmlFile) : AbstractBlock() {
-  xmlFile = _xmlFile;
+ReferenceBlock::ReferenceBlock(const QString _xmlFile) : AbstractBlock(NULL) {
+  xmlFile = _xmlFile;  
 }
 
 void ReferenceBlock::addCategory(int id) {
  categories.append(id);
 }
 
-void ReferenceBlock::setBriefDescription(const QString& str) {
+void ReferenceBlock::setDescription(const QString& str) {
   if(str != NULL)
-    descriptionBrief = str;
-}
-
-void ReferenceBlock::setDetailedDescription(const QString& str) {
-  if(str != NULL)
-    descriptionDetail = str;
+    description = str;
 }
 
 void ReferenceBlock::addImplementation(BlockImplementation *impl) {
@@ -45,6 +40,16 @@ void ReferenceBlock::setHashMd5() {
 
 void ReferenceBlock::load(QDomElement &elt) throw(Exception) {
 
+  cout << "Block : get version" << endl;
+  QString verStr = elt.attribute("version","none");
+  QString specialStr = elt.attribute("special","none");
+  if (verStr != "none") {
+    setVersion(verStr);
+  }
+  else {
+    setVersion("0.0");
+  }
+  setSpecialType(getSpecialTypeFromString(specialStr));
 
   cout << "Block : get informations" << endl;  
   QDomElement eltInfo  = elt.firstChildElement("informations");
@@ -75,7 +80,7 @@ void ReferenceBlock::load(QDomElement &elt) throw(Exception) {
 
   // create interfaces that correspond to a wishbone parameter, if any.
   try {
-    createInterfaceForParameters();    
+    createInterfaceForWishbone();
   }
   catch(int err) {
     throw(err);
@@ -120,28 +125,16 @@ void ReferenceBlock::loadInformations(QDomElement &elt) throw(Exception) {
   // getting description
   cout << "Block info : get description" << endl;  
   QDomElement eltDesc = eltCat.nextSiblingElement("description");
-  // getting brief  
-  QDomElement eltBrief = eltDesc.firstChildElement("brief");
-  QDomNode nodeBriefTxt = eltBrief.firstChild();
-  if (nodeBriefTxt.isNull()) {
-    descriptionBrief = "no brief description";
-  }
-  else {
-    QDomText txtBrief = nodeBriefTxt.toText();
-    descriptionBrief = txtBrief.data().trimmed();
-    cout << "block brief desc : " << qPrintable(descriptionBrief) << endl;
-  }
-  // getting detailed  
-  QDomElement eltDetail = eltBrief.nextSiblingElement("detailed");
-  QDomNode nodeDetailTxt = eltDetail.firstChild();
-  if (nodeDetailTxt.isNull()) {
-    descriptionDetail = "no detailed description";
+  // getting text
+  QDomNode nodeTxt = eltDesc.firstChild();
+  if (nodeTxt.isNull()) {
+    description = "no description";
   }
   else {
-    QDomText txtDetail = nodeDetailTxt.toText();
-    descriptionDetail = txtDetail.data().trimmed();
-    cout << "block detail desc : " << qPrintable(descriptionDetail) << endl;
-  }
+    QDomText txtBrief = nodeTxt.toText();
+    description = txtBrief.data().trimmed();
+    cout << "block desc : " << qPrintable(description) << endl;
+  }  
 }
 
 void ReferenceBlock::loadParameters(QDomElement &elt) throw(Exception) {
@@ -227,7 +220,7 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
   int purpose;
   QString multStr;
   int mult;
-  AbstractInterface* inter;
+  ReferenceInterface* iface;
 
   if ((elt.isNull()) || (elt.tagName() != "interfaces")) throw (Exception(BLOCKFILE_CORRUPTED));
 
@@ -243,9 +236,12 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
     purposeStr = eltInput.attribute("purpose","none");
     if (purposeStr == "clock") {
       nameStr = eltInput.attribute("name","none");
-      inter = new ReferenceInterface(this,nameStr,AbstractInterface::Input, AbstractInterface::Clock, "boolean", "1", AbstractInterface::LittleEndian, 1);
-      inputs.append(inter);
-      clocks.append(inter);
+      iface = new ReferenceInterface(this,nameStr,AbstractInterface::Input, AbstractInterface::Clock, "boolean", "1", AbstractInterface::LittleEndian, 1);
+      if (! iface->checkSetClockIface(nameStr)) {
+        throw (Exception(BLOCKFILE_CORRUPTED));
+      }
+      inputs.append(iface);
+      clocks.append(iface);
     }
   }
   cout << "number of clocks: " << clocks.size() << endl;
@@ -277,15 +273,19 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
       multStr = eltInput.attribute("multiplicity","none");
       mult = ReferenceInterface::translateMultiplicity(multStr);
 
-      inter = new ReferenceInterface(this,nameStr, AbstractInterface::Input, purpose, typeStr, widthStr, endianess, mult);
+      iface = new ReferenceInterface(this,nameStr, AbstractInterface::Input, purpose, typeStr, widthStr, endianess, mult);
       if (clockStr == "none") {
-        // no clock given, take the first one (hope that there is a single one !)
+        if (clocks.size() > 1) {
+          // if several clocks, the associated one MUST be given
+          throw (Exception(BLOCKFILE_CORRUPTED));
+        }
+        // no clock given, take the single one
         clockStr = clocks.at(0)->getName();
       }
-      if (! inter->setClockIface(clockStr)) {
+      if (! iface->checkSetClockIface(clockStr)) {
         throw (Exception(BLOCKFILE_CORRUPTED));
       }
-      inputs.append(inter);
+      inputs.append(iface);
     }
   }
   // getting each control
@@ -296,13 +296,17 @@ 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()+"_enb";
-    inter = new ReferenceInterface(this,nameStr,AbstractInterface::Input, AbstractInterface::Control,"boolean","1", AbstractInterface::LittleEndian, 1);
-    if (!inter->setAssociatedIface(dataIface)) {
+    QString nameEnbStr = dataIface->getName()+"_enb";
+    iface = new ReferenceInterface(this,nameEnbStr,AbstractInterface::Input, AbstractInterface::Control,"boolean","1", AbstractInterface::LittleEndian, 1);
+    if (!iface->setAssociatedIface(dataIface)) {
       throw (Exception(BLOCKFILE_CORRUPTED));      
     }
-    cout << "created a control input named " << qPrintable(inter->getName()) << endl;
-    inputs.append(inter);
+    clockStr = dataIface->getClockIfaceString();
+    if (! iface->checkSetClockIface(clockStr)) {
+      throw (Exception(BLOCKFILE_CORRUPTED));
+    }
+    cout << "created a control input named " << qPrintable(iface->getName()) << endl;
+    inputs.append(iface);
   }
   QDomElement eltOutputs = eltInputs.nextSiblingElement("outputs");
   QDomNodeList listNodeOutputs = eltOutputs.elementsByTagName("output");
@@ -330,15 +334,20 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
     multStr = eltOutput.attribute("multiplicity","none");
     mult = ReferenceInterface::translateMultiplicity(multStr);
 
-    inter = new ReferenceInterface(this,nameStr,AbstractInterface::Output, purpose,typeStr,widthStr, endianess, mult);
+    iface = new ReferenceInterface(this,nameStr,AbstractInterface::Output, purpose,typeStr,widthStr, endianess, mult);
     if (clockStr == "none") {
-      // no clock given, take the first one (hope that there is a single one !)
+      if (clocks.size() > 1) {
+        // if several clocks, the associated one MUST be given
+        throw (Exception(BLOCKFILE_CORRUPTED));
+      }
+      // no clock given, take the single one
       clockStr = clocks.at(0)->getName();
     }
-    if (! inter->setClockIface(clockStr)) {
+    if (! iface->checkSetClockIface(clockStr)) {
       throw (Exception(BLOCKFILE_CORRUPTED));
     }
-    outputs.append(inter);
+
+    outputs.append(iface);
   }
   // getting each control
   QDomNodeList listNodeOutCtl = eltOutputs.elementsByTagName("control");
@@ -349,12 +358,16 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
     AbstractInterface* dataIface = getIfaceFromName(nameStr);
     if (dataIface == NULL) throw (Exception(BLOCKFILE_CORRUPTED));
     nameStr = dataIface->getName()+"_enb";
-    inter = new ReferenceInterface(this,nameStr,AbstractInterface::Output, AbstractInterface::Control,"boolean","1",AbstractInterface::LittleEndian, 1);
-    if (!inter->setAssociatedIface(dataIface)) {
+    iface = new ReferenceInterface(this,nameStr,AbstractInterface::Output, AbstractInterface::Control,"boolean","1",AbstractInterface::LittleEndian, 1);
+    if (!iface->setAssociatedIface(dataIface)) {
       throw (Exception(BLOCKFILE_CORRUPTED));      
     }
-    cout << "created a control output named " << qPrintable(inter->getName()) << endl;
-    outputs.append(inter);
+    clockStr = dataIface->getClockIfaceString();
+    if (! iface->checkSetClockIface(clockStr)) {
+      throw (Exception(BLOCKFILE_CORRUPTED));
+    }
+    cout << "created a control output named " << qPrintable(iface->getName()) << endl;
+    outputs.append(iface);
   }
 
   QDomElement eltBidirs = eltInputs.nextSiblingElement("bidirs");
@@ -382,19 +395,24 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
     multStr = eltBidir.attribute("multiplicity","none");
     mult = ReferenceInterface::translateMultiplicity(multStr);
 
-    inter = new ReferenceInterface(this,nameStr,AbstractInterface::InOut, purpose,typeStr,widthStr, endianess, mult);
+    iface = new ReferenceInterface(this,nameStr,AbstractInterface::InOut, purpose,typeStr,widthStr, endianess, mult);
     if (clockStr == "none") {
-      // no clock given, take the first one (hope that there is a single one !)
+      if (clocks.size() > 1) {
+        // if several clocks, the associated one MUST be given
+        throw (Exception(BLOCKFILE_CORRUPTED));
+      }
+      // no clock given, take the single one
       clockStr = clocks.at(0)->getName();
     }
-    if (! inter->setClockIface(clockStr)) {
+    if (! iface->checkSetClockIface(clockStr)) {
       throw (Exception(BLOCKFILE_CORRUPTED));
     }
-    bidirs.append(inter);
+
+    bidirs.append(iface);
   }
 }
 
-void ReferenceBlock::createInterfaceForParameters() throw(Exception){
+void ReferenceBlock::createInterfaceForWishbone() throw(Exception){
   ReferenceInterface* iface = NULL;
   foreach(BlockParameter* param, params) {
     
@@ -436,8 +454,9 @@ QDataStream& operator<<(QDataStream &out, const ReferenceBlock &b) {
 
   toWrite << b.name;
   toWrite << b.xmlFile;
-  toWrite << b.descriptionBrief;
-  toWrite << b.descriptionDetail;
+  toWrite << b.specialType;
+  toWrite << b.version;
+  toWrite << b.description;
   toWrite << b.categories;
   toWrite << b.hashMd5;
   toWrite << b.params.size();
@@ -490,7 +509,7 @@ QDataStream& operator<<(QDataStream &out, const ReferenceBlock &b) {
       toWrite << iface->getClockIfaceString();
     }
   }
-  // secondly, write other ifaces
+  // thirdly, write other ifaces
   for(int i=0; i<b.inputs.size(); i++){
     ReferenceInterface *iface = (ReferenceInterface *)(b.inputs.at(i));
     if ((iface->getPurpose() != AbstractInterface::Control) && (iface->getPurpose() != AbstractInterface::Clock)) {
@@ -565,8 +584,9 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) {
 
   in >> b.name;
   in >> b.xmlFile;
-  in >> b.descriptionBrief;
-  in >> b.descriptionDetail;
+  in >> b.specialType;
+  in >> b.version;
+  in >> b.description;
   in >> b.categories;
   in >> b.hashMd5;
   b.params.clear();
@@ -629,13 +649,8 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) {
     QString clk;
     in >> clkType;
     in >> clk;
-    if (clkType == AbstractInterface::ParameterName) {
-      clk = "$"+clk;
-    }
-    if (! iface->setClockIface(clk)) {
-      cerr << "Abnormal case while reading a reference block in library: cannot set ref clock for an interface" << endl;
-    }
-
+    iface->setClockIfaceName(clk);
+    iface->setClockIfaceType(clkType);
     b.inputs.append(iface);
     if (iface->getPurpose() == AbstractInterface::Data) {
       QString ctlRefName = iface->getName()+"_enb";
@@ -669,12 +684,8 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) {
     QString clk;
     in >> clkType;
     in >> clk;
-    if (clkType == AbstractInterface::ParameterName) {
-      clk = "$"+clk;
-    }
-    if (! iface->setClockIface(clk)) {
-      cerr << "Abnormal case while reading a reference block in library: cannot set ref clock for an interface" << endl;
-    }
+    iface->setClockIfaceName(clk);
+    iface->setClockIfaceType(clkType);
     b.outputs.append(iface);
     if (iface->getPurpose() == AbstractInterface::Data) {
       QString ctlRefName = iface->getName()+"_enb";      
@@ -708,12 +719,8 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) {
     QString clk;
     in >> clkType;
     in >> clk;
-    if (clkType == AbstractInterface::ParameterName) {
-      clk = "$"+clk;
-    }
-    if (! iface->setClockIface(clk)) {
-      cerr << "Abnormal case while reading a reference block in library: cannot set ref clock for an interface" << endl;
-    }
+    iface->setClockIfaceName(clk);
+    iface->setClockIfaceType(clkType);
     b.bidirs.append(iface);
   }
 
@@ -764,3 +771,4 @@ QList<QString> ReferenceBlock::getExternalResources() {
   return list;
 }
 
+