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

Private GIT Repository
cc9f7658c7ab083b8fe2bfbb87cea71012e6d2c5
[blast.git] / FunctionalInterface.cpp
1 #include "ArithmeticEvaluator.h"\r
2 #include "FunctionalInterface.h"\r
3 #include "ReferenceInterface.h"\r
4 #include "GroupInterface.h"\r
5 #include "FunctionalBlock.h"\r
6 #include "GroupBlock.h"\r
7 \r
8 \r
9 FunctionalInterface::FunctionalInterface(AbstractBlock* _owner, ReferenceInterface *_reference) throw(Exception) : ConnectedInterface(_owner) {\r
10 \r
11   if (_owner == NULL) throw(Exception(BLOCK_NULL));\r
12   if (_reference == NULL) throw(Exception(IFACE_NULL));\r
13 \r
14   if (! _owner->isFunctionalBlock()) throw(Exception(BLOCK_INVALID_TYPE));\r
15   if (! _reference->isReferenceInterface()) throw(Exception(IFACE_INVALID_TYPE));\r
16 \r
17   reference = _reference;\r
18 \r
19   name = reference->getName();\r
20   width = reference->getWidth();\r
21   direction = reference->getDirection();\r
22   purpose = reference->getPurpose();\r
23   level = reference->getLevel(); \r
24   connectedFrom = NULL;\r
25 }\r
26 \r
27 bool FunctionalInterface::isFunctionalInterface() {\r
28   return true;\r
29 }\r
30 \r
31 int FunctionalInterface::getInterfaceMultiplicity() {\r
32 \r
33   int i=0;\r
34   int ifaceCount = 0;\r
35   FunctionalInterface* iface = NULL;\r
36 \r
37   if (direction == AbstractInterface::Input) {\r
38     QList<AbstractInterface *> inputs = owner->getInputs();\r
39     for(i=0;i<inputs.size();i++) {\r
40       iface = AI_TO_FUN(inputs.at(i));\r
41       if (iface->getReference() == reference) {\r
42         ifaceCount += 1;\r
43       }\r
44     }\r
45   }\r
46   else if (direction == AbstractInterface::Output) {\r
47     QList<AbstractInterface *> outputs = owner->getOutputs();\r
48     for(i=0;i<outputs.size();i++) {\r
49       iface = AI_TO_FUN(outputs.at(i));\r
50       if (iface->getReference() == reference) {\r
51         ifaceCount += 1;\r
52       }\r
53     }\r
54   }\r
55   else if (direction == AbstractInterface::InOut) {\r
56     QList<AbstractInterface *> bidirs = owner->getBidirs();\r
57     for(i=0;i<bidirs.size();i++) {\r
58       iface = AI_TO_FUN(bidirs.at(i));\r
59       if (iface->getReference() == reference) {\r
60         ifaceCount += 1;\r
61       }\r
62     }\r
63   }\r
64   if (ifaceCount == 0) {\r
65     return -1;\r
66   }\r
67   else if ( reference->getMultiplicity() == -1) {\r
68     return ifaceCount+1;\r
69   }\r
70   else if ( reference->getMultiplicity() > ifaceCount) {\r
71     return ifaceCount+1;\r
72   }\r
73   return -1;\r
74 }\r
75 \r
76 AbstractInterface *FunctionalInterface::clone() { \r
77   int id = getInterfaceMultiplicity();\r
78   if (id < 0) return NULL;\r
79   FunctionalInterface *inter = new FunctionalInterface(owner, reference);\r
80   inter->setWidth(width);\r
81   inter->setDirection(direction);\r
82   inter->setPurpose(purpose);\r
83   inter->setLevel(level);  \r
84   inter->connectFrom(NULL);\r
85   inter->setName(reference->getName()+"_"+QString::number(id));\r
86   return inter;\r
87 }\r
88 \r
89 bool FunctionalInterface::canConnectTo(AbstractInterface *iface) {\r
90 \r
91   /* NOTE :\r
92      necessary conditions :\r
93         - this is an output or in/out interface\r
94         - iface type must be functional or group interface\r
95         - iface->connectedFrom must be NULL\r
96 \r
97      valid cases:\r
98      1 - iface is owned by a block (group or func) that is within the same group as the block that own this\r
99         1.1 - this is output and iface is input\r
100         1.2 - both are inout\r
101      2 - iface is owned by the parent group of the block that owns this\r
102         2.1 - this is an output, iface is an output of the group\r
103         2.2 - both are inout\r
104 \r
105   */\r
106   if (direction == Input) return false;\r
107   if (iface->isReferenceInterface()) return false;\r
108   if (iface->getConnectedFrom() != NULL) return false;\r
109 \r
110   if (getOwner()->getParent() == iface->getOwner()->getParent()) {\r
111 \r
112     if ((direction == Output) && (iface->getDirection() == Input)) return true;\r
113     if ((direction == InOut) && (iface->getDirection() == InOut)) return true;\r
114   }\r
115   else if (getOwner()->getParent() == iface->getOwner()) {\r
116     if ((direction == Output) && (iface->getDirection() == Output)) return true;\r
117     if ((direction == InOut) && (iface->getDirection() == InOut)) return true;\r
118   }\r
119 \r
120   return false;\r
121 \r
122 }\r
123 \r
124 bool FunctionalInterface::canConnectFrom(AbstractInterface *iface) {\r
125 \r
126   /* NOTE :\r
127      necessary conditions :\r
128         - this is an input or in/out interface\r
129         - iface type must be functional or group interface\r
130         - this connectedFrom must be NULL\r
131 \r
132      valid cases:\r
133      1 - iface is owned by a block (group or func) that is within the same group as the block that own this\r
134         1.1 - this is input and iface is output\r
135         1.2 - both are inout\r
136      2 - iface is owned by the parent group of the block that owns this\r
137         2.1 - this is an input, iface is an input of the group\r
138         2.2 - both are inout\r
139   */\r
140   if (direction == Output) return false;\r
141   if (iface->isReferenceInterface()) return false;\r
142   if (connectedFrom != NULL) return false;\r
143 \r
144   if (getOwner()->getParent() == iface->getOwner()->getParent()) {\r
145 \r
146     if ((direction == Input) && (iface->getDirection() == Output)) return true;\r
147     if ((direction == InOut) && (iface->getDirection() == InOut)) return true;\r
148   }\r
149   else if (getOwner()->getParent() == iface->getOwner()) {\r
150     if ((direction == Input) && (iface->getDirection() == Input)) return true;\r
151     if ((direction == InOut) && (iface->getDirection() == InOut)) return true;\r
152   }\r
153 \r
154   return false;\r
155 }\r
156 \r
157 \r
158 void FunctionalInterface::connectionsValidation(QStack<AbstractInterface *> *interfacetoValidate, QList<AbstractInterface *> *validatedInterfaces) throw(Exception) {\r
159 \r
160   /*\r
161   //inputs interfaces\r
162   double widthInput, widthOutput;\r
163   if(getDirection() == AbstractInterface::Input){\r
164     widthInput = getDoubleWidth();\r
165     widthOutput = getConnectedFrom()->getDoubleWidth();\r
166     if(widthInput != widthOutput){\r
167       throw new Exception(WIDTHS_NOT_EQUALS);\r
168     }\r
169     foreach(AbstractInterface *inter, getOwner()->getOutputs()){\r
170       if(inter->isConnectedTo()){\r
171         if((!interfacetoValidate->contains(inter)) && (!validatedInterfaces->contains(inter))){\r
172           interfacetoValidate->push(inter);\r
173         }\r
174       }\r
175     }\r
176   }\r
177   //outputs interfaces\r
178   else if(getDirection() == AbstractInterface::Output){\r
179     widthOutput = getDoubleWidth();\r
180     foreach(AbstractInterface *inter, getConnectedTo()){\r
181       widthInput = inter->getDoubleWidth();\r
182       if(widthInput != widthOutput){\r
183         throw new Exception(WIDTHS_NOT_EQUALS);\r
184       }\r
185     }\r
186     foreach(AbstractInterface *inter, getConnectedTo()){\r
187       if((!interfacetoValidate->contains(inter)) && (!validatedInterfaces->contains(inter))){\r
188         interfacetoValidate->push(inter);\r
189       }\r
190     }\r
191   }\r
192   else if(getDirection() == AbstractInterface::InOut){\r
193 \r
194   }\r
195 \r
196   */\r
197 }\r