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

Private GIT Repository
add graph modif, progress on vhdl 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 \r
7 AbstractBlock::AbstractBlock() {\r
8   name = "";\r
9   parent = NULL;\r
10 }\r
11 \r
12 AbstractBlock::AbstractBlock(const QString& _name) {\r
13   name = _name;\r
14   parent = NULL;\r
15 }\r
16 \r
17 AbstractBlock::~AbstractBlock() {\r
18 \r
19   removeAllInterfaces();\r
20 \r
21   foreach(BlockParameter* p, params) {\r
22     delete p;\r
23   }\r
24   params.clear();\r
25 }\r
26 \r
27 void AbstractBlock::setName(const QString& str) {\r
28   name = str;\r
29 }\r
30 \r
31 void AbstractBlock::setParent(AbstractBlock* _parent) {\r
32   parent = _parent;\r
33 }\r
34 \r
35 bool AbstractBlock::isReferenceBlock() {\r
36   return false;\r
37 }\r
38 \r
39 bool AbstractBlock::isFunctionalBlock() {\r
40   return false;\r
41 }\r
42 \r
43 bool AbstractBlock::isGroupBlock() {\r
44   return false;\r
45 }\r
46 \r
47 bool AbstractBlock::isTopGroupBlock() {  \r
48   return false;\r
49 }\r
50 \r
51 bool AbstractBlock::isSourceBlock() {\r
52   return false;\r
53 }\r
54 /* NB: a generator is a block that has no data inputs\r
55  * and has at least one data output.\r
56  */\r
57 bool AbstractBlock::isGeneratorBlock() {\r
58   if (getDataInputs().size() > 0) return false;\r
59   \r
60   return true;\r
61 }\r
62 \r
63 void AbstractBlock::addParameter(BlockParameter *param) {\r
64   params.append(param);\r
65 }\r
66 \r
67 \r
68 BlockParameter* AbstractBlock::getParameterFromName(QString name) {\r
69   foreach(BlockParameter* p, params) {\r
70     if (p->getName() == name) return p;\r
71   }\r
72   return NULL;\r
73 }\r
74 \r
75 void AbstractBlock::addInterface(AbstractInterface *inter) {\r
76   if(inter->getDirection() == AbstractInterface::Input){\r
77     inputs.append(inter);\r
78   } else if(inter->getDirection() == AbstractInterface::Output){\r
79     outputs.append(inter);\r
80   } else if(inter->getDirection() == AbstractInterface::InOut){\r
81     bidirs.append(inter);\r
82   }\r
83 }\r
84 \r
85 void AbstractBlock::removeInterface(AbstractInterface *inter) {\r
86   /* CAUTION: no check is done about the connection state of this interface\r
87      Thus, if it is still connected to/from, there will be a crash\r
88    */\r
89   if(inter->getDirection() == AbstractInterface::Input){\r
90     inputs.removeAll(inter);\r
91   } else if(inter->getDirection() == AbstractInterface::Output){\r
92     outputs.removeAll(inter);\r
93   } else if(inter->getDirection() == AbstractInterface::InOut){\r
94     bidirs.removeAll(inter);\r
95   }\r
96   delete inter;\r
97 }\r
98 \r
99 void AbstractBlock::removeAllInterfaces() {\r
100 \r
101   foreach(AbstractInterface* iface, inputs) {\r
102     delete iface;\r
103   }\r
104   foreach(AbstractInterface* iface, outputs) {\r
105     delete iface;\r
106   }\r
107   foreach(AbstractInterface* iface, bidirs) {\r
108     delete iface;\r
109   }\r
110   inputs.clear();\r
111   outputs.clear();\r
112   bidirs.clear();\r
113 \r
114 }\r
115 \r
116 void AbstractBlock::defineBlockParam(BlockParameter *param)\r
117 {\r
118   cout << "definition of param : " << param->getName().toStdString() << endl;\r
119   bool ok = false;\r
120   QString value = QInputDialog::getText(NULL, "Block parameter", "value for the "+ param->getName() +" parameter of " + param->getOwner()->getName() + "?", QLineEdit::Normal, param->getValue().toString(), &ok);\r
121 \r
122   while (!ok && value.isEmpty())\r
123   {\r
124     QMessageBox::critical(NULL, "Error", "You have to insert a value for the parameter or accept the default value !");\r
125     value = QInputDialog::getText(NULL, "Block parameter", "value for the "+ param->getName() +" parameter of " + param->getOwner()->getName() + " ?", QLineEdit::Normal, param->getValue().toString(), &ok);\r
126   }\r
127   param->setValue(value);  \r
128 }\r
129 \r
130 QList<AbstractInterface *> AbstractBlock::getInterfaces(int direction, int purpose) {\r
131   QList<AbstractInterface *> list;\r
132   bool selIn = false;\r
133   bool selOut = false;\r
134   bool selInOut = false;\r
135   \r
136   if (direction == AbstractInterface::AnyDirection) {\r
137     selIn = true;\r
138     selOut = true;\r
139     selInOut = true;\r
140   }\r
141   else if (direction == AbstractInterface::Input) {\r
142     selIn = true;    \r
143   }\r
144   else if (direction == AbstractInterface::Output) {\r
145     selOut = true;    \r
146   }\r
147   else if (direction == AbstractInterface::InOut) {\r
148     selInOut = true;    \r
149   }\r
150   if (selIn) {\r
151     foreach(AbstractInterface* iface, inputs) {\r
152       if ((iface->getPurpose() == purpose) || (purpose == AbstractInterface::AnyPurpose)) list.append(iface);      \r
153     }\r
154   }\r
155   if (selOut) {\r
156     foreach(AbstractInterface* iface, outputs) {\r
157       if ((iface->getPurpose() == purpose) || (purpose == AbstractInterface::AnyPurpose)) list.append(iface);      \r
158     }\r
159   }\r
160   if (selInOut) {\r
161     foreach(AbstractInterface* iface, bidirs) {\r
162       if ((iface->getPurpose() == purpose) || (purpose == AbstractInterface::AnyPurpose)) list.append(iface);      \r
163     }\r
164   }\r
165   return list;\r
166 }\r
167 \r
168 QList<AbstractInterface *> AbstractBlock::getDataInputs() {\r
169   return getInterfaces(AbstractInterface::Input, AbstractInterface::Data);  \r
170 }\r
171 \r
172 QList<AbstractInterface *> AbstractBlock::getDataOutputs() {\r
173   return getInterfaces(AbstractInterface::Output, AbstractInterface::Data);  \r
174 }\r
175 \r
176 QList<AbstractInterface *> AbstractBlock::getControlInputs() {\r
177   return getInterfaces(AbstractInterface::Input, AbstractInterface::Control);  \r
178 }\r
179 \r
180 QList<AbstractInterface *> AbstractBlock::getControlOutputs() {\r
181   return getInterfaces(AbstractInterface::Output, AbstractInterface::Control);    \r
182 }\r
183 \r
184 AbstractInterface* AbstractBlock::getIfaceFromName(QString name) {\r
185 \r
186   foreach(AbstractInterface* iface, inputs) {\r
187     if (iface->getName() == name) return iface;\r
188   }\r
189   foreach(AbstractInterface* iface, outputs) {\r
190     if (iface->getName() == name) return iface;\r
191   }\r
192   foreach(AbstractInterface* iface, bidirs) {\r
193     if (iface->getName() == name) return iface;\r
194   }\r
195   return NULL;\r
196 }\r
197 \r
198 bool AbstractBlock::isWBConfigurable() {\r
199 \r
200   foreach(BlockParameter* p, params) {\r
201     if (p->isWishboneParameter()) return true;\r
202   }\r
203   return false;\r
204 }\r
205 \r
206 QList<BlockParameter *> AbstractBlock::getUserParameters() {\r
207   QList<BlockParameter *> lst;\r
208   foreach(BlockParameter* p, params) {\r
209     if (p->isUserParameter()) lst.append(p);\r
210   }\r
211   return lst;\r
212 }\r
213 \r
214 QList<BlockParameter *> AbstractBlock::getGenericParameters() {\r
215   QList<BlockParameter *> lst;\r
216   foreach(BlockParameter* p, params) {\r
217     if (p->isGenericParameter()) lst.append(p);\r
218   }\r
219   return lst;\r
220 }\r
221 \r
222 QList<BlockParameter *> AbstractBlock::getPortParameters() {\r
223   QList<BlockParameter *> lst;\r
224   foreach(BlockParameter* p, params) {\r
225     if (p->isPortParameter()) lst.append(p);\r
226   }\r
227   return lst;\r
228 }\r
229 \r
230 QList<BlockParameter *> AbstractBlock::getWishboneParameters() {\r
231   QList<BlockParameter *> lst;\r
232   foreach(BlockParameter* p, params) {\r
233     if (p->isWishboneParameter()) lst.append(p);\r
234   }\r
235   return lst;\r
236 }\r
237 \r