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

Private GIT Repository
b6ac65f1ee869f3f23c1ecec6ff68bd95b611895
[blast.git] / FunctionalBlock.h
1 #ifndef __FUNCTIONALBLOCK_H__\r
2 #define __FUNCTIONALBLOCK_H__\r
3 \r
4 #include <iostream>\r
5 \r
6 #include <QtCore>\r
7 \r
8 #include "AbstractBlock.h"\r
9 class AbstractBlock;\r
10 class ReferenceBlock;\r
11 class GroupBlock;\r
12 #include "Exception.h"\r
13 class Exception;\r
14 class BlockImplementation;\r
15 class ArithmeticEvaluator;\r
16     \r
17 \r
18 \r
19 using namespace std;\r
20 using namespace Qt;\r
21 \r
22 /* NOTES :\r
23    - NEVER forget to call populate() after creating an instance of GraphBlock.\r
24  */\r
25 \r
26 class FunctionalBlock : public AbstractBlock {\r
27 public:\r
28 \r
29   FunctionalBlock(GroupBlock* _parent, ReferenceBlock* _reference) throw(Exception);\r
30 \r
31   // getters\r
32   inline ReferenceBlock* getReference() { return reference; }\r
33   inline QList<int> getProductionCounter() { return productionCounter; }\r
34   inline int getDelta() { return delta; }\r
35   \r
36   // setters\r
37   inline void setImplementation(BlockImplementation* impl) { implementation = impl; }\r
38   inline void setProductionCounter(QList<int> pattern) { productionCounter = pattern; }\r
39   inline void setDelta(int _delta) { delta = _delta; }\r
40   \r
41 \r
42   // testers\r
43   bool isFunctionalBlock();\r
44   bool isSourceBlock(); //! a source block has no parent and has no data inputs\r
45 \r
46   // others\r
47 \r
48   void populate(); // create parameters and interface from reference block\r
49   void parametersValidation(QList<AbstractBlock *> *checkedBlocks, QList<AbstractBlock*>* blocksToConfigure);\r
50 \r
51   QString getReferenceXmlFile();\r
52   QString getReferenceHashMd5();\r
53   \r
54   // patterns\r
55   bool createPatterns();\r
56   bool createDelta();\r
57   bool createConsumptionPattern(); // initialize a QList<char> for each interface from patterns defined in implementation\r
58   bool createProductionPattern(); // initialize a QList<char> for each interface from patterns defined in implementation\r
59   bool createProductionCounter(); // initialize a QList<int> from counter defined in implementation\r
60   void initConsumptionPattern(); // initialize a char** from patterns defined for each interface\r
61   void initProductionPattern(); // initialize a char** from patterns defined for each interface\r
62   void clearConsumptionPattern();\r
63   void clearProductionPattern();\r
64   bool computeOutputPattern(int nbExec = -1);\r
65   \r
66 private:  \r
67   // patterns  \r
68   bool isValidDataGroup(char** pattern, int nbPorts, int clock);\r
69   double evaluateExpression(const QString& expression, bool* ok);\r
70   QList<char> expandPattern(const QString& pattern, bool* ok);\r
71   QList<char> expandPatternRecur(const QString& pattern, int* offset, bool* ok);\r
72   /*!\r
73    * \brief combinePatterns\r
74    * \param patternSrc the pattern that must be combined with patternDest (patternDest = patternDest OR patternSrc)  \r
75    * \param srcCol the column index within patternSrc\r
76    * \param patternDest the pattern that is modified by the combination (patternDest = patternDest OR patternSrc)\r
77    * \param destClock the column index within patternDest\r
78    * \param nbCols the numer of columns to combine\r
79    * \param nbPorts the number of rows in both patterns\r
80    * BEWARE: no check is done if nbCols is consistent with the real length of both patterns, thus an access outside\r
81    * the patterns is possible.\r
82    */\r
83   void combinePatterns(char** patternSrc, int srcCol, char** patternDest, int destCol, int nbCols, int nbPorts );\r
84 \r
85   QList<int> productionCounter; //! only usefull for output interfaces\r
86   int delta;\r
87   \r
88   char** consumptionPattern;\r
89   int nbConsumingPorts;\r
90   int lengthCP;\r
91   char** productionPattern;\r
92   int nbProducingPorts;\r
93   int lengthPP;\r
94   ArithmeticEvaluator* evaluator;\r
95   \r
96   ReferenceBlock* reference;\r
97   BlockImplementation* implementation;\r
98 \r
99 };\r
100 \r
101 #endif // __FUNCTIONALBLOCK_H__\r