X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/77e28a24d444098399304f0175b1aba43c83017f..3fb762e7042d9b4a1cf78556ad9ed7f117cc53ba:/AbstractBlock.cpp?ds=inline

diff --git a/AbstractBlock.cpp b/AbstractBlock.cpp
index 90031d9..b8ce5e5 100644
--- a/AbstractBlock.cpp
+++ b/AbstractBlock.cpp
@@ -4,16 +4,22 @@
 #include "AbstractInterface.h"
 #include "BlockParameter.h"
 #include "Parameters.h"
+#include "GroupBlock.h"
+#include "ConnectedInterface.h"
+
 
 AbstractBlock::AbstractBlock() {
   name = "";
   parent = NULL;
+  specialType = NotSpecial;
 }
 
+/*
 AbstractBlock::AbstractBlock(const QString& _name) {
   name = Parameters::normalizeName(_name);
   parent = NULL;
 }
+*/
 
 AbstractBlock::~AbstractBlock() {
 
@@ -29,6 +35,15 @@ void AbstractBlock::setName(const QString& str) {
   name = Parameters::normalizeName(str);
 }
 
+void AbstractBlock::setSpecialType(int type) {
+  if ((type >= NotSpecial) && (type <= ClkConvert)) {
+    specialType = type;
+  }
+  else {
+    specialType = NotSpecial;
+  }
+}
+
 void AbstractBlock::setParent(AbstractBlock* _parent) {
   parent = _parent;
 }
@@ -41,6 +56,10 @@ bool AbstractBlock::isFunctionalBlock() {
   return false;
 }
 
+bool AbstractBlock::isSpecialBlock() {
+  return false;
+}
+
 bool AbstractBlock::isGroupBlock() {
   return false;
 }
@@ -49,18 +68,40 @@ bool AbstractBlock::isTopGroupBlock() {
   return false;
 }
 
-bool AbstractBlock::isSourceBlock() {
+bool AbstractBlock::isStimuliBlock() {
   return false;
 }
-/* NB: a generator is a block that has no data inputs
+/* NB: a source is a block that has no data inputs
  * and has at least one data output.
+ * By the way, blocks that have no data input/output
+ * (like clkrstgen) are not sources !
  */
-bool AbstractBlock::isGeneratorBlock() {
+bool AbstractBlock::isSourceBlock() {
   if (getDataInputs().size() > 0) return false;
-  
+  if (getDataOutputs().size() == 0) return false;
   return true;
 }
 
+/* NB: a sink is a block without outputs of any type */
+bool AbstractBlock::isSinkBlock() {
+  if (getOutputs().size() == 0) return true;
+  return false;
+}
+
+int AbstractBlock::getSpecialTypeFromString(QString str) {
+  if (str == "source") {
+    return Source;
+  }
+  else if (str == "sink") {
+    return Sink;
+  }
+  else if (str == "clkconvert") {
+    return ClkConvert;
+  }
+  return NotSpecial;
+}
+
+
 void AbstractBlock::addParameter(BlockParameter *param) {
   params.append(param);
 }
@@ -236,6 +277,95 @@ QList<BlockParameter *> AbstractBlock::getWishboneParameters() {
   return lst;
 }
 
+void AbstractBlock::connectClock(QString clkName, int idGen) throw(Exception) {
+
+  GroupBlock* parentBlock = AB_TO_GRP(parent);  
+  ConnectedInterface* fromClk = NULL;
+  ConnectedInterface* toClk = AI_TO_CON(getIfaceFromName(clkName));
+
+  if (parentBlock->isTop()) {
+    QString genName = "clkrstgen_" + QString::number(idGen);
+    AbstractBlock* clkrstgen = parentBlock->getFunctionalBlockByName(genName);
+    if (clkrstgen == NULL) {
+      throw(Exception(IFACE_TOP_NOCLKRSTGEN,this));
+    }
+    else {
+      fromClk = AI_TO_CON(clkrstgen->getIfaceFromName("clk"));      
+    }
+    cout << "connecting clock for " << qPrintable(name) << " to " << qPrintable(genName) << endl;
+  }
+  else {
+    // searching for ext_clk_idGen
+    QString name = "ext_clk_"+QString::number(idGen);
+    fromClk = AI_TO_CON(parentBlock->getIfaceFromName(name));
+    cout << "connecting clk for child " << qPrintable(name) << " of " << qPrintable(parentBlock->getName()) << endl;
+  }
+
+  if (fromClk == NULL) {
+    throw(Exception(IFACE_GROUP_NOCLKRST,parentBlock));
+  }
+  else {
+    fromClk->connectTo(toClk);
+    cout << "connection done between " << qPrintable(toClk->getConnectedFrom()->getOwner()->getName()) << "/" << qPrintable(toClk->getConnectedFrom()->getName());
+    cout << " and " << qPrintable(toClk->getOwner()->getName()) << "/" << qPrintable(toClk->getName()) << endl;
+  }
+}
+
+void AbstractBlock::connectReset(QString rstName, int idGen) throw(Exception) {
+
+  GroupBlock* parentBlock = AB_TO_GRP(parent);
+  ConnectedInterface* fromRst = NULL;
+  ConnectedInterface* toRst = AI_TO_CON(getIfaceFromName(rstName));
 
+  if (parentBlock->isTop()) {
+    QString genName = "clkrstgen_" + QString::number(idGen);
+    AbstractBlock* clkrstgen = parentBlock->getFunctionalBlockByName(genName);
+    if (clkrstgen == NULL) {
+      throw(Exception(IFACE_TOP_NOCLKRSTGEN,this));
+    }
+    else {
+      fromRst = AI_TO_CON(clkrstgen->getIfaceFromName("reset"));
+    }
+    cout << "connecting reset for " << qPrintable(name) << " to " << qPrintable(genName) << endl;
+  }
+  else {
+    QString name = "ext_reset_"+QString::number(idGen);
+    fromRst = AI_TO_CON(parentBlock->getIfaceFromName(name));
+    cout << "connecting reset for child " << qPrintable(name) << " of " << qPrintable(parentBlock->getName()) << endl;
+  }
+
+  if (fromRst == NULL) {
+    throw(Exception(IFACE_GROUP_NOCLKRST,parentBlock));
+  }
+  else {
+    fromRst->connectTo(toRst);
+    cout << "connection done between " << qPrintable(toRst->getConnectedFrom()->getOwner()->getName()) << "/" << qPrintable(toRst->getConnectedFrom()->getName());
+    cout << " and " << qPrintable(toRst->getOwner()->getName()) << "/" << qPrintable(toRst->getName()) << endl;
+  }
+}
+
+void AbstractBlock::generateEntity(QTextStream& out, bool hasController) throw(Exception) {
+
+  out << "entity " << name << " is" << endl;
+  try {
+    generateEntityOrComponentBody(out, 0, hasController);
+  }
+  catch(Exception e) {
+    throw(e);
+  }
+  out << "end entity " << name << ";" << endl << endl;
+}
+
+void AbstractBlock::generateComponent(QTextStream& out, bool hasController) throw(Exception) {
+
+  out << "  component " << name << " is" << endl;
+  try {
+    generateEntityOrComponentBody(out, 2, hasController);
+  }
+  catch(Exception e) {
+    throw(e);
+  }
+  out << "  end component; " << endl << endl;
+}