source: branches/dev-5819/Compiler/ModelicaFlatTree/src/jastadd/FlatAPI/FlatAPIAttributes.jrag @ 13800

Last change on this file since 13800 was 13800, checked in by randersson, 8 weeks ago

#5819 Merged trunk into branch

File size: 17.2 KB
Line 
1/*
2    Copyright (C) 2009-2017 Modelon AB
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, version 3 of the License.
7
8    This program is distributed in the hope that it will be useful,
9    but WITHOUT ANY WARRANTY; without even the implied warranty of
10    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11    GNU General Public License for more details.
12
13    You should have received a copy of the GNU General Public License
14    along with this program.  If not, see <http://www.gnu.org/licenses/>.
15*/
16
17aspect FlatAPIAttributes {
18
19    public static final String FAttribute.QUANTITY     = "quantity";
20    public static final String FAttribute.UNIT         = "unit";
21    public static final String FAttribute.DISPLAY_UNIT = "displayUnit";
22    public static final String FAttribute.MIN          = "min";
23    public static final String FAttribute.MAX          = "max";
24    public static final String FAttribute.START        = "start";
25    public static final String FAttribute.FIXED        = "fixed";
26    public static final String FAttribute.NOMINAL      = "nominal";
27    public static final String FAttribute.STATE_SELECT = "stateSelect";
28    public static final String FAttribute.SIZE         = "size()";
29
30    public static final String FAttribute.STATE_SELECT_TYPE = "StateSelect";
31
32    syn lazy FDerivedType FVariable.myFDerivedType() = findFDerivedType(getDerivedType());
33    syn FDerivedType FEnumDecl.myFDerivedType()      = findFDerivedType(name());
34    eq FRecordVariable.myFDerivedType()              = null;
35
36    inh FDerivedType FVariable.findFDerivedType(String name);
37    inh FDerivedType FEnumDecl.findFDerivedType(String name);
38    eq FClass.getChild().findFDerivedType(String name) = derivedTypeMap().get(name);
39    eq Root.getChild().findFDerivedType(String name)   = null;
40
41    syn lazy Map<String,FDerivedType> FClass.derivedTypeMap() {
42        Map<String,FDerivedType> m = new HashMap<String,FDerivedType>();
43        for (FDerivedType t : getFDerivedTypes()) {
44            m.put(t.getName(), t);
45        }
46        return m;
47    }
48
49    eq FAttribute.matches(String str)   = getName().name().equals(str);
50    eq FDerivedType.matches(String str) = getName().equals(str);
51
52    syn FAttribute FVariable.findAttributeLocal(String name) = findMatching(getFAttributes(), name);
53
54    syn lazy FAttribute FVariable.findAttribute(String name) {
55        FAttribute res = findAttributeLocal(name);
56        if (res == null && myFDerivedType() != null)
57            res = myFDerivedType().findAttribute(name);
58        return res;
59    }
60
61    syn FAttribute FAttribute.findAttribute(String name)        = findMatching(getFAttributes(), name);
62    syn FAttribute FDerivedType.findAttribute(String name)      = findMatching(getFAttributes(), name);
63    syn FAttribute FAbstractEquation.findAttribute(String name) = findMatching(getFAttributes(), name);
64    syn FAttribute FFunctionDecl.findAttribute(String name)     = findMatching(getFAttributes(), name);
65    syn boolean FVariable.attributeSet(FAttribute a)   = (a != null) && a.getAttributeSet();
66    syn FExp    FVariable.attributeExp(FAttribute a)   = (a != null && a.hasValue()) ? a.getValue() : null;
67    syn boolean FVariable.attributeSet(String name)    = attributeSet(findAttribute(name));
68    syn FExp    FVariable.attributeExp(String name)    = attributeExp(findAttribute(name));
69    syn String  FVariable.attributeString(String name) = attributeCValueString(name).stringValue();
70
71    syn FExp FRecordVariable.findHierarchicalAttributeValue(FAccessFull name, int n, String attrName) {
72        FAttribute attr = findHierarchicalAttribute(name, n);
73        if (attr != null) {
74            attr = attr.findAttribute(attrName);
75            if (attr != null) {
76                return attr.getValue();
77            }
78        }
79        return null;
80    }
81
82    syn FAttribute FAbstractVariable.findHierarchicalAttribute(FAccessFull name) =
83            findHierarchicalAttribute(name, name.numParts());
84
85    syn FAttribute FAbstractVariable.findHierarchicalAttribute(FAccessFull name, int n) = null;
86    eq FVariable.findHierarchicalAttribute(FAccessFull name, int n) =
87            name.findHierarchicalAttribute(getFAccess().asFAccessFull(), this, n);
88
89    syn FAttribute FAccess.findHierarchicalAttribute(FAccessFull prefix, FVariable var, int n) = asFAccessFull().findHierarchicalAttribute(prefix, var, n);
90    eq FAccessFull.findHierarchicalAttribute(FAccessFull prefix, FVariable var, int n) {
91        int i = prefix.numMatchingParts(this);
92        if (i >= n)
93            return null;
94        FAttribute attr = var.findAttribute(getFAccessPart(i).getName());
95        for (i++; i < n && attr != null; i++)
96            attr = attr.findAttribute(getFAccessPart(i).getName());
97        return attr;
98    }
99
100    syn CValue FVariable.attributeCValue(String name) {
101        FAttribute a = findAttribute(name);
102        return attributeSet(a) ? attributeExp(a).ceval() : CValue.UNKNOWN;
103    }
104
105    syn CValue FVariable.attributeCValueString(String name) {
106        FAttribute a = findAttribute(name);
107        return (attributeSet(a) ? attributeExp(a).ceval() : new CValueString("")).expandArray(size());
108    }
109    syn CValue FVariable.attributeCValueBoolean(String name, boolean def) {
110        FAttribute a = findAttribute(name);
111        return (attributeSet(a) ? attributeExp(a).ceval() : CValueBoolean.valueOf(def)).expandArray(size());
112    }
113    syn CValue FVariable.attributeCValueReal(String name, double def) {
114        FAttribute a = findAttribute(name);
115        return (attributeSet(a) ? attributeExp(a).ceval() : CValueReal.valueOf(def)).expandArray(size());
116    }
117    syn CValue FVariable.attributeCValueInteger(String name, int def) {
118        FAttribute a = findAttribute(name);
119        return (attributeSet(a) ? attributeExp(a).ceval() : CValueInteger.valueOf(def)).expandArray(size());
120    }
121    syn CValue FVariable.attributeCValueEnum(String name, FType type, int def) {
122        FAttribute a = findAttribute(name);
123        return (attributeSet(a) ? attributeExp(a).ceval() : new CValueEnum(type, def)).expandArray(size());
124    }
125
126    public void FVariable.setAttribute(String name, String type, FExp exp) {
127        setAttribute(name, type, exp, 0);
128    }
129
130    public void FVariable.setAttribute(String name, String type, FExp exp, int level) {
131        FAttribute attr = findMatching(getFAttributes(), name);
132        if (attr == null) {
133            attr = new FAttribute(new FAccessString(type), new FIdDecl(name), exp, true, level);
134            addFAttribute(attr);
135        } else {
136            attr.setValue(exp);
137            attr.setLevel(level);
138        }
139    }
140
141    public void FVariable.unsetAttribute(String name) {
142        List<FAttribute> newList = new List<FAttribute>();
143        for (FAttribute attr : getFAttributes()) {
144            if (!attr.matches(name))
145                newList.add(attr);
146        }
147        setFAttributeList(newList);
148        flushCache();
149    }
150
151    // Quantity attribute
152    syn boolean FVariable.quantityAttributeSet()    = attributeSet(FAttribute.QUANTITY);
153    syn FExp    FVariable.quantityAttributeExp()    = attributeExp(FAttribute.QUANTITY);
154    syn CValue  FVariable.quantityAttributeCValue() = attributeCValueString(FAttribute.QUANTITY);
155    syn String  FVariable.quantityAttribute()       = quantityAttributeCValue().stringValue();
156
157    // Unit attribute
158    syn boolean FVariable.unitAttributeSet()    = attributeSet(FAttribute.UNIT);
159    syn FExp    FVariable.unitAttributeExp()    = attributeExp(FAttribute.UNIT);
160    syn CValue  FVariable.unitAttributeCValue() = attributeCValueString(FAttribute.UNIT);
161    syn String  FVariable.unitAttribute()       = unitAttributeCValue().stringValue();
162
163    // Display Unit attribute
164    syn boolean FVariable.displayUnitAttributeSet()    = attributeSet(FAttribute.DISPLAY_UNIT);
165    syn FExp    FVariable.displayUnitAttributeExp()    = attributeExp(FAttribute.DISPLAY_UNIT);
166    syn CValue  FVariable.displayUnitAttributeCValue() = attributeCValueString(FAttribute.DISPLAY_UNIT);
167    syn String  FVariable.displayUnitAttribute()       = displayUnitAttributeCValue().stringValue();
168
169    // min attribute
170    syn boolean FVariable.minAttributeSet()           = attributeSet(FAttribute.MIN);
171    syn FExp    FVariable.minAttributeExp()           = attributeExp(FAttribute.MIN);
172    syn CValue  FRealVariable.minAttributeCValue()    = attributeCValueReal(FAttribute.MIN, -1e20);
173    syn CValue  FIntegerVariable.minAttributeCValue() = attributeCValueInteger(FAttribute.MIN, (int) -1e10);
174    syn CValue  FEnumVariable.minAttributeCValue()    = attributeCValueEnum(FAttribute.MIN, type(), 1);
175    syn double  FRealVariable.minAttribute()          = minAttributeCValue().realValue();
176    syn int     FIntegerVariable.minAttribute()       = minAttributeCValue().intValue();
177    syn int     FEnumVariable.minAttribute()          = minAttributeCValue().intValue();
178
179    // max attribute
180    syn boolean FVariable.maxAttributeSet()           = attributeSet(FAttribute.MAX);
181    syn FExp    FVariable.maxAttributeExp()           = attributeExp(FAttribute.MAX);
182    syn CValue  FRealVariable.maxAttributeCValue()    = attributeCValueReal(FAttribute.MAX, 1e20);
183    syn CValue  FIntegerVariable.maxAttributeCValue() = attributeCValueInteger(FAttribute.MAX, (int) 1e10);
184    syn CValue  FEnumVariable.maxAttributeCValue()    = attributeCValueEnum(FAttribute.MAX, type(), numEnumLiterals());
185    syn double  FRealVariable.maxAttribute()          = maxAttributeCValue().realValue();
186    syn int     FIntegerVariable.maxAttribute()       = maxAttributeCValue().intValue();
187    syn int     FEnumVariable.maxAttribute()          = maxAttributeCValue().intValue();
188
189    // start attribute
190    syn boolean FVariable.useBindingExpAsStart()  =
191        (isIndependentParameter() || variability().knownParameterOrLess()) && hasBindingExp();
192
193    syn boolean FVariable.startAttributeSet()     = attributeSet(FAttribute.START);
194    syn FExp    FVariable.startAttributeExp()     = attributeExp(FAttribute.START);
195    syn FExp    FVariable.createStartAttributeExp() {
196        FExp e = startAttributeExp();
197        return (e == null) ? startAttributeCValue().buildLiteral() : e.fullCopy();
198    }
199
200    syn CValue FVariable.startAttributeCValue()   = CValue.UNKNOWN;
201    eq FRealVariable.startAttributeCValue()       = attributeCValueReal(FAttribute.START, 0.0);
202    eq FDerivativeVariable.startAttributeCValue() = CValueReal.valueOf(0.0);
203    eq FIntegerVariable.startAttributeCValue()    = attributeCValueInteger(FAttribute.START, 0);
204    eq FBooleanVariable.startAttributeCValue()    = attributeCValueBoolean(FAttribute.START, false);
205    eq FStringVariable.startAttributeCValue()     = attributeCValueString(FAttribute.START);
206    eq FEnumVariable.startAttributeCValue()       = attributeCValueEnum(FAttribute.START, type(), 1);
207
208    syn double  FRealVariable.startAttribute()    = startAttributeCValue().realValue();
209    syn int     FIntegerVariable.startAttribute() = startAttributeCValue().intValue();
210    syn boolean FBooleanVariable.startAttribute() = startAttributeCValue().booleanValue();
211    syn String  FStringVariable.startAttribute()  = startAttributeCValue().stringValue();
212    syn int     FEnumVariable.startAttribute()    = startAttributeCValue().intValue();
213
214    // fixed attribute
215    syn boolean FVariable.fixedAttributeSet()           = attributeSet(FAttribute.FIXED);
216    syn FExp    FVariable.fixedAttributeExp()           = attributeExp(FAttribute.FIXED);
217    syn CValue  FVariable.fixedAttributeCValue()        = attributeCValueBoolean(FAttribute.FIXED, isParameter() || isConstant());
218    syn boolean FVariable.fixedAttribute()              = fixedAttributeCValue().reduceBooleanOr();
219    public void FVariable.setFixedAttribute(boolean value) { setFixedAttribute(FBooleanLitExp.create(value)); }
220    public void FVariable.setFixedAttribute(FExp value)    { setAttribute(FAttribute.FIXED, "Boolean", value); }
221
222    // Nominal attribute
223    syn boolean FVariable.nominalAttributeSet()    = attributeSet(FAttribute.NOMINAL);
224    syn FExp    FVariable.nominalAttributeExp()    = attributeExp(FAttribute.NOMINAL);
225    syn CValue  FVariable.nominalAttributeCValue() = attributeCValueReal(FAttribute.NOMINAL, 1.0);
226    syn double  FVariable.nominalAttribute()       = nominalAttributeCValue().realValue();
227
228    syn boolean FDerivativeVariable.nominalAttributeSet()    = myDifferentiatedVariable().asFVariable().nominalAttributeSet();
229    syn FExp    FDerivativeVariable.nominalAttributeExp()    = myDifferentiatedVariable().asFVariable().nominalAttributeExp();
230    syn CValue  FDerivativeVariable.nominalAttributeCValue() = myDifferentiatedVariable().asFVariable().nominalAttributeCValue();
231
232    // State Select attribute
233    syn boolean FVariable.stateSelectAttributeSet()        = attributeSet(FAttribute.STATE_SELECT);
234    syn FExp    FRealVariable.stateSelectAttributeExp()    = attributeExp(FAttribute.STATE_SELECT);
235    syn CValue  FRealVariable.stateSelectAttributeCValue() = attributeCValueEnum(FAttribute.STATE_SELECT, stateSelectType(), 3);
236    syn int     FRealVariable.stateSelectAttributeInt()    = stateSelectAttributeCValue().intValue();
237
238    public void FVariable.warnStartAttributeNotSet() {
239        if (!ASTNode.printer_C.C_blockResidualAttributePrinter.attributeSet(this, "start"))
240            warning("Iteration variable \"" + name() + "\" is missing start value!");
241    }
242
243
244    /**
245     * Return the maximum numeric value that this expression can take, considering min/max values of variables.
246     *
247     * Only implemented for a small subset of expressions:
248     *  - flat access to Real or Integer
249     *  - numeric literal
250     *  - negation
251     */
252    syn double FExp.maxRealValue() {
253        throw new UnsupportedOperationException();
254    }
255
256    /**
257     * Return the minimum numeric value that this expression can take, considering min/max values of variables.
258     *
259     * Only implemented for a small subset of expressions:
260     *  - flat access to Real or Integer
261     *  - numeric literal
262     *  - negation
263     */
264    syn double FExp.minRealValue() {
265        throw new UnsupportedOperationException();
266    }
267
268    eq FRealLitExp.maxRealValue()    = getValue();
269    eq FRealLitExp.minRealValue()    = getValue();
270    eq FIntegerLitExp.maxRealValue() = getValue();
271    eq FIntegerLitExp.minRealValue() = getValue();
272    eq FNegExp.maxRealValue()        = -getFExp().minRealValue();
273    eq FNegExp.minRealValue()        = -getFExp().maxRealValue();
274    eq FAccessExp.maxRealValue()     = myFV().maxRealValue();
275    eq FAccessExp.minRealValue()     = myFV().minRealValue();
276
277    /**
278     * Return the maximum numeric value that this variable can take.
279     *
280     * Only implemented for Real and Integer variables.
281     */
282    syn double FAbstractVariable.maxRealValue() {
283        throw new UnsupportedOperationException();
284    }
285
286    /**
287     * Return the minimum numeric value that this variable can take.
288     *
289     * Only implemented for Real and Integer variables.
290     */
291    syn double FAbstractVariable.minRealValue() {
292        throw new UnsupportedOperationException();
293    }
294
295    eq FRealVariable.maxRealValue()    = variability().knownParameterOrLess() ? ceval().realValue() : maxAttribute();
296    eq FRealVariable.minRealValue()    = variability().knownParameterOrLess() ? ceval().realValue() : minAttribute();
297    eq FIntegerVariable.maxRealValue() = variability().knownParameterOrLess() ? ceval().intValue() : maxAttribute();
298    eq FIntegerVariable.minRealValue() = variability().knownParameterOrLess() ? ceval().intValue() : minAttribute();
299
300
301    /**
302     * Check if this attribute is in an FVariable.
303     */
304    inh boolean FAttribute.isInFV();
305    eq FVariable.getChild().isInFV()         = true;
306    eq FDerivedType.getChild().isInFV()      = false;
307    eq FAbstractEquation.getChild().isInFV() = false;
308    eq FFunctionDecl.getChild().isInFV()     = false;
309    eq FClass.getChild().isInFV()            = false;
310
311    /**
312     * Check if this attribute is in a specific FVariable.
313     */
314    inh boolean FAttribute.isInFV(FVariable fv);
315    eq FVariable.getChild().isInFV(FVariable fv)         = fv == this;
316    eq FDerivedType.getChild().isInFV(FVariable fv)      = false;
317    eq FAbstractEquation.getChild().isInFV(FVariable fv) = false;
318    eq FFunctionDecl.getChild().isInFV(FVariable fv)     = false;
319    eq FClass.getChild().isInFV(FVariable fv)            = false;
320
321    /**
322     * Check if this attribute is in an FDerivedType.
323     */
324    inh boolean FAttribute.isInDerivedType();
325    eq FVariable.getChild().isInDerivedType()         = false;
326    eq FDerivedType.getChild().isInDerivedType()      = true;
327    eq FAbstractEquation.getChild().isInDerivedType() = false;
328    eq FFunctionDecl.getChild().isInDerivedType()     = false;
329    eq FClass.getChild().isInDerivedType()            = false;
330
331    /**
332     * Check if this attribute is in a specific FDerivedType.
333     */
334    inh boolean FAttribute.isInDerivedType(FDerivedType t);
335    eq FVariable.getChild().isInDerivedType(FDerivedType t)         = false;
336    eq FDerivedType.getChild().isInDerivedType(FDerivedType t)      = t == this;
337    eq FAbstractEquation.getChild().isInDerivedType(FDerivedType t) = false;
338    eq FFunctionDecl.getChild().isInDerivedType(FDerivedType t)     = false;
339    eq FClass.getChild().isInDerivedType(FDerivedType t)            = false;
340
341}
Note: See TracBrowser for help on using the repository browser.