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

Private GIT Repository
changed sources to stimulis
[blast.git] / AbstractBlock.cpp
index c71b2e0c508e46719659e2e15ba8982a69cdaf66..b8ce5e5e1ddd8747ad461b278bbc215cfa093322 100644 (file)
@@ -3,16 +3,23 @@
 #include <QMessageBox>\r
 #include "AbstractInterface.h"\r
 #include "BlockParameter.h"\r
+#include "Parameters.h"\r
+#include "GroupBlock.h"\r
+#include "ConnectedInterface.h"\r
+\r
 \r
 AbstractBlock::AbstractBlock() {\r
   name = "";\r
   parent = NULL;\r
+  specialType = NotSpecial;\r
 }\r
 \r
+/*\r
 AbstractBlock::AbstractBlock(const QString& _name) {\r
-  name = _name;\r
+  name = Parameters::normalizeName(_name);\r
   parent = NULL;\r
 }\r
+*/\r
 \r
 AbstractBlock::~AbstractBlock() {\r
 \r
@@ -25,7 +32,16 @@ AbstractBlock::~AbstractBlock() {
 }\r
 \r
 void AbstractBlock::setName(const QString& str) {\r
-  name = str;\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
@@ -40,6 +56,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
@@ -48,17 +68,40 @@ bool AbstractBlock::isTopGroupBlock() {
   return false;\r
 }\r
 \r
+bool AbstractBlock::isStimuliBlock() {\r
+  return false;\r
+}\r
+/* NB: a source is a block that has no data inputs\r
+ * and has at least one data output.\r
+ * By the way, blocks that have no data input/output\r
+ * (like clkrstgen) are not sources !\r
+ */\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
-bool AbstractBlock::isGeneratorBlock() {\r
-  foreach(AbstractInterface* iface, inputs) {\r
-    if (iface->getPurpose() == AbstractInterface::Data) return false;\r
+int AbstractBlock::getSpecialTypeFromString(QString str) {\r
+  if (str == "source") {\r
+    return Source;\r
   }\r
-  return true;\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
@@ -126,42 +169,58 @@ void AbstractBlock::defineBlockParam(BlockParameter *param)
   param->setValue(value);  \r
 }\r
 \r
-QList<AbstractInterface *> AbstractBlock::getInterfaces() {\r
+QList<AbstractInterface *> AbstractBlock::getInterfaces(int direction, int purpose) {\r
   QList<AbstractInterface *> list;\r
-  list.append(inputs);\r
-  list.append(outputs);\r
-  list.append(bidirs);\r
+  bool selIn = false;\r
+  bool selOut = false;\r
+  bool selInOut = false;\r
+  \r
+  if (direction == AbstractInterface::AnyDirection) {\r
+    selIn = true;\r
+    selOut = true;\r
+    selInOut = true;\r
+  }\r
+  else if (direction == AbstractInterface::Input) {\r
+    selIn = true;    \r
+  }\r
+  else if (direction == AbstractInterface::Output) {\r
+    selOut = true;    \r
+  }\r
+  else if (direction == AbstractInterface::InOut) {\r
+    selInOut = true;    \r
+  }\r
+  if (selIn) {\r
+    foreach(AbstractInterface* iface, inputs) {\r
+      if ((iface->getPurpose() == purpose) || (purpose == AbstractInterface::AnyPurpose)) list.append(iface);      \r
+    }\r
+  }\r
+  if (selOut) {\r
+    foreach(AbstractInterface* iface, outputs) {\r
+      if ((iface->getPurpose() == purpose) || (purpose == AbstractInterface::AnyPurpose)) list.append(iface);      \r
+    }\r
+  }\r
+  if (selInOut) {\r
+    foreach(AbstractInterface* iface, bidirs) {\r
+      if ((iface->getPurpose() == purpose) || (purpose == AbstractInterface::AnyPurpose)) list.append(iface);      \r
+    }\r
+  }\r
   return list;\r
 }\r
 \r
 QList<AbstractInterface *> AbstractBlock::getDataInputs() {\r
-  QList<AbstractInterface *> list;\r
-  foreach(AbstractInterface* iface, inputs) {\r
-    if (iface->getPurpose() == AbstractInterface::Data) {\r
-      list.append(iface);\r
-    }\r
-  }\r
-  return list;\r
+  return getInterfaces(AbstractInterface::Input, AbstractInterface::Data);  \r
+}\r
+\r
+QList<AbstractInterface *> AbstractBlock::getDataOutputs() {\r
+  return getInterfaces(AbstractInterface::Output, AbstractInterface::Data);  \r
 }\r
 \r
 QList<AbstractInterface *> AbstractBlock::getControlInputs() {\r
-  QList<AbstractInterface *> list;\r
-  foreach(AbstractInterface* iface, inputs) {\r
-    if (iface->getPurpose() == AbstractInterface::Control) {\r
-      list.append(iface);\r
-    }\r
-  }\r
-  return list;\r
+  return getInterfaces(AbstractInterface::Input, AbstractInterface::Control);  \r
 }\r
 \r
 QList<AbstractInterface *> AbstractBlock::getControlOutputs() {\r
-  QList<AbstractInterface *> list;\r
-  foreach(AbstractInterface* iface, outputs) {\r
-    if (iface->getPurpose() == AbstractInterface::Control) {\r
-      list.append(iface);\r
-    }\r
-  }\r
-  return list;\r
+  return getInterfaces(AbstractInterface::Output, AbstractInterface::Control);    \r
 }\r
 \r
 AbstractInterface* AbstractBlock::getIfaceFromName(QString name) {\r
@@ -217,3 +276,96 @@ QList<BlockParameter *> AbstractBlock::getWishboneParameters() {
   }\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
+  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 (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
+void AbstractBlock::connectReset(QString rstName, int idGen) throw(Exception) {\r
+\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
+    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
+      fromRst = AI_TO_CON(clkrstgen->getIfaceFromName("reset"));\r
+    }\r
+    cout << "connecting reset for " << qPrintable(name) << " to " << qPrintable(genName) << endl;\r
+  }\r
+  else {\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
+\r
+  if (fromRst == NULL) {\r
+    throw(Exception(IFACE_GROUP_NOCLKRST,parentBlock));\r
+  }\r
+  else {\r
+    fromRst->connectTo(toRst);\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
+void AbstractBlock::generateEntity(QTextStream& out, bool hasController) throw(Exception) {\r
+\r
+  out << "entity " << name << " is" << endl;\r
+  try {\r
+    generateEntityOrComponentBody(out, 0, hasController);\r
+  }\r
+  catch(Exception e) {\r
+    throw(e);\r
+  }\r
+  out << "end entity " << name << ";" << endl << endl;\r
+}\r
+\r
+void AbstractBlock::generateComponent(QTextStream& out, bool hasController) throw(Exception) {\r
+\r
+  out << "  component " << name << " is" << endl;\r
+  try {\r
+    generateEntityOrComponentBody(out, 2, hasController);\r
+  }\r
+  catch(Exception e) {\r
+    throw(e);\r
+  }\r
+  out << "  end component; " << endl << endl;\r
+}\r
+\r
+\r