AbstractBlock::AbstractBlock() {\r
name = "";\r
parent = NULL;\r
+ specialType = NotSpecial;\r
}\r
\r
/*\r
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
return false;\r
}\r
\r
+bool AbstractBlock::isSpecialBlock() {\r
+ return false;\r
+}\r
+\r
bool AbstractBlock::isGroupBlock() {\r
return false;\r
}\r
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
*/\r
-bool AbstractBlock::isGeneratorBlock() {\r
+bool AbstractBlock::isSourceBlock() {\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
return lst;\r
}\r
\r
+void AbstractBlock::connectClock(QString clkName, int idGen) throw(Exception) {\r
\r
+ GroupBlock* parentBlock = AB_TO_GRP(parent); \r
+ ConnectedInterface* fromClk = NULL;\r
+ ConnectedInterface* toClk = AI_TO_CON(getIfaceFromName(clkName));\r
\r
-void AbstractBlock::connectClkReset() throw(Exception) {\r
-\r
- GroupBlock* parentBlock = AB_TO_GRP(parent);\r
-\r
-\r
-\r
- QList<AbstractInterface* > lstClk = getInterfaces(AbstractInterface::Input,AbstractInterface::Clock);\r
- QList<AbstractInterface* > lstRst = getInterfaces(AbstractInterface::Input,AbstractInterface::Reset);\r
+ if (parentBlock->isTop()) {\r
+ QString genName = "clkrstgen_" + QString::number(idGen);\r
+ AbstractBlock* clkrstgen = parentBlock->getFunctionalBlockByName(genName);\r
+ if (clkrstgen == NULL) {\r
+ throw(Exception(IFACE_TOP_NOCLKRSTGEN,this));\r
+ }\r
+ else {\r
+ fromClk = AI_TO_CON(clkrstgen->getIfaceFromName("clk")); \r
+ }\r
+ cout << "connecting clock for " << qPrintable(name) << " to " << qPrintable(genName) << endl;\r
+ }\r
+ else {\r
+ // searching for ext_clk_idGen\r
+ QString name = "ext_clk_"+QString::number(idGen);\r
+ fromClk = AI_TO_CON(parentBlock->getIfaceFromName(name));\r
+ cout << "connecting clk for child " << qPrintable(name) << " of " << qPrintable(parentBlock->getName()) << endl;\r
+ }\r
\r
- if ((lstClk.isEmpty()) || (lstRst.isEmpty())) {\r
- throw(Exception(IFACE_GROUP_NOCLKRST,this));\r
+ if (fromClk == NULL) {\r
+ throw(Exception(IFACE_GROUP_NOCLKRST,parentBlock));\r
}\r
+ else {\r
+ fromClk->connectTo(toClk);\r
+ cout << "connection done between " << qPrintable(toClk->getConnectedFrom()->getOwner()->getName()) << "/" << qPrintable(toClk->getConnectedFrom()->getName());\r
+ cout << " and " << qPrintable(toClk->getOwner()->getName()) << "/" << qPrintable(toClk->getName()) << endl;\r
+ }\r
+}\r
\r
- ConnectedInterface* toClk = AI_TO_CON(lstClk.at(0));\r
- ConnectedInterface* toRst = AI_TO_CON(lstRst.at(0));\r
+void AbstractBlock::connectReset(QString rstName, int idGen) throw(Exception) {\r
\r
- ConnectedInterface* fromClk = NULL;\r
+ GroupBlock* parentBlock = AB_TO_GRP(parent);\r
ConnectedInterface* fromRst = NULL;\r
+ ConnectedInterface* toRst = AI_TO_CON(getIfaceFromName(rstName));\r
\r
if (parentBlock->isTop()) {\r
- AbstractBlock* clkrstgen = parentBlock->getFunctionalBlockByName("clkrstgen");\r
+ QString genName = "clkrstgen_" + QString::number(idGen);\r
+ AbstractBlock* clkrstgen = parentBlock->getFunctionalBlockByName(genName);\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
- cout << "connecting clk/rst for " << qPrintable(name) << " to clkrstgen" << endl;\r
+ cout << "connecting reset for " << qPrintable(name) << " to " << qPrintable(genName) << endl;\r
}\r
else {\r
- fromClk = AI_TO_CON(parentBlock->getIfaceFromName("clk"));\r
- fromRst = AI_TO_CON(parentBlock->getIfaceFromName("reset"));\r
- cout << "connecting clk/rst for child " << qPrintable(name) << " of " << qPrintable(parentBlock->getName()) << endl;\r
+ QString name = "ext_reset_"+QString::number(idGen);\r
+ fromRst = AI_TO_CON(parentBlock->getIfaceFromName(name));\r
+ cout << "connecting reset for child " << qPrintable(name) << " of " << qPrintable(parentBlock->getName()) << endl;\r
}\r
- if ((fromClk == NULL) || (fromRst == NULL)) {\r
+\r
+ if (fromRst == NULL) {\r
throw(Exception(IFACE_GROUP_NOCLKRST,parentBlock));\r
}\r
else {\r
- fromClk->connectTo(toClk);\r
fromRst->connectTo(toRst);\r
- cout << "connection done between " << qPrintable(toClk->getConnectedFrom()->getOwner()->getName()) << "/" << qPrintable(toClk->getConnectedFrom()->getName());\r
- cout << " and " << qPrintable(toClk->getOwner()->getName()) << "/" << qPrintable(toClk->getName()) << endl;\r
+ cout << "connection done between " << qPrintable(toRst->getConnectedFrom()->getOwner()->getName()) << "/" << qPrintable(toRst->getConnectedFrom()->getName());\r
+ cout << " and " << qPrintable(toRst->getOwner()->getName()) << "/" << qPrintable(toRst->getName()) << endl;\r
}\r
}\r
\r