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

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