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

Private GIT Repository
dde5930ab90aebae1d11a4f965bfeb97395c1b48
[blast.git] / AbstractInterface.cpp
1 #include "AbstractInterface.h"
2 #include "BlockParameterPort.h"
3 #include "AbstractBlock.h"
4
5 AbstractInterface::AbstractInterface(AbstractBlock* _owner) {
6
7   owner = _owner;
8   name = "";
9   width = "1";
10   direction = Input;
11   purpose = Data;  
12   type = Boolean;
13   associatedIface = NULL;
14
15 }
16
17 AbstractInterface::AbstractInterface(AbstractBlock* _owner, const QString& _name, const QString& _type, const QString& _width, int _direction, int _purpose) {
18
19   owner = _owner;  
20   name = _name;
21   width = _width;
22   direction = _direction;
23   purpose = _purpose;
24   type = typeFromString(_type);
25   associatedIface = NULL;
26 }
27
28 AbstractInterface::AbstractInterface(AbstractInterface* other) {
29   owner = NULL;
30   name = other->name;
31   type = other->type;
32   width = other->width;
33   direction = other->direction;
34   purpose = other->purpose;
35   associatedIface = NULL;
36 }
37
38 AbstractInterface::~AbstractInterface() {
39
40 }
41
42 bool AbstractInterface::isReferenceInterface() {
43   return false;
44 }
45
46 bool AbstractInterface::isFunctionalInterface() {
47   return false;
48 }
49
50 bool AbstractInterface::isGroupInterface() {
51   return false;
52 }
53
54 QString AbstractInterface::getPurposeString() {
55     QString str;
56     switch(purpose){
57         case AbstractInterface::Data:
58             str = QString("data");
59             break;
60         case AbstractInterface::Clock:
61             str = QString("clock");
62             break;
63         case AbstractInterface::Reset:
64             str = QString("reset");
65             break;
66         case AbstractInterface::Wishbone:
67             str = QString("wishbone");
68             break;
69     }
70     return str;
71 }
72
73 QString AbstractInterface::getDirectionString() {
74     QString str;
75     switch(direction){
76         case AbstractInterface::Input:
77             str = QString("input");
78             break;
79         case AbstractInterface::Output:
80             str = QString("output");
81             break;
82         case AbstractInterface::InOut:
83             str = QString("inout");
84             break;
85     }
86     return str;
87 }
88
89 double AbstractInterface::getDoubleWidth() throw(QException) {
90
91   static QString fctName = "AbstractInterface::getDoubleWidth()";
92  #ifdef DEBUG_FCTNAME
93    cout << "call to " << qPrintable(fctName) << endl;
94  #endif
95
96    /*
97     cout << "start AbstractInterface::getDoubleWidth()" << endl;
98     bool ok;
99     double width = getWidth().toDouble(&ok);
100
101     if(!ok){
102       ArithmeticEvaluator *evaluator = new ArithmeticEvaluator;
103       cout << "evaluator created!" << endl;
104       evaluator->setExpression(getWidth());
105       cout << "expression defined!" << endl;
106       foreach(BlockParameter *param, getOwner()->getParameters()){
107         evaluator->setVariableValue(param->getName(), param->getIntValue());
108         cout << "param : " << param->getName().toStdString() << " evaluated!" << endl;
109       }
110       width = evaluator->evaluate();
111       cout << "expression evaluated succefully!" << endl;
112     }
113     cout << "real width : " << width << endl;
114     return width;
115     */
116
117    return 1.0;
118 }
119
120 void AbstractInterface::setPurpose(int _purpose) {
121   if ((_purpose>=Data) && (_purpose <= Wishbone)) {
122     purpose = _purpose;
123   }
124 }
125
126 void AbstractInterface::setDirection(int _direction) {
127   if ((_direction > Input) && (_direction <= InOut)) {
128     direction = _direction;
129   }
130 }
131
132 bool AbstractInterface::setAssociatedIface(AbstractInterface* iface) {
133   if (purpose != Control) return false;
134   if (iface->purpose != Data) return false;
135   associatedIface = iface;
136   iface->associatedIface = this;  
137   return true;
138 }
139
140
141 int AbstractInterface::getIntDirection(QString str) {
142     if(str == "input") return Input;
143     if(str == "output") return Output;
144     if(str == "inOut") return InOut;
145     return -1;
146 }
147
148
149 QString AbstractInterface::getTypeString() {
150
151   if (type == Boolean) {
152     return "boolean";
153   }
154   else if (type == Natural) {
155     return "natural";
156   }
157   else if (type == Expression) {
158     return "expression";
159   }
160   return "invalid_type";
161 }
162
163 int AbstractInterface::typeFromString(const QString &_type) {
164
165   int ret;
166   if (_type == "expression") {
167     ret = Expression;
168   }
169   else if (_type == "boolean") {
170     ret = Boolean;
171   }
172   else if (_type == "natural") {
173     ret = Natural;
174   }
175   return ret;
176 }
177
178 QString AbstractInterface::toVHDL(int context, int flags) throw(Exception) {
179
180   if (isReferenceInterface()) throw(Exception(IFACE_INVALID_TYPE));
181
182   QString msb = width;
183   QString ret="";
184   bool ok;
185   if ((context == BlockParameter::Entity) || (context == BlockParameter::Component)) {
186
187     QString formatBool = "%1 : %2 std_logic";
188     QString formatVector = "%1 : %2 std_logic_vector(%3 downto %4)";
189     if ((flags & BlockParameter::NoComma) == 0) {
190       formatBool.append(";");
191       formatVector.append(";");
192     }
193     QString orientation="";
194     if (direction == Input) {
195       orientation = "in";
196     }
197     else if (direction == Output) {
198       orientation = "out";
199     }
200     else {
201       orientation = "inout";
202     }
203     if (type == Boolean) {
204       ret = formatVector.arg(name).arg(orientation);
205     }
206     else if (type == Natural) {
207       int w = width.toInt(&ok);
208       if (!ok) {
209         throw(Exception(INVALID_VALUE));
210       }
211       else {
212         w -= 1;
213         ret = formatVector.arg(name).arg(orientation).arg(w).arg("0");
214       }
215     }
216     else if (type == Expression) {
217       /* must check the following conditions :
218            - if it contains user/port parameters : must evaluate their numeric value
219            - if it contains generic parameters : just remove the $ -> the expression is not arithmetically evaluated.
220       */
221       QList<BlockParameter*> listGenerics = owner->getGenericParameters();
222       QList<BlockParameter*> listUsers = owner->getUserParameters();
223       QList<BlockParameter*> listPorts = owner->getPortParameters();
224       foreach(BlockParameter* p, listUsers) {
225         QString var = "$";
226         var.append(p->getName());
227         if (width.contains(var)) {
228           int w = p->getValue().toInt(&ok);
229           if (!ok) throw(Exception(INVALID_VALUE));
230           msb.replace(var,p->getValue().toString());
231         }
232       }
233       foreach(BlockParameter* p, listPorts) {
234         QString var = "$";
235         var.append(p->getName());
236         if (width.contains(var)) {
237           BlockParameterPort* pp = (BlockParameterPort*)p;
238           AbstractInterface* iface = owner->getIfaceFromName(pp->getIfaceName());
239
240           int w = p->getValue().toInt(&ok);
241           if (!ok) throw(Exception(INVALID_VALUE));
242           msb.replace(var,p->getValue().toString());
243         }
244       }
245
246       ret = formatVector.arg(name).arg(orientation).arg("toto").arg("0");
247     }
248   }
249   return ret;
250 }
251