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

Private GIT Repository
moved vhdl gen. into block
[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  */\r
63 bool AbstractBlock::isGeneratorBlock() {\r
64   if (getDataInputs().size() > 0) return false;\r
65   \r
66   return true;\r
67 }\r
68 \r
69 void AbstractBlock::addParameter(BlockParameter *param) {\r
70   params.append(param);\r
71 }\r
72 \r
73 \r
74 BlockParameter* AbstractBlock::getParameterFromName(QString name) {\r
75   foreach(BlockParameter* p, params) {\r
76     if (p->getName() == name) return p;\r
77   }\r
78   return NULL;\r
79 }\r
80 \r
81 void AbstractBlock::addInterface(AbstractInterface *inter) {\r
82   if(inter->getDirection() == AbstractInterface::Input){\r
83     inputs.append(inter);\r
84   } else if(inter->getDirection() == AbstractInterface::Output){\r
85     outputs.append(inter);\r
86   } else if(inter->getDirection() == AbstractInterface::InOut){\r
87     bidirs.append(inter);\r
88   }\r
89 }\r
90 \r
91 void AbstractBlock::removeInterface(AbstractInterface *inter) {\r
92   /* CAUTION: no check is done about the connection state of this interface\r
93      Thus, if it is still connected to/from, there will be a crash\r
94    */\r
95   if(inter->getDirection() == AbstractInterface::Input){\r
96     inputs.removeAll(inter);\r
97   } else if(inter->getDirection() == AbstractInterface::Output){\r
98     outputs.removeAll(inter);\r
99   } else if(inter->getDirection() == AbstractInterface::InOut){\r
100     bidirs.removeAll(inter);\r
101   }\r
102   delete inter;\r
103 }\r
104 \r
105 void AbstractBlock::removeAllInterfaces() {\r
106 \r
107   foreach(AbstractInterface* iface, inputs) {\r
108     delete iface;\r
109   }\r
110   foreach(AbstractInterface* iface, outputs) {\r
111     delete iface;\r
112   }\r
113   foreach(AbstractInterface* iface, bidirs) {\r
114     delete iface;\r
115   }\r
116   inputs.clear();\r
117   outputs.clear();\r
118   bidirs.clear();\r
119 \r
120 }\r
121 \r
122 void AbstractBlock::defineBlockParam(BlockParameter *param)\r
123 {\r
124   cout << "definition of param : " << param->getName().toStdString() << endl;\r
125   bool ok = false;\r
126   QString value = QInputDialog::getText(NULL, "Block parameter", "value for the "+ param->getName() +" parameter of " + param->getOwner()->getName() + "?", QLineEdit::Normal, param->getValue().toString(), &ok);\r
127 \r
128   while (!ok && value.isEmpty())\r
129   {\r
130     QMessageBox::critical(NULL, "Error", "You have to insert a value for the parameter or accept the default value !");\r
131     value = QInputDialog::getText(NULL, "Block parameter", "value for the "+ param->getName() +" parameter of " + param->getOwner()->getName() + " ?", QLineEdit::Normal, param->getValue().toString(), &ok);\r
132   }\r
133   param->setValue(value);  \r
134 }\r
135 \r
136 QList<AbstractInterface *> AbstractBlock::getInterfaces(int direction, int purpose) {\r
137   QList<AbstractInterface *> list;\r
138   bool selIn = false;\r
139   bool selOut = false;\r
140   bool selInOut = false;\r
141   \r
142   if (direction == AbstractInterface::AnyDirection) {\r
143     selIn = true;\r
144     selOut = true;\r
145     selInOut = true;\r
146   }\r
147   else if (direction == AbstractInterface::Input) {\r
148     selIn = true;    \r
149   }\r
150   else if (direction == AbstractInterface::Output) {\r
151     selOut = true;    \r
152   }\r
153   else if (direction == AbstractInterface::InOut) {\r
154     selInOut = true;    \r
155   }\r
156   if (selIn) {\r
157     foreach(AbstractInterface* iface, inputs) {\r
158       if ((iface->getPurpose() == purpose) || (purpose == AbstractInterface::AnyPurpose)) list.append(iface);      \r
159     }\r
160   }\r
161   if (selOut) {\r
162     foreach(AbstractInterface* iface, outputs) {\r
163       if ((iface->getPurpose() == purpose) || (purpose == AbstractInterface::AnyPurpose)) list.append(iface);      \r
164     }\r
165   }\r
166   if (selInOut) {\r
167     foreach(AbstractInterface* iface, bidirs) {\r
168       if ((iface->getPurpose() == purpose) || (purpose == AbstractInterface::AnyPurpose)) list.append(iface);      \r
169     }\r
170   }\r
171   return list;\r
172 }\r
173 \r
174 QList<AbstractInterface *> AbstractBlock::getDataInputs() {\r
175   return getInterfaces(AbstractInterface::Input, AbstractInterface::Data);  \r
176 }\r
177 \r
178 QList<AbstractInterface *> AbstractBlock::getDataOutputs() {\r
179   return getInterfaces(AbstractInterface::Output, AbstractInterface::Data);  \r
180 }\r
181 \r
182 QList<AbstractInterface *> AbstractBlock::getControlInputs() {\r
183   return getInterfaces(AbstractInterface::Input, AbstractInterface::Control);  \r
184 }\r
185 \r
186 QList<AbstractInterface *> AbstractBlock::getControlOutputs() {\r
187   return getInterfaces(AbstractInterface::Output, AbstractInterface::Control);    \r
188 }\r
189 \r
190 AbstractInterface* AbstractBlock::getIfaceFromName(QString name) {\r
191 \r
192   foreach(AbstractInterface* iface, inputs) {\r
193     if (iface->getName() == name) return iface;\r
194   }\r
195   foreach(AbstractInterface* iface, outputs) {\r
196     if (iface->getName() == name) return iface;\r
197   }\r
198   foreach(AbstractInterface* iface, bidirs) {\r
199     if (iface->getName() == name) return iface;\r
200   }\r
201   return NULL;\r
202 }\r
203 \r
204 bool AbstractBlock::isWBConfigurable() {\r
205 \r
206   foreach(BlockParameter* p, params) {\r
207     if (p->isWishboneParameter()) return true;\r
208   }\r
209   return false;\r
210 }\r
211 \r
212 QList<BlockParameter *> AbstractBlock::getUserParameters() {\r
213   QList<BlockParameter *> lst;\r
214   foreach(BlockParameter* p, params) {\r
215     if (p->isUserParameter()) lst.append(p);\r
216   }\r
217   return lst;\r
218 }\r
219 \r
220 QList<BlockParameter *> AbstractBlock::getGenericParameters() {\r
221   QList<BlockParameter *> lst;\r
222   foreach(BlockParameter* p, params) {\r
223     if (p->isGenericParameter()) lst.append(p);\r
224   }\r
225   return lst;\r
226 }\r
227 \r
228 QList<BlockParameter *> AbstractBlock::getPortParameters() {\r
229   QList<BlockParameter *> lst;\r
230   foreach(BlockParameter* p, params) {\r
231     if (p->isPortParameter()) lst.append(p);\r
232   }\r
233   return lst;\r
234 }\r
235 \r
236 QList<BlockParameter *> AbstractBlock::getWishboneParameters() {\r
237   QList<BlockParameter *> lst;\r
238   foreach(BlockParameter* p, params) {\r
239     if (p->isWishboneParameter()) lst.append(p);\r
240   }\r
241   return lst;\r
242 }\r
243 \r
244 \r
245 \r
246 void AbstractBlock::connectClkReset() throw(Exception) {\r
247 \r
248   GroupBlock* parentBlock = AB_TO_GRP(parent);\r
249 \r
250   cout << "connecting clk/rst for child " << qPrintable(name) << " of " << qPrintable(parentBlock->getName()) << endl;\r
251 \r
252   QList<AbstractInterface* > lstClk = getInterfaces(AbstractInterface::Input,AbstractInterface::Clock);\r
253   QList<AbstractInterface* > lstRst = getInterfaces(AbstractInterface::Input,AbstractInterface::Reset);\r
254 \r
255   if ((lstClk.isEmpty()) || (lstRst.isEmpty())) {\r
256     throw(Exception(IFACE_GROUP_NOCLKRST,this));\r
257   }\r
258 \r
259   ConnectedInterface* toClk = AI_TO_CON(lstClk.at(0));\r
260   ConnectedInterface* toRst = AI_TO_CON(lstRst.at(0));\r
261 \r
262   ConnectedInterface* fromClk = NULL;\r
263   ConnectedInterface* fromRst = NULL;\r
264 \r
265   if (parentBlock->isTop()) {\r
266     AbstractBlock* clkrstgen = parentBlock->getFunctionalBlockByName("clkrstgen");\r
267     if (clkrstgen == NULL) {\r
268       throw(Exception(IFACE_TOP_NOCLKRSTGEN,this));\r
269     }\r
270     else {\r
271       fromClk = AI_TO_CON(clkrstgen->getIfaceFromName("clk"));\r
272       fromRst = AI_TO_CON(clkrstgen->getIfaceFromName("reset"));\r
273     }\r
274   }\r
275   else {\r
276     fromClk = AI_TO_CON(parentBlock->getIfaceFromName("clk"));\r
277     fromRst = AI_TO_CON(parentBlock->getIfaceFromName("reset"));\r
278   }\r
279   if ((fromClk == NULL) || (fromRst == NULL)) {\r
280     throw(Exception(IFACE_GROUP_NOCLKRST,parentBlock));\r
281   }\r
282   else {\r
283     fromClk->connectTo(toClk);\r
284     fromRst->connectTo(toRst);\r
285   }\r
286 \r
287 \r
288 }\r
289 \r
290 \r
291 \r