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

Private GIT Repository
after merge
[blast.git] / FunctionalBlock.cpp
index 91f4e03798c1403f63cd0128258df45630c01f7a..8ecd6a3d802bb68f15e952f4bde1d78b7cd55a7a 100644 (file)
@@ -29,6 +29,7 @@ FunctionalBlock::FunctionalBlock(GroupBlock *_parent, ReferenceBlock *_reference
   lengthPP = -1;\r
   delta = -1;\r
   evaluator = NULL;\r
+\r
 }\r
 \r
 FunctionalBlock::~FunctionalBlock() {\r
@@ -77,6 +78,8 @@ void FunctionalBlock::populate() {
     addParameter(p);\r
   }\r
 \r
+  ConnectedInterface* toClk = NULL;\r
+  ConnectedInterface* toRst = NULL;\r
   // create interfaces from reference block\r
   QList<AbstractInterface *> lstRef = reference->getInterfaces();\r
   // store relation between functional and reference\r
@@ -90,8 +93,19 @@ void FunctionalBlock::populate() {
       exit(1);\r
     }\r
     hashIface.insert(lstRef.at(i),inter);\r
-\r
     addInterface(inter);\r
+    /* WARNING FOR THE FUTURE :\r
+       in case of there are several clock interfaces ofr that block\r
+       it would be a godd idea to make the user choose which one\r
+       must be connected to defautl clk.\r
+       Presently, the first encountered is chosen\r
+     */\r
+    if ((toClk == NULL) && (inter->getPurpose() == AbstractInterface::Clock)) {\r
+      toClk = AI_TO_CON(inter);\r
+    }\r
+    if ((toRst == NULL) && (inter->getPurpose() == AbstractInterface::Reset)) {\r
+      toRst = AI_TO_CON(inter);\r
+    }\r
   }\r
     \r
   AbstractInterface* funCtlIface = NULL;\r
@@ -108,8 +122,19 @@ void FunctionalBlock::populate() {
       }       \r
     }\r
   }\r
-}\r
 \r
+  // connect clk and rst to group clk/rst or to clkrstgen\r
+  if ((name != "clkrstgen") && (parent != NULL)) {\r
+    try {\r
+      connectClkReset();\r
+    }\r
+    catch(Exception e) {\r
+      AbstractBlock* source = (AbstractBlock *)(e.getSource());\r
+      cerr << qPrintable(source->getName()) << ":" << qPrintable(e.getMessage()) << endl;\r
+      throw(e);\r
+    }\r
+  }\r
+}\r
 \r
 QString FunctionalBlock::getReferenceXmlFile() {\r
     return ((ReferenceBlock *)reference)->getXmlFile();\r
@@ -649,9 +674,7 @@ void FunctionalBlock::createInputPattern()  throw(Exception) {
     }\r
     // get the precursor output pattern\r
     QList<char>* out = connIface->getConnectedFrom()->getOutputPattern();\r
-\r
-    ConnectedInterface* assoIface = AI_TO_CON(connIface->getAssociatedIface());\r
-    AbstractInputModifier* modifier = assoIface->getInputModifier();\r
+    AbstractInputModifier* modifier = connIface->getInputModifier();\r
     // check if the input is modified\r
     if (modifier != NULL) {\r
 \r
@@ -815,12 +838,13 @@ void FunctionalBlock::computeOutputPattern(int nbExec) throw(Exception) {
 #ifdef DEBUG_FCTNAME\r
   cout << "call to " << qPrintable(fctName) << endl;\r
 #endif\r
-  \r
+\r
+  clearOutputPattern();\r
+\r
   /* case 1: the block is a generator for which output pattern\r
      must be computed for a nbExec following executions\r
   */\r
-  \r
-  \r
+\r
   if (nbExec > 0) {\r
     cout << "computing output pattern of " << qPrintable(name) << " for " << nbExec << " executions" << endl;\r
     foreach(AbstractInterface* iface, getControlOutputs()) {\r
@@ -1243,6 +1267,20 @@ void FunctionalBlock::clearInputPattern() {
   lengthIP = -1;\r
 }\r
 \r
+void FunctionalBlock::clearOutputPattern() {\r
+\r
+  QMapIterator<AbstractInterface*,QList<char>* > iterO(outputPattern);\r
+  while (iterO.hasNext()) {\r
+    iterO.next();\r
+    ConnectedInterface* connIface = AI_TO_CON(iterO.key());\r
+    connIface->resetOutputPattern();\r
+    QList<char>* pattern = iterO.value();\r
+    if (pattern != NULL) delete pattern;\r
+  }\r
+  outputPattern.clear();\r
+  lengthOP = -1;\r
+}\r
+\r
 void FunctionalBlock::clearAdmittanceDelays() {\r
   QMapIterator<AbstractInterface*, QList<int>* > iterA(admittanceDelays);\r
   while (iterA.hasNext()) {\r