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

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