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

Private GIT Repository
be9452ecf2d6f61017f0fd67fd0bbc246326ffb8
[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   double periodIn = 1000.0/clkIn->getClockFrequency();\r
110   double periodOut = 1000.0/clkOut->getClockFrequency();\r
111   cout << "period clk_in = " << periodIn << endl;\r
112   cout << "period clk_out = " << periodOut << endl;\r
113   // starts with 1 data in FIFO\r
114   int latency = 1+(int)((periodIn+5.0*periodOut)/periodOut);\r
115   QList<char> pattern;\r
116   for(int i=0;i<latency;i++) {\r
117     pattern.append(0);\r
118   }\r
119   int inFifo = 1;\r
120   int idIn = 1;\r
121   int idOut = 1;\r
122   while (idIn < lengthIP) {\r
123     double tIn = (double)idIn * periodIn;\r
124     double tOut = (double)idOut * periodOut;\r
125     if (fabs(tIn-tOut) < 0.001) {\r
126       if (inFifo > 0) {\r
127         pattern.append(1);\r
128       }\r
129       else {\r
130         pattern.append(0);\r
131         inFifo ++;\r
132       }\r
133       idIn ++;\r
134       idOut ++;\r
135     }\r
136     else if (tIn < tOut) {\r
137       inFifo++;\r
138       idIn ++;\r
139     }\r
140     else {\r
141       if (inFifo > 0) {\r
142         pattern.append(1);\r
143         inFifo--;\r
144       }\r
145       else {\r
146         pattern.append(0);\r
147       }\r
148       idOut++;\r
149     }\r
150   }\r
151   foreach(char c, pattern) cout << (int)c;\r
152   cout << endl;\r
153 \r
154   // initialize the output pattern\r
155   lengthOP = pattern.size();\r
156   foreach(AbstractInterface* iface, getControlOutputs()) {\r
157     FunctionalInterface* connIface = AI_TO_FUN(iface);    \r
158     QList<char>* pat = new QList<char>(pattern);\r
159     connIface->setOutputPattern(pat);\r
160     outputPattern.insert(connIface,pat);\r
161   }\r
162   cout << "output pattern computed" << endl;\r
163 }\r
164 \r
165 \r