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

Private GIT Repository
added impl xsd + patterns in impls
[blast.git] / GroupInterface.cpp
1 #include "GroupInterface.h"
2 #include "FunctionalInterface.h"
3 #include "GroupBlock.h"
4
5 GroupInterface::GroupInterface(AbstractBlock* _owner, const QString& _name, int _direction) throw(Exception) : ConnectedInterface(_owner,_name,"expression","",_direction,AbstractInterface::Data) {
6   if (! _owner->isGroupBlock()) throw(Exception(BLOCK_INVALID_TYPE));
7
8   connectedFrom = NULL;
9 }
10
11 bool GroupInterface::isGroupInterface() {
12   return true;
13 }
14
15 AbstractInterface *GroupInterface::clone() {
16     GroupInterface *inter = new GroupInterface(owner,name,direction);
17     inter->setWidth(width);
18     inter->setDirection(direction);
19     inter->setPurpose(purpose);    
20     inter->connectFrom(NULL);
21
22     return inter;
23 }
24
25
26 bool GroupInterface::canConnectTo(AbstractInterface *iface) {
27
28   /* NOTE :
29      necessary conditions :
30         - iface type must be functional or group interface
31         - iface->connectedFrom must be NULL
32
33      valid cases:
34      1 - this is owned by the parent group of the block (group or func) that owns iface
35         1.1 - this is input and iface is input
36         1.2 - both are inout
37      2 - this is owned by a group that has the same parent as the block (group or func) that owns iface
38         2.1 - this is an output, iface is an input of the group
39         2.2 - both are inout
40      3 - this is owned by a group and iface by its parent group
41         2.1 - this is an output, iface is an output of the group
42         2.2 - both are inout
43
44
45   */
46   if (iface->isReferenceInterface()) return false;
47   if (iface->getConnectedFrom() != NULL) return false;
48
49   if (this->getOwner() == iface->getOwner()->getParent()) {
50     if ((direction == Input) && (iface->getDirection() == Input)) return true;
51     if ((direction == InOut) && (iface->getDirection() == InOut)) return true;
52
53   }
54   else if (this->getOwner()->getParent() == iface->getOwner()->getParent()) {
55     if ((direction == Output) && (iface->getDirection() == Input)) return true;
56     if ((direction == InOut) && (iface->getDirection() == InOut)) return true;
57   }
58   else if (this->getOwner()->getParent() == iface->getOwner()) {
59     if ((direction == Output) && (iface->getDirection() == Output)) return true;
60     if ((direction == InOut) && (iface->getDirection() == InOut)) return true;
61   }
62
63   return false;
64 }
65
66 bool GroupInterface::canConnectFrom(AbstractInterface *iface) {
67
68   /* NOTE :
69      necessary conditions :
70         - iface type must be functional or group interface
71         - this->connectedFrom must be NULL
72
73      valid cases:
74      1 - this is owned by the parent group of the block (group or func) that owns iface
75         1.1 - this is output and iface is output
76         1.2 - both are inout
77      2 - this is owned by a group that has the same parent as the block (group or func) that owns iface
78         2.1 - this is an input, iface is an output of the group
79         2.2 - both are inout
80      3 - this is owned by a group and iface by its parent group
81         2.1 - this is an input, iface is an input of the group
82         2.2 - both are inout
83   */
84   if (iface->isReferenceInterface()) return false;
85   if (getConnectedFrom() != NULL) return false;
86
87   if (this->getOwner() == iface->getOwner()->getParent()) {
88     if ((direction == Output) && (iface->getDirection() == Output)) return true;
89     if ((direction == InOut) && (iface->getDirection() == InOut)) return true;
90
91   }
92   else if (this->getOwner()->getParent() == iface->getOwner()->getParent()) {
93     if ((direction == Input) && (iface->getDirection() == Output)) return true;
94     if ((direction == InOut) && (iface->getDirection() == InOut)) return true;
95   }
96   else if (this->getOwner()->getParent() == iface->getOwner()) {
97     if ((direction == Input) && (iface->getDirection() == Input)) return true;
98     if ((direction == InOut) && (iface->getDirection() == InOut)) return true;
99   }
100
101   return false;
102 }
103
104 void GroupInterface::connectionsValidation(QStack<AbstractInterface*> *interfacetoValidate, QList<AbstractInterface*> *validatedInterfaces) throw(Exception) {
105     cout << "group interface connection validation" << endl;
106 }