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

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