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

Private GIT Repository
patter compat continued
authorstephane Domas <stephane.domas@univ-fcomte.fr>
Mon, 22 May 2017 07:28:30 +0000 (09:28 +0200)
committerstephane Domas <stephane.domas@univ-fcomte.fr>
Mon, 22 May 2017 07:28:30 +0000 (09:28 +0200)
AbstractBlock.h
FunctionalBlock.cpp
FunctionalBlock.h
GroupBlock.cpp
GroupBlock.h
ReferenceBlock.cpp
ReferenceBlock.h
blast.creator.user
lib/implementations/impls.bmf

index 921621204526ba47d575abed2ca2f35eec1bf6d4..aee8c99766ae2256175662dbba913f1734d25382 100644 (file)
@@ -70,6 +70,7 @@ public:
   BlockParameter* getParameterFromName(QString name);\r
 \r
   // patterns\r
   BlockParameter* getParameterFromName(QString name);\r
 \r
   // patterns\r
+  virtual bool checkInputPatternCompatibility() = 0;\r
   virtual bool computeOutputPattern(int nbExec = -1) = 0;\r
   \r
 protected:\r
   virtual bool computeOutputPattern(int nbExec = -1) = 0;\r
   \r
 protected:\r
index ac27de40a0168d25129cb50334badc96c7d6e3df..66e89b420968bd2c703efd38075d89e59acaf83b 100644 (file)
@@ -22,6 +22,12 @@ FunctionalBlock::FunctionalBlock(GroupBlock *_parent, ReferenceBlock *_reference
   else {\r
     implementation = reference->getImplementations().at(0);\r
   }\r
   else {\r
     implementation = reference->getImplementations().at(0);\r
   }\r
+  lengthAP = -1;\r
+  lengthCP = -1;\r
+  lengthIP = -1;\r
+  lengthOP = -1;\r
+  lengthPP = -1;\r
+  delta = -1;\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -397,6 +403,11 @@ double FunctionalBlock::evaluateExpression(const QString& expression, bool* ok)
 }\r
 \r
 void FunctionalBlock::createInputPattern() {\r
 }\r
 \r
 void FunctionalBlock::createInputPattern() {\r
+  static QString fctName = "FunctionalBlock::createInputPattern())";\r
+#ifdef DEBUG_FCTNAME\r
+  cout << "call to " << qPrintable(fctName) << endl;\r
+#endif\r
+  \r
   lengthIP = -1;\r
   foreach(AbstractInterface* iface, getControlInputs()) {      \r
     ConnectedInterface* connIface = AI_TO_CON(iface);\r
   lengthIP = -1;\r
   foreach(AbstractInterface* iface, getControlInputs()) {      \r
     ConnectedInterface* connIface = AI_TO_CON(iface);\r
@@ -486,7 +497,15 @@ bool FunctionalBlock::createAdmittance(int nbExec) {
       }\r
     }\r
   }\r
       }\r
     }\r
   }\r
-  \r
+  // turn all X into 0\r
+  QMapIterator<AbstractInterface*,QList<char>* > iterA(admittance);\r
+  while (iterA.hasNext()) {\r
+    iterA.next();\r
+    QList<char>* pattern = iterA.value();\r
+    for(int i=0;i<pattern->size();i++) {\r
+      if (pattern->at(i) == -1) pattern->replace(i,0);\r
+    }\r
+  }\r
   return true;\r
 }\r
 \r
   return true;\r
 }\r
 \r
@@ -508,6 +527,24 @@ bool FunctionalBlock::checkInputPatternCompatibility() {
   ok = createAdmittance(nbExec);\r
   if (!ok) return false;\r
   \r
   ok = createAdmittance(nbExec);\r
   if (!ok) return false;\r
   \r
+  int clock = 0; // index in IP  \r
+  int i = 0; // index in AP\r
+  while (clock < lengthIP) {\r
+    if (samePatterns(inputPattern,clock,admittance,i)) {\r
+      clock++;\r
+      i++;\r
+    }\r
+    else {\r
+      if (isValidDataGroup(admittance,i)) {\r
+        \r
+      }\r
+      else {\r
+        // IP and AP are not equal and AP is a valid group -> not compatible\r
+        return false;\r
+      }\r
+      \r
+    }    \r
+  }\r
   return true;\r
 }\r
 \r
   return true;\r
 }\r
 \r
@@ -638,6 +675,23 @@ bool FunctionalBlock::computeOutputPattern(int nbExec) {
   return true;\r
 }\r
 \r
   return true;\r
 }\r
 \r
+bool FunctionalBlock::samePatterns(const QMap<AbstractInterface*, QList<char>* >& patternSrc, int srcCol, const QMap<AbstractInterface*, QList<char>* >& patternDest, int destCol) {\r
+  \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) != destPat->at(destCol)) return false;    \r
+  }\r
+  return true;\r
+}\r
+\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
 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
index 6f47a008033b7747ed9d7508c3dd6e4c158dd9cd..f27bef640f5b78efcf0591910a9612f78a1c80a2 100644 (file)
@@ -56,7 +56,12 @@ public:
   QString getReferenceHashMd5();\r
   \r
   // patterns\r
   QString getReferenceHashMd5();\r
   \r
   // patterns\r
-  bool createPatterns();\r
+  bool createPatterns(); // called in Graph, before checking compatibility and computing output pattern\r
+  bool checkInputPatternCompatibility();\r
+  bool computeOutputPattern(int nbExec = -1);\r
+  \r
+private:  \r
+  // patterns\r
   bool createDelta();\r
   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 createDelta();\r
   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
@@ -67,14 +72,20 @@ public:
   void createInputPattern();\r
   void clearInputPattern();\r
   int getNumberOfExecution(); // compute number of block execution from inputPattern and delta\r
   void createInputPattern();\r
   void clearInputPattern();\r
   int getNumberOfExecution(); // compute number of block execution from inputPattern and delta\r
-  bool checkInputPatternCompatibility();\r
-  bool computeOutputPattern(int nbExec = -1);\r
   \r
   \r
-private:  \r
-  // patterns    \r
   double evaluateExpression(const QString& expression, 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
   double evaluateExpression(const QString& expression, 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 samePatterns\r
+   * \param patternSrc the pattern that must be tested with patternDest (is patternDest == patternDest)  \r
+   * \param srcCol the column index within patternSrc\r
+   * \param patternDest the pattern that must be tested with patternSrc\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
+  bool samePatterns(const QMap<AbstractInterface*, QList<char>* >& patternSrc, int srcCol, const QMap<AbstractInterface*, QList<char>* >& patternDest, int destCol);\r
   /*!\r
    * \brief canCombinePatterns\r
    * \param patternSrc the pattern that must be combined with patternDest (patternDest = patternDest OR patternSrc)  \r
   /*!\r
    * \brief canCombinePatterns\r
    * \param patternSrc the pattern that must be combined with patternDest (patternDest = patternDest OR patternSrc)  \r
index 2fc3012e62de0bf99d6dbec772df571170df530d..1560d98ce27c34998c3a49f6145062565641c6e2 100644 (file)
@@ -105,7 +105,7 @@ void GroupBlock::removeGenericParameter(QString name) {
   if (p != NULL) params.removeAll(p);
 }
 
   if (p != NULL) params.removeAll(p);
 }
 
-void GroupBlock::initInputPattern() {
+void GroupBlock::createInputPattern() {
   foreach(AbstractInterface* iface, getControlInputs()) {
     ConnectedInterface* connIface = AI_TO_CON(iface);
     QList<char>* pattern = new QList<char>(*(connIface->getConnectedFrom()->getOutputPattern()));    
   foreach(AbstractInterface* iface, getControlInputs()) {
     ConnectedInterface* connIface = AI_TO_CON(iface);
     QList<char>* pattern = new QList<char>(*(connIface->getConnectedFrom()->getOutputPattern()));    
@@ -113,6 +113,10 @@ void GroupBlock::initInputPattern() {
   }  
 }
 
   }  
 }
 
+bool GroupBlock::checkInputPatternCompatibility() {
+  return true;
+}
+
 bool GroupBlock::computeOutputPattern(int nbExec) {
 
   static QString fctName = "GroupBlock::computeOutputPattern()";
 bool GroupBlock::computeOutputPattern(int nbExec) {
 
   static QString fctName = "GroupBlock::computeOutputPattern()";
@@ -123,8 +127,9 @@ bool GroupBlock::computeOutputPattern(int nbExec) {
   cout << "computing output pattern of group " << qPrintable(name) << endl;
   
   bool canCompute = true;
   cout << "computing output pattern of group " << qPrintable(name) << endl;
   
   bool canCompute = true;
+  bool compatible = true;
   // get the input pattern on each inputs
   // get the input pattern on each inputs
-  initInputPattern();
+  createInputPattern();
   
   cout << "Input pattern OK" << endl;
   // find blocks that are connected to that inputs and generators
   
   cout << "Input pattern OK" << endl;
   // find blocks that are connected to that inputs and generators
@@ -158,8 +163,13 @@ bool GroupBlock::computeOutputPattern(int nbExec) {
   while (!fifo.isEmpty()) {
     AbstractBlock* block = fifo.takeFirst();
     
   while (!fifo.isEmpty()) {
     AbstractBlock* block = fifo.takeFirst();
     
-    if (block->getPatternComputed()) continue; // block has laready been processed
-        
+    if (block->getPatternComputed()) continue; // block has already been processed
+    
+    compatible = block->checkInputPatternCompatibility();
+    if (!compatible) {
+      cout << qPrintable(block->getName()) << " is not compatible with his input pattern" << endl;
+      break;
+    }
     canCompute = block->computeOutputPattern();
     if (!canCompute) {
       cout << "cannot finalize output pattern computation of " << qPrintable(block->getName()) << endl;
     canCompute = block->computeOutputPattern();
     if (!canCompute) {
       cout << "cannot finalize output pattern computation of " << qPrintable(block->getName()) << endl;
index 4a147ab51ef512a774352e6aaa51c7852ba2bebb..27e43cc1fd6d45d1fc3e4ee32699643a21c2f812 100644 (file)
@@ -42,6 +42,7 @@ public:
   // public attributes
   static int counter;
 
   // public attributes
   static int counter;
 
+  bool checkInputPatternCompatibility();
   bool computeOutputPattern(int nbExec = -1);
   
 private:    
   bool computeOutputPattern(int nbExec = -1);
   
 private:    
@@ -54,12 +55,12 @@ private:
     
    */
   /*!
     
    */
   /*!
-   * \brief initInputPattern
+   * \brief createInputPattern
    * Since input GroupInterface are just tunnels to input interfaces of inner blocks, they must
    * have an output pattern that can be provided to inner interfaces. That outpu pattern is just
    * found by taking the output pattern of the connectedFrom interface.
    */   
    * Since input GroupInterface are just tunnels to input interfaces of inner blocks, they must
    * have an output pattern that can be provided to inner interfaces. That outpu pattern is just
    * found by taking the output pattern of the connectedFrom interface.
    */   
-  void initInputPattern();
+  void createInputPattern();
   
   
   bool topGroup;  
   
   
   bool topGroup;  
index 12db4b4a9bc683b99cddea0c3ed0724e7d7e4ae2..89bde3a402b65fc473df5412a21ba1c3df80e77b 100644 (file)
@@ -567,6 +567,10 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) {
   return in;
 }
 
   return in;
 }
 
+bool ReferenceBlock::checkInputPatternCompatibility() {
+  return false;
+}
+
 bool ReferenceBlock::computeOutputPattern(int nbExec) {
   // does strictly nothing
   return false;
 bool ReferenceBlock::computeOutputPattern(int nbExec) {
   // does strictly nothing
   return false;
index b10c1429852d7762c2a795d3d49052ba4f9bad22..8212fcd5afb75117b840733d375d4dfb2bd5ff24 100644 (file)
@@ -68,6 +68,7 @@ public:
   
 private:
   // patterns
   
 private:
   // patterns
+  bool checkInputPatternCompatibility();
   bool computeOutputPattern(int nbExec = -1);
 };
 
   bool computeOutputPattern(int nbExec = -1);
 };
 
index acd48e98162630221628ad117c5f66f374d59b8f..9bc7661deb431a24f83491771a7f4a86f8919d00 100755 (executable)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 3.2.1, 2017-05-19T16:37:01. -->
+<!-- Written by QtCreator 3.2.1, 2017-05-22T09:28:13. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
index f108eac57120f7b7bb773d4b8eb71ec7ea70fa2d..8d7e2961d56bd85ffbb01b9c46757ecec06b736a 100644 (file)
Binary files a/lib/implementations/impls.bmf and b/lib/implementations/impls.bmf differ