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

Private GIT Repository
finished testbench generation
[blast.git] / AbstractBlock.cpp
1 #include <AbstractBlock.h>\r
2 #include <QInputDialog>\r
3 #include <QMessageBox>\r
4 #include "AbstractInterface.h"\r
5 #include "BlockParameter.h"\r
6 #include "Parameters.h"\r
7 #include "GroupBlock.h"\r
8 #include "ConnectedInterface.h"\r
9 \r
10 \r
11 AbstractBlock::AbstractBlock(Graph *_graph) {\r
12   name = "";\r
13   parent = NULL;\r
14   specialType = NotSpecial;\r
15   graph = _graph;\r
16 }\r
17 \r
18 /*\r
19 AbstractBlock::AbstractBlock(const QString& _name) {\r
20   name = Parameters::normalizeName(_name);\r
21   parent = NULL;\r
22 }\r
23 */\r
24 \r
25 AbstractBlock::~AbstractBlock() {\r
26 \r
27   removeAllInterfaces();\r
28 \r
29   foreach(BlockParameter* p, params) {\r
30     delete p;\r
31   }\r
32   params.clear();\r
33 }\r
34 \r
35 void AbstractBlock::setName(const QString& str) {\r
36   name = Parameters::normalizeName(str);\r
37 }\r
38 \r
39 void AbstractBlock::setSpecialType(int type) {\r
40   if ((type >= NotSpecial) && (type <= ClkConvert)) {\r
41     specialType = type;\r
42   }\r
43   else {\r
44     specialType = NotSpecial;\r
45   }\r
46 }\r
47 \r
48 void AbstractBlock::setParent(AbstractBlock* _parent) {\r
49   parent = _parent;\r
50 }\r
51 \r
52 bool AbstractBlock::isReferenceBlock() {\r
53   return false;\r
54 }\r
55 \r
56 bool AbstractBlock::isFunctionalBlock() {\r
57   return false;\r
58 }\r
59 \r
60 bool AbstractBlock::isSpecialBlock() {\r
61   return false;\r
62 }\r
63 \r
64 bool AbstractBlock::isGroupBlock() {\r
65   return false;\r
66 }\r
67 \r
68 bool AbstractBlock::isTopGroupBlock() {  \r
69   return false;\r
70 }\r
71 \r
72 bool AbstractBlock::isStimuliBlock() {\r
73   return false;\r
74 }\r
75 /* NB: a source is a block that has no data inputs\r
76  * and has at least one data output.\r
77  * By the way, blocks that have no data input/output\r
78  * (like clkrstgen) are not sources !\r
79  * A source may also be a block of special type source.\r
80  */\r
81 bool AbstractBlock::isSourceBlock() {\r
82   if (specialType == Source) return true;\r
83   if (getDataInputs().size() > 0) return false;\r
84   if (getDataOutputs().size() == 0) return false;\r
85   return true;\r
86 }\r
87 \r
88 /* NB: a sink is a block without outputs of any type */\r
89 bool AbstractBlock::isSinkBlock() {\r
90   if (getOutputs().size() == 0) return true;\r
91   return false;\r
92 }\r
93 \r
94 int AbstractBlock::getSpecialTypeFromString(QString str) {\r
95   if (str == "source") {\r
96     return Source;\r
97   }\r
98   else if (str == "sink") {\r
99     return Sink;\r
100   }\r
101   else if (str == "clkconvert") {\r
102     return ClkConvert;\r
103   }\r
104   return NotSpecial;\r
105 }\r
106 \r
107 \r
108 void AbstractBlock::addParameter(BlockParameter *param) {\r
109   params.append(param);\r
110 }\r
111 \r
112 \r
113 BlockParameter* AbstractBlock::getParameterFromName(QString name) {\r
114   foreach(BlockParameter* p, params) {\r
115     if (p->getName() == name) return p;\r
116   }\r
117   return NULL;\r
118 }\r
119 \r
120 void AbstractBlock::addInterface(AbstractInterface *inter) {\r
121   if(inter->getDirection() == AbstractInterface::Input){\r
122     inputs.append(inter);\r
123   } else if(inter->getDirection() == AbstractInterface::Output){\r
124     outputs.append(inter);\r
125   } else if(inter->getDirection() == AbstractInterface::InOut){\r
126     bidirs.append(inter);\r
127   }\r
128 }\r
129 \r
130 void AbstractBlock::removeInterface(AbstractInterface *inter) {\r
131   /* CAUTION: no check is done about the connection state of this interface\r
132      Thus, if it is still connected to/from, there will be a crash\r
133    */\r
134   if(inter->getDirection() == AbstractInterface::Input){\r
135     inputs.removeAll(inter);\r
136   } else if(inter->getDirection() == AbstractInterface::Output){\r
137     outputs.removeAll(inter);\r
138   } else if(inter->getDirection() == AbstractInterface::InOut){\r
139     bidirs.removeAll(inter);\r
140   }\r
141   delete inter;\r
142 }\r
143 \r
144 void AbstractBlock::removeAllInterfaces() {\r
145 \r
146   foreach(AbstractInterface* iface, inputs) {\r
147     delete iface;\r
148   }\r
149   foreach(AbstractInterface* iface, outputs) {\r
150     delete iface;\r
151   }\r
152   foreach(AbstractInterface* iface, bidirs) {\r
153     delete iface;\r
154   }\r
155   inputs.clear();\r
156   outputs.clear();\r
157   bidirs.clear();\r
158 \r
159 }\r
160 \r
161 void AbstractBlock::defineBlockParam(BlockParameter *param)\r
162 {\r
163   cout << "definition of param : " << param->getName().toStdString() << endl;\r
164   bool ok = false;\r
165   QString value = QInputDialog::getText(NULL, "Block parameter", "value for the "+ param->getName() +" parameter of " + param->getOwner()->getName() + "?", QLineEdit::Normal, param->getValue().toString(), &ok);\r
166 \r
167   while (!ok && value.isEmpty())\r
168   {\r
169     QMessageBox::critical(NULL, "Error", "You have to insert a value for the parameter or accept the default value !");\r
170     value = QInputDialog::getText(NULL, "Block parameter", "value for the "+ param->getName() +" parameter of " + param->getOwner()->getName() + " ?", QLineEdit::Normal, param->getValue().toString(), &ok);\r
171   }\r
172   param->setValue(value);  \r
173 }\r
174 \r
175 QList<AbstractInterface *> AbstractBlock::getInterfaces(int direction, int purpose) {\r
176   QList<AbstractInterface *> list;\r
177   bool selIn = false;\r
178   bool selOut = false;\r
179   bool selInOut = false;\r
180   \r
181   if (direction == AbstractInterface::AnyDirection) {\r
182     selIn = true;\r
183     selOut = true;\r
184     selInOut = true;\r
185   }\r
186   else if (direction == AbstractInterface::Input) {\r
187     selIn = true;    \r
188   }\r
189   else if (direction == AbstractInterface::Output) {\r
190     selOut = true;    \r
191   }\r
192   else if (direction == AbstractInterface::InOut) {\r
193     selInOut = true;    \r
194   }\r
195   if (selIn) {\r
196     foreach(AbstractInterface* iface, inputs) {\r
197       if ((iface->getPurpose() == purpose) || (purpose == AbstractInterface::AnyPurpose)) list.append(iface);      \r
198     }\r
199   }\r
200   if (selOut) {\r
201     foreach(AbstractInterface* iface, outputs) {\r
202       if ((iface->getPurpose() == purpose) || (purpose == AbstractInterface::AnyPurpose)) list.append(iface);      \r
203     }\r
204   }\r
205   if (selInOut) {\r
206     foreach(AbstractInterface* iface, bidirs) {\r
207       if ((iface->getPurpose() == purpose) || (purpose == AbstractInterface::AnyPurpose)) list.append(iface);      \r
208     }\r
209   }\r
210   return list;\r
211 }\r
212 \r
213 QList<AbstractInterface *> AbstractBlock::getDataInputs() {\r
214   return getInterfaces(AbstractInterface::Input, AbstractInterface::Data);  \r
215 }\r
216 \r
217 QList<AbstractInterface *> AbstractBlock::getDataOutputs() {\r
218   return getInterfaces(AbstractInterface::Output, AbstractInterface::Data);  \r
219 }\r
220 \r
221 QList<AbstractInterface *> AbstractBlock::getControlInputs() {\r
222   return getInterfaces(AbstractInterface::Input, AbstractInterface::Control);  \r
223 }\r
224 \r
225 QList<AbstractInterface *> AbstractBlock::getControlOutputs() {\r
226   return getInterfaces(AbstractInterface::Output, AbstractInterface::Control);    \r
227 }\r
228 \r
229 AbstractInterface* AbstractBlock::getIfaceFromName(QString name) {\r
230 \r
231   foreach(AbstractInterface* iface, inputs) {\r
232     if (iface->getName() == name) return iface;\r
233   }\r
234   foreach(AbstractInterface* iface, outputs) {\r
235     if (iface->getName() == name) return iface;\r
236   }\r
237   foreach(AbstractInterface* iface, bidirs) {\r
238     if (iface->getName() == name) return iface;\r
239   }\r
240   return NULL;\r
241 }\r
242 \r
243 bool AbstractBlock::isWBConfigurable() {\r
244 \r
245   foreach(BlockParameter* p, params) {\r
246     if (p->isWishboneParameter()) return true;\r
247   }\r
248   return false;\r
249 }\r
250 \r
251 QList<BlockParameter *> AbstractBlock::getUserParameters() {\r
252   QList<BlockParameter *> lst;\r
253   foreach(BlockParameter* p, params) {\r
254     if (p->isUserParameter()) lst.append(p);\r
255   }\r
256   return lst;\r
257 }\r
258 \r
259 QList<BlockParameter *> AbstractBlock::getGenericParameters() {\r
260   QList<BlockParameter *> lst;\r
261   foreach(BlockParameter* p, params) {\r
262     if (p->isGenericParameter()) lst.append(p);\r
263   }\r
264   return lst;\r
265 }\r
266 \r
267 QList<BlockParameter *> AbstractBlock::getPortParameters() {\r
268   QList<BlockParameter *> lst;\r
269   foreach(BlockParameter* p, params) {\r
270     if (p->isPortParameter()) lst.append(p);\r
271   }\r
272   return lst;\r
273 }\r
274 \r
275 QList<BlockParameter *> AbstractBlock::getWishboneParameters() {\r
276   QList<BlockParameter *> lst;\r
277   foreach(BlockParameter* p, params) {\r
278     if (p->isWishboneParameter()) lst.append(p);\r
279   }\r
280   return lst;\r
281 }\r
282 \r
283 void AbstractBlock::generateEntity(QTextStream& out, bool hasController) throw(Exception) {\r
284 \r
285   out << "entity " << name << " is" << endl;\r
286   try {\r
287     generateEntityOrComponentBody(out, 0, hasController);\r
288   }\r
289   catch(Exception e) {\r
290     throw(e);\r
291   }\r
292   out << "end entity " << name << ";" << endl << endl;\r
293 }\r
294 \r
295 void AbstractBlock::generateComponent(QTextStream& out, bool hasController) throw(Exception) {\r
296 \r
297   out << "  component " << name << " is" << endl;\r
298   try {\r
299     generateEntityOrComponentBody(out, 2, hasController);\r
300   }\r
301   catch(Exception e) {\r
302     throw(e);\r
303   }\r
304   out << "  end component; " << endl << endl;\r
305 }\r
306 \r
307 \r