X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/3bcfe4df6fdde086eb1b59f7a0173358170174a1..a13795fc34cd1e74f94695d35253c3d00abec9bc:/FunctionalBlock.cpp

diff --git a/FunctionalBlock.cpp b/FunctionalBlock.cpp
index ccaa7b2..925a0f9 100644
--- a/FunctionalBlock.cpp
+++ b/FunctionalBlock.cpp
@@ -8,7 +8,7 @@
 #include "ArithmeticEvaluator.h"
 
 
-FunctionalBlock::FunctionalBlock(GroupBlock *_parent, ReferenceBlock *_reference, bool createIfaces) throw(Exception) :  AbstractBlock() {
+FunctionalBlock::FunctionalBlock(Graph *_graph, GroupBlock *_parent, ReferenceBlock *_reference, bool createIfaces) throw(Exception) :  AbstractBlock(_graph) {
   //if (! _reference->isReferenceBlock()) throw(Exception(BLOCK_INVALID_TYPE));
   //if (! _group->isGroupBlock()) throw(Exception(BLOCK_INVALID_TYPE));
   reference = _reference;
@@ -65,7 +65,7 @@ bool FunctionalBlock::isFunctionalBlock() {
   return true;
 }
 
-bool FunctionalBlock::isSourceBlock() {
+bool FunctionalBlock::isStimuliBlock() {
   if (parent == NULL) return true;
   return false;
 }
@@ -146,7 +146,7 @@ void FunctionalBlock::createPatterns() throw(Exception) {
   
   cout << "create patterns for block " << qPrintable(name) << endl;
   if (evaluator == NULL) evaluator = new ArithmeticEvaluator();
-  if (! isGeneratorBlock()) {
+  if (! isSourceBlock()) {
     try {
       createDelta();
       createConsumptionPattern();    
@@ -846,125 +846,113 @@ void FunctionalBlock::computeOutputPattern(int nbExec) throw(Exception) {
 
   clearOutputPattern();
 
-  /* case 1: the block is a generator for which output pattern
-     must be computed for a nbExec following executions
-  */
+  if (specialType != NotSpecial) {
+    cerr << "Abnormal case: the block is special and output pattern is computed normally" << endl;
+    throw(Exception(INVALID_FUNBLOCK_USE,this));
+  }
 
-  if (nbExec > 0) {
-    cout << "computing output pattern of " << qPrintable(name) << " for " << nbExec << " executions" << endl;
-    foreach(AbstractInterface* iface, getControlOutputs()) {
-      FunctionalInterface* connIface = AI_TO_FUN(iface);
-      // create output pattern
-      QList<char>* pp = productionPattern.value(connIface);
-      QList<char>* pattern = new QList<char>(*pp);
-      for(int i=1;i<nbExec;i++) pattern->append(*pp);
-      // assign pattern to interface
-      connIface->setOutputPattern(pattern);
-      // store it in QMap
-      outputPattern.insert(connIface,pattern);      
+  cout << "computing output pattern of " << qPrintable(name) << endl;
+
+  // in case of inputPattern not created, do it
+  if (lengthIP <= 0) {
+
+    cout << "Strange case: input pattern is not created while it is time to compute output pattern !" << endl;
+    // collect the input patterns for each input
+    try {
+      createInputPattern();
     }
+    catch(Exception e) {
+      throw(e);
+    }
+    cout << "input pattern array initialized with min. len " << lengthIP << endl;
   }
-  else {
-    cout << "computing output pattern of " << qPrintable(name) << endl;
-    
-    // in case of inputPattern not created, do it
-    if (lengthIP <= 0) {
 
-      cout << "Strange case: input pattern is not created while it is time to compute output pattern !" << endl;
-      // collect the input patterns for each input    
-      try {
-        createInputPattern();
-      }
-      catch(Exception e) {
-        throw(e);
+  // initialize the output pattern
+  lengthOP = 0;
+  foreach(AbstractInterface* iface, getControlOutputs()) {
+    FunctionalInterface* connIface = AI_TO_FUN(iface);
+    lengthOP = lengthIP+productionPattern.value(connIface)->size();
+    QList<char>* pattern = new QList<char>();
+    for(int i=0;i<lengthOP;i++) pattern->append(0);
+    connIface->setOutputPattern(pattern);
+    outputPattern.insert(connIface,pattern);
+  }
+  cout << "output pattern array initialized" << endl;
+
+  int clock = 0;
+  nbExec = 0;
+  // search for the beginning of the first execution.
+  while ((clock < lengthIP) && (! isValidDataGroup(inputPattern,clock))) clock++;
+  cout << "found 1st exec clock: " << clock << endl;
+
+  while (clock < lengthIP) {
+    // initialize counters for current execution.
+    int p = 0; // index in production pattern
+    int o = 0; // clock+o will give the clock cycle of each output group
+    int cip = 0; // clock+cip give the clock cycle of an input group
+    int ccp = 0; // ccp give a column in the consumptio pattern
+    int nip = 0; // number of input data groups already consumed during the current execution, used while exploring IP
+    int ncp = 0; // number of input data groups already consumed during the current execution, used while exploring CP
+    bool cannotCompleteExec = false;
+    for(int m=0;m<productionCounter.size();m++) {
+      // search for the first production in PP
+      while (!isValidDataGroup(productionPattern,p)) {
+        p += 1;
+        o += 1;
       }
-      cout << "input pattern array initialized with min. len " << lengthIP << endl;
-    }
-    
-    // initialize the output pattern    
-    lengthOP = 0;
-    foreach(AbstractInterface* iface, getControlOutputs()) {
-      FunctionalInterface* connIface = AI_TO_FUN(iface);      
-      lengthOP = lengthIP+productionPattern.value(connIface)->size();
-      QList<char>* pattern = new QList<char>();
-      for(int i=0;i<lengthOP;i++) pattern->append(0);
-      connIface->setOutputPattern(pattern);
-      outputPattern.insert(connIface,pattern);
-    }
-    cout << "output pattern array initialized" << endl;
-    
-    int clock = 0;
-    nbExec = 0;
-    // search for the beginning of the first execution.
-    while ((clock < lengthIP) && (! isValidDataGroup(inputPattern,clock))) clock++;
-    cout << "found 1st exec clock: " << clock << endl;
-    
-    while (clock < lengthIP) {
-      // initialize counters for current execution.
-      int p = 0; // index in production pattern
-      int o = 0; // clock+o will give the clock cycle of each output group
-      int cip = 0; // clock+cip give the clock cycle of an input group
-      int ccp = 0; // ccp give a column in the consumptio pattern
-      int nip = 0; // number of input data groups already consumed during the current execution, used while exploring IP
-      int ncp = 0; // number of input data groups already consumed during the current execution, used while exploring CP
-      bool cannotCompleteExec = false;
-      for(int m=0;m<productionCounter.size();m++) {
-        // search for the first production in PP
-        while (!isValidDataGroup(productionPattern,p)) {
-          p += 1;
-          o += 1;
+      int gap = 0; // count the number of extra null columns
+      // search for PC(m) valid input group in IP
+      while (nip < productionCounter.at(m)) {
+        if (clock+cip < lengthIP) {
+          if (isValidDataGroup(inputPattern,clock+cip)) nip += 1;
+          cip += 1;
+          gap += 1;
         }
-        int gap = 0; // count the number of extra null columns
-        // search for PC(m) valid input group in IP
-        while (nip < productionCounter.at(m)) {
-          if (clock+cip < lengthIP) {
-            if (isValidDataGroup(inputPattern,clock+cip)) nip += 1;
-            cip += 1;
-            gap += 1;
-          }
-          else {
-            cannotCompleteExec = true;
-            break;
-          }        
-        }        
-        
-        if (cannotCompleteExec) break; // no need to go further since the next search of input data group will lead to go outside inputPattern
-        
-        // search for PC(m) valid input group in IP
-        while (ncp < productionCounter.at(m)) {
-          if (isValidDataGroup(consumptionPattern,ccp)) ncp += 1;
-          ccp += 1;
-          gap -= 1;
+        else {
+          cannotCompleteExec = true;
+          break;
         }
-        o += gap; // to take into acocunt of extra null columns
-        combinePatterns(productionPattern,p,outputPattern,clock+o);
-        p += 1;
-        o += 1;
       }
-      
+
       if (cannotCompleteExec) break; // no need to go further since the next search of input data group will lead to go outside inputPattern
-      
-      // current exec. taken into accunt
-      nbExec += 1;
-      
-      // search for the next exec.
-      clock += 1;      
-      nip = 0;
-      while ((clock < lengthIP) && (nip < delta)) {
-        if (isValidDataGroup(inputPattern,clock)) nip += 1;
-        if (nip < delta) clock += 1;
+
+      // search for PC(m) valid input group in IP
+      while (ncp < productionCounter.at(m)) {
+        if (isValidDataGroup(consumptionPattern,ccp)) ncp += 1;
+        ccp += 1;
+        gap -= 1;
       }
-      cout << "found exec " << nbExec << " at clock: " << clock << endl;
+      o += gap; // to take into acocunt of extra null columns
+      combinePatterns(productionPattern,p,outputPattern,clock+o);
+      p += 1;
+      o += 1;
     }
-    // find the last valid output data group
-    while(! isValidDataGroup(outputPattern,lengthOP-1)) {
-      removeDataGroup(outputPattern,lengthOP-1);
-      lengthOP -= 1;
+
+    if (cannotCompleteExec) break; // no need to go further since the next search of input data group will lead to go outside inputPattern
+
+    // current exec. taken into accunt
+    nbExec += 1;
+
+    // search for the next exec.
+    clock += 1;
+    nip = 0;
+    while ((clock < lengthIP) && (nip < delta)) {
+      if (isValidDataGroup(inputPattern,clock)) nip += 1;
+      if (nip < delta) clock += 1;
     }
+    cout << "found exec " << nbExec << " at clock: " << clock << endl;
+  }
+  // find the last valid output data group
+  while(! isValidDataGroup(outputPattern,lengthOP-1)) {
+    removeDataGroup(outputPattern,lengthOP-1);
+    lengthOP -= 1;
+  }
+
+  // clear input pattern
+  clearInputPattern();
+
+  setOutputPatternComputed(true);
 
-    // clear input pattern
-    clearInputPattern();
-  }  
 }
 
 /*