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

Private GIT Repository
modifying pattern methods to throw exceptions
authordomas stephane <sdomas@info-s2-01.iut-bm.univ-fcomte.fr>
Mon, 22 May 2017 17:37:09 +0000 (19:37 +0200)
committerdomas stephane <sdomas@info-s2-01.iut-bm.univ-fcomte.fr>
Mon, 22 May 2017 17:37:09 +0000 (19:37 +0200)
12 files changed:
AbstractBlock.h
Exception.cpp
Exception.h
FunctionalBlock.cpp
FunctionalBlock.h
Graph.cpp
Graph.h
GroupBlock.cpp
GroupBlock.h
ReferenceBlock.cpp
ReferenceBlock.h
blast.creator.user

index aee8c99766ae2256175662dbba913f1734d25382..2bb2717f969767ec4a6cce4e42f1b5b2727317d1 100644 (file)
@@ -70,8 +70,8 @@ public:
   BlockParameter* getParameterFromName(QString name);\r
 \r
   // patterns\r
-  virtual bool checkInputPatternCompatibility() = 0;\r
-  virtual bool computeOutputPattern(int nbExec = -1) = 0;\r
+  virtual void checkInputPatternCompatibility() throw(Exception) = 0;\r
+  virtual void computeOutputPattern(int nbExec = -1) throw(Exception) = 0;\r
   \r
 protected:\r
 \r
index 9093e4905dae4f94edb4fecbee976c11ed9685c7..a051e7ac7f07f713bc5a63f58b11adf719705903 100644 (file)
@@ -34,6 +34,21 @@ QString Exception::getDefaultMessage() {
   case BLOCKITEM_INVALID_TYPE : ret = tr("A parameter of type AbstractBlockItem* is used with an incorrect instance type."); break;
   case WIDTHS_NOT_EQUALS : ret = tr("Two interfaces are connected but don't have the same widths."); break;
   case INVALID_VALUE : ret = tr("parameter value is not correct (e.g. not numeric, invalid other parameter name, ...)."); break;
+  case INVALID_REFBLOCK_USE : ret = tr("a reference block is used during pattern computations"); break;
+  case INVALID_DELTA_CP : ret = tr("delta and CP are not consistent"); break;
+  case EVAL_PARAM_UNKNOWN : ret = tr("a variable used in an expression is not defined as a block parameter"); break;
+  case EVAL_PARAM_NOVALUE : ret = tr("can't get the double value of a block parameter"); break;
+  case EVAL_INVALID_EXPR : ret = tr("invalid arithmetic expression (in a block parameter/pattern)"); break;    
+  case INVALID_IFACE_PATTERN : ret = tr("the pattern of an interface is invalid (not correct grammar)"); break;
+  case INVALID_IFACE_PC : ret = tr("the production counter of an interface is invalid (not correct grammar)"); break;    
+  case INVALID_IFACE_CP_LENGTH : ret = tr("the size of CP for an interface differs from others"); break;
+  case NO_IFACE_CP : ret = tr("an interface has no CP defined in reference block"); break;    
+  case INVALID_IFACE_PP_LENGTH : ret = tr("the size of PP for an interface differs from others"); break;
+  case NO_IFACE_PP : ret = tr("an interface has no PP defined in reference block"); break;    
+  case NO_IFACE_IP : ret = tr("an interface has no IP"); break;
+  case IP_AP_NOTCOMPAT : ret = tr("IP and AP not compatible"); break;
+  case IP_END_NULLCOL : ret = tr("IP ends with anull column (normally not possible during compat. check)"); break;
+  case AP_TOO_SHORT : ret = tr("AP has been badly computed, leading to a AP shorter than needed (NB: it is an abnormal case)"); break;
   }
 
   return ret;
index c65ed5a0e3915b474acbda99a3365c9610d5774e..3972d4ea302f0fd60c1913114273464cbd0160b4 100644 (file)
@@ -58,6 +58,29 @@ supp. infos : saved in UTF-8 [éè]
 // exceptions for VHDL generation
 #define INVALID_VALUE 5001
 
+// exception for patterns
+#define INVALID_REFBLOCK_USE 10001
+#define INVALID_DELTA_CP 10002 // delta and CP are not consistent (NB: used during admittance computation)
+
+#define EVAL_PARAM_UNKNOWN 10101 // a variable used in an expression is not defined as a block parameter
+#define EVAL_PARAM_NOVALUE 10102 // can't get the double value of a block parameter
+#define EVAL_INVALID_EXPR 10103 // invalid arithmetic expression (in a block parameter/pattern)
+
+#define INVALID_IFACE_PATTERN 10201 // the pattern of an interface is invalid (not correct grammar)
+#define INVALID_IFACE_PC 10202 // the production counter of an interface is invalid (not correct grammar)
+
+#define INVALID_IFACE_CP_LENGTH 10301 // the size of CP for an interface differs from others
+#define NO_IFACE_CP 10302 // an interface has no CP defined in reference block
+
+#define INVALID_IFACE_PP_LENGTH 10401 // the size of PP for an interface differs from others
+#define NO_IFACE_PP 10402 // an interface has no PP defined in reference block
+
+#define NO_IFACE_IP 10501 // an interface has no IP
+#define IP_AP_NOTCOMPAT 10502 // IP and AP not compatible
+#define IP_END_NULLCOL 10503 // IP ends with anull column (normally not possible during compat. check)
+#define AP_TOO_SHORT 10504 // AP has been badly computed, leading to a AP shorter than needed (NB: it is an abnormal case)
+
+
 using namespace std;
 using namespace Qt;
 
index 7a4d4ff8fa332d391e05e8f03c6e7349ae7de387..e7239e09c01e8bf999f1665e96ae78d3488ae476 100644 (file)
@@ -28,8 +28,12 @@ FunctionalBlock::FunctionalBlock(GroupBlock *_parent, ReferenceBlock *_reference
   lengthOP = -1;\r
   lengthPP = -1;\r
   delta = -1;\r
+  evaluator = NULL;\r
 }\r
 \r
+FunctionalBlock::~FunctionalBlock() {\r
+  if (evaluator != NULL) delete evaluator;\r
+}\r
 \r
 void FunctionalBlock::parametersValidation(QList<AbstractBlock*>* checkedBlocks, QList<AbstractBlock *> *blocksToConfigure) {\r
   /*\r
@@ -115,26 +119,34 @@ QString FunctionalBlock::getReferenceHashMd5() {
     return ((ReferenceBlock *)reference)->getHashMd5();\r
 }\r
 \r
-bool FunctionalBlock::createPatterns() {\r
+void FunctionalBlock::createPatterns() throw(Exception) {\r
   static QString fctName = "FunctionalBlock::createPatterns()";\r
 #ifdef DEBUG_FCTNAME\r
   cout << "call to " << qPrintable(fctName) << endl;\r
 #endif\r
   \r
   cout << "create patterns for block " << qPrintable(name) << endl;\r
-  evaluator = new ArithmeticEvaluator();\r
+  if (evaluator == NULL) evaluator = new ArithmeticEvaluator();\r
   bool ok = true;  \r
   if (! isGeneratorBlock()) {\r
-    ok = ok & createDelta();\r
-    if (ok) ok = ok & createConsumptionPattern();    \r
-    if (ok) ok = ok & createProductionCounter();\r
+    try {\r
+      createDelta();\r
+      createConsumptionPattern();    \r
+      createProductionCounter();\r
+    }\r
+    catch(Exception e) {\r
+      throw(e); // rethrow e\r
+    }\r
   }\r
-  if (ok) ok = ok & createProductionPattern();\r
-  delete evaluator;\r
-  return ok;\r
+  try {\r
+    createProductionPattern();\r
+  }\r
+  catch(Exception e) {\r
+    throw(e);\r
+  }  \r
 }\r
 \r
-bool FunctionalBlock::createDelta() {\r
+void FunctionalBlock::createDelta() throw(Exception) {\r
   static QString fctName = "FunctionalBlock::createDelta()";\r
 #ifdef DEBUG_FCTNAME\r
   cout << "call to " << qPrintable(fctName) << endl;\r
@@ -144,21 +156,23 @@ bool FunctionalBlock::createDelta() {
   cout << "delta for " << qPrintable(name) << " = " << qPrintable(deltaStr) << endl;\r
   if (deltaStr.isEmpty()) {\r
     delta = -1;\r
-    return true;\r
+    return;\r
   }\r
   \r
   // look for parameter names\r
   bool ok = true;\r
-  double result = evaluateExpression(deltaStr, &ok);\r
-  if (!ok) return false;\r
-  \r
+  double result = 0;\r
+  try {\r
+    result = evaluateExpression(deltaStr);\r
+  }\r
+  catch(Exception e) {\r
+    throw(e);\r
+  }\r
   delta = result;\r
   cout << "delta = " << delta << endl;\r
-   \r
-  return true;\r
 }\r
 \r
-bool FunctionalBlock::createConsumptionPattern() {\r
+void FunctionalBlock::createConsumptionPattern()  throw(Exception) {\r
   static QString fctName = "FunctionalBlock::createConsumptionPattern()";\r
 #ifdef DEBUG_FCTNAME\r
   cout << "call to " << qPrintable(fctName) << endl;\r
@@ -172,53 +186,63 @@ bool FunctionalBlock::createConsumptionPattern() {
     FunctionalInterface* connIface = AI_TO_FUN(iface);\r
     QString refName = connIface->getReference()->getName();    \r
     if (! consPattern.contains(refName)) {\r
+      throw(Exception(NO_IFACE_CP));\r
       cerr << "no consumption pattern for reference interface " << qPrintable(refName) << endl;\r
-      return false;\r
     }\r
-    QList<char>* pattern = expandPattern(consPattern.value(refName),&ok);        \r
-    if (!ok) return false;\r
+    QList<char>* pattern = NULL;\r
+    try {\r
+      pattern = expandPattern(consPattern.value(refName));\r
+    }\r
+    catch(Exception e) {\r
+      throw(e);\r
+    }\r
     consumptionPattern.insert(connIface,pattern);\r
     if (lengthCP == -1) {\r
       lengthCP = pattern->size();\r
     }\r
     else {\r
-      if (pattern->size() != lengthCP) return false;\r
+      if (pattern->size() != lengthCP) {\r
+        throw(Exception(INVALID_IFACE_CP_LENGTH));\r
+      }\r
     }\r
-  }        \r
-  return true;\r
+  }          \r
 }\r
 \r
-bool FunctionalBlock::createProductionPattern() {  \r
+void FunctionalBlock::createProductionPattern() throw(Exception){  \r
   static QString fctName = "FunctionalBlock::createProductionPattern()";\r
 #ifdef DEBUG_FCTNAME\r
   cout << "call to " << qPrintable(fctName) << endl;\r
 #endif\r
   \r
-  lengthPP = -1;\r
-  bool ok = true; \r
+  lengthPP = -1;  \r
   QHash<QString,QString> prodPattern = implementation->getProductionPattern();  \r
   \r
   foreach(AbstractInterface* iface, getControlOutputs()) {    \r
     FunctionalInterface* connIface = AI_TO_FUN(iface);\r
     QString refName = connIface->getReference()->getName();    \r
     if (! prodPattern.contains(refName)) {\r
-      cerr << "no production pattern for reference interface " << qPrintable(refName) << endl;\r
-      return false;\r
+      throw(Exception(NO_IFACE_PP));      \r
+    }\r
+    QList<char>* pattern = NULL;\r
+    try {\r
+      pattern = expandPattern(prodPattern.value(refName));\r
+    }\r
+    catch(Exception e) {\r
+      throw(e);\r
     }\r
-    QList<char>* pattern = expandPattern(prodPattern.value(refName),&ok);\r
-    if (!ok) return false;\r
     productionPattern.insert(connIface,pattern);\r
     if (lengthPP == -1) {\r
       lengthPP = pattern->size();\r
     }\r
     else {\r
-      if (pattern->size() != lengthPP) return false;\r
+      if (pattern->size() != lengthPP) {\r
+        throw(Exception(INVALID_IFACE_PP_LENGTH));\r
+      }\r
     }\r
-  }    \r
-  return true;\r
+  }      \r
 }\r
 \r
-bool FunctionalBlock::createProductionCounter() {\r
+void FunctionalBlock::createProductionCounter() throw(Exception) {\r
   static QString fctName = "FunctionalBlock::createProductionCounter()";\r
 #ifdef DEBUG_FCTNAME\r
   cout << "call to " << qPrintable(fctName) << endl;\r
@@ -236,14 +260,20 @@ bool FunctionalBlock::createProductionCounter() {
       s.remove(0,1);\r
       s.chop(1);\r
       QStringList gen = s.split(":");\r
-      if (gen.size() != 3) return false;\r
+      if (gen.size() != 3) {\r
+        throw(Exception(INVALID_IFACE_PC));\r
+      }\r
       int start = 0;\r
       int nb = 0;\r
       int step = 0;\r
-      for(int i=0;i<3;i++) {\r
-        bool okVal;\r
-        double result = evaluateExpression(gen.at(i),&okVal);\r
-        if (!okVal) return false;\r
+      for(int i=0;i<3;i++) {        \r
+        double result = 0.0;\r
+        try {\r
+          result = evaluateExpression(gen.at(i));\r
+        }\r
+        catch(Exception e) {\r
+          throw(e);\r
+        }\r
         if (i==0) start = result;\r
         else if (i==1) nb = result;\r
         else if (i==2) step = result;\r
@@ -252,11 +282,14 @@ bool FunctionalBlock::createProductionCounter() {
         productionCounter.append(start+j*step);\r
       }\r
     }\r
-    else {\r
-      bool okVal;\r
-      double result = evaluateExpression(s,&okVal);\r
-      \r
-      if (!okVal) return false;\r
+    else {      \r
+      double result = 0.0;\r
+      try {\r
+        result = evaluateExpression(s);\r
+      }\r
+      catch(Exception e) {\r
+        throw(e);\r
+      }\r
       productionCounter.append(result);      \r
     }\r
   }\r
@@ -264,11 +297,9 @@ bool FunctionalBlock::createProductionCounter() {
     cout << val << ",";\r
   }\r
   cout << endl;\r
-  \r
-  return true;\r
 }\r
 \r
-QList<char>* FunctionalBlock::expandPattern(const QString& patternIn, bool* ok) {\r
+QList<char>* FunctionalBlock::expandPattern(const QString& patternIn) throw(Exception) {\r
   static QString fctName = "FunctionalBlock::expandPattern()";\r
 #ifdef DEBUG_FCTNAME\r
   cout << "call to " << qPrintable(fctName) << endl;\r
@@ -277,22 +308,30 @@ QList<char>* FunctionalBlock::expandPattern(const QString& patternIn, bool* ok)
   QList<char> lst;\r
   QString  p = patternIn;\r
   p.append(')');\r
-  int offset = 0;\r
+  int offset = 0;  \r
   QList<char>* patternOut = new QList<char>();\r
-  expandPatternRecur(p,&offset,ok,patternOut);   \r
+  try {\r
+    expandPatternRecur(p,&offset, patternOut); \r
+  }\r
+  catch(Exception e) {\r
+    throw(e);\r
+  }\r
+\r
   return patternOut;\r
 }\r
 \r
-void FunctionalBlock::expandPatternRecur(const QString& patternIn, int *offset, bool *ok, QList<char>* patternOut) {  \r
+void FunctionalBlock::expandPatternRecur(const QString& patternIn, int *offset, QList<char>* patternOut) throw(Exception) {  \r
   \r
   while ((*offset < patternIn.size()) && (patternIn.at(*offset) != ')')) {\r
     \r
     QChar c = patternIn.at(*offset);\r
     if (c == '(') {\r
       *offset += 1;\r
-      expandPatternRecur(patternIn,offset, ok, patternOut);\r
-      if (!ok) {\r
-        return;\r
+      try {\r
+        expandPatternRecur(patternIn,offset, patternOut);\r
+      }\r
+      catch(Exception e) {\r
+        throw(e);\r
       }\r
     }\r
     else if (c == '0') {\r
@@ -312,13 +351,15 @@ void FunctionalBlock::expandPatternRecur(const QString& patternIn, int *offset,
         *offset += 1;\r
       }\r
       if (*offset == patternIn.size()) {\r
-        *ok = false;\r
-        return;\r
+        throw(Exception(INVALID_IFACE_PATTERN));\r
+      }\r
+      double repeat = 0;\r
+      try {\r
+        repeat = evaluateExpression(expr);\r
+      }\r
+      catch(Exception e) {\r
+        throw(e);\r
       }\r
-      double repeat = evaluateExpression(expr,ok);\r
-      if (!ok) {\r
-        return;      \r
-      }            \r
       // repeat just the last value in currentGroup\r
       char last = patternOut->last();      \r
       //cout << "repeat last char " << repeat << " times : " << (int)last << endl;\r
@@ -339,12 +380,14 @@ void FunctionalBlock::expandPatternRecur(const QString& patternIn, int *offset,
       *offset += 1;\r
     }\r
     if (*offset == patternIn.size()) {\r
-      *ok = false;\r
-      return;\r
+      throw(Exception(INVALID_IFACE_PATTERN));\r
     }\r
-    double repeat = evaluateExpression(expr,ok);\r
-    if (!ok) {\r
-      return;      \r
+    double repeat = 0;\r
+    try {\r
+      repeat = evaluateExpression(expr);\r
+    }\r
+    catch(Exception e) {\r
+      throw(e);\r
     }\r
     /*\r
     cout << "repeat last group " << repeat << " times : ";\r
@@ -355,18 +398,15 @@ void FunctionalBlock::expandPatternRecur(const QString& patternIn, int *offset,
     for(int i=1;i<(int)repeat;i++) {\r
       patternOut->append(single);\r
     }    \r
-  }\r
-  //*offset += 1;\r
-  return;\r
+  }  \r
 }\r
 \r
-double FunctionalBlock::evaluateExpression(const QString& expression, bool* ok) {\r
+double FunctionalBlock::evaluateExpression(const QString& expression) throw(Exception) {\r
   static QString fctName = "FunctionalBlock::evaluateExpression()";\r
 #ifdef DEBUG_FCTNAME\r
   cout << "call to " << qPrintable(fctName) << endl;\r
 #endif\r
-  \r
-  *ok = true;\r
+    \r
   QHash<QString,double> vars;\r
   evaluator->setExpression(expression);\r
   QList<QString> varNames = evaluator->getVariableNames();\r
@@ -375,34 +415,29 @@ double FunctionalBlock::evaluateExpression(const QString& expression, bool* ok)
     paramName.remove(0,1);\r
     BlockParameter* param = reference->getParameterFromName(paramName);    \r
     if (param == NULL) {\r
-      cerr << "found an unknown parameter in delta"<< endl;\r
-      *ok = false;\r
-      return 0.0;\r
+      throw(Exception(EVAL_PARAM_UNKNOWN));\r
     }\r
     bool okVal;\r
     int val = param->getDoubleValue(&okVal);\r
     if (!okVal) {\r
-      cerr << "cannot obtain double value of paramter " << qPrintable(paramName) << endl;\r
-      *ok = false;\r
-      return 0.0;\r
+      throw(Exception(EVAL_PARAM_NOVALUE));      \r
     }\r
     vars.insert(name,(double)val);    \r
   }\r
   \r
   evaluator->setVariablesValue(vars);\r
-  double result;\r
+  double result = 0.0;\r
   try {\r
     result = evaluator->evaluate();\r
   }\r
   catch(int index) {\r
     cerr << "Error at index " << index << ": " << qPrintable(evaluator->getError()) << endl;\r
-    *ok = false;\r
-    return 0.0;\r
+    throw(Exception(EVAL_INVALID_EXPR));\r
   }\r
   return result;\r
 }\r
 \r
-void FunctionalBlock::createInputPattern() {\r
+void FunctionalBlock::createInputPattern()  throw(Exception) {\r
   static QString fctName = "FunctionalBlock::createInputPattern())";\r
 #ifdef DEBUG_FCTNAME\r
   cout << "call to " << qPrintable(fctName) << endl;\r
@@ -412,33 +447,32 @@ void FunctionalBlock::createInputPattern() {
   foreach(AbstractInterface* iface, getControlInputs()) {      \r
     ConnectedInterface* connIface = AI_TO_CON(iface);\r
     QList<char>* out = connIface->getConnectedFrom()->getOutputPattern();\r
+    if (out->size() == 0) {\r
+      clearInputPattern();\r
+      throw(Exception(NO_IFACE_IP));\r
+    }\r
     if (lengthIP == -1) {\r
       lengthIP = out->size();\r
     }\r
     else {\r
       if (out->size() < lengthIP) lengthIP = out->size();\r
     }\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
+    QList<char>* in = new QList<char>(*out);\r
+    foreach(char c, *in) {\r
+      cout << (int)c;\r
     }\r
-    else {\r
-      inputPattern.insert(connIface,NULL);\r
-    }      \r
+    cout << endl;    \r
+    inputPattern.insert(connIface,in);    \r
   }\r
-  // remove null columns at the end of IP\r
+  // search the last valid group in IP,\r
   while(! isValidDataGroup(inputPattern,lengthIP-1)) {\r
-    removeDataGroup(inputPattern,lengthIP-1);\r
+    //removeDataGroup(inputPattern,lengthIP-1);\r
     lengthIP -= 1;\r
   }\r
 }\r
 \r
-bool FunctionalBlock::createAdmittance(int nbExec) {\r
+void FunctionalBlock::createAdmittance(int nbExec) throw(Exception) {\r
   static QString fctName = "FunctionalBlock::createAdmittance()";\r
 #ifdef DEBUG_FCTNAME\r
   cout << "call to " << qPrintable(fctName) << endl;\r
@@ -497,8 +531,7 @@ bool FunctionalBlock::createAdmittance(int nbExec) {
         j -= 1;\r
       }\r
       else {\r
-        cout << "AP and CP are not consistent" << endl;\r
-        return false;\r
+        throw(INVALID_DELTA_CP);        \r
       }\r
     }\r
   }\r
@@ -512,11 +545,10 @@ bool FunctionalBlock::createAdmittance(int nbExec) {
       cout << (int)(pattern->at(i));\r
     }\r
     cout << endl;\r
-  }\r
-  return true;\r
+  }  \r
 }\r
 \r
-bool FunctionalBlock::checkInputPatternCompatibility() {\r
+void FunctionalBlock::checkInputPatternCompatibility() throw(Exception) {\r
   static QString fctName = "FunctionalBlock::checkInputPatternCompatibility()";\r
 #ifdef DEBUG_FCTNAME\r
   cout << "call to " << qPrintable(fctName) << endl;\r
@@ -524,20 +556,21 @@ bool FunctionalBlock::checkInputPatternCompatibility() {
   \r
   bool ok = true;\r
   // firstly, create input pattern\r
-  createInputPattern();      \r
-  // if some patterns are not available, end now, returning false\r
-  if (lengthIP == 0) {\r
-    clearInputPattern();\r
-    return false;\r
+  try {\r
+    createInputPattern();\r
+  }\r
+  catch(Exception e) {\r
+    throw(e);\r
   }\r
-  int nbExec = getNumberOfExecution();\r
+  int nbExec = createTriggers();\r
   cout << qPrintable(name) << " will exec. " << nbExec << " times." << endl;\r
   \r
-  ok = createAdmittance(nbExec);\r
-  \r
-  if (!ok) {\r
+  try {\r
+    createAdmittance(nbExec);\r
+  }\r
+  catch(Exception e) {\r
     cout << "cannot create admittance" << endl;\r
-    return false;\r
+    throw(e);\r
   }\r
   \r
   int clock = 0; // index in IP  \r
@@ -549,7 +582,7 @@ bool FunctionalBlock::checkInputPatternCompatibility() {
       while ((clock < lengthIP) && (! isValidDataGroup(inputPattern,clock))) clock++;\r
       if (clock == lengthIP) {\r
         cerr << "Abnormal case: end of IP has been reached without finding a valid group" << endl;\r
-        return false;\r
+        throw(Exception(IP_END_NULLCOL));        \r
       }\r
     }    \r
     /* at that point 2 cases of compat : IP(clock) and AP(i) are equal valid group, or\r
@@ -557,19 +590,18 @@ bool FunctionalBlock::checkInputPatternCompatibility() {
     */\r
     if (! samePatterns(inputPattern,clock,admittance,i)) {\r
       cout << "AP(" << i << ") and IP(" << clock << ") are not equal" << endl;\r
-      return false;\r
+      throw(Exception(IP_AP_NOTCOMPAT)); // IP and AP not compatible\r
     }\r
     clock++;\r
     i++;\r
   }\r
   if (clock < lengthIP) {\r
-    cerr << "Abnormal case: AP is to short" << endl;\r
-    return false;\r
-  }\r
-  return true;\r
+    throw(Exception(AP_TOO_SHORT));\r
+    cerr << "Abnormal case: AP is to short" << endl;   \r
+  }  \r
 }\r
 \r
-bool FunctionalBlock::computeOutputPattern(int nbExec) {\r
+void FunctionalBlock::computeOutputPattern(int nbExec) throw(Exception) {\r
   static QString fctName = "FunctionalBlock::computeOutputPattern()";\r
 #ifdef DEBUG_FCTNAME\r
   cout << "call to " << qPrintable(fctName) << endl;\r
@@ -600,11 +632,11 @@ bool FunctionalBlock::computeOutputPattern(int nbExec) {
     // in case of inputPattern not created, do it\r
     if (lengthIP <= 0) {\r
       // collect the input patterns for each input    \r
-      createInputPattern();    \r
-      // if some patterns are not available, end now, returning false\r
-      if (lengthIP == 0) {\r
-        clearInputPattern();\r
-        return false;\r
+      try {\r
+        createInputPattern();\r
+      }\r
+      catch(Exception e) {\r
+        throw(e);\r
       }\r
       cout << "input pattern array initialized with min. len " << lengthIP << endl;\r
     }\r
@@ -692,8 +724,7 @@ bool FunctionalBlock::computeOutputPattern(int nbExec) {
 \r
     // clear input pattern\r
     clearInputPattern();\r
-  }\r
-  return true;\r
+  }  \r
 }\r
 \r
 bool FunctionalBlock::samePatterns(const QMap<AbstractInterface*, QList<char>* >& patternSrc, int srcCol, const QMap<AbstractInterface*, QList<char>* >& patternDest, int destCol) {\r
@@ -842,24 +873,24 @@ void FunctionalBlock::clearInputPattern() {
   lengthIP = -1;\r
 }\r
 \r
-int FunctionalBlock::getNumberOfExecution() {\r
+int FunctionalBlock::createTriggers() {\r
+  triggers.clear();\r
   /* NB: this method returns the number of executions that have been started\r
      but not necessary completed.\r
   */\r
-  if (delta <= 0) return 0;\r
-  int nbExec = 0;\r
+  if (delta <= 0) return 0;  \r
   int offset = 0;\r
   // search for the first exec.\r
   while ((offset < lengthIP) && (! isValidDataGroup(inputPattern,offset))) offset++;\r
   if (offset == lengthIP) return 0;\r
-  nbExec = 1;\r
+  triggers.append(offset);  \r
   int nbGroup = 0;\r
   for(int i = offset;i<lengthIP;i++) {\r
     if (isValidDataGroup(inputPattern,i)) nbGroup++;\r
     if (nbGroup == delta+1) {\r
-      nbExec += 1;\r
+      triggers.append(i);\r
       nbGroup = 1;\r
     }\r
   }      \r
-  return nbExec;  \r
+  return triggers.size();\r
 }\r
index f27bef640f5b78efcf0591910a9612f78a1c80a2..440c1543bd0f3bc7a454ea7148f1bfa09ab0284e 100644 (file)
@@ -27,7 +27,7 @@ class FunctionalBlock : public AbstractBlock {
 public:\r
 \r
   FunctionalBlock(GroupBlock* _parent, ReferenceBlock* _reference) throw(Exception);\r
-\r
+  ~FunctionalBlock();\r
   // getters\r
   inline ReferenceBlock* getReference() { return reference; }\r
   inline QList<int> getProductionCounter() { return productionCounter; }\r
@@ -56,26 +56,26 @@ public:
   QString getReferenceHashMd5();\r
   \r
   // patterns\r
-  bool createPatterns(); // called in Graph, before checking compatibility and computing output pattern\r
-  bool checkInputPatternCompatibility();\r
-  bool computeOutputPattern(int nbExec = -1);\r
+  void createPatterns() throw(Exception); // called in Graph, before checking compatibility and computing output pattern\r
+  void checkInputPatternCompatibility() throw(Exception);\r
+  void computeOutputPattern(int nbExec = -1) throw(Exception);\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 createProductionCounter(); // initialize a QList<int> from counter defined in implementation\r
-  bool createAdmittance(int nbExec); // initialize a QList<char> from consumption pattern and delta\r
+  void createDelta() throw(Exception);\r
+  void createConsumptionPattern() throw(Exception); // initialize a QList<char> for each interface from patterns defined in implementation\r
+  void createProductionPattern() throw(Exception); // initialize a QList<char> for each interface from patterns defined in implementation\r
+  void createProductionCounter() throw(Exception); // initialize a QList<int> from counter defined in implementation\r
+  void createAdmittance(int nbExec) throw(Exception); // initialize a QList<char> from consumption pattern and delta\r
   void clearConsumptionPattern();\r
   void clearProductionPattern();\r
-  void createInputPattern();\r
+  void createInputPattern() throw(Exception);\r
   void clearInputPattern();\r
-  int getNumberOfExecution(); // compute number of block execution from inputPattern and delta\r
+  int createTriggers(); // compute the clock cycle at which the block is triggered\r
   \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) throw(Exception);\r
+  QList<char>* expandPattern(const QString& patternIn) throw(Exception);\r
+  void expandPatternRecur(const QString& patternIn, int* offset, QList<char> *patternOut)  throw(Exception);\r
   /*!\r
    * \brief samePatterns\r
    * \param patternSrc the pattern that must be tested with patternDest (is patternDest == patternDest)  \r
@@ -151,7 +151,8 @@ private:
   QMap<AbstractInterface*, QList<char>* > productionPattern;\r
   QMap<AbstractInterface*,QList<char>* > inputPattern;\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
+  QList<int> productionCounter; // only usefull for control output interfaces\r
+  QList<int> triggers; // the clock cycles at which the block is triggered, taking into account IP\r
   int lengthIP; // for convenience, set in createInputPattern()\r
   int lengthCP; // for convenience, set in createConsumptionPattern()\r
   int lengthAP; // for convenience, set in createAdmittance()\r
index eb66dc4e8ad8b7cc35cb76108b78c06f9b0738c4..0fb4fcb612933fff65265619655d45601adaacf5 100644 (file)
--- a/Graph.cpp
+++ b/Graph.cpp
@@ -2,6 +2,7 @@
 #include "GroupBlock.h"
 #include "ReferenceBlock.h"
 #include "FunctionalBlock.h"
+#include "Exception.h"
 
 Graph::Graph() {
   topGroup = new GroupBlock(NULL);
@@ -108,12 +109,16 @@ bool Graph::removeSourceBlock(FunctionalBlock *block) {
   return true;
 }
 
-bool Graph::createPatterns() {
+void Graph::createPatterns() throw(Exception) {
   bool ok = true;
   foreach(AbstractBlock* block, sources) {
     FunctionalBlock* funBlock = AB_TO_FUN(block);
-    ok = funBlock->createPatterns();
-    if (!ok) return false;
+    try {
+      funBlock->createPatterns();
+    }
+    catch(Exception e) {
+      throw(e);      
+    }
   }
   
   foreach(AbstractBlock* block, groups) {
@@ -121,12 +126,15 @@ bool Graph::createPatterns() {
     foreach(AbstractBlock* inBlock, group->getBlocks()) {
       if (inBlock->isFunctionalBlock()) {
         FunctionalBlock* funBlock = AB_TO_FUN(inBlock);
-        ok = funBlock->createPatterns();
-        if (!ok) return false;
+        try {
+          funBlock->createPatterns();
+        }
+        catch(Exception e) {
+          throw(e);
+        }
       }
     }
-  }
-  return true;
+  }  
 }
 
 void Graph::resetPatternComputed() {
@@ -144,7 +152,14 @@ void Graph::resetPatternComputed() {
 
 bool Graph::computeOutputPatterns(int nbExec) {
   
-  createPatterns();
+  try {
+    createPatterns();
+  }
+  catch(Exception e) {
+    cerr << qPrintable(e.getMessage()) << endl;
+    return false;
+  }
+
   resetPatternComputed();  
   // search for all block that are generators.
   QList<FunctionalBlock*> generators;
@@ -170,5 +185,11 @@ bool Graph::computeOutputPatterns(int nbExec) {
     block->computeOutputPattern((maxExecLen+d-1)/d);
   }
   // compute output for top group
-  topGroup->computeOutputPattern();
+  try {
+    topGroup->computeOutputPattern();
+  }
+  catch(Exception e) {
+    cerr << qPrintable(e.getMessage()) << endl;
+    return false;
+  }
 }
diff --git a/Graph.h b/Graph.h
index f3e9923ecacd6f391e86c4855c8b45f1266cedb9..03d188265d04efd771bcb56f2479a72bc8e3e8a6 100644 (file)
--- a/Graph.h
+++ b/Graph.h
@@ -10,7 +10,7 @@ class GroupBlock;
 class ReferenceBlock;
 class FunctionalBlock;
 class AbstractInterface;
-
+class Exception;
 using namespace std;
 using namespace Qt;
 
@@ -45,12 +45,12 @@ public:
   // others
   QList<AbstractInterface *> getOutsideInterfaces();
   /*!
-   * \brief initPatterns
-   * initPatterns() crosses the graph and for each functional block, it computes
+   * \brief createPatterns
+   * createPatterns() crosses the graph and for each functional block, it computes
    * the consumptionPattern, the productionPattern, the production counter and delta
    * using the parameters fo the block.
    */
-  bool createPatterns();
+  void createPatterns() throw(Exception);
   void resetPatternComputed();
   bool computeOutputPatterns(int nbExec);
   
index 1b307da2445350211fc6ad5f85b4cdf106144571..b6fc702d0f317701290434843331da6545b1eb22 100644 (file)
@@ -113,12 +113,10 @@ void GroupBlock::createInputPattern() {
   }  
 }
 
-bool GroupBlock::checkInputPatternCompatibility() {
-  return true;
+void GroupBlock::checkInputPatternCompatibility() throw(Exception){  
 }
 
-bool GroupBlock::computeOutputPattern(int nbExec) {
+void GroupBlock::computeOutputPattern(int nbExec) throw(Exception) {
 
   static QString fctName = "GroupBlock::computeOutputPattern()";
 #ifdef DEBUG_FCTNAME
@@ -166,16 +164,23 @@ bool GroupBlock::computeOutputPattern(int nbExec) {
     
     if (block->getPatternComputed()) continue; // block has already been processed
     
-    compatible = block->checkInputPatternCompatibility();
-    if (!compatible) {
+    try {
+      block->checkInputPatternCompatibility();
+    }
+    catch(Exception e) {
       cout << qPrintable(block->getName()) << " is not compatible with his input pattern" << endl;
-      break;
+      throw(e);
+    }
+    compatible = true;
+    
+    try {
+      block->computeOutputPattern();
     }
-    canCompute = block->computeOutputPattern();
-    if (!canCompute) {
+    catch(Exception e) {    
       cout << "cannot finalize output pattern computation of " << qPrintable(block->getName()) << endl;
-      break;
+      throw(e);      
     }
+    canCompute = true;
     block->setPatternComputed(true);
     // add other blocks connected from block to the fifo
     foreach(AbstractInterface* iface, block->getControlOutputs()) {
@@ -201,6 +206,5 @@ bool GroupBlock::computeOutputPattern(int nbExec) {
       connIface->setOutputPattern(pattern);    
     }
     setPatternComputed(true);
-  }
-  return canCompute;
+  }  
 }
index 27e43cc1fd6d45d1fc3e4ee32699643a21c2f812..b3aaeafbe50b3fecc9ec3bfbd4061ce42800cc8c 100644 (file)
@@ -42,8 +42,8 @@ public:
   // public attributes
   static int counter;
 
-  bool checkInputPatternCompatibility();
-  bool computeOutputPattern(int nbExec = -1);
+  void checkInputPatternCompatibility() throw(Exception);
+  void computeOutputPattern(int nbExec = -1) throw(Exception);
   
 private:    
   // patterns  
index 89bde3a402b65fc473df5412a21ba1c3df80e77b..a31db67b0f28c807c21b910f6cb979037f70876a 100644 (file)
@@ -567,11 +567,11 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) {
   return in;
 }
 
-bool ReferenceBlock::checkInputPatternCompatibility() {
-  return false;
+void ReferenceBlock::checkInputPatternCompatibility()  throw(Exception){
+  throw(Exception(INVALID_REFBLOCK_USE));
 }
 
-bool ReferenceBlock::computeOutputPattern(int nbExec) {
+void ReferenceBlock::computeOutputPattern(int nbExec)  throw(Exception) {
   // does strictly nothing
-  return false;
+  throw(Exception(INVALID_REFBLOCK_USE));  
 }
index 8212fcd5afb75117b840733d375d4dfb2bd5ff24..b1ebd84808940c4fcdc2656dfc11f7f19f8a952e 100644 (file)
@@ -68,8 +68,8 @@ public:
   
 private:
   // patterns
-  bool checkInputPatternCompatibility();
-  bool computeOutputPattern(int nbExec = -1);
+  void checkInputPatternCompatibility() throw(Exception);
+  void computeOutputPattern(int nbExec = -1) throw(Exception);
 };
 
 #endif // __REFERENCEBLOCK_H__
index fa2712558619547640eb5fbb72b822e29309824b..aea89f7f4be503ca892602614ce0102ab757f8f6 100755 (executable)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 3.2.1, 2017-05-22T11:04:55. -->
+<!-- Written by QtCreator 3.2.1, 2017-05-22T16:26:54. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>