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

Private GIT Repository
moved clocks list to graph
[blast.git] / SpecialBlock.cpp
1 #include "SpecialBlock.h"\r
2 #include "FunctionalInterface.h"\r
3 \r
4 SpecialBlock::SpecialBlock(int _type, GroupBlock* _parent, ReferenceBlock* _reference, bool createIfaces) throw(Exception) : FunctionalBlock(_parent, _reference, createIfaces) {\r
5   specialType = _type;\r
6 }\r
7 \r
8 SpecialBlock::~SpecialBlock() {\r
9 }\r
10 \r
11 bool SpecialBlock::isSpecialBlock() {\r
12   return true;\r
13 }\r
14 \r
15 void SpecialBlock::checkInputPatternCompatibility() throw(Exception) {\r
16   try {\r
17     switch(specialType) {\r
18     case Source :\r
19       checkInputPatternCompatibilitySource();\r
20       break;\r
21     case Sink :\r
22       checkInputPatternCompatibilitySink();\r
23       break;\r
24     case ClkConvert :\r
25       checkInputPatternCompatibilityClockConvert();\r
26       break;\r
27     default:\r
28       break;\r
29     }\r
30   }\r
31   catch(Exception e) {\r
32     throw (e);\r
33   }\r
34 }\r
35 \r
36 void SpecialBlock::computeOutputPattern(int nbExec) throw(Exception) {\r
37   try {\r
38     switch(specialType) {\r
39     case Source :\r
40       computeOutputPatternSource(nbExec);\r
41       break;\r
42     case Sink :\r
43       computeOutputPatternSink(nbExec);\r
44       break;\r
45     case ClkConvert :\r
46       computeOutputPatternClockConvert(nbExec);\r
47       break;    \r
48     default:\r
49       break;\r
50     }\r
51   }\r
52   catch(Exception e) {\r
53     throw (e);\r
54   }\r
55 }\r
56 \r
57 void SpecialBlock::checkInputPatternCompatibilitySource() throw(Exception) {\r
58 }\r
59 void SpecialBlock::computeOutputPatternSource(int nbExec) throw(Exception) {\r
60 \r
61   cout << "computing output pattern of " << qPrintable(name) << " for " << nbExec << " executions" << endl;\r
62   foreach(AbstractInterface* iface, getControlOutputs()) {\r
63     FunctionalInterface* connIface = AI_TO_FUN(iface);\r
64     // create output pattern\r
65     QList<char>* pp = productionPattern.value(connIface);\r
66     QList<char>* pattern = new QList<char>(*pp);\r
67     for(int i=1;i<nbExec;i++) pattern->append(*pp);\r
68     // assign pattern to interface\r
69     connIface->setOutputPattern(pattern);\r
70     // store it in QMap\r
71     outputPattern.insert(connIface,pattern);\r
72   }\r
73   setOutputPatternComputed(true);\r
74 }\r
75 \r
76 void SpecialBlock::checkInputPatternCompatibilitySink() throw(Exception) {\r
77 }\r
78 void SpecialBlock::computeOutputPatternSink(int nbExec) throw(Exception) {\r
79 }\r
80 \r
81 void SpecialBlock::checkInputPatternCompatibilityClockConvert() throw(Exception) {\r
82   static QString fctName = "SpecialBlock::checkInputPatternCompatibilityClockConvert()";\r
83 #ifdef DEBUG_FCTNAME\r
84   cout << "call to " << qPrintable(fctName) << endl;\r
85 #endif\r
86   // just create input pattern\r
87   try {\r
88     createInputPattern();\r
89   }\r
90   catch(Exception e) {\r
91     throw(e);\r
92   }\r
93 }\r
94 \r
95 void SpecialBlock::computeOutputPatternClockConvert(int nbExec) throw(Exception) {\r
96   static QString fctName = "SpecialBlock::computeOutputPatternClockConvert()";\r
97 #ifdef DEBUG_FCTNAME\r
98   cout << "call to " << qPrintable(fctName) << endl;\r
99 #endif\r
100   cout << "computing output pattern of " << qPrintable(name) << endl;\r
101 \r
102   /* CAUTION: it is assumed that all clock domain converters are using\r
103    * a clk_in and clk_out signals for input and output clocks.\r
104    */\r
105   AbstractInterface* clkIn = getIfaceFromName("clk_in");\r
106   AbstractInterface* clkOut = getIfaceFromName("clk_out");\r
107   //cout << "freq clk_in = " << clkIn-\r
108 \r
109   // in case of inputPattern not created, do it\r
110   if (lengthIP <= 0) {\r
111 \r
112     cout << "Strange case: input pattern is not created while it is time to compute output pattern !" << endl;\r
113     // collect the input patterns for each input\r
114     try {\r
115       createInputPattern();\r
116     }\r
117     catch(Exception e) {\r
118       throw(e);\r
119     }\r
120     cout << "input pattern array initialized with min. len " << lengthIP << endl;\r
121   }\r
122 \r
123   // initialize the output pattern\r
124   lengthOP = 0;\r
125   foreach(AbstractInterface* iface, getControlOutputs()) {\r
126     FunctionalInterface* connIface = AI_TO_FUN(iface);\r
127     lengthOP = lengthIP+productionPattern.value(connIface)->size();\r
128     QList<char>* pattern = new QList<char>();\r
129     for(int i=0;i<lengthOP;i++) pattern->append(0);\r
130     connIface->setOutputPattern(pattern);\r
131     outputPattern.insert(connIface,pattern);\r
132   }\r
133   cout << "output pattern array initialized" << endl;\r
134 \r
135   int clock = 0;\r
136 \r
137 }\r
138 \r
139 \r