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

Private GIT Repository
finished testbench generation
[blast.git] / AbstractBlock.cpp
index 3bb808ead3a61d5491e659821b8e426424e2ae3c..de282720412988b118630585b1e20dd2013eeba4 100644 (file)
@@ -8,9 +8,11 @@
 #include "ConnectedInterface.h"\r
 \r
 \r
-AbstractBlock::AbstractBlock() {\r
+AbstractBlock::AbstractBlock(Graph *_graph) {\r
   name = "";\r
   parent = NULL;\r
+  specialType = NotSpecial;\r
+  graph = _graph;\r
 }\r
 \r
 /*\r
@@ -34,6 +36,15 @@ void AbstractBlock::setName(const QString& str) {
   name = Parameters::normalizeName(str);\r
 }\r
 \r
+void AbstractBlock::setSpecialType(int type) {\r
+  if ((type >= NotSpecial) && (type <= ClkConvert)) {\r
+    specialType = type;\r
+  }\r
+  else {\r
+    specialType = NotSpecial;\r
+  }\r
+}\r
+\r
 void AbstractBlock::setParent(AbstractBlock* _parent) {\r
   parent = _parent;\r
 }\r
@@ -46,6 +57,10 @@ bool AbstractBlock::isFunctionalBlock() {
   return false;\r
 }\r
 \r
+bool AbstractBlock::isSpecialBlock() {\r
+  return false;\r
+}\r
+\r
 bool AbstractBlock::isGroupBlock() {\r
   return false;\r
 }\r
@@ -54,20 +69,42 @@ bool AbstractBlock::isTopGroupBlock() {
   return false;\r
 }\r
 \r
-bool AbstractBlock::isSourceBlock() {\r
+bool AbstractBlock::isStimuliBlock() {\r
   return false;\r
 }\r
-/* NB: a generator is a block that has no data inputs\r
+/* NB: a source is a block that has no data inputs\r
  * and has at least one data output.\r
- * By the way, blokcs that have no data input/output\r
- * (like clkrstgen) are not generators !\r
+ * By the way, blocks that have no data input/output\r
+ * (like clkrstgen) are not sources !\r
+ * A source may also be a block of special type source.\r
  */\r
-bool AbstractBlock::isGeneratorBlock() {\r
+bool AbstractBlock::isSourceBlock() {\r
+  if (specialType == Source) return true;\r
   if (getDataInputs().size() > 0) return false;\r
   if (getDataOutputs().size() == 0) return false;\r
   return true;\r
 }\r
 \r
+/* NB: a sink is a block without outputs of any type */\r
+bool AbstractBlock::isSinkBlock() {\r
+  if (getOutputs().size() == 0) return true;\r
+  return false;\r
+}\r
+\r
+int AbstractBlock::getSpecialTypeFromString(QString str) {\r
+  if (str == "source") {\r
+    return Source;\r
+  }\r
+  else if (str == "sink") {\r
+    return Sink;\r
+  }\r
+  else if (str == "clkconvert") {\r
+    return ClkConvert;\r
+  }\r
+  return NotSpecial;\r
+}\r
+\r
+\r
 void AbstractBlock::addParameter(BlockParameter *param) {\r
   params.append(param);\r
 }\r
@@ -243,50 +280,6 @@ QList<BlockParameter *> AbstractBlock::getWishboneParameters() {
   return lst;\r
 }\r
 \r
-\r
-\r
-void AbstractBlock::connectClkReset() throw(Exception) {\r
-\r
-  GroupBlock* parentBlock = AB_TO_GRP(parent);\r
-\r
-  cout << "connecting clk/rst for child " << qPrintable(name) << " of " << qPrintable(parentBlock->getName()) << endl;\r
-\r
-  QList<AbstractInterface* > lstClk = getInterfaces(AbstractInterface::Input,AbstractInterface::Clock);\r
-  QList<AbstractInterface* > lstRst = getInterfaces(AbstractInterface::Input,AbstractInterface::Reset);\r
-\r
-  if ((lstClk.isEmpty()) || (lstRst.isEmpty())) {\r
-    throw(Exception(IFACE_GROUP_NOCLKRST,this));\r
-  }\r
-\r
-  ConnectedInterface* toClk = AI_TO_CON(lstClk.at(0));\r
-  ConnectedInterface* toRst = AI_TO_CON(lstRst.at(0));\r
-\r
-  ConnectedInterface* fromClk = NULL;\r
-  ConnectedInterface* fromRst = NULL;\r
-\r
-  if (parentBlock->isTop()) {\r
-    AbstractBlock* clkrstgen = parentBlock->getFunctionalBlockByName("clkrstgen");\r
-    if (clkrstgen == NULL) {\r
-      throw(Exception(IFACE_TOP_NOCLKRSTGEN,this));\r
-    }\r
-    else {\r
-      fromClk = AI_TO_CON(clkrstgen->getIfaceFromName("clk"));\r
-      fromRst = AI_TO_CON(clkrstgen->getIfaceFromName("reset"));\r
-    }\r
-  }\r
-  else {\r
-    fromClk = AI_TO_CON(parentBlock->getIfaceFromName("clk"));\r
-    fromRst = AI_TO_CON(parentBlock->getIfaceFromName("reset"));\r
-  }\r
-  if ((fromClk == NULL) || (fromRst == NULL)) {\r
-    throw(Exception(IFACE_GROUP_NOCLKRST,parentBlock));\r
-  }\r
-  else {\r
-    fromClk->connectTo(toClk);\r
-    fromRst->connectTo(toRst);\r
-  }\r
-}\r
-\r
 void AbstractBlock::generateEntity(QTextStream& out, bool hasController) throw(Exception) {\r
 \r
   out << "entity " << name << " is" << endl;\r
@@ -308,7 +301,7 @@ void AbstractBlock::generateComponent(QTextStream& out, bool hasController) thro
   catch(Exception e) {\r
     throw(e);\r
   }\r
-  out << "  end component " << endl << endl;\r
+  out << "  end component; " << endl << endl;\r
 }\r
 \r
 \r