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

Private GIT Repository
added clk/rst link when creating a block
[blast.git] / ReferenceBlock.cpp
index 5137d73f576c7af050a3d82ccd6269c88d9f31cf..c2d9bffdfefbb4dccd3b40385f86ede7762ee97b 100644 (file)
@@ -6,6 +6,7 @@
 #include "BlockParameterGeneric.h"
 #include "BlockParameterPort.h"
 #include "BlockParameterWishbone.h"
+#include "Parameters.h"
 
 ReferenceBlock::ReferenceBlock(const QString _xmlFile) : AbstractBlock() {
   xmlFile = _xmlFile;
@@ -94,7 +95,7 @@ void ReferenceBlock::loadInformations(QDomElement &elt) throw(Exception) {
   }
   else {
     QDomText txtName = nodeNameTxt.toText();
-    name = normalizeName(txtName.data().trimmed());
+    name = Parameters::normalizeName(txtName.data().trimmed());
     cout<< "block name : " << qPrintable(name) << endl;
   }
 
@@ -222,6 +223,7 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
   QString widthStr;
   QString endianStr;
   QString purposeStr;
+  QString clockStr;
   int purpose;
   QString multStr;
   int mult;
@@ -232,33 +234,59 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
   QDomElement eltInputs = elt.firstChildElement("inputs");
   // getting each input
   QDomNodeList listNodeInputs = eltInputs.elementsByTagName("input");
+
+  // find all input clocks
+  QList<AbstractInterface*> clocks;
   for(int i=0;i<listNodeInputs.size();i++) {
     QDomNode node = listNodeInputs.at(i);
     QDomElement eltInput = node.toElement();
-    nameStr = eltInput.attribute("name","none");
-    typeStr = eltInput.attribute("type","none");
-    widthStr = eltInput.attribute("width","none");
-    endianStr = eltInput.attribute("endian","none");
-    int endianess;
-    if ((endianStr == "none") || (endianStr == "little")) {
-      endianess = AbstractInterface::LittleEndian;
-    }
-    else if (endianStr == "big") {
-      endianess = AbstractInterface::BigEndian;
-    }
-    else {
-      throw (Exception(BLOCKFILE_CORRUPTED));
+    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);
     }
+  }
+  cout << "number of clocks: " << clocks.size() << endl;
+
+  // find inputs
+  for(int i=0;i<listNodeInputs.size();i++) {
+    QDomNode node = listNodeInputs.at(i);
+    QDomElement eltInput = node.toElement();
     purposeStr = eltInput.attribute("purpose","none");
-    cout << "block : " << this->getName().toStdString() << endl;
-    cout << "purpose for " << nameStr.toStdString() << " : " << purposeStr.toStdString() << endl;
     purpose = ReferenceInterface::translatePurpose(purposeStr);
-    cout << "translated purpose : " << purpose << endl;
-    multStr = eltInput.attribute("multiplicity","none");
-    mult = ReferenceInterface::translateMultiplicity(multStr);
+    if (purpose != AbstractInterface::Clock) {
+      cout << "translated purpose : " << purpose << endl;
+      nameStr = eltInput.attribute("name","none");
+      typeStr = eltInput.attribute("type","none");
+      widthStr = eltInput.attribute("width","none");
+      endianStr = eltInput.attribute("endian","none");
+      clockStr = eltInput.attribute("clock","none");
+      int endianess;
+      if ((endianStr == "none") || (endianStr == "little")) {
+        endianess = AbstractInterface::LittleEndian;
+      }
+      else if (endianStr == "big") {
+        endianess = AbstractInterface::BigEndian;
+      }
+      else {
+        throw (Exception(BLOCKFILE_CORRUPTED));
+      }
 
-    inter = new ReferenceInterface(this,nameStr,AbstractInterface::Input, purpose, typeStr, widthStr, endianess, mult);
-    inputs.append(inter);
+      multStr = eltInput.attribute("multiplicity","none");
+      mult = ReferenceInterface::translateMultiplicity(multStr);
+
+      inter = 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 !)
+        clockStr = clocks.at(0)->getName();
+      }
+      if (! inter->setClockIface(clockStr)) {
+        throw (Exception(BLOCKFILE_CORRUPTED));
+      }
+      inputs.append(inter);
+    }
   }
   // getting each control
   QDomNodeList listNodeInCtl = eltInputs.elementsByTagName("control");
@@ -281,10 +309,12 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
   for(int i=0;i<listNodeOutputs.size();i++) {
     QDomNode node = listNodeOutputs.at(i);
     QDomElement eltOutput = node.toElement();
+
     nameStr = eltOutput.attribute("name","none");
     typeStr = eltOutput.attribute("type","none");
     widthStr = eltOutput.attribute("width","none");
     endianStr = eltOutput.attribute("endian","none");
+    clockStr = eltOutput.attribute("clock","none");
     int endianess;
     if ((endianStr == "none") || (endianStr == "little")) {
       endianess = AbstractInterface::LittleEndian;
@@ -301,6 +331,13 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
     mult = ReferenceInterface::translateMultiplicity(multStr);
 
     inter = 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 !)
+      clockStr = clocks.at(0)->getName();
+    }
+    if (! inter->setClockIface(clockStr)) {
+      throw (Exception(BLOCKFILE_CORRUPTED));
+    }
     outputs.append(inter);
   }
   // getting each control
@@ -329,6 +366,7 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
     typeStr = eltBidir.attribute("type","none");
     widthStr = eltBidir.attribute("width","none");
     endianStr = eltBidir.attribute("endian","none");
+    clockStr = eltBidir.attribute("clock","none");
     int endianess;
     if ((endianStr == "none") || (endianStr == "little")) {
       endianess = AbstractInterface::LittleEndian;
@@ -345,6 +383,13 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
     mult = ReferenceInterface::translateMultiplicity(multStr);
 
     inter = 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 !)
+      clockStr = clocks.at(0)->getName();
+    }
+    if (! inter->setClockIface(clockStr)) {
+      throw (Exception(BLOCKFILE_CORRUPTED));
+    }
     bidirs.append(inter);
   }
 }
@@ -417,28 +462,46 @@ QDataStream& operator<<(QDataStream &out, const ReferenceBlock &b) {
   }
 
   toWrite << b.inputs.size();
-  // firstly write control ifaces
+  // firstly write clock ifaces
+  for(int i=0; i<b.inputs.size(); i++){
+    ReferenceInterface *iface = (ReferenceInterface *)(b.inputs.at(i));
+    if (iface->getPurpose() == AbstractInterface::Clock) {
+      toWrite << iface->getName();
+      toWrite << iface->getType();
+      toWrite << iface->getWidthString();
+      toWrite << iface->getPurpose();
+      toWrite << iface->getDirection();
+      toWrite << iface->getMultiplicity();
+      toWrite << iface->getClockIfaceType();
+      toWrite << iface->getClockIfaceString();
+    }
+  }
+  // secondly write control 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->getType();
-      toWrite << iface->getWidth();
+      toWrite << iface->getWidthString();
       toWrite << iface->getPurpose();
       toWrite << iface->getDirection();    
       toWrite << iface->getMultiplicity();
+      toWrite << iface->getClockIfaceType();
+      toWrite << iface->getClockIfaceString();
     }
   }
   // 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) {
+    if ((iface->getPurpose() != AbstractInterface::Control) && (iface->getPurpose() != AbstractInterface::Clock)) {
       toWrite << iface->getName();
       toWrite << iface->getType();
-      toWrite << iface->getWidth();
+      toWrite << iface->getWidthString();
       toWrite << iface->getPurpose();
       toWrite << iface->getDirection();    
       toWrite << iface->getMultiplicity();
+      toWrite << iface->getClockIfaceType();
+      toWrite << iface->getClockIfaceString();
     }
   }
   toWrite << b.outputs.size();
@@ -448,10 +511,12 @@ QDataStream& operator<<(QDataStream &out, const ReferenceBlock &b) {
     if (iface->getPurpose() == AbstractInterface::Control) {
       toWrite << iface->getName();
       toWrite << iface->getType();
-      toWrite << iface->getWidth();
+      toWrite << iface->getWidthString();
       toWrite << iface->getPurpose();
       toWrite << iface->getDirection();    
       toWrite << iface->getMultiplicity();
+      toWrite << iface->getClockIfaceType();
+      toWrite << iface->getClockIfaceString();
     }
   }
   // secondly, write other ifaces
@@ -460,10 +525,12 @@ QDataStream& operator<<(QDataStream &out, const ReferenceBlock &b) {
     if (iface->getPurpose() != AbstractInterface::Control) {
       toWrite << iface->getName();
       toWrite << iface->getType();
-      toWrite << iface->getWidth();
+      toWrite << iface->getWidthString();
       toWrite << iface->getPurpose();
       toWrite << iface->getDirection();    
       toWrite << iface->getMultiplicity();
+      toWrite << iface->getClockIfaceType();
+      toWrite << iface->getClockIfaceString();
     }
   }
   toWrite << b.bidirs.size();
@@ -471,10 +538,12 @@ QDataStream& operator<<(QDataStream &out, const ReferenceBlock &b) {
     ReferenceInterface *iface = (ReferenceInterface *)(b.bidirs.at(i));
     toWrite << iface->getName();
     toWrite << iface->getType();
-    toWrite << iface->getWidth();
+    toWrite << iface->getWidthString();
     toWrite << iface->getPurpose();
     toWrite << iface->getDirection();    
     toWrite << iface->getMultiplicity();
+    toWrite << iface->getClockIfaceType();
+    toWrite << iface->getClockIfaceString();
   }
 
   out << blockData;
@@ -556,13 +625,24 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) {
     iface->setDirection(val);    
     in >> val;
     iface->setMultiplicity(val);
+    int clkType;
+    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;
+    }
+
     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;
+          cerr << "Abnormal case while reading a reference block in library: cannot set associated control interface for data interface" << endl;
         }      
       }        
     }    
@@ -585,6 +665,16 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) {
     iface->setDirection(val);
     in >> val;   
     iface->setMultiplicity(val);
+    int clkType;
+    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;
+    }
     b.outputs.append(iface);
     if (iface->getPurpose() == AbstractInterface::Data) {
       QString ctlRefName = iface->getName()+"_enb";      
@@ -614,6 +704,16 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) {
     iface->setDirection(val);
     in >> val;    
     iface->setMultiplicity(val);
+    int clkType;
+    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;
+    }
     b.bidirs.append(iface);
   }
 
@@ -635,3 +735,32 @@ void ReferenceBlock::computeAdmittanceDelays() throw(Exception) {
 }
 
 
+void ReferenceBlock::generateVHDL(const QString& path) throw(Exception){
+ throw(Exception(INVALID_REFBLOCK_USE));
+}
+
+void ReferenceBlock::generateComments(QTextStream& out, QDomElement &elt, QString coreFile) throw(Exception) {
+  throw(Exception(INVALID_REFBLOCK_USE));
+}
+
+void ReferenceBlock::generateLibraries(QTextStream& out, QDomElement &elt) throw(Exception) {
+  throw(Exception(INVALID_REFBLOCK_USE));
+}
+
+void ReferenceBlock::generateArchitecture(QTextStream& out, QDomElement &elt ) throw(Exception) {
+  throw(Exception(INVALID_REFBLOCK_USE));
+}
+
+void ReferenceBlock::generateController(QTextStream& out) throw(Exception) {
+  throw(Exception(INVALID_REFBLOCK_USE));
+}
+
+void ReferenceBlock::generateEntityOrComponentBody(QTextStream &out, int indentLevel, bool hasController) throw(Exception) {
+  throw(Exception(INVALID_REFBLOCK_USE));
+}
+
+QList<QString> ReferenceBlock::getExternalResources() {
+  QList<QString> list;
+  return list;
+}
+