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

Private GIT Repository
modified pattern to use only QMap
authorstephane Domas <stephane.domas@univ-fcomte.fr>
Thu, 18 May 2017 15:01:11 +0000 (17:01 +0200)
committerstephane Domas <stephane.domas@univ-fcomte.fr>
Thu, 18 May 2017 15:01:11 +0000 (17:01 +0200)
ConnectedInterface.cpp
ConnectedInterface.h
Dispatcher.cpp
FunctionalBlock.cpp
FunctionalBlock.h
FunctionalInterface.h
GroupBlock.cpp
GroupBlock.h
blast.creator.user
lib/implementations/average-Nx3_impl.xml
lib/implementations/impls.bmf

index c053aadb708f727f458c6199a7331ea1e3273258..948388add9821dd50e0e7a5e3d88abeb56d2e9c0 100644 (file)
@@ -6,15 +6,25 @@
 \r
 ConnectedInterface::ConnectedInterface(AbstractBlock* _owner) : AbstractInterface(_owner) {\r
   connectedFrom = NULL;\r
+  outputPattern = NULL;\r
+      \r
 }\r
 \r
 ConnectedInterface::ConnectedInterface(AbstractBlock* _owner, const QString& _name, const QString& _type, const QString& _width, int _direction, int _purpose) : AbstractInterface(_owner, _name, _type, _width, _direction, _purpose) {\r
   connectedFrom = NULL;\r
+  outputPattern = NULL;\r
 }\r
 \r
+ConnectedInterface::~ConnectedInterface() {\r
+  if (outputPattern != NULL) delete outputPattern;\r
+}\r
+\r
+/* NB/ became useless since disconnectTo does the job\r
\r
 void ConnectedInterface::removeConnectedTo(ConnectedInterface *iface) {\r
-  connectedTo.removeOne(iface);\r
+  connectedTo.removeAll(iface);\r
 }\r
+*/\r
 \r
 void ConnectedInterface::clearConnections() {\r
   connectedFrom = NULL;\r
@@ -25,6 +35,10 @@ void ConnectedInterface::clearConnectedTo() {
   connectedTo.clear();\r
 }\r
 \r
+void ConnectedInterface::setOutputPattern(QList<char>* pattern) {\r
+  if (outputPattern != NULL) delete outputPattern;\r
+  outputPattern = pattern; \r
+}\r
 void ConnectedInterface::connectTo(ConnectedInterface *iface) {\r
   \r
   connectedTo.append(iface);\r
index 84066a6d74c664e92bcf4b4fab4fe81faed29edc..7866a8fa957370169b8471e0a9cdf704f6e560a1 100644 (file)
@@ -24,14 +24,15 @@ public :
 
   ConnectedInterface(AbstractBlock* _owner);
   ConnectedInterface(AbstractBlock* _owner, const QString& _name, const QString& _type, const QString& _width, int _direction, int _purpose);
+  ~ConnectedInterface();
   
   // getters
   inline QList<ConnectedInterface*> getConnectedTo() { return connectedTo;}
   inline ConnectedInterface* getConnectedFrom() { return connectedFrom;}
-  inline QList<char> getOutputPattern() { return outputPattern; }  
+  inline QList<char>* getOutputPattern() { return outputPattern; }  
 
   // setters
-  inline void setOutputPattern(QList<char> pattern) { outputPattern = pattern; }
+  void setOutputPattern(QList<char>* pattern);
 
   // testers
   inline bool isConnectedTo(){return connectedTo.length() != 0;}
@@ -47,7 +48,7 @@ public :
   ConnectedInterface* getConnectionFromParentGroup();
 
   virtual AbstractInterface *clone() = 0;  
-  void removeConnectedTo(ConnectedInterface *inter);
+  //void removeConnectedTo(ConnectedInterface *inter);
 
   virtual void clearConnectedTo();
   inline void clearConnectedFrom() { connectedFrom = NULL; }
@@ -71,7 +72,7 @@ protected:
   ConnectedInterface* connectedFrom;  
   
   // patterns  
-  QList<char> outputPattern; //! only usefull for output interfaces
+  QList<char>* outputPattern; //! only usefull for output interfaces
 };
 
 
index 4cd112df29a665f9e1dbcdc354353cdeffa6bdb8..ee727438160c6c28a33e93798c825b19a808c673 100644 (file)
@@ -344,7 +344,7 @@ void Dispatcher::showPatterns(InterfaceItem *item) {
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
   ConnectedInterface* iface = AI_TO_CON(item->refInter->getAssociatedIface());
-  foreach(char c, iface->getOutputPattern()) {
+  foreach(char c, *(iface->getOutputPattern())) {
     cout << (int)c;
   }
   cout << endl;
index 0db21c42398801f2097a9cc7c506f6ffb1d51da4..23d43b9033c5c6157afdeb3ceb5c1a90fcddde58 100644 (file)
@@ -14,12 +14,7 @@ FunctionalBlock::FunctionalBlock(GroupBlock *_parent, ReferenceBlock *_reference
   reference = _reference;\r
   parent = _parent;\r
   name = reference->getName();\r
-  consumptionPattern = NULL;\r
-  lengthCP = 0;\r
-  nbConsumingPorts = 0;\r
-  productionPattern = NULL;\r
-  lengthPP = 0;\r
-  nbProducingPorts = 0;\r
+\r
   if (reference->getImplementations().isEmpty()) {\r
     implementation = NULL;\r
     cout << "block has no implementation" << endl;\r
@@ -169,16 +164,10 @@ bool FunctionalBlock::createConsumptionPattern() {
       cerr << "no consumption pattern for reference interface " << qPrintable(refName) << endl;\r
       return false;\r
     }\r
-    QList<char> pattern = expandPattern(consPattern.value(refName),&ok);    \r
+    QList<char>* pattern = expandPattern(consPattern.value(refName),&ok);    \r
     \r
     if (!ok) return false;\r
-    connIface->setConsumptionPattern(pattern);\r
-    cout << qPrintable(refName) << " consumption pattern = ";\r
-    foreach(char c, pattern) {\r
-      cout << (int)c << " ";\r
-    }\r
-    cout << endl;\r
-    \r
+    consumptionPattern.insert(connIface,pattern);        \r
   }        \r
   return true;\r
 }\r
@@ -199,15 +188,9 @@ bool FunctionalBlock::createProductionPattern() {
       cerr << "no production pattern for reference interface " << qPrintable(refName) << endl;\r
       return false;\r
     }\r
-    QList<char> pattern = expandPattern(prodPattern.value(refName),&ok);\r
+    QList<char>* pattern = expandPattern(prodPattern.value(refName),&ok);\r
     if (!ok) return false;\r
-    connIface->setProductionPattern(pattern);\r
-    cout << qPrintable(refName) << " production pattern = ";\r
-    foreach(char c, pattern) {\r
-      cout << (int)c << " ";\r
-    }\r
-    cout << endl;\r
-    \r
+    productionPattern.insert(connIface,pattern);    \r
   }    \r
   return true;\r
 }\r
@@ -262,97 +245,96 @@ bool FunctionalBlock::createProductionCounter() {
   return true;\r
 }\r
 \r
-QList<char> FunctionalBlock::expandPattern(const QString& pattern, bool* ok) {\r
+QList<char>* FunctionalBlock::expandPattern(const QString& patternIn, bool* ok) {\r
   static QString fctName = "FunctionalBlock::expandPattern()";\r
 #ifdef DEBUG_FCTNAME\r
   cout << "call to " << qPrintable(fctName) << endl;\r
 #endif\r
   \r
   QList<char> lst;\r
-  QString  p = pattern;\r
+  QString  p = patternIn;\r
   p.append(')');\r
   int offset = 0;\r
-  lst = expandPatternRecur(p,&offset,ok);   \r
-  return lst;\r
+  QList<char>* patternOut = new QList<char>();\r
+  expandPatternRecur(p,&offset,ok,patternOut);   \r
+  return patternOut;\r
 }\r
 \r
-QList<char> FunctionalBlock::expandPatternRecur(const QString& pattern, int *offset, bool *ok) {\r
-  \r
-  QList<char> currentGroup; \r
+void FunctionalBlock::expandPatternRecur(const QString& patternIn, int *offset, bool *ok, QList<char>* patternOut) {  \r
   \r
-  while ((*offset < pattern.size()) && (pattern.at(*offset) != ')')) {\r
+  while ((*offset < patternIn.size()) && (patternIn.at(*offset) != ')')) {\r
     \r
-    QChar c = pattern.at(*offset);\r
+    QChar c = patternIn.at(*offset);\r
     if (c == '(') {\r
       *offset += 1;\r
-      currentGroup += expandPatternRecur(pattern,offset, ok);\r
+      expandPatternRecur(patternIn,offset, ok, patternOut);\r
       if (!ok) {\r
-        return currentGroup;\r
+        return;\r
       }\r
     }\r
     else if (c == '0') {\r
-      currentGroup.append(0);\r
+      patternOut->append(0);\r
     }\r
     else if (c == '1') {\r
-      currentGroup.append(1);\r
+      patternOut->append(1);\r
     }\r
     else if (c == 'X') {\r
-      currentGroup.append(-1);\r
+      patternOut->append(-1);\r
     }\r
     else if (c == '{') {\r
       *offset += 1;\r
       QString expr = "";      \r
-      while ((*offset < pattern.size()) && (pattern.at(*offset) != '}')) {\r
-        expr += pattern.at(*offset);        \r
+      while ((*offset < patternIn.size()) && (patternIn.at(*offset) != '}')) {\r
+        expr += patternIn.at(*offset);        \r
         *offset += 1;\r
       }\r
-      if (*offset == pattern.size()) {\r
+      if (*offset == patternIn.size()) {\r
         *ok = false;\r
-        return currentGroup;\r
+        return;\r
       }\r
       double repeat = evaluateExpression(expr,ok);\r
       if (!ok) {\r
-        return currentGroup;      \r
+        return;      \r
       }            \r
       // repeat just the last value in currentGroup\r
-      char last = currentGroup.last();      \r
+      char last = patternOut->last();      \r
       //cout << "repeat last char " << repeat << " times : " << (int)last << endl;\r
       \r
       for(int i=1;i<(int)repeat;i++) {\r
-        currentGroup += last;\r
+        patternOut->append(last);\r
       }\r
     }    \r
     *offset += 1;\r
   }\r
   \r
   // must check if after ), there is a {\r
-  if ((*offset < pattern.size()-1) && (pattern.at(*offset+1) == '{')) {\r
+  if ((*offset < patternIn.size()-1) && (patternIn.at(*offset+1) == '{')) {\r
     *offset += 2;\r
     QString expr = "";      \r
-    while ((*offset < pattern.size()) && (pattern.at(*offset) != '}')) {\r
-      expr += pattern.at(*offset);        \r
+    while ((*offset < patternIn.size()) && (patternIn.at(*offset) != '}')) {\r
+      expr += patternIn.at(*offset);        \r
       *offset += 1;\r
     }\r
-    if (*offset == pattern.size()) {\r
+    if (*offset == patternIn.size()) {\r
       *ok = false;\r
-      return currentGroup;\r
+      return;\r
     }\r
     double repeat = evaluateExpression(expr,ok);\r
     if (!ok) {\r
-      return currentGroup;      \r
+      return;      \r
     }\r
     /*\r
     cout << "repeat last group " << repeat << " times : ";\r
     foreach (char c, currentGroup) cout <<(int)c;\r
     cout << endl;  \r
     */\r
-    QList<char> single = currentGroup;\r
+    QList<char> single = *patternOut;\r
     for(int i=1;i<(int)repeat;i++) {\r
-      currentGroup += single;\r
+      patternOut->append(single);\r
     }    \r
   }\r
   //*offset += 1;\r
-  return currentGroup;\r
+  return;\r
 }\r
 \r
 double FunctionalBlock::evaluateExpression(const QString& expression, bool* ok) {\r
@@ -382,7 +364,8 @@ double FunctionalBlock::evaluateExpression(const QString& expression, bool* ok)
       return 0.0;\r
     }\r
     vars.insert(name,(double)val);    \r
-  }  \r
+  }\r
+  \r
   evaluator->setVariablesValue(vars);\r
   double result;\r
   try {\r
@@ -411,69 +394,72 @@ bool FunctionalBlock::computeOutputPattern(int nbExec) {
     cout << "computing output pattern of " << qPrintable(name) << " for " << nbExec << " executions" << endl;\r
     foreach(AbstractInterface* iface, getControlOutputs()) {\r
       FunctionalInterface* connIface = AI_TO_FUN(iface);\r
-      QList<char> pattern;\r
-      for(int i=0;i<nbExec;i++) pattern += connIface->getProductionPattern();\r
+      // create output pattern\r
+      QList<char>* pp = productionPattern.value(connIface);\r
+      QList<char>* pattern = new QList<char>(*pp);\r
+      for(int i=1;i<nbExec;i++) pattern->append(*pp);\r
+      // assign pattern to interface\r
       connIface->setOutputPattern(pattern);\r
-    }    \r
+      // store it in QMap\r
+      outputPattern.insert(connIface,pattern);      \r
+    }\r
   }\r
   else {\r
     cout << "computing output pattern of " << qPrintable(name) << endl;\r
     \r
-    // initialize consumption and production patterns    \r
-    initConsumptionPattern();\r
-    initProductionPattern();\r
-    \r
-    // collect the input patterns for each input    \r
-    char** inputPattern = NULL;\r
-    int idIface = 0;\r
-    inputPattern = new char*[nbConsumingPorts];\r
+    // collect the input patterns for each input \r
+    QMap<AbstractInterface*,QList<char>* > inputPattern;    \r
     int minLen = -1;\r
     foreach(AbstractInterface* iface, getControlInputs()) {      \r
       ConnectedInterface* connIface = AI_TO_CON(iface);\r
-      QList<char> in = connIface->getConnectedFrom()->getOutputPattern();\r
+      QList<char>* out = connIface->getConnectedFrom()->getOutputPattern();\r
       if (minLen == -1) {\r
-        minLen = in.size();\r
+        minLen = out->size();\r
       }\r
       else {\r
-        if (in.size() < minLen) minLen = in.size();\r
+        if (out->size() < minLen) minLen = out->size();\r
       }\r
-      if (in.size() > 0) {\r
-        inputPattern[idIface] = new char[in.size()];\r
-        int i = 0;\r
-        foreach(char c, in) inputPattern[idIface][i++] = c;\r
+      if (out->size() > 0) {\r
+        QList<char>* in = new QList<char>(*out);\r
+        foreach(char c, *in) {\r
+          cout << (int)c;\r
+        }\r
+        cout << endl;\r
+\r
+        inputPattern.insert(connIface,in);\r
       }\r
       else {\r
-        inputPattern[idIface] = NULL;\r
-      }\r
-      idIface += 1;      \r
+        inputPattern.insert(connIface,NULL);\r
+      }      \r
     }\r
-    // if some patterns are not available, ens now, returning false\r
+    // if some patterns are not available, end now, returning false\r
     if (minLen == 0) {\r
-      for(int i=0;i<nbConsumingPorts; i++) {\r
-        if (inputPattern[i] != NULL) delete [] inputPattern[i];\r
-      }\r
-      delete [] inputPattern;\r
+      QMapIterator<AbstractInterface*,QList<char>* > iterI(inputPattern);\r
+      while (iterI.hasNext()) {\r
+        iterI.next();\r
+        QList<char>* pattern = iterI.value();        \r
+        if (pattern != NULL) delete pattern;\r
+      }     \r
       return false;\r
     }\r
     cout << "input pattern array initialized with min. len " << minLen << endl;\r
+    \r
     // initialize the output pattern    \r
-    char** outputPattern = NULL;\r
-    outputPattern = new char*[nbProducingPorts];\r
     int lengthOP = 0;\r
-    idIface = 0;\r
     foreach(AbstractInterface* iface, getControlOutputs()) {\r
-      FunctionalInterface* connIface = AI_TO_FUN(iface);\r
-      lengthOP = minLen+connIface->getProductionPattern().size();\r
-      outputPattern[idIface] = new char[lengthOP];\r
-      memset(outputPattern[idIface],0,lengthOP);\r
-      idIface += 1;\r
+      FunctionalInterface* connIface = AI_TO_FUN(iface);      \r
+      lengthOP = minLen+productionPattern.value(connIface)->size();\r
+      QList<char>* pattern = new QList<char>();\r
+      for(int i=0;i<lengthOP;i++) pattern->append(0);\r
+      connIface->setOutputPattern(pattern);\r
+      outputPattern.insert(connIface,pattern);\r
     }\r
     cout << "output pattern array initialized" << endl;\r
     \r
     int clock = 0;\r
     nbExec = 0;\r
     // search for the beginning of the first execution.\r
-    while ((clock < minLen) && (! isValidDataGroup(inputPattern,nbConsumingPorts,clock))) clock++;\r
+    while ((clock < minLen) && (! isValidDataGroup(inputPattern,clock))) clock++;\r
     cout << "found 1st exec clock: " << clock << endl;\r
     \r
     while (clock < minLen) {\r
@@ -487,7 +473,7 @@ bool FunctionalBlock::computeOutputPattern(int nbExec) {
       bool cannotCompleteExec = false;\r
       for(int m=0;m<productionCounter.size();m++) {\r
         // search for the first production in PP\r
-        while (!isValidDataGroup(productionPattern,nbProducingPorts,p)) {\r
+        while (!isValidDataGroup(productionPattern,p)) {\r
           p += 1;\r
           o += 1;\r
         }\r
@@ -495,7 +481,7 @@ bool FunctionalBlock::computeOutputPattern(int nbExec) {
         // search for PC(m) valid input group in IP\r
         while (nip < productionCounter.at(m)) {\r
           if (clock+cip < minLen) {\r
-            if (isValidDataGroup(inputPattern,nbConsumingPorts,clock+cip)) nip += 1;\r
+            if (isValidDataGroup(inputPattern,clock+cip)) nip += 1;\r
             cip += 1;\r
             gap += 1;\r
           }\r
@@ -503,18 +489,18 @@ bool FunctionalBlock::computeOutputPattern(int nbExec) {
             cannotCompleteExec = true;\r
             break;\r
           }        \r
-        }\r
+        }        \r
         \r
         if (cannotCompleteExec) break; // no need to go further since the next search of input data group will lead to go outside inputPattern\r
         \r
         // search for PC(m) valid input group in IP\r
         while (ncp < productionCounter.at(m)) {\r
-          if (isValidDataGroup(consumptionPattern,nbConsumingPorts,ccp)) ncp += 1;\r
+          if (isValidDataGroup(consumptionPattern,ccp)) ncp += 1;\r
           ccp += 1;\r
           gap -= 1;\r
         }\r
         o += gap; // to take into acocunt of extra null columns\r
-        combinePatterns(productionPattern,p,outputPattern,clock+o,1,nbProducingPorts);\r
+        combinePatterns(productionPattern,p,outputPattern,clock+o);\r
         p += 1;\r
         o += 1;\r
       }\r
@@ -528,113 +514,126 @@ bool FunctionalBlock::computeOutputPattern(int nbExec) {
       clock += 1;      \r
       nip = 0;\r
       while ((clock < minLen) && (nip < delta)) {\r
-        if (isValidDataGroup(inputPattern,nbConsumingPorts,clock)) nip += 1;\r
+        if (isValidDataGroup(inputPattern,clock)) nip += 1;\r
         if (nip < delta) clock += 1;\r
       }\r
+      cout << "found exec " << nbExec << " at clock: " << clock << endl;\r
     }\r
     // find the last valid output data group\r
-    while(! isValidDataGroup(outputPattern,nbProducingPorts,lengthOP-1)) lengthOP -= 1;\r
-    \r
-    //for(int i=0;i<lengthOP;i++) cout << (int)(outputPattern[0][i]);\r
-    //cout << endl;\r
-    // copy back outputPattern info each interface\r
-    idIface = 0;\r
-    foreach(AbstractInterface* iface, getControlOutputs()) {\r
-      ConnectedInterface* connIface = AI_TO_CON(iface);\r
-      QList<char> pattern;\r
-      for(int i=0;i<lengthOP;i++) pattern.append(outputPattern[idIface][i]);\r
-      connIface->setOutputPattern(pattern);      \r
-      idIface += 1;\r
-    }\r
-    \r
-    // clear inputPattern and outputPattern\r
-    for(int i=0;i<nbConsumingPorts; i++) {\r
-      delete [] inputPattern[i];\r
-    }\r
-    delete [] inputPattern;\r
-    for(int i=0;i<nbProducingPorts; i++) {\r
-      delete [] outputPattern[i];\r
+    while(! isValidDataGroup(outputPattern,lengthOP-1)) {\r
+      removeDataGroup(outputPattern,lengthOP-1);\r
+      lengthOP -= 1;\r
     }\r
-    delete [] outputPattern;\r
+\r
+    // clear input pattern    \r
+    QMapIterator<AbstractInterface*,QList<char>* > iterI(inputPattern);\r
+    while (iterI.hasNext()) {\r
+      iterI.next();\r
+      QList<char>* pattern = iterI.value();        \r
+      if (pattern != NULL) delete pattern;\r
+    }     \r
   }\r
   return true;\r
 }\r
 \r
-bool FunctionalBlock::isValidDataGroup(char** pattern, int nbPorts, int clock) {\r
-  \r
-  for(int i=0;i<nbPorts;i++) {\r
-    if (pattern[i][clock] == 1) return true;\r
+bool FunctionalBlock::canCombinePatterns(const QMap<AbstractInterface*, QList<char>* >& patternSrc, int srcCol, QMap<AbstractInterface*, QList<char>* > patternDest, int destCol) {\r
+  if (patternSrc.size() != patternDest.size()) return false;\r
+  QMapIterator<AbstractInterface*, QList<char>* > iterSrc(patternSrc);\r
+  QMapIterator<AbstractInterface*, QList<char>* > iterDest(patternDest);\r
+  while (iterSrc.hasNext()) {\r
+    iterSrc.next();\r
+    iterDest.next();    \r
+    QList<char>* srcPat = iterSrc.value();\r
+    QList<char>* destPat = iterDest.value();\r
+    if (srcCol >= srcPat->size()) return false;\r
+    if (destCol >= destPat->size()) return false;\r
+    if ((srcPat->at(srcCol) == -1) && (destPat->at(destCol) == 1)) return false;\r
+    if ((srcPat->at(srcCol) == 1) && (destPat->at(destCol) == -1)) return false;\r
   }\r
-  return false;  \r
+  return true;\r
 }\r
 \r
-void FunctionalBlock::combinePatterns(char** patternSrc, int srcCol, char** patternDest, int destCol, int nbCols, int nbPorts ) {\r
-  \r
-  for (int i=0;i<nbCols;i++) {\r
-    for(int j=0;j<nbPorts;j++) {\r
-      patternDest[j][destCol+i] = patternDest[j][destCol+i] | patternSrc[j][srcCol+i];\r
+void FunctionalBlock::combinePatterns(const QMap<AbstractInterface*, QList<char>* >& patternSrc, int srcCol, QMap<AbstractInterface*, QList<char>* > patternDest, int destCol) {\r
+  if (patternSrc.size() != patternDest.size()) return;\r
+  QMapIterator<AbstractInterface*, QList<char>* > iterSrc(patternSrc);\r
+  QMapIterator<AbstractInterface*, QList<char>* > iterDest(patternDest);\r
+  while (iterSrc.hasNext()) {\r
+    iterSrc.next();\r
+    iterDest.next();    \r
+    QList<char>* srcPat = iterSrc.value();\r
+    QList<char>* destPat = iterDest.value();\r
+    if (srcCol >= srcPat->size()) return;\r
+    if (destCol >= destPat->size()) return;\r
+    if ((srcPat->at(srcCol) == -1) && (destPat->at(destCol) == 1)) return;\r
+    if ((srcPat->at(srcCol) == 1) && (destPat->at(destCol) == -1)) return;    \r
+    destPat->replace(destCol,destPat->at(destCol) | srcPat->at(srcCol));\r
+  }  \r
+}\r
+\r
+void FunctionalBlock::appendToPattern(const QMap<AbstractInterface*, QList<char>* >& patternSrc, int srcCol, QMap<AbstractInterface*, QList<char>* > patternDest, int nbCols) {\r
+  if (patternSrc.size() != patternDest.size()) return;\r
+  QMapIterator<AbstractInterface*, QList<char>* > iterSrc(patternSrc);\r
+  QMapIterator<AbstractInterface*, QList<char>* > iterDest(patternDest);\r
+  while (iterSrc.hasNext()) {\r
+    iterSrc.next();\r
+    iterDest.next();    \r
+    QList<char>* srcPat = iterSrc.value();\r
+    QList<char>* destPat = iterDest.value();    \r
+    int i=0;\r
+    while ((srcCol+i < srcPat->size()) && (i<nbCols)) {\r
+      destPat->append(srcPat->at(srcCol+i));\r
+      i++;\r
     }\r
-  }\r
-  \r
+  }  \r
 }\r
 \r
-void FunctionalBlock::clearConsumptionPattern() {\r
-  if (consumptionPattern == NULL) return;\r
-  \r
-  for(int i=0;i<nbConsumingPorts; i++) {\r
-    delete [] consumptionPattern[i];\r
+void FunctionalBlock::removeDataGroup(QMap<AbstractInterface *, QList<char> *> &pattern, int offset) {\r
+  QMapIterator<AbstractInterface*, QList<char>* > iterSrc(pattern);  \r
+  while (iterSrc.hasNext()) {\r
+    iterSrc.next();    \r
+    QList<char>* srcPat = iterSrc.value();\r
+    if (offset < srcPat->size()) {\r
+      srcPat->removeAt(offset);\r
+    }\r
   }\r
-  delete [] consumptionPattern;      \r
 }\r
 \r
-void FunctionalBlock::clearProductionPattern() {\r
-  if (productionPattern == NULL) return;\r
-  for(int i=0;i<nbProducingPorts;i++) {\r
-    delete [] productionPattern[i];\r
+bool FunctionalBlock::isValidDataGroup(const QMap<AbstractInterface *, QList<char> *> &pattern, int offset) {\r
+  QMapIterator<AbstractInterface*, QList<char>* > iterSrc(pattern);  \r
+  while (iterSrc.hasNext()) {\r
+    iterSrc.next();    \r
+    QList<char>* srcPat = iterSrc.value();\r
+    if (offset >= srcPat->size()) return false;\r
+    if (srcPat->at(offset) == 1) return true;\r
   }\r
-  delete [] productionPattern;\r
+  return false;\r
 }\r
 \r
-void FunctionalBlock::initConsumptionPattern() {\r
-  static QString fctName = "FunctionalBlock::initConsumptionPattern()";\r
-#ifdef DEBUG_FCTNAME\r
-  cout << "call to " << qPrintable(fctName) << endl;\r
-#endif\r
-  \r
-  if (consumptionPattern != NULL) clearConsumptionPattern();\r
-  \r
-  nbConsumingPorts = getControlInputs().size();  \r
-  int idIface = 0;\r
-  consumptionPattern = new char*[nbConsumingPorts];  \r
-  foreach(AbstractInterface* iface, getControlInputs()) {\r
-    FunctionalInterface* connIface = AI_TO_FUN(iface);\r
-    QList<char> in = connIface->getConsumptionPattern();\r
-    lengthCP = in.size(); // normally, all inputs have the same lenght for CP\r
-    consumptionPattern[idIface] = new char[lengthCP];\r
-    int i = 0;\r
-    foreach(char c, in) consumptionPattern[idIface][i++] = c;\r
-    idIface += 1;    \r
+bool FunctionalBlock::isOnlyXDataGroup(const QMap<AbstractInterface *, QList<char> *> &pattern, int offset) {\r
+  QMapIterator<AbstractInterface*, QList<char>* > iterSrc(pattern);  \r
+  while (iterSrc.hasNext()) {\r
+    iterSrc.next();    \r
+    QList<char>* srcPat = iterSrc.value();\r
+    if (offset >= srcPat->size()) return false;\r
+    if (srcPat->at(offset) != -1) return false;\r
   }\r
+  return true;  \r
 }\r
 \r
-void FunctionalBlock::initProductionPattern() {\r
-  static QString fctName = "FunctionalBlock::initProductionPattern()";\r
-#ifdef DEBUG_FCTNAME\r
-  cout << "call to " << qPrintable(fctName) << endl;\r
-#endif\r
-  \r
-  if (productionPattern != NULL) clearProductionPattern();\r
-  \r
-  nbProducingPorts = getControlOutputs().size();  \r
-  int idIface = 0;\r
-  productionPattern = new char*[nbProducingPorts];  \r
-  foreach(AbstractInterface* iface, getControlOutputs()) {\r
-    FunctionalInterface* connIface = AI_TO_FUN(iface);\r
-    QList<char> in = connIface->getProductionPattern();\r
-    lengthPP = in.size(); // normally, all inputs have the same lenght for PP\r
-    productionPattern[idIface] = new char[lengthPP];\r
-    int i = 0;\r
-    foreach(char c, in) productionPattern[idIface][i++] = c;\r
-    idIface += 1;    \r
+void FunctionalBlock::clearConsumptionPattern() {\r
+  QMapIterator<AbstractInterface*, QList<char>* > iterP(consumptionPattern);  \r
+  while (iterP.hasNext()) {\r
+    iterP.next();\r
+    QList<char>* pattern = iterP.value();\r
+    if (pattern != NULL) delete pattern;\r
   }\r
-}\r
+}  \r
+\r
+void FunctionalBlock::clearProductionPattern() {\r
+  QMapIterator<AbstractInterface*, QList<char>* > iterP(productionPattern);  \r
+  while (iterP.hasNext()) {\r
+    iterP.next();\r
+    QList<char>* pattern = iterP.value();\r
+    if (pattern != NULL) delete pattern;\r
+  }\r
+}  \r
index b6ac65f1ee869f3f23c1ecec6ff68bd95b611895..2cf9a5afc01929f78b88f7abc352f5403fcce4b7 100644 (file)
@@ -57,40 +57,83 @@ public:
   bool createConsumptionPattern(); // initialize a QList<char> for each interface from patterns defined in implementation\r
   bool createProductionPattern(); // initialize a QList<char> for each interface from patterns defined in implementation\r
   bool createProductionCounter(); // initialize a QList<int> from counter defined in implementation\r
-  void initConsumptionPattern(); // initialize a char** from patterns defined for each interface\r
-  void initProductionPattern(); // initialize a char** from patterns defined for each interface\r
   void clearConsumptionPattern();\r
   void clearProductionPattern();\r
   bool computeOutputPattern(int nbExec = -1);\r
   \r
 private:  \r
-  // patterns  \r
-  bool isValidDataGroup(char** pattern, int nbPorts, int clock);\r
+  // patterns    \r
   double evaluateExpression(const QString& expression, bool* ok);\r
-  QList<char> expandPattern(const QString& pattern, bool* ok);\r
-  QList<char> expandPatternRecur(const QString& pattern, int* offset, bool* ok);\r
+  QList<char>* expandPattern(const QString& patternIn, bool* ok);\r
+  void expandPatternRecur(const QString& patternIn, int* offset, bool* ok, QList<char> *patternOut);\r
+  /*!\r
+   * \brief canCombinePatterns\r
+   * \param patternSrc the pattern that must be combined with patternDest (patternDest = patternDest OR patternSrc)  \r
+   * \param srcCol the column index within patternSrc\r
+   * \param patternDest the pattern that is modified by the combination (patternDest = patternDest OR patternSrc)\r
+   * \param destCol the column index within patternDest  \r
+   * \return true if the combination is possible, and false else (e.g. when X1 must be combined with 11)\r
+   * NB: if src/destCol are outside the range of the list, false is returned.   \r
+   */\r
+  bool canCombinePatterns(const QMap<AbstractInterface*, QList<char>* >& patternSrc, int srcCol, QMap<AbstractInterface*, QList<char>* > patternDest, int destCol);\r
   /*!\r
    * \brief combinePatterns\r
    * \param patternSrc the pattern that must be combined with patternDest (patternDest = patternDest OR patternSrc)  \r
    * \param srcCol the column index within patternSrc\r
    * \param patternDest the pattern that is modified by the combination (patternDest = patternDest OR patternSrc)\r
-   * \param destClock the column index within patternDest\r
-   * \param nbCols the numer of columns to combine\r
-   * \param nbPorts the number of rows in both patterns\r
-   * BEWARE: no check is done if nbCols is consistent with the real length of both patterns, thus an access outside\r
-   * the patterns is possible.\r
+   * \param destCol the column index within patternDest      \r
+   * BEWARE: this method returns as soons as there is an acces problem (i.e. out of list range, impossible combine, ...)\r
+   leaving the dest pattern in an inconsistent state. Thus, it is a good idea to call canCombine before.\r
    */\r
-  void combinePatterns(char** patternSrc, int srcCol, char** patternDest, int destCol, int nbCols, int nbPorts );\r
-\r
-  QList<int> productionCounter; //! only usefull for output interfaces\r
-  int delta;\r
+  void combinePatterns(const QMap<AbstractInterface*, QList<char>* >& patternSrc, int srcCol, QMap<AbstractInterface*, QList<char>* > patternDest, int destCol);\r
+  /*!\r
+   * \brief appendToPattern\r
+   * \param patternSrc the pattern that must be appended to patternDest\r
+   * \param srcCol the column index within patternSrc\r
+   * \param patternDest the pattern that is modified by the append   \r
+   * \param nbCols the numer of columns to append   \r
+   * BEWARE: if nbCols is not consistent with the real length of src pattern, there may be less that nbCols\r
+   * that will be appended\r
+   */\r
+  void appendToPattern(const QMap<AbstractInterface*, QList<char>* >& patternSrc, int srcCol, QMap<AbstractInterface*, QList<char>* > patternDest, int nbCols);\r
+  /*!\r
+  * \brief removeDataGroup\r
+  * \param pattern the pattern for which a column is removed\r
+  * \param offset the index of the column to remove \r
+  */\r
+  void removeDataGroup(QMap<AbstractInterface*, QList<char>* >& pattern, int offset);\r
+  /*!\r
+  * \brief isValidGroup\r
+  * \param pattern the pattern to test\r
+  * \param offset the column to test\r
+  * isValidGroup checks if there is at least one 1 in the column offset of pattern.\r
+  */\r
+  bool isValidDataGroup(const QMap<AbstractInterface*, QList<char>* >& pattern, int offset);\r
+  /*!\r
+  * \brief isOnlyXGroup\r
+  * \param pattern the pattern to test\r
+  * \param offset the column to test\r
+  * isOnlyXGroup checks if there is only X in the column offset of pattern.\r
+  */\r
+  bool isOnlyXDataGroup(const QMap<AbstractInterface*, QList<char>* >& pattern, int offset);\r
+  /*!\r
+  * \brief shifRightPattern\r
+  * \param pattern the pattern to shift\r
+  * \param offset the column where to shift\r
+  * shiftRightPattern insert a null colmun in pattern, which leads to shift right the pattern at offset.\r
+  * this method is used during admittance generation\r
+  */\r
+  void shiftRightPattern(const QMap<AbstractInterface*, QList<char>* >& pattern, int offset);\r
+\r
+  QMap<AbstractInterface*, QList<char>* > consumptionPattern;\r
+  QMap<AbstractInterface*, QString > admittance; // the admittance expressed as prologue-cyclic part-eppilogue\r
+  QMap<AbstractInterface*, QList<char>* > admittanceExpanded; // the admittance expanded by taking into account nb exec.\r
+  QMap<AbstractInterface*, QList<char>* > productionPattern;\r
+  QMap<AbstractInterface*, QList<char>* > outputPattern; // CAUTION: the QList<char>* must also be stored in the outputPattern attributes of AbstractInterface\r
+  QList<int> productionCounter; //! only usefull for control output interfaces\r
   \r
-  char** consumptionPattern;\r
-  int nbConsumingPorts;\r
-  int lengthCP;\r
-  char** productionPattern;\r
-  int nbProducingPorts;\r
-  int lengthPP;\r
+  int delta;\r
+    \r
   ArithmeticEvaluator* evaluator;\r
   \r
   ReferenceBlock* reference;\r
index b87e2c79afd64001488ff99696854e91ff8391cc..43f31c3aa6c6b47259d6d299c815522fe941fdb7 100644 (file)
@@ -35,12 +35,12 @@ public :
 \r
   // getters\r
   inline ReferenceInterface* getReference() { return reference; }\r
-  inline QList<char> getConsumptionPattern() { return consumptionPattern; }\r
-  inline QList<char> getProductionPattern() { return productionPattern; }  \r
+  //inline QList<char>* getConsumptionPattern() { return consumptionPattern; }\r
+  //inline QList<char>* getProductionPattern() { return productionPattern; }  \r
 \r
   // setters\r
-  inline void setConsumptionPattern(QList<char> pattern) { consumptionPattern = pattern; }\r
-  inline void setProductionPattern(QList<char> pattern) { productionPattern = pattern; }  \r
+  //inline void setConsumptionPattern(QList<char>* pattern) { consumptionPattern = pattern; }\r
+  //inline void setProductionPattern(QList<char>* pattern) { productionPattern = pattern; }  \r
 \r
   // testers\r
   bool isFunctionalInterface();\r
@@ -59,8 +59,9 @@ private:
   ReferenceInterface* reference;  \r
   \r
   //patterns\r
-  QList<char> consumptionPattern; //! only usefull for input interfaces\r
-  QList<char> productionPattern; //! only usefull for output interfaces  \r
+  //QList<char>* consumptionPattern; //! only usefull for input interfaces\r
+  //QList<char>* productionPattern; //! only usefull for output interfaces  \r
+  //QString admittance; //! only usefull for input interfaces  \r
 };\r
 \r
 #endif // __FUNCTIONALINTERFACE_H__\r
index 474d5dc33afb4b59a68f02fab47ad5e4ed3118c3..2fc3012e62de0bf99d6dbec772df571170df530d 100644 (file)
@@ -108,7 +108,8 @@ void GroupBlock::removeGenericParameter(QString name) {
 void GroupBlock::initInputPattern() {
   foreach(AbstractInterface* iface, getControlInputs()) {
     ConnectedInterface* connIface = AI_TO_CON(iface);
-    connIface->setOutputPattern(connIface->getConnectedFrom()->getOutputPattern());    
+    QList<char>* pattern = new QList<char>(*(connIface->getConnectedFrom()->getOutputPattern()));    
+    connIface->setOutputPattern(pattern);    
   }  
 }
 
@@ -185,7 +186,8 @@ bool GroupBlock::computeOutputPattern(int nbExec) {
   if (canCompute) {
     foreach(AbstractInterface* iface, getControlOutputs()) {
       ConnectedInterface* connIface = AI_TO_CON(iface);
-      connIface->setOutputPattern(connIface->getConnectedFrom()->getOutputPattern());    
+      QList<char>* pattern = new QList<char>(*(connIface->getConnectedFrom()->getOutputPattern()));
+      connIface->setOutputPattern(pattern);    
     }
     setPatternComputed(true);
   }
index 593b8541bde4b74008387e7ea68c90f31969ceff..4a147ab51ef512a774352e6aaa51c7852ba2bebb 100644 (file)
@@ -46,6 +46,13 @@ public:
   
 private:    
   // patterns  
+  /* NB: in opposition to FunctionalBlock, the input pattern and output pattern of a block
+     is not computed but just deduced from the output pattern of functional interfaces that
+     are connected to some block interfaces. Thus, there is no need to have an outputPattern QMap linking
+     interfaces and patterns as in FunctionalBlock.
+     Thus, the output patterns are directly set/retrieved from interfaces.
+    
+   */
   /*!
    * \brief initInputPattern
    * Since input GroupInterface are just tunnels to input interfaces of inner blocks, they must
index d2134784690d8064acf451969686a4ba6b67d3de..dc3af4ea70d8cd7361d7ed5d9670f8ae0b7cab10 100755 (executable)
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 3.2.1, 2017-05-14T21:44:23. -->
+<!-- Written by QtCreator 3.2.1, 2017-05-18T16:26:09. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
-  <value type="QByteArray">{c8006d66-d34f-42be-ad10-d0207752286d}</value>
+  <value type="QByteArray">{1d077e47-e3a1-47fd-8b12-4de650e39df5}</value>
  </data>
  <data>
   <variable>ProjectExplorer.Project.ActiveTarget</variable>
   <valuemap type="QVariantMap">
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{2c9bf876-3476-44eb-8065-1f0844704dda}</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{451ee8a3-56ff-4aba-8a8e-3da882cc142e}</value>
    <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/sdomas/Projet/Blast/code/blast</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/localhome/sdomas/Projet/Blast/code/blast</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <valuelist type="QVariantList" key="GenericProjectManager.GenericMakeStep.BuildTargets">
index 4c1457d621aa5fe9a037ea4b103d9a565567e512..981529b9c41d5e2a3318a9f04c92a6269645b35f 100644 (file)
@@ -28,7 +28,7 @@
     <consumption>
       <input name="data_i_enb" pattern="1{$nb_data}" />
     </consumption>
-    <production counter="{2:$nb_data:1}">
+    <production counter="{2:$nb_data-1:1},$nb_data-1">
       <output name="data_o_enb" pattern="0001{$nb_data}" />
     </production>
   </patterns>
index d43a935111c63cb5fee4e6a04d0c141242216977..f108eac57120f7b7bb773d4b8eb71ec7ea70fa2d 100644 (file)
Binary files a/lib/implementations/impls.bmf and b/lib/implementations/impls.bmf differ