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

Private GIT Repository
9576dc96184cfab349f8ddc4de4cc8b86b780e8e
[blast.git] / SpecialBlock.cpp
1 #include "SpecialBlock.h"\r
2 #include "FunctionalInterface.h"\r
3 \r
4 SpecialBlock::SpecialBlock(Graph *_graph, int _type, GroupBlock* _parent, ReferenceBlock* _reference, bool createIfaces) throw(Exception) : FunctionalBlock(_graph, _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 special block " << 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 special block " << 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->getClockFrequency() << endl;\r
108   cout << "freq clk_out = " << clkOut->getClockFrequency() << endl;\r
109 \r
110   // in case of inputPattern not created, do it\r
111   if (lengthIP <= 0) {\r
112 \r
113     cout << "Strange case: input pattern is not created while it is time to compute output pattern !" << endl;\r
114     // collect the input patterns for each input\r
115     try {\r
116       createInputPattern();\r
117     }\r
118     catch(Exception e) {\r
119       throw(e);\r
120     }\r
121     cout << "input pattern array initialized with min. len " << lengthIP << endl;\r
122   }\r
123 \r
124   // initialize the output pattern\r
125   lengthOP = 0;\r
126   foreach(AbstractInterface* iface, getControlOutputs()) {\r
127     FunctionalInterface* connIface = AI_TO_FUN(iface);\r
128     lengthOP = lengthIP+productionPattern.value(connIface)->size();\r
129     QList<char>* pattern = new QList<char>();\r
130     for(int i=0;i<lengthOP;i++) pattern->append(0);\r
131     connIface->setOutputPattern(pattern);\r
132     outputPattern.insert(connIface,pattern);\r
133   }\r
134   cout << "output pattern array initialized" << endl;\r
135 \r
136   int clock = 0;\r
137 \r
138 }\r
139 \r
140 \r