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

Private GIT Repository
finished VHDL gen. (but have to test further
authorstephane Domas <stephane.domas@univ-fcomte.fr>
Fri, 30 Mar 2018 14:41:33 +0000 (16:41 +0200)
committerstephane Domas <stephane.domas@univ-fcomte.fr>
Fri, 30 Mar 2018 14:41:33 +0000 (16:41 +0200)
29 files changed:
AbstractBlock.cpp
AbstractBlock.h
BlockImplementation.cpp
BlockImplementation.h
BlockParameterGeneric.cpp
DelayInputModifier.cpp
Dispatcher.cpp
Dispatcher.h
Exception.cpp
Exception.h
ExternalResource.cpp [new file with mode: 0644]
ExternalResource.h [moved from ExternalSource.h with 76% similarity]
ExternalSource.cpp [deleted file]
FunctionalBlock.cpp
FunctionalBlock.h
Graph.cpp
Graph.h
GroupBlock.cpp
GroupBlock.h
MainWindow.cpp
Makefile-isim
Parameters.cpp
Parameters.h
ReferenceBlock.cpp
ReferenceBlock.h
blast.creator.user
blast.files
lib/implementations/impls.bmf
object-files.txt

index 7bdec1b5cdc25a15b1807bf21366a4368edf3945..c1c3c38df0d9d7ab3f6e80af49070ff7121bc648 100644 (file)
@@ -312,7 +312,7 @@ void AbstractBlock::generateComponent(QTextStream& out, bool hasController) thro
   catch(Exception e) {\r
     throw(e);\r
   }\r
   catch(Exception e) {\r
     throw(e);\r
   }\r
-  out << "  end component " << endl << endl;\r
+  out << "  end component; " << endl << endl;\r
 }\r
 \r
 \r
 }\r
 \r
 \r
index 5f2acb563b8b4a33f30865d7b8606d311683b841..0ca55360cc65c761bff83ffd442ad94f9cc00cc2 100644 (file)
@@ -60,7 +60,7 @@ public:
 \r
   // others\r
   void connectClkReset() throw(Exception);  \r
 \r
   // others\r
   void connectClkReset() throw(Exception);  \r
-\r
+  virtual QList<QString> getExternalResources() = 0; // returns the list of all external files needed for VHDL generation\r
   virtual void generateVHDL(const QString& path) throw(Exception) = 0; // main entry to generate the VHDL code\r
   void generateComponent(QTextStream& out, bool hasController=false) throw(Exception); // generate the component using reference\r
   void generateEntity(QTextStream& out, bool hasController=false) throw(Exception); // generate the entity using reference\r
   virtual void generateVHDL(const QString& path) throw(Exception) = 0; // main entry to generate the VHDL code\r
   void generateComponent(QTextStream& out, bool hasController=false) throw(Exception); // generate the component using reference\r
   void generateEntity(QTextStream& out, bool hasController=false) throw(Exception); // generate the entity using reference\r
index 23ec8bcb4aff0d2ff1c5b55b3723670ffd435a6f..365ccb7380c4ffa5d8ca9fe45bcd69f200148586 100644 (file)
@@ -110,217 +110,6 @@ bool BlockImplementation::checkPatterns() {
   return true;  \r
 }\r
 \r
   return true;  \r
 }\r
 \r
-QString BlockImplementation::eval(QString line, QTextStream& out) {\r
-  QString res, s, begLine, endLine, expr;\r
-  evaluator->setExpression(line);\r
-  QRegExp *rxString = new QRegExp("(.*)@{(.*)}(.*)");\r
-  QRegExp *rxValue = new QRegExp("(.*)@val{(.*)}(.*)");\r
-  QRegExp *rxExpr = new QRegExp(".*@eval{(.*)}.*");\r
-\r
-  int nbAt = line.count('@');\r
-  while(nbAt != 0) {\r
-    for(int i = 0; i < line.size(); i++) {\r
-      if(rxString->indexIn(line)) {\r
-        begLine = rxString->cap(1);\r
-        s = rxString->cap(2);\r
-        endLine = rxString->cap(3);\r
-        res = begLine + evalString(s) + endLine + '\n';\r
-        nbAt --;\r
-      }\r
-    }\r
-    for(int i = 0; i < line.size(); i++) {\r
-      if(rxValue->indexIn(line)) {\r
-        begLine = rxValue->cap(1);\r
-        s = rxValue->cap(2);\r
-        endLine = rxValue->cap(3);\r
-        res = begLine + evalValue(s) + endLine + '\n';\r
-        nbAt --;\r
-      }\r
-    }\r
-    for(int i = 0; i < line.size(); i++) {\r
-      if(rxExpr->indexIn(line)) {\r
-        expr = rxExpr->cap(1);\r
-        if(expr.count('@') == 0) {\r
-          evaluator->setExpression(expr);\r
-          s = QString::number(evaluator->evaluate());\r
-        }\r
-        res = begLine + s + endLine + '\n';\r
-        nbAt --;\r
-      }\r
-    }\r
-  }\r
-  return res;\r
-}\r
-\r
-QString BlockImplementation::evalComplex(QString line, int id) {\r
-  QString res, s, begLine, endLine, expr;\r
-  QRegExp *rxString = new QRegExp("(.*)@{(.*)}(.*)");\r
-  QRegExp *rxValue = new QRegExp("(.*)@val{(.*)}(.*)");\r
-  QRegExp *rxExpr = new QRegExp(".*@eval{(.*)}.*");\r
-  QRegExp *rxFor = new QRegExp("@foreach{.*}(@{.*})(.*)@endforeach");\r
-  QRegExp *rxCase = new QRegExp("@caseeach{.*,(.*),(.*)}(@{.*})(.*)@endcaseeach");\r
-  QRegExp *rxCaseDown = new QRegExp("@#-:(.*)");\r
-  QRegExp *rxCaseUp = new QRegExp("@#:(.*)");\r
-  evaluator->setExpression(line);\r
-\r
-  int nbAt = line.count('@') - 2;\r
-  while(nbAt != 0) {\r
-    for(int i = 0; i < line.size(); i++) {\r
-      if(rxString->indexIn(line)) {\r
-        begLine = rxString->cap(1);\r
-        s = rxString->cap(2);\r
-        endLine = rxString->cap(3);\r
-        if(evalStringComplex(s)->size() == 0)\r
-          line = begLine + evalString(s) + endLine;\r
-        nbAt --;\r
-      }\r
-    }\r
-    for(int i = 0; i < line.size(); i++) {\r
-      if(rxValue->indexIn(line)) {\r
-        begLine = rxValue->cap(1);\r
-        s = rxValue->cap(2);\r
-        endLine = rxValue->cap(3);\r
-        line = begLine + evalValue(s) + endLine;\r
-        nbAt --;\r
-      }\r
-    }\r
-    for(int i = 0; i < line.size(); i++) {\r
-      if(rxExpr->indexIn(line)) {\r
-        expr = rxExpr->cap(1);\r
-        if(expr.count('@') == 0) {\r
-          evaluator->setExpression(expr);\r
-          s = QString::number(evaluator->evaluate());\r
-        }\r
-        res = begLine + s + endLine + '\n';\r
-        nbAt --;\r
-      }\r
-    }\r
-  }\r
-\r
-  if(id == 1) {\r
-    if(rxFor->indexIn(line)) {\r
-      QString intName, instruc;\r
-      intName = rxFor->cap(1);\r
-      instruc = rxFor->cap(2);\r
-      QList<AbstractInterface*> *intList = evalStringComplex(intName);\r
-      if(intList->size() != 0) {\r
-        for(int i = 0; i < intList->size(); i++) {\r
-          res = intList->at(i)->getName() + instruc + '\n';\r
-        }\r
-      }\r
-    }\r
-  }\r
-\r
-  else if(id == 2) {\r
-    if(rxCase->indexIn(line)) {\r
-      QString intName, sigName, cases, instruc;\r
-      int number;\r
-      sigName = rxCase->cap(1);\r
-      cases = rxCase->cap(2);\r
-      intName = rxCase->cap(3);\r
-      instruc = rxCase->cap(4);\r
-      QList<AbstractInterface*> *intList = evalStringComplex(intName);\r
-      int listSize = intList->count();\r
-      res = "case " + sigName + " is\n";\r
-      if(rxCaseUp->indexIn(cases)) {\r
-        number = rxCaseUp->cap(1).toInt();\r
-        for(int j = number; j < listSize; j++) {\r
-          if(listSize > 0) {\r
-            for(int i = 0; i < listSize; i++) {\r
-              res += "\twhen " + QString::number(number) + " " + intList->at(i)->getName() + instruc + "\n";\r
-            }\r
-          }\r
-          else\r
-            res += "\twhen " + number + ' ' + intName + instruc + "\n";\r
-          number++;\r
-        }\r
-      }\r
-      if(rxCaseDown->indexIn(cases)) {\r
-        number = rxCaseDown->cap(1).toInt();\r
-        for(int j = number; j < listSize; j++) {\r
-          if(listSize > 0) {\r
-            for(int i = 0; i < listSize; i++) {\r
-              res += "\twhen " + QString::number(number) + " " + intList->at(i)->getName() + instruc + "\n";\r
-            }\r
-          }\r
-          else\r
-            res += "\twhen " + number + ' ' + intName + instruc + "\n";\r
-          number--;\r
-        }\r
-        res += "end case ;\n";\r
-      }\r
-    }\r
-  }\r
-  return res;\r
-}\r
-\r
-QString BlockImplementation::evalString(QString s) {\r
-\r
-  QString name = getIfaceUserName(block->AbstractBlock::getIfaceFromName(s));\r
-  return name;\r
-}\r
-\r
-QList<AbstractInterface*>* BlockImplementation::evalStringComplex(QString s) {\r
-\r
-  int j = 0;\r
-  QList<AbstractInterface*> *listInterfaces = new QList<AbstractInterface*>();\r
-  AbstractInterface *inter = block->AbstractBlock::getIfaceFromName(s);\r
-  QList<AbstractInterface*> listIntBlock = block->getInterfaces();\r
-  for(int i = 0; i < listIntBlock.size(); i++) {\r
-    if(inter->getName().compare(listIntBlock.at(i)->getName()) < -1) {\r
-      listInterfaces->insert(j, inter);\r
-      j ++;\r
-    }\r
-  }\r
-  return listInterfaces;\r
-}\r
-\r
-QString BlockImplementation::evalValue(QString s) {\r
-\r
-  QString val = "";\r
-  if(paramMap.contains(s))\r
-    val = paramMap.value(s);\r
-  return val;\r
-}\r
-\r
-QString BlockImplementation::getIfaceUserName(AbstractInterface* refIface) {\r
-\r
-  if (! refIface->isReferenceInterface()) return "";\r
-\r
-  AbstractInterface* funcIface = NULL;\r
-\r
-  if (refIface->getDirection() == AbstractInterface::Input) {\r
-    foreach(AbstractInterface* iface, block->getInputs()) {\r
-      FunctionalInterface* fi = (FunctionalInterface*)iface;\r
-      if (fi->getReference() == refIface) {\r
-        funcIface = iface;\r
-        break;\r
-      }\r
-    }\r
-  }\r
-  else if (refIface->getDirection() == AbstractInterface::Output) {\r
-    foreach(AbstractInterface* iface, block->getOutputs()) {\r
-      FunctionalInterface* fi = (FunctionalInterface*)iface;\r
-      if (fi->getReference() == refIface) {\r
-        funcIface = iface;\r
-        break;\r
-      }\r
-    }\r
-  }\r
-  else if (refIface->getDirection() == AbstractInterface::InOut) {\r
-    foreach(AbstractInterface* iface, block->getBidirs()) {\r
-      FunctionalInterface* fi = (FunctionalInterface*)iface;\r
-      if (fi->getReference() == refIface) {\r
-        funcIface = iface;\r
-        break;\r
-      }\r
-    }\r
-  }\r
-  if (funcIface == NULL) return "";\r
-\r
-  return funcIface->getName();\r
-}\r
-\r
 QDataStream& operator<<(QDataStream &out, const BlockImplementation &impl) {\r
 \r
   out.setVersion(QDataStream::Qt_5_0);\r
 QDataStream& operator<<(QDataStream &out, const BlockImplementation &impl) {\r
 \r
   out.setVersion(QDataStream::Qt_5_0);\r
@@ -331,6 +120,7 @@ QDataStream& operator<<(QDataStream &out, const BlockImplementation &impl) {
   toWrite << impl.xmlFile;\r
   toWrite << impl.referenceXml;\r
   toWrite << impl.referenceMd5;\r
   toWrite << impl.xmlFile;\r
   toWrite << impl.referenceXml;\r
   toWrite << impl.referenceMd5;\r
+  toWrite << impl.resources;\r
   // saving patterns\r
   toWrite << impl.noPatterns;\r
   toWrite << impl.delta;\r
   // saving patterns\r
   toWrite << impl.noPatterns;\r
   toWrite << impl.delta;\r
@@ -354,6 +144,7 @@ QDataStream& operator>>(QDataStream &in, BlockImplementation &impl) {
   in >> impl.xmlFile;\r
   in >> impl.referenceXml;\r
   in >> impl.referenceMd5;\r
   in >> impl.xmlFile;\r
   in >> impl.referenceXml;\r
   in >> impl.referenceMd5;\r
+  in >> impl.resources;\r
   // loading patterns\r
   in >> impl.noPatterns;\r
   in >> impl.delta;\r
   // loading patterns\r
   in >> impl.noPatterns;\r
   in >> impl.delta;\r
@@ -363,38 +154,3 @@ QDataStream& operator>>(QDataStream &in, BlockImplementation &impl) {
 \r
   return in;\r
 }\r
 \r
   return in;\r
 }\r
-\r
-QString BlockImplementation::calculateWidth(QString s){\r
-  QRegExp *rxWidth = new QRegExp("$*([a-zA-Z0-9_-]*)");\r
-  QStringList matchList = s.split(" ");\r
-  int pos = 0;\r
-  QString res, line;\r
-  QList<BlockParameter*> listParams = reference->getParameters();\r
-\r
-  while ((pos = rxWidth->indexIn(s, pos)) != -1) {\r
-    matchList << rxWidth->cap(1);\r
-    pos += rxWidth->matchedLength();\r
-  }\r
-\r
-  for (int i = 0; i < matchList.size(); i++) {\r
-    QString match = matchList.at(i);\r
-    if(rxWidth->indexIn(match)) {\r
-      for(int j = 0; j < listParams.size(); j++) {\r
-        if(match.compare(listParams.at(j)->getName())) {\r
-          BlockParameter *param = listParams.at(i);\r
-          if(param->getContext() == "generic") {\r
-            match = match.remove('$');\r
-          }\r
-          else {\r
-            match = param->getValue().toString();\r
-          }\r
-        }\r
-      }\r
-    }\r
-  }\r
-  line = matchList.join(' ');\r
-  evaluator->setExpression(line);\r
-  res = evaluator->evaluate();\r
-  return res;\r
-}\r
-\r
index 72776e3b675af175a773a0e38c2d774a7518feda..a9a52494364310af019fd3cb2d32c75ba7e2f65f 100644 (file)
@@ -35,6 +35,7 @@ public:
   inline QHash<QString,QString> getConsumptionPattern() { return consumptionPattern; }\r
   inline QHash<QString,QString> getProductionPattern() { return productionPattern; }\r
   inline QString getProductionCounter() { return productionCounter; }\r
   inline QHash<QString,QString> getConsumptionPattern() { return consumptionPattern; }\r
   inline QHash<QString,QString> getProductionPattern() { return productionPattern; }\r
   inline QString getProductionCounter() { return productionCounter; }\r
+  inline QList<QString> getResources() { return resources; }\r
 \r
   // setters\r
   inline void setDelta(QString _delta) { delta = _delta; }\r
 \r
   // setters\r
   inline void setDelta(QString _delta) { delta = _delta; }\r
@@ -46,25 +47,18 @@ public:
 \r
   inline bool hasNoPatterns() { return noPatterns; }\r
 \r
 \r
   inline bool hasNoPatterns() { return noPatterns; }\r
 \r
-  QString eval(QString line, QTextStream& out);\r
-  QString evalComplex(QString line, int num);\r
-  QString evalString(QString s);\r
-  QList<AbstractInterface*>* evalStringComplex(QString s);\r
-  QString evalValue(QString s);\r
-  QString calculateWidth(QString s);\r
-\r
   inline void setReference(ReferenceBlock* _reference) { reference = _reference; }\r
 \r
   void loadPatterns(QDomElement &root) throw(Exception);\r
   bool checkPatterns();  \r
   \r
   inline void setReference(ReferenceBlock* _reference) { reference = _reference; }\r
 \r
   void loadPatterns(QDomElement &root) throw(Exception);\r
   bool checkPatterns();  \r
   \r
-  inline void addSource(QString file) { sources.append(file); }\r
+  inline void addResource(QString file) { resources.append(file); }\r
 private:  \r
   QString xmlFile;\r
   QString referenceXml;\r
   QString referenceMd5;\r
 \r
 private:  \r
   QString xmlFile;\r
   QString referenceXml;\r
   QString referenceMd5;\r
 \r
-  QList<QString> sources;\r
+  QList<QString> resources;\r
 \r
   QMap<QString, int> paramMap;\r
   ArithmeticEvaluator* evaluator;\r
 \r
   QMap<QString, int> paramMap;\r
   ArithmeticEvaluator* evaluator;\r
@@ -74,9 +68,7 @@ private:
   QString delta;\r
   QHash<QString,QString> consumptionPattern; // key = reference interface name, value = pattern expression\r
   QHash<QString,QString> productionPattern; // key = reference interface name, value = pattern expression\r
   QString delta;\r
   QHash<QString,QString> consumptionPattern; // key = reference interface name, value = pattern expression\r
   QHash<QString,QString> productionPattern; // key = reference interface name, value = pattern expression\r
-  QString productionCounter;\r
-\r
-  QString getIfaceUserName(AbstractInterface* refIface); // get the name of an interface given by the user, from the reference interface\r
+  QString productionCounter;  \r
 \r
   friend QDataStream &operator<<(QDataStream &out, const BlockImplementation &impl);\r
   friend QDataStream &operator>>(QDataStream &in, BlockImplementation &impl);\r
 \r
   friend QDataStream &operator<<(QDataStream &out, const BlockImplementation &impl);\r
   friend QDataStream &operator>>(QDataStream &in, BlockImplementation &impl);\r
index d652c3740d90c18632128304320125a7effd1a3e..14b8c595f20d7ef5105504ed16949e2c5740d285 100644 (file)
@@ -59,14 +59,33 @@ QString BlockParameterGeneric::toVHDL(int context, int flags) {
       formatNoValue.append(";");\r
     }\r
 \r
       formatNoValue.append(";");\r
     }\r
 \r
-    if (!userValue.isNull()) {\r
-      ret = formatValue.arg(name).arg(getTypeString()).arg(userValue.toString());\r
-    }\r
-    else if (!defaultValue.isNull()) {\r
-      ret = formatValue.arg(name).arg(getTypeString()).arg(defaultValue.toString());\r
+    QString typeStr = "";\r
+    QString valueStr = "";\r
+    if ((type == Boolean)||(type == Bit)) {\r
+      typeStr = "std_logic";\r
+      if (!userValue.isNull()) {\r
+        valueStr = "'"+userValue.toString()+"'";\r
+        ret = formatValue.arg(name).arg(typeStr).arg(valueStr);\r
+      }\r
+      else if (!defaultValue.isNull()) {\r
+        valueStr = "'"+defaultValue.toString()+"'";\r
+        ret = formatValue.arg(name).arg(typeStr).arg(valueStr);\r
+      }\r
+      else {\r
+        ret = formatNoValue.arg(name).arg(typeStr);\r
+      }\r
     }\r
     else {\r
     }\r
     else {\r
-      ret = formatNoValue.arg(name).arg(getTypeString());\r
+      typeStr = getTypeString();\r
+      if (!userValue.isNull()) {\r
+        ret = formatValue.arg(name).arg(typeStr).arg(userValue.toString());\r
+      }\r
+      else if (!defaultValue.isNull()) {\r
+        ret = formatValue.arg(name).arg(typeStr).arg(defaultValue.toString());\r
+      }\r
+      else {\r
+        ret = formatNoValue.arg(name).arg(typeStr);\r
+      }\r
     }\r
   }\r
   else if (context == BlockParameter::Instance) {\r
     }\r
   }\r
   else if (context == BlockParameter::Instance) {\r
@@ -87,10 +106,20 @@ QString BlockParameterGeneric::toVHDL(int context, int flags) {
     }\r
     else {\r
       if (!userValue.isNull()) {\r
     }\r
     else {\r
       if (!userValue.isNull()) {\r
-        ret = format.arg(name).arg(userValue.toString());\r
+        if ((type == Boolean)||(type == Bit)) {\r
+          ret = format.arg(name).arg("'"+userValue.toString()+"'");\r
+        }\r
+        else {\r
+          ret = format.arg(name).arg(userValue.toString());\r
+        }\r
       }\r
       else if (!defaultValue.isNull()) {\r
       }\r
       else if (!defaultValue.isNull()) {\r
-        ret = format.arg(name).arg(defaultValue.toString());\r
+        if ((type == Boolean)||(type == Bit)) {\r
+          ret = format.arg(name).arg("'"+defaultValue.toString()+"'");\r
+        }\r
+        else {\r
+          ret = format.arg(name).arg(defaultValue.toString());\r
+        }\r
       }\r
       else {\r
         // abnormal case\r
       }\r
       else {\r
         // abnormal case\r
index a90695a2ecdb6737b92a547ffa527d1e86c666cd..a60d7e27a23440da0f40c862a33e892317eda7b9 100644 (file)
@@ -34,23 +34,30 @@ QString DelayInputModifier::toVHDL(int context, int flags) throw(Exception) {
   dm1.setNum(delayLength-1);\r
   dm2.setNum(delayLength-2);\r
   QString ret="";\r
   dm1.setNum(delayLength-1);\r
   dm2.setNum(delayLength-2);\r
   QString ret="";\r
+  QString clkName = "clk";\r
+  QString resetName = "reset";\r
+  if (toIface->getOwner()->getParent()->isTopGroupBlock()) {\r
+    clkName = "from_clkrstgen_clk";\r
+    resetName ="from_clkrstgen_reset";\r
+  }\r
+\r
   if (context == Architecture) {\r
   if (context == Architecture) {\r
-    ret = toName + "_mod_process : process(clk,reset)\n";\r
+    ret = toName + "_mod_process : process("+clkName+","+resetName+")\n";\r
     ret += "  begin\n";\r
     ret += "  begin\n";\r
-    ret += "    if reset = '1' then\n";\r
+    ret += "    if "+resetName+" = '1' then\n";\r
     ret += "      "+toName+"_dly     <= (others => (others => '0'));\n";\r
     ret += "      "+toCtlName+"_dly  <= (others => '0');\n";\r
     ret += "      "+toName+"_mod     <= (others => '0');\n";\r
     ret += "      "+toCtlName+"_mod  <= '0';\n";\r
     ret += "      "+toName+"_dly     <= (others => (others => '0'));\n";\r
     ret += "      "+toCtlName+"_dly  <= (others => '0');\n";\r
     ret += "      "+toName+"_mod     <= (others => '0');\n";\r
     ret += "      "+toCtlName+"_mod  <= '0';\n";\r
-    ret += "    elsif rising_edge(clk) then\n";\r
+    ret += "    elsif rising_edge("+clkName+") then\n";\r
     ret += "      "+toName+"_mod <= "+toName+"_dly("+dm1+");\n";\r
     ret += "      "+toCtlName+"_mod  <= "+toCtlName+"_dly("+dm1+");\n";\r
     ret += "      "+toName+"_dly(0)  <= "+fromIface->toVHDL(AbstractInterface::Instance,0)+";\n";\r
     ret += "      "+toCtlName+"_dly(0)  <= "+fromCtlIface->toVHDL(AbstractInterface::Instance,0)+";\n";\r
     ret += "      "+toName+"_dly(1 to "+dm1+")  <= "+toName+"_dly(0 to "+dm2+");\n";\r
     ret += "      "+toCtlName+"_dly(1 to "+dm1+")  <= "+toCtlName+"_dly(0 to "+dm2+");\n";\r
     ret += "      "+toName+"_mod <= "+toName+"_dly("+dm1+");\n";\r
     ret += "      "+toCtlName+"_mod  <= "+toCtlName+"_dly("+dm1+");\n";\r
     ret += "      "+toName+"_dly(0)  <= "+fromIface->toVHDL(AbstractInterface::Instance,0)+";\n";\r
     ret += "      "+toCtlName+"_dly(0)  <= "+fromCtlIface->toVHDL(AbstractInterface::Instance,0)+";\n";\r
     ret += "      "+toName+"_dly(1 to "+dm1+")  <= "+toName+"_dly(0 to "+dm2+");\n";\r
     ret += "      "+toCtlName+"_dly(1 to "+dm1+")  <= "+toCtlName+"_dly(0 to "+dm2+");\n";\r
-    ret += "    end if\n";\r
-    ret += "  end process "+toName + "_mod_process\n";\r
+    ret += "    end if;\n";\r
+    ret += "  end process "+toName + "_mod_process;\n";\r
   }\r
   else if (context == Signal) {\r
     QString sig = toIface->toVHDL(AbstractInterface::Signal,0);\r
   }\r
   else if (context == Signal) {\r
     QString sig = toIface->toVHDL(AbstractInterface::Signal,0);\r
index c3ff33fd91b713078ff111e3ec9e2389b630477c..b9e09a946151f447a71b6eb287cffa586f6fe39b 100644 (file)
@@ -2,6 +2,8 @@
 #include "Parameters.h"
 #include "MainWindow.h"
 
 #include "Parameters.h"
 #include "MainWindow.h"
 
+#include "ExternalResource.h"
+
 #include "Graph.h"
 #include "ReferenceBlock.h"
 #include "GroupBlock.h"
 #include "Graph.h"
 #include "ReferenceBlock.h"
 #include "GroupBlock.h"
@@ -71,6 +73,7 @@ GroupWidget *Dispatcher::loadProject(const QString& filename) {
 
   QFileInfo info(filename);
   params->projectPath = info.absolutePath();
 
   QFileInfo info(filename);
   params->projectPath = info.absolutePath();
+  params->projectName = info.baseName();
   cout << "project path = " << qPrintable(params->projectPath) << endl;
   groupList.append(topGroup);
   return topGroup;
   cout << "project path = " << qPrintable(params->projectPath) << endl;
   groupList.append(topGroup);
   return topGroup;
@@ -174,6 +177,93 @@ void Dispatcher::changeConnectionMode(int mode){
   */
 }
 
   */
 }
 
+void Dispatcher::generateVHDL() throw(Exception) {
+  static QString fctName = "Dispatcher::generateVHDL()";
+#ifdef DEBUG_FCTNAME
+  cout << "call to " << qPrintable(fctName) << endl;
+#endif
+
+  QDir baseDir(params->projectPath);
+  QDir srcDir(params->projectPath+"/src");
+
+  if (!baseDir.exists()) {
+    cerr << "Project path " << qPrintable(params->projectPath) << " no longer exists. First, recreate it and put the project file within. Then retry to generate." << endl;
+    return;
+  }
+
+  if (srcDir.exists()) {
+    srcDir.removeRecursively();
+  }
+  baseDir.mkdir("src");
+
+  if (! baseDir.exists("testbench")) {
+    baseDir.mkdir("testbench");
+  }
+  if (! baseDir.exists("Makefile")) {
+    QFile make("/home/sdomas/Projet/Blast/code/blast/Makefile-isim");
+    QString dest = params->projectPath;
+    dest += "/Makefile";
+    make.copy(dest);
+  }
+
+  // copying external resources
+  QString dest = params->projectPath;
+  dest += "/src/";
+  try {
+    params->getGraph()->generateVHDL(dest);
+
+    QList<QString> extResources = params->getGraph()->getExternalResources();
+    foreach(QString name, extResources) {
+      cout << qPrintable(name) << endl;
+      QList<ExternalResource*> lstRes = params->searchResourceByName(name);
+      foreach(ExternalResource* res, lstRes) {
+        QFile resFile(res->getFile());
+        QFileInfo info(res->getFile());
+        QString destFile = dest+info.fileName();
+        cout << "copying " << qPrintable(res->getFile()) << " into " << qPrintable(destFile) << endl;
+        resFile.copy(destFile);
+      }
+    }
+  }
+  catch(Exception e) {
+    throw(e);
+  }
+
+  // creating parameters file
+  QString paramName = params->projectPath+"/params-isim.txt";
+  QFile paramFile(paramName);
+  if (!paramFile.open(QIODevice::WriteOnly)) {
+    throw(Exception(PROJECTPATH_NOACCESS));
+  }
+  QTextStream out(&paramFile);
+  out << "PROJECT_NAME := " << params->projectName << endl << endl;
+  out << "SRC_DIR := src" << endl;
+  out << "TB_DIR := testbench" << endl << endl;
+  out << "VHDL_SRC := ";
+  QStringList filter;
+  filter << "*.vhd" ;
+  srcDir.setNameFilters(filter);
+  QStringList listVHDL = srcDir.entryList();
+  for(int j=0;j<listVHDL.size();j++) {
+    if (j > 0) {
+      out << "\t";
+    }
+    out << "$(SRC_DIR)/" << qPrintable(listVHDL.at(j));
+    if (j != listVHDL.size()-1) {
+      out << " \\";
+    }
+    out << endl;
+  }
+  out << endl;
+  out << "VL_SRC := ${XILINX}/verilog/src/glbl.v" << endl << endl;
+  out << "TB_SRC := $(TB_DIR)/$(PROJECT_NAME)_tb.vhd" << endl << endl;
+  out << "SIMU_EXE := $(PROJECT_NAME)_tb" << endl << endl;
+
+  paramFile.close();
+
+
+}
+
 void Dispatcher::generateBlockVHDL(BoxItem *item){
   static QString fctName = "Dispatcher::generateBlockVHDL()";
 #ifdef DEBUG_FCTNAME
 void Dispatcher::generateBlockVHDL(BoxItem *item){
   static QString fctName = "Dispatcher::generateBlockVHDL()";
 #ifdef DEBUG_FCTNAME
index 538ee667d23cfcded6ff7b63e4fc55ef12bf0fdd..807c3bb1b7139fc099e5940dec698f44d1df14cf 100644 (file)
@@ -20,6 +20,8 @@ class ConnectionItem;
 class InterfaceItem;
 class GroupBlock;
 class FunctionalBlock;
 class InterfaceItem;
 class GroupBlock;
 class FunctionalBlock;
+#include "Exception.h"
+class Exception;
 
 
 
 
 
 
@@ -62,7 +64,12 @@ public:
   bool isCurrentProject;
 
 public slots:
   bool isCurrentProject;
 
 public slots:
+
+  // graph ops
   QMap<int, QString> getAllGroupNames();
   QMap<int, QString> getAllGroupNames();
+  void generateVHDL() throw(Exception);
+
+  // scene ops
   GroupScene* getSceneById(int id);
   GroupScene* getSceneByName(QString name);
   BoxItem* getBoxItemById(int id);
   GroupScene* getSceneById(int id);
   GroupScene* getSceneByName(QString name);
   BoxItem* getBoxItemById(int id);
index 8c59d0d2aebb64f2a57f36a7fedc49dccd7df1d4..1329f0c81caa125f0662ffb93ee7c1b205ef2bc8 100644 (file)
@@ -20,6 +20,7 @@ QString Exception::getDefaultMessage() {
   case CONFIGFILE_NOACCESS : ret = tr("Blast configuration file cannot be read"); break;
   case PROJECTFILE_CORRUPTED : ret = tr("Project file is corrupted"); break;
   case PROJECTFILE_NOACCESS : ret = tr("Project file cannot be read"); break;
   case CONFIGFILE_NOACCESS : ret = tr("Blast configuration file cannot be read"); break;
   case PROJECTFILE_CORRUPTED : ret = tr("Project file is corrupted"); break;
   case PROJECTFILE_NOACCESS : ret = tr("Project file cannot be read"); break;
+  case PROJECTPATH_NOACCESS : ret = tr("Project (sub)directory or file cannot be created or accessed"); break;
   case BLOCKPATH_NOACCESS : ret = tr("Directory containing references cannot be accessed (no rights/existence)"); break;
   case IMPLPATH_NOACCESS : ret = tr("Directory containing implementations cannot be accessed (no rights/existence)"); break;
   case BLOCKFILE_CORRUPTED : ret = tr("Block file is corrupted"); break;
   case BLOCKPATH_NOACCESS : ret = tr("Directory containing references cannot be accessed (no rights/existence)"); break;
   case IMPLPATH_NOACCESS : ret = tr("Directory containing implementations cannot be accessed (no rights/existence)"); break;
   case BLOCKFILE_CORRUPTED : ret = tr("Block file is corrupted"); break;
index 608bc551a25f39b660ce982fb52680152d7e2a71..00d146ae85e025e75467a1e44df85be327ff2d6e 100644 (file)
@@ -25,6 +25,7 @@ supp. infos : saved in UTF-8 [éè]
 
 #define PROJECTFILE_NOACCESS 201
 #define PROJECTFILE_CORRUPTED 202
 
 #define PROJECTFILE_NOACCESS 201
 #define PROJECTFILE_CORRUPTED 202
+#define PROJECTPATH_NOACCESS 203
 
 #define BLOCKFILE_NOACCESS 301
 #define BLOCKFILE_CORRUPTED 302
 
 #define BLOCKFILE_NOACCESS 301
 #define BLOCKFILE_CORRUPTED 302
diff --git a/ExternalResource.cpp b/ExternalResource.cpp
new file mode 100644 (file)
index 0000000..4f3f7fd
--- /dev/null
@@ -0,0 +1,9 @@
+#include "ExternalResource.h"\r
+\r
+\r
+ExternalResource::ExternalResource(const QString& _name, const QString& _file, int _type) {\r
+\r
+  name = _name;\r
+  file = _file;\r
+  type = _type;\r
+}\r
similarity index 76%
rename from ExternalSource.h
rename to ExternalResource.h
index 5c244c4b37c4182527ca2eaa992a2aa00d81539f..e3adf1bda2bbe07e7894775a76716ce12d902768 100644 (file)
 using namespace std;\r
 using namespace Qt;\r
 \r
 using namespace std;\r
 using namespace Qt;\r
 \r
-class ExternalSource {\r
+class ExternalResource {\r
 \r
 public :\r
 \r
   enum SourceType { Code = 1, Package, Netlist, InitFile};\r
 \r
 \r
 public :\r
 \r
   enum SourceType { Code = 1, Package, Netlist, InitFile};\r
 \r
-  ExternalSource(const QString& _name, const QString& _file, int _type = Code);\r
+  ExternalResource(const QString& _name, const QString& _file, int _type = Code);\r
 \r
   // getters\r
   inline QString getName() { return name; }\r
 \r
   // getters\r
   inline QString getName() { return name; }\r
diff --git a/ExternalSource.cpp b/ExternalSource.cpp
deleted file mode 100644 (file)
index b0f8b32..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#include "ExternalSource.h"\r
-\r
-\r
-ExternalSource::ExternalSource(const QString& _name, const QString& _file, int _type) {\r
-\r
-  name = _name;\r
-  file = _file;\r
-  type = _type;\r
-}\r
index 3ea8253b6f0f30749809a35980c9edd32d2613af..449e2ecee4df3605beff48c630451fb3c4a31dd1 100644 (file)
@@ -1315,9 +1315,23 @@ int FunctionalBlock::createTriggers() {
   return triggers.size();\r
 }\r
 \r
   return triggers.size();\r
 }\r
 \r
+QList<QString> FunctionalBlock::getExternalResources() {\r
+\r
+  BlockImplementation* impl = reference->getImplementations().at(0); // for now only take first impl available\r
+  QList<QString> list = impl->getResources();\r
+  foreach(QString s, list) {\r
+    cout << qPrintable(s) << " ";\r
+  }\r
+  cout << endl;\r
+\r
+  return list;\r
+}\r
+\r
+\r
 void FunctionalBlock::generateVHDL(const QString& path) throw(Exception){\r
     \r
 void FunctionalBlock::generateVHDL(const QString& path) throw(Exception){\r
     \r
-  BlockImplementation* impl = reference->getImplementations().at(0); // for now only take first impl available\r
+  BlockImplementation* impl = reference->getImplementations().at(0); // for now only take first impl available  \r
+\r
   QFile implFile(impl->getXmlFile());\r
 \r
   // reading in into QDomDocument\r
   QFile implFile(impl->getXmlFile());\r
 \r
   // reading in into QDomDocument\r
@@ -1445,7 +1459,7 @@ void FunctionalBlock::generateLibraries(QTextStream& out, QDomElement &elt) thro
       QDomElement eltPack = nodePack.toElement();\r
       QString namePack = eltPack.attribute("name","none");\r
       QString usePack = eltPack.attribute("use","none");\r
       QDomElement eltPack = nodePack.toElement();\r
       QString namePack = eltPack.attribute("name","none");\r
       QString usePack = eltPack.attribute("use","none");\r
-      out << "use " << nameLib << "." << namePack << "." << usePack << endl;\r
+      out << "use " << nameLib << "." << namePack << "." << usePack << ";" << endl;\r
     }\r
     out << endl;\r
   }\r
     }\r
     out << endl;\r
   }\r
@@ -1485,106 +1499,82 @@ void FunctionalBlock::generateEntityOrComponentBody(QTextStream& out, int indent
 \r
   out << indent << "  port (" << endl;\r
 \r
 \r
   out << indent << "  port (" << endl;\r
 \r
+  QString ports = "";\r
+  QTextStream outPorts(&ports);\r
+\r
   // Generation of the clk & rst signals\r
   // Generation of the clk & rst signals\r
-  out << indent << "    -- clk/rst" << endl;\r
+  outPorts << indent << "    -- clk/rst" << endl;\r
   foreach(AbstractInterface* iface, listInputs) {\r
     if(iface->getPurpose() == AbstractInterface::Clock || iface->getPurpose() == AbstractInterface::Reset) {\r
   foreach(AbstractInterface* iface, listInputs) {\r
     if(iface->getPurpose() == AbstractInterface::Clock || iface->getPurpose() == AbstractInterface::Reset) {\r
-      out << indent << "    " << iface->getName() << " : in std_logic;" << endl;\r
+      outPorts << indent << "    " << iface->getName() << " : in std_logic;" << endl;\r
     }\r
   }\r
   foreach(AbstractInterface* iface, listOutputs) {\r
     if(iface->getPurpose() == AbstractInterface::Clock || iface->getPurpose() == AbstractInterface::Reset) {\r
     }\r
   }\r
   foreach(AbstractInterface* iface, listOutputs) {\r
     if(iface->getPurpose() == AbstractInterface::Clock || iface->getPurpose() == AbstractInterface::Reset) {\r
-      out << indent << "    " << iface->getName() << " : out std_logic;" << endl;\r
+      outPorts << indent << "    " << iface->getName() << " : out std_logic;" << endl;\r
     }\r
   }\r
 \r
   if (hasController) {\r
     // Generation of the wishbone signals\r
     }\r
   }\r
 \r
   if (hasController) {\r
     // Generation of the wishbone signals\r
-    out << indent << "    -- registers r/w via wishbone" << endl;\r
+    outPorts << indent << "    -- registers r/w via wishbone" << endl;\r
     QList<BlockParameter*> listWB = reference->getWishboneParameters();\r
     for(i=0;i<listWB.size()-1;i++) {\r
     QList<BlockParameter*> listWB = reference->getWishboneParameters();\r
     for(i=0;i<listWB.size()-1;i++) {\r
-      out << indent << "    " << listWB.at(i)->toVHDL(BlockParameter::Entity, 0) << endl;\r
+      outPorts << indent << "    " << listWB.at(i)->toVHDL(BlockParameter::Entity, 0) << endl;\r
     }\r
     }\r
-    out << indent << "    " << listWB.at(i)->toVHDL(BlockParameter::Entity,BlockParameter::NoComma) << endl;\r
+    outPorts << indent << "    " << listWB.at(i)->toVHDL(BlockParameter::Entity,BlockParameter::NoComma) << endl;\r
   }\r
 \r
   }\r
 \r
-\r
-  int count = 0;\r
-  foreach(AbstractInterface* iface, getInterfaces()) {\r
-    if((iface->getPurpose() == AbstractInterface::Data)||(iface->getPurpose() == AbstractInterface::Control)) count++;\r
-  }\r
   // Generation of the data/control signals\r
 \r
   // Generation of the data/control signals\r
 \r
-  int flag = 0;\r
-  bool first = true;\r
-\r
-  foreach(AbstractInterface* iface, listInputs) {\r
-    if(iface->getPurpose() == AbstractInterface::Data) {\r
-      if (first) {\r
-        out << indent << "    -- input data ports" << endl;\r
-        first = false;\r
-      }\r
-      count--;\r
-      if (count == 0) flag = AbstractInterface::NoComma;\r
-      out << indent << "    " << iface->toVHDL(AbstractInterface::Entity, flag) << endl;\r
+  QList<AbstractInterface*> listIface = getInterfaces(AbstractInterface::Input, AbstractInterface::Data);\r
+  if (listIface.size()>0) {\r
+    outPorts << indent << "    -- input data ports" << endl;\r
+    foreach(AbstractInterface* iface, listIface) {\r
+      outPorts << indent << "    " << iface->toVHDL(AbstractInterface::Entity, 0) << endl;\r
     }\r
   }\r
     }\r
   }\r
-  first = true;\r
-  foreach(AbstractInterface* iface, listInputs) {\r
-    if(iface->getPurpose() == AbstractInterface::Control) {\r
-      if (first) {\r
-        out << indent << "    -- input control ports" << endl;\r
-        first = false;\r
-      }\r
-      count--;\r
-      if (count == 0) flag = AbstractInterface::NoComma;\r
-      out << indent << "    " << iface->toVHDL(AbstractInterface::Entity, flag) << endl;\r
+  listIface = getInterfaces(AbstractInterface::Input, AbstractInterface::Control);\r
+  if (listIface.size()>0) {\r
+    outPorts << indent << "    -- input control ports" << endl;\r
+    foreach(AbstractInterface* iface, listIface) {\r
+      outPorts << indent << "    " << iface->toVHDL(AbstractInterface::Entity, 0) << endl;\r
     }\r
   }\r
     }\r
   }\r
-  first = true;\r
-  foreach(AbstractInterface* iface, listOutputs) {\r
-    if(iface->getPurpose() == AbstractInterface::Data) {\r
-      if (first) {\r
-        out << indent << "    -- output data ports" << endl;\r
-        first = false;\r
-      }\r
-      count--;\r
-      if (count == 0) flag = AbstractInterface::NoComma;\r
-      out << indent << "    " << iface->toVHDL(AbstractInterface::Entity, flag) << endl;\r
+  listIface = getInterfaces(AbstractInterface::Output, AbstractInterface::Data);\r
+  if (listIface.size()>0) {\r
+    outPorts << indent << "    -- output data ports" << endl;\r
+    foreach(AbstractInterface* iface, listIface) {\r
+      outPorts << indent << "    " << iface->toVHDL(AbstractInterface::Entity, 0) << endl;\r
     }\r
   }\r
     }\r
   }\r
-  first = true;\r
-  foreach(AbstractInterface* iface, listOutputs) {\r
-    if(iface->getPurpose() == AbstractInterface::Control) {\r
-      if (first) {\r
-        out << indent << "    -- output control ports" << endl;\r
-        first = false;\r
-      }\r
-      count--;\r
-      if (count == 0) flag = AbstractInterface::NoComma;\r
-      out << indent << "    " << iface->toVHDL(AbstractInterface::Entity, flag) << endl;\r
+  listIface = getInterfaces(AbstractInterface::Output, AbstractInterface::Control);\r
+  if (listIface.size()>0) {\r
+    outPorts << indent << "    -- output control ports" << endl;\r
+    foreach(AbstractInterface* iface, listIface) {\r
+      outPorts << indent << "    " << iface->toVHDL(AbstractInterface::Entity, 0) << endl;\r
     }\r
   }\r
     }\r
   }\r
-  first = true;\r
-  foreach(AbstractInterface* iface, listBidirs) {\r
-    if(iface->getPurpose() == AbstractInterface::Data) {\r
-      if (first) {\r
-        out << indent << "    -- bidirs data ports" << endl;\r
-        first = false;\r
-      }\r
-      count--;\r
-      if (count == 0) flag = AbstractInterface::NoComma;\r
-      out << indent << "    " << iface->toVHDL(AbstractInterface::Entity, flag) << endl;\r
+  listIface = getInterfaces(AbstractInterface::InOut, AbstractInterface::Data);\r
+  if (listIface.size()>0) {\r
+    outPorts << indent << "    -- bidirs data ports" << endl;\r
+    foreach(AbstractInterface* iface, listIface) {\r
+      outPorts << indent << "    " << iface->toVHDL(AbstractInterface::Entity, 0) << endl;\r
     }\r
   }\r
     }\r
   }\r
+\r
+  ports.chop(2);\r
+  ports += "\n";\r
+  out << ports;\r
   out << indent << "    );" << endl << endl;\r
 \r
 }\r
 \r
 void FunctionalBlock::generateArchitecture(QTextStream& out, QDomElement &elt ) throw(Exception) {\r
   out << indent << "    );" << endl << endl;\r
 \r
 }\r
 \r
 void FunctionalBlock::generateArchitecture(QTextStream& out, QDomElement &elt ) throw(Exception) {\r
+  QRegularExpression rxPort("@\\{([a-zA-Z0-9_]+)\\}");\r
   QString expr;\r
   QString code = elt.text();\r
   QString expr;\r
   QString code = elt.text();\r
-  cout << qPrintable(code) << endl;\r
+  //cout << qPrintable(code) << endl;\r
   out << "architecture rtl of " << name << " is" << endl;\r
 \r
   QStringList listLine = code.split("\n");\r
   out << "architecture rtl of " << name << " is" << endl;\r
 \r
   QStringList listLine = code.split("\n");\r
@@ -1610,12 +1600,72 @@ void FunctionalBlock::generateArchitecture(QTextStream& out, QDomElement &elt )
     }\r
 */\r
     if(line.contains("@{")) {\r
     }\r
 */\r
     if(line.contains("@{")) {\r
-      out << line << endl;\r
+      QMap<QString,QString> modifs;\r
+      //cout << qPrintable(line) << endl;\r
+      QRegularExpressionMatchIterator matchPort = rxPort.globalMatch(line);\r
+      while(matchPort.hasNext()) {\r
+        QRegularExpressionMatch m = matchPort.next();\r
+        QString refName = m.captured(1);\r
+        AbstractInterface* refIface = reference->getIfaceFromName(refName);\r
+        QString funName = getIfaceUserName(refIface);\r
+        if (!funName.isEmpty()) {\r
+          modifs.insert(m.captured(0),funName);\r
+          //cout << "replace " << qPrintable(refIface->getName()) << " by " << qPrintable(funIface->getName()) << endl;\r
+        }\r
+      }\r
+      QMapIterator<QString,QString> iterM(modifs);\r
+      while(iterM.hasNext()) {\r
+        iterM.next();\r
+        QString oldName = iterM.key();\r
+        QString newName = iterM.value();\r
+        line.replace(oldName,newName);\r
+      }\r
     }\r
     }\r
+    out << line << endl;\r
   }\r
   }\r
+\r
+  out << "end rtl;" << endl;\r
 }\r
 \r
 void FunctionalBlock::generateController(QTextStream &out) throw(Exception) {\r
   \r
 }\r
 \r
 }\r
 \r
 void FunctionalBlock::generateController(QTextStream &out) throw(Exception) {\r
   \r
 }\r
 \r
+QString FunctionalBlock::getIfaceUserName(AbstractInterface* refIface) {\r
+\r
+  if (! refIface->isReferenceInterface()) return "";\r
+\r
+  AbstractInterface* funcIface = NULL;\r
+\r
+  if (refIface->getDirection() == AbstractInterface::Input) {\r
+    foreach(AbstractInterface* iface, getInputs()) {\r
+      FunctionalInterface* fi = AI_TO_FUN(iface);\r
+      if (fi->getReference() == refIface) {\r
+        funcIface = iface;\r
+        break;\r
+      }\r
+    }\r
+  }\r
+  else if (refIface->getDirection() == AbstractInterface::Output) {\r
+    foreach(AbstractInterface* iface, getOutputs()) {\r
+      FunctionalInterface* fi = AI_TO_FUN(iface);\r
+      if (fi->getReference() == refIface) {\r
+        funcIface = iface;\r
+        break;\r
+      }\r
+    }\r
+  }\r
+  else if (refIface->getDirection() == AbstractInterface::InOut) {\r
+    foreach(AbstractInterface* iface, getBidirs()) {\r
+      FunctionalInterface* fi = AI_TO_FUN(iface);\r
+      if (fi->getReference() == refIface) {\r
+        funcIface = iface;\r
+        break;\r
+      }\r
+    }\r
+  }\r
+  if (funcIface == NULL) return "";\r
+\r
+  return funcIface->getName();\r
+}\r
+\r
index 7bba2c8ed273565cc6a89c6f751e888d87cfa40e..99f8a80aa2d4ec9335e64c54bb316ed9ed09a2b7 100644 (file)
@@ -51,7 +51,10 @@ public:
   // others\r
 \r
   void populate(); // create parameters and interface from reference block\r
   // others\r
 \r
   void populate(); // create parameters and interface from reference block\r
+\r
+  QList<QString> getExternalResources();\r
   void generateVHDL(const QString& path) throw(Exception); // main entry to generate the VHDL code  \r
   void generateVHDL(const QString& path) throw(Exception); // main entry to generate the VHDL code  \r
+  QString getIfaceUserName(AbstractInterface* refIface); // get iface name from reference interface\r
 \r
   void parametersValidation(QList<AbstractBlock *> *checkedBlocks, QList<AbstractBlock*>* blocksToConfigure);\r
 \r
 \r
   void parametersValidation(QList<AbstractBlock *> *checkedBlocks, QList<AbstractBlock*>* blocksToConfigure);\r
 \r
index 5b491b07ea15c5cd24d06daff89e90ff1bc814fa..46159ff39538f56b127d340171b62c40384d88bd 100644 (file)
--- a/Graph.cpp
+++ b/Graph.cpp
@@ -201,3 +201,8 @@ void Graph::generateVHDL(const QString &path) throw(Exception) {
     throw(e);
   }
 }
     throw(e);
   }
 }
+
+QList<QString> Graph::getExternalResources() {
+  QList<QString> list = topGroup->getExternalResources();
+  return list;
+}
diff --git a/Graph.h b/Graph.h
index e7ff3e283b2393370300da91bf1c6f2d1b83ac31..8b2015fdb736c769c9022ba7d05cff2168961406 100644 (file)
--- a/Graph.h
+++ b/Graph.h
@@ -45,6 +45,8 @@ public:
   
   // others
   QList<AbstractInterface *> getOutsideInterfaces();
   
   // others
   QList<AbstractInterface *> getOutsideInterfaces();
+  QList<QString> getExternalResources(); // returns the list of all external files needed for VHDL generation
+
   /*!
    * \brief createPatterns
    * createPatterns() crosses the graph and for each functional block, it computes
   /*!
    * \brief createPatterns
    * createPatterns() crosses the graph and for each functional block, it computes
index 66268b93e161d8bc76d0d4061b65f5f07af30e4d..5b4f34e2c9e2090c90f5d8e91ef042c7513ab1b9 100644 (file)
@@ -6,6 +6,7 @@
 #include "string.h"
 #include <sstream>
 #include "Parameters.h"
 #include "string.h"
 #include <sstream>
 #include "Parameters.h"
+#include "DelayInputModifier.h"
 
 int GroupBlock::counter = 1;
 
 
 int GroupBlock::counter = 1;
 
@@ -276,11 +277,20 @@ void GroupBlock::computeOutputPattern(int nbExec) throw(Exception) {
   }
 }
 
   }
 }
 
+QList<QString> GroupBlock::getExternalResources() {
+
+  QList<QString> list;
+  foreach(AbstractBlock* block, blocks) {
+    list.append(block->getExternalResources());
+  }
+  return list;
+}
+
 void GroupBlock::generateVHDL(const QString& path) throw(Exception) {
 
   QString coreFile = "";
 
 void GroupBlock::generateVHDL(const QString& path) throw(Exception) {
 
   QString coreFile = "";
 
-  coreFile = path;
+  coreFile = path;  
   coreFile.append(Parameters::normalizeName(name));
   coreFile.append(".vhd");
 
   coreFile.append(Parameters::normalizeName(name));
   coreFile.append(".vhd");
 
@@ -299,6 +309,10 @@ void GroupBlock::generateVHDL(const QString& path) throw(Exception) {
     generateLibraries(outCore,dummyElt);
     generateEntity(outCore);
     generateArchitecture(outCore,dummyElt);
     generateLibraries(outCore,dummyElt);
     generateEntity(outCore);
     generateArchitecture(outCore,dummyElt);
+
+    foreach(AbstractBlock* block, blocks) {
+      block->generateVHDL(path);
+    }
   }
   catch(Exception err) {
     throw(err);
   }
   catch(Exception err) {
     throw(err);
@@ -429,6 +443,38 @@ void GroupBlock::generateArchitecture(QTextStream& out, QDomElement &elt) throw(
 
   out << "architecture rtl of " << name << " is " << endl << endl;
 
 
   out << "architecture rtl of " << name << " is " << endl << endl;
 
+  // generate type for delays, if needed.
+  QList<int> modWidth;
+  foreach(AbstractBlock* block, blocks) {
+    QList<AbstractInterface*> listCtlInputs = block->getControlInputs();
+    foreach(AbstractInterface* iface, listCtlInputs) {
+      ConnectedInterface* connCtlIface = AI_TO_CON(iface);
+      AbstractInputModifier* modifier = connCtlIface->getInputModifier();
+      if (modifier != NULL) {
+        ConnectedInterface* connIface = AI_TO_CON(connCtlIface->getAssociatedIface());
+        int w = connIface->getWidth();
+        if (w == -1) throw(Exception(INVALID_VALUE));
+        if (!modWidth.contains(w)) {
+          modWidth.append(w);
+        }
+      }
+    }
+  }
+  if (modWidth.size() > 0) {
+
+    out << "  -- types for modified inputs" << endl;
+    out << "  type vector_of_std_logic is array (natural range <>) of std_logic;" << endl;
+    foreach(int w, modWidth) {
+      QString mw = "";
+      mw.setNum(w);
+      QString mwm1 = "";
+      mwm1.setNum(w-1);
+      out << "  type vector_of_std_logic_vector"<< mw << " is array (natural range <>) of std_logic_vector(" << mwm1 << " downto 0);" << endl;
+    }
+    out << endl;
+  }
+
+
   // generate the components
   foreach(AbstractBlock* block, blocks) {
     try {
   // generate the components
   foreach(AbstractBlock* block, blocks) {
     try {
@@ -442,10 +488,10 @@ void GroupBlock::generateArchitecture(QTextStream& out, QDomElement &elt) throw(
   out << endl;
   // generate signals
   out << "  ----------------------------" << endl;
   out << endl;
   // generate signals
   out << "  ----------------------------" << endl;
-  out << "    SIGNALS" << endl;
+  out << "  --  SIGNALS" << endl;
   out << "  ----------------------------" << endl << endl;
 
   out << "  ----------------------------" << endl << endl;
 
-
+// "normal" signals
   foreach(AbstractBlock* block, blocks) {
     try {
       out << "  -- signals from output ports of " << block->getName() << endl;
   foreach(AbstractBlock* block, blocks) {
     try {
       out << "  -- signals from output ports of " << block->getName() << endl;
@@ -466,12 +512,24 @@ void GroupBlock::generateArchitecture(QTextStream& out, QDomElement &elt) throw(
     }
     out << endl;
   }
     }
     out << endl;
   }
+
+  // signal for modifiers
   foreach(AbstractBlock* block, blocks) {
   foreach(AbstractBlock* block, blocks) {
-    try {
-      out << "  -- signals for modified input ports of " << block->getName() << endl;
-      QList<AbstractInterface*> listInputs = block->getInputs();
-      foreach(AbstractInterface* iface, listInputs) {
-        if (iface->getPurpose() == AbstractInterface::Control) {
+    bool hasModif = false;
+    QList<AbstractInterface*> listCtlInputs = block->getControlInputs();
+
+    foreach(AbstractInterface* iface, listCtlInputs) {
+      ConnectedInterface* connCtlIface = AI_TO_CON(iface);
+      AbstractInputModifier* modifier = connCtlIface->getInputModifier();
+      if (modifier != NULL) {
+        hasModif = true;
+        break;
+      }
+    }
+    if (hasModif) {
+      try {
+        out << "  -- signals for modified input ports of " << block->getName() << endl;
+        foreach(AbstractInterface* iface, listCtlInputs) {
           ConnectedInterface* connCtlIface = AI_TO_CON(iface);
           AbstractInputModifier* modifier = connCtlIface->getInputModifier();
           if (modifier != NULL) {
           ConnectedInterface* connCtlIface = AI_TO_CON(iface);
           AbstractInputModifier* modifier = connCtlIface->getInputModifier();
           if (modifier != NULL) {
@@ -479,11 +537,11 @@ void GroupBlock::generateArchitecture(QTextStream& out, QDomElement &elt) throw(
           }
         }
       }
           }
         }
       }
+      catch(Exception e) {
+        throw(e);
+      }
+      out << endl;
     }
     }
-    catch(Exception e) {
-      throw(e);
-    }
-    out << endl;
   }
 
   out << "begin" << endl;
   }
 
   out << "begin" << endl;
index 23a8ce27a5819db44c08f51f91f1bcca25bfadf4..c3b6f9cf5a72fa26505445ced26a7ab68316039c 100644 (file)
@@ -46,6 +46,7 @@ public:
   void computeOutputPattern(int nbExec = -1) throw(Exception);
   void computeAdmittanceDelays() throw(Exception);
   
   void computeOutputPattern(int nbExec = -1) throw(Exception);
   void computeAdmittanceDelays() throw(Exception);
   
+  QList<QString> getExternalResources();
   void generateVHDL(const QString& path) throw(Exception); // main entry to generate the VHDL code  
 
 private:    
   void generateVHDL(const QString& path) throw(Exception); // main entry to generate the VHDL code  
 
 private:    
index 212e54dd6cf9a7f7a8f91b0c052cb2575fcc051f..166dfa29511d591682f0769da801aa776297cd82 100644 (file)
@@ -451,28 +451,8 @@ void MainWindow::slotGraphAnalysis() {
 
 void MainWindow::slotGenerateVHDL() {
 
 
 void MainWindow::slotGenerateVHDL() {
 
-  QDir baseDir(params->projectPath);
-  if (!baseDir.exists()) {
-    cerr << "Project path " << qPrintable(params->projectPath) << " no longer exists. First, recreate it and put the project file within. Then retry to generate." << endl;
-    return;
-  }
-  if (! baseDir.exists("src")) {
-    baseDir.mkdir("src");
-  }
-  if (! baseDir.exists("testbench")) {
-    baseDir.mkdir("testbench");
-  }
-  if (! baseDir.exists("Makefile")) {
-    QFile make("/home/sdomas/Projet/Blast/code/blast/Makefile-isim");
-    QString dest = params->projectPath;
-    dest += "/Makefile";
-    make.copy(dest);
-  }
-
-  QString dest = params->projectPath;
-  dest += "/src/";
   try {
   try {
-    params->getGraph()->generateVHDL(dest);
+    dispatcher->generateVHDL();
   }
   catch(Exception e) {
     cerr << qPrintable(e.getMessage()) << endl;
   }
   catch(Exception e) {
     cerr << qPrintable(e.getMessage()) << endl;
index c10eb1d14e3f7c956a576057c68d96b52b20fa6b..15319a141e556cd6f3d14c8342fde545e8be9241 100644 (file)
@@ -8,16 +8,16 @@ ISIM_LIB := work
 
 all : project compile 
 
 
 all : project compile 
 
-project : $(PROJECT).prj
+project : $(PROJECT_NAME).prj
 
 
-compile : $(PROJECT).prj $(VHDL_SRC)
+compile : $(PROJECT_NAME).prj $(VHDL_SRC)
        tb_name=$$( echo $(TB_SRC) | sed 's,.*/,,' | sed 's,[.].*,,'); \
        tb_name=$$( echo $(TB_SRC) | sed 's,.*/,,' | sed 's,[.].*,,'); \
-       fuse $(ISIM_LIB).$$tb_name $(ISIM_LIB).glbl -prj $(PROJECT).prj -L unisim -L secureip -timeprecision_vhdl ps -o $(SIMU_EXE)
+       fuse $(ISIM_LIB).$$tb_name $(ISIM_LIB).glbl -prj $(PROJECT_NAME).prj -L unisim -L secureip -timeprecision_vhdl ps -o $(SIMU_EXE)
 
 view :
        $(SIMU_EXE) -gui -wdb $(SIMU_EXE).wdb
 
 
 view :
        $(SIMU_EXE) -gui -wdb $(SIMU_EXE).wdb
 
-$(PROJECT).prj :
+$(PROJECT_NAME).prj :
        if [ -f $@ ]; then rm $@; fi
        echo "### VHDL sources"
        for fich in $(VHDL_SRC); do echo vhdl $(ISIM_LIB) $$fich >> $@; done
        if [ -f $@ ]; then rm $@; fi
        echo "### VHDL sources"
        for fich in $(VHDL_SRC); do echo vhdl $(ISIM_LIB) $$fich >> $@; done
@@ -28,6 +28,6 @@ $(PROJECT).prj :
 
 clean :
        rm -f *~
 
 clean :
        rm -f *~
-       rm -f $(PROJECT).prj
+       rm -f $(PROJECT_NAME).prj
        cd $(SRC_DIR); rm -f *~
        cd $(TB_DIR); rm -f *~
        cd $(SRC_DIR); rm -f *~
        cd $(TB_DIR); rm -f *~
index 32bec53a4294bb1d377157de74cdf8a549862cb1..2ee625592f4e0f36f19a63ac33e4da397d7d4f61 100644 (file)
@@ -836,7 +836,7 @@ void Parameters::loadImplementationsFromXml() throw(Exception) {
       if (compList != "none") {\r
         QStringList compos = compList.split(",");\r
         foreach(QString s, compos) {\r
       if (compList != "none") {\r
         QStringList compos = compList.split(",");\r
         foreach(QString s, compos) {\r
-          impl->addSource(s);\r
+          impl->addResource(s);\r
         }\r
       }\r
 \r
         }\r
       }\r
 \r
@@ -960,7 +960,7 @@ void Parameters::loadSources() throw(Exception) {
         QString netName = list.at(j);\r
         netName.truncate(list.at(j).size() -4);\r
         cout << "found netlist " << qPrintable(netName) << endl;\r
         QString netName = list.at(j);\r
         netName.truncate(list.at(j).size() -4);\r
         cout << "found netlist " << qPrintable(netName) << endl;\r
-        availableSources.append(new ExternalSource(netName,fileName,ExternalSource::Netlist));\r
+        availableResources.append(new ExternalResource(netName,fileName,ExternalResource::Netlist));\r
       }\r
       else {\r
         cout << "parsing " << qPrintable(fileName) << " ... ";\r
       }\r
       else {\r
         cout << "parsing " << qPrintable(fileName) << " ... ";\r
@@ -978,7 +978,7 @@ void Parameters::loadSources() throw(Exception) {
             if (matchPack.hasMatch()) {\r
               QString packName = matchPack.captured(1);\r
               cout << "found package " << qPrintable(packName) << endl;\r
             if (matchPack.hasMatch()) {\r
               QString packName = matchPack.captured(1);\r
               cout << "found package " << qPrintable(packName) << endl;\r
-              availableSources.append(new ExternalSource(packName,fileName,ExternalSource::Package));\r
+              availableResources.append(new ExternalResource(packName,fileName,ExternalResource::Package));\r
             }\r
           }\r
           else if (line.contains("entity", Qt::CaseInsensitive)) {\r
             }\r
           }\r
           else if (line.contains("entity", Qt::CaseInsensitive)) {\r
@@ -987,7 +987,7 @@ void Parameters::loadSources() throw(Exception) {
             if (matchEnt.hasMatch()) {\r
               QString entityName = matchEnt.captured(1);\r
               cout << "found entity " << qPrintable(entityName) << endl;\r
             if (matchEnt.hasMatch()) {\r
               QString entityName = matchEnt.captured(1);\r
               cout << "found entity " << qPrintable(entityName) << endl;\r
-              availableSources.append(new ExternalSource(entityName,fileName,ExternalSource::Code));\r
+              availableResources.append(new ExternalResource(entityName,fileName,ExternalResource::Code));\r
             }\r
           }\r
           line = in.readLine();\r
             }\r
           }\r
           line = in.readLine();\r
@@ -999,11 +999,14 @@ void Parameters::loadSources() throw(Exception) {
   }\r
 }\r
 \r
   }\r
 }\r
 \r
-ExternalSource* Parameters::searchSourceByName(const QString& name) {\r
-  foreach(ExternalSource* s, availableSources) {\r
-    if (s->getName() == name) return s;\r
+QList<ExternalResource *> Parameters::searchResourceByName(const QString& name) {\r
+  QList<ExternalResource*> listRes;\r
+  foreach(ExternalResource* s, availableResources) {\r
+    if (s->getName() == name) {\r
+      listRes.append(s);\r
+    }\r
   }\r
   }\r
-  return NULL;\r
+  return listRes;\r
 }\r
 \r
 void Parameters::addAvailableBlock(ReferenceBlock *block) {\r
 }\r
 \r
 void Parameters::addAvailableBlock(ReferenceBlock *block) {\r
index 03291305b1030b2cb331b17469f97865ba4c8d27..9b4ee1bc64d7cf04a6b5b46c4017a09d01c2f07b 100644 (file)
@@ -24,7 +24,7 @@ class Graph;
 class GroupWidget;\r
 \r
 #include "BlockImplementation.h"\r
 class GroupWidget;\r
 \r
 #include "BlockImplementation.h"\r
-#include "ExternalSource.h"\r
+#include "ExternalResource.h"\r
 \r
 #include "Exception.h"\r
 class Exception;\r
 \r
 #include "Exception.h"\r
 class Exception;\r
@@ -83,7 +83,7 @@ public :
 \r
   // others\r
   static QString normalizeName(const QString& name);\r
 \r
   // others\r
   static QString normalizeName(const QString& name);\r
-  ExternalSource* searchSourceByName(const QString& name);\r
+  QList<ExternalResource*> searchResourceByName(const QString& name);\r
 \r
   /***************************************************\r
     attributes that are general to the application\r
 \r
   /***************************************************\r
     attributes that are general to the application\r
@@ -94,7 +94,7 @@ public :
   QList<QString> sourcePathes;\r
   QList<ReferenceBlock*> availableBlocks;\r
   QList<BlockImplementation*> availableImplementations;\r
   QList<QString> sourcePathes;\r
   QList<ReferenceBlock*> availableBlocks;\r
   QList<BlockImplementation*> availableImplementations;\r
-  QList<ExternalSource*> availableSources;\r
+  QList<ExternalResource*> availableResources;\r
 \r
   ReferenceBlock* delayRef;\r
   BlockImplementation* delayImpl;  \r
 \r
   ReferenceBlock* delayRef;\r
   BlockImplementation* delayImpl;  \r
index 9d6eb537984c3a6f2295ce73d11c5038a7e827a7..e0edd969b1b475fa454eb82ec5603a652a3a36db 100644 (file)
@@ -660,3 +660,8 @@ void ReferenceBlock::generateEntityOrComponentBody(QTextStream &out, int indentL
   throw(Exception(INVALID_REFBLOCK_USE));
 }
 
   throw(Exception(INVALID_REFBLOCK_USE));
 }
 
+QList<QString> ReferenceBlock::getExternalResources() {
+  QList<QString> list;
+  return list;
+}
+
index 5dfcbd14446304550df1364e24fbb518b3edf2be..83f38c55d0902f114146662d18ed6a3efb801937 100644 (file)
@@ -44,6 +44,7 @@ public:
   void load(QDomElement &elt) throw(Exception);
   void setHashMd5();
 
   void load(QDomElement &elt) throw(Exception);
   void setHashMd5();
 
+  QList<QString> getExternalResources();
   void generateVHDL(const QString& path) throw(Exception); // main entry to generate the VHDL code
 
   void parametersValidation(QList<AbstractBlock*>* checkedBlocks, QList<AbstractBlock*>* blocksToConfigure);
   void generateVHDL(const QString& path) throw(Exception); // main entry to generate the VHDL code
 
   void parametersValidation(QList<AbstractBlock*>* checkedBlocks, QList<AbstractBlock*>* blocksToConfigure);
index 3d17b3dad141eb6a8a192f4b07365a2b5b08bc9b..3230c1f88437c718d44a06531ac083cf1c1fd311 100644 (file)
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.2.0, 2018-03-29T22:16:07. -->
+<!-- Written by QtCreator 4.2.0, 2018-03-30T16:40:46. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
-  <value type="QByteArray">{c8006d66-d34f-42be-ad10-d0207752286d}</value>
+  <value type="QByteArray">{3701e197-5b6c-48ea-9e98-a6cf6de18672}</value>
  </data>
  <data>
   <variable>ProjectExplorer.Project.ActiveTarget</variable>
  </data>
  <data>
   <variable>ProjectExplorer.Project.ActiveTarget</variable>
@@ -61,7 +61,7 @@
   <valuemap type="QVariantMap">
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
   <valuemap type="QVariantMap">
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{2c9bf876-3476-44eb-8065-1f0844704dda}</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{ed04208c-8774-456b-99b9-4a02094ca7a4}</value>
    <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
index 01b85e5d8fa1cb2040d102e39b20a191535cc8d6..01d93d0ea02040d0de2f351c5e643d7eaf28ccdc 100755 (executable)
@@ -1,5 +1,5 @@
-ExternalSource.h
-ExternalSource.cpp
+ExternalResource.cpp
+ExternalResource.h
 CustomDialog.h
 CustomDialog.cpp
 NewProjectDialog.h
 CustomDialog.h
 CustomDialog.cpp
 NewProjectDialog.h
index cba0a1de5960b384f217ea5989e951606c2567df..96b752cd589b23ee0bbf9453296477bfc8f5d451 100644 (file)
Binary files a/lib/implementations/impls.bmf and b/lib/implementations/impls.bmf differ
index 3ced8a924d9f5a1af8ea17c629e8068f702d8261..13f2ff62ff0137087a263a8e41945ffabc81f31b 100644 (file)
@@ -10,7 +10,7 @@ COMMON-OBJ = $(BUILDPATH)/AbstractBlock.o \
           $(BUILDPATH)/AbstractInputModifier.o \
           $(BUILDPATH)/DelayInputModifier.o \
           $(BUILDPATH)/BlockImplementation.o \
           $(BUILDPATH)/AbstractInputModifier.o \
           $(BUILDPATH)/DelayInputModifier.o \
           $(BUILDPATH)/BlockImplementation.o \
-          $(BUILDPATH)/ExternalSource.o \
+          $(BUILDPATH)/ExternalResource.o \
           $(BUILDPATH)/Graph.o \
           $(BUILDPATH)/AbstractBoxItem.o \
           $(BUILDPATH)/BoxItem.o \
           $(BUILDPATH)/Graph.o \
           $(BUILDPATH)/AbstractBoxItem.o \
           $(BUILDPATH)/BoxItem.o \