@@ -59,33 +59,41 @@ import Package = NFPackage;
5959public
6060function evaluate
6161 input output FlatModel flatModel;
62+ protected
63+ Variability const_var;
6264algorithm
63- flatModel. variables := list(evaluateVariable(v) for v in flatModel. variables);
64- flatModel. equations := evaluateEquations(flatModel. equations);
65- flatModel. initialEquations := evaluateEquations(flatModel. initialEquations);
66- flatModel. algorithms := evaluateAlgorithms(flatModel. algorithms);
67- flatModel. initialAlgorithms := evaluateAlgorithms(flatModel. initialAlgorithms);
65+ const_var := if Flags . getConfigBool(Flags . CHECK_MODEL ) then
66+ Variability . CONSTANT else Variability . STRUCTURAL_PARAMETER ;
67+
68+ flatModel. variables := list(evaluateVariable(v, const_var) for v in flatModel. variables);
69+ flatModel. equations := evaluateEquations(flatModel. equations, const_var);
70+ flatModel. initialEquations := evaluateEquations(flatModel. initialEquations, const_var);
71+ flatModel. algorithms := evaluateAlgorithms(flatModel. algorithms, const_var);
72+ flatModel. initialAlgorithms := evaluateAlgorithms(flatModel. initialAlgorithms, const_var);
6873
6974 execStat(getInstanceName());
7075end evaluate;
7176
7277function evaluateVariable
7378 input output Variable var ;
79+ input Variability constVariability;
7480protected
7581 Binding binding;
7682algorithm
77- binding := evaluateBinding(var . binding, Variable . isStructural(var ));
83+ binding := evaluateBinding(var . binding,
84+ Variable . variability(var ) <= constVariability, constVariability);
7885
7986 if not referenceEq(binding, var . binding) then
8087 var . binding := binding;
8188 end if ;
8289
83- var . typeAttributes := list(evaluateTypeAttribute(a) for a in var . typeAttributes);
90+ var . typeAttributes := list(evaluateTypeAttribute(a, constVariability ) for a in var . typeAttributes);
8491end evaluateVariable;
8592
8693function evaluateBinding
8794 input output Binding binding;
8895 input Boolean structural;
96+ input Variability constVariability;
8997protected
9098 Expression exp, eexp;
9199algorithm
@@ -95,7 +103,7 @@ algorithm
95103 if structural then
96104 eexp := Ceval . evalExp(exp, Ceval . EvalTarget . ATTRIBUTE (binding));
97105 else
98- eexp := evaluateExp(exp);
106+ eexp := evaluateExp(exp, constVariability );
99107 end if ;
100108
101109 if not referenceEq(exp, eexp) then
@@ -106,14 +114,15 @@ end evaluateBinding;
106114
107115function evaluateTypeAttribute
108116 input output tuple< String , Binding > attribute;
117+ input Variability constVariability;
109118protected
110119 String name;
111120 Binding binding, sbinding;
112121 Boolean structural;
113122algorithm
114123 (name, binding) := attribute;
115124 structural := name == "fixed" or name == "stateSelect" ;
116- sbinding := evaluateBinding(binding, structural);
125+ sbinding := evaluateBinding(binding, structural, constVariability );
117126
118127 if not referenceEq(binding, sbinding) then
119128 attribute := (name, sbinding);
@@ -122,29 +131,33 @@ end evaluateTypeAttribute;
122131
123132function evaluateExp
124133 input Expression exp;
134+ input Variability constVariability;
125135 output Expression outExp;
126136algorithm
127- outExp := evaluateExpTraverser(exp, false );
137+ outExp := evaluateExpTraverser(exp, constVariability, false );
128138end evaluateExp;
129139
130140function evaluateExpTraverser
131141 input Expression exp;
142+ input Variability constVariability;
132143 input Boolean changed;
133144 output Expression outExp;
134145 output Boolean outChanged;
135146protected
136147 Expression e;
137148 ComponentRef cref;
138149 Type ty;
150+ Variability var ;
139151algorithm
140152 outExp := match exp
141153 case Expression . CREF ()
142154 algorithm
143155 (outExp as Expression . CREF (cref = cref, ty = ty), outChanged) :=
144- Expression . mapFoldShallow(exp, evaluateExpTraverser, false );
156+ Expression . mapFoldShallow(exp,
157+ function evaluateExpTraverser(constVariability = constVariability), false );
145158
146159 // Evaluate constants and structural parameters.
147- if ComponentRef . nodeVariability(cref) <= Variability . STRUCTURAL_PARAMETER then
160+ if ComponentRef . nodeVariability(cref) <= constVariability then
148161 // Evaluate all constants and structural parameters.
149162 outExp := Ceval . evalCref(cref, outExp, Ceval . EvalTarget . IGNORE_ERRORS (), evalSubscripts = false );
150163 outChanged := true ;
@@ -157,7 +170,8 @@ algorithm
157170
158171 else
159172 algorithm
160- (outExp, outChanged) := Expression . mapFoldShallow(exp, evaluateExpTraverser, false );
173+ (outExp, outChanged) := Expression . mapFoldShallow(exp,
174+ function evaluateExpTraverser(constVariability = constVariability), false );
161175 then
162176 if outChanged then Expression . retype(outExp) else outExp;
163177 end match;
@@ -175,7 +189,7 @@ algorithm
175189
176190 case Dimension . EXP ()
177191 algorithm
178- e := evaluateExp(dim. exp);
192+ e := evaluateExp(dim. exp, constVariability = Variability . STRUCTURAL_PARAMETER );
179193 then
180194 if referenceEq(e, dim. exp) then dim else Dimension . fromExp(e, dim. var );
181195
@@ -185,11 +199,13 @@ end evaluateDimension;
185199
186200function evaluateEquations
187201 input list< Equation > eql;
188- output list< Equation > outEql = list(evaluateEquation(e) for e in eql);
202+ input Variability constVariability;
203+ output list< Equation > outEql = list(evaluateEquation(e, constVariability) for e in eql);
189204end evaluateEquations;
190205
191206function evaluateEquation
192207 input output Equation eq;
208+ input Variability constVariability;
193209algorithm
194210 eq := match eq
195211 local
@@ -199,60 +215,61 @@ algorithm
199215 case Equation . EQUALITY ()
200216 algorithm
201217 ty := Type . mapDims(eq. ty, evaluateDimension);
202- e1 := evaluateExp(eq. lhs);
203- e2 := evaluateExp(eq. rhs);
218+ e1 := evaluateExp(eq. lhs, constVariability );
219+ e2 := evaluateExp(eq. rhs, constVariability );
204220 then
205221 Equation . EQUALITY (e1, e2, ty, eq. source);
206222
207223 case Equation . ARRAY_EQUALITY ()
208224 algorithm
209225 ty := Type . mapDims(eq. ty, evaluateDimension);
210- e2 := evaluateExp(eq. rhs);
226+ e2 := evaluateExp(eq. rhs, constVariability );
211227 then
212228 Equation . ARRAY_EQUALITY (eq. lhs, e2, ty, eq. source);
213229
214230 case Equation . FOR ()
215231 algorithm
216- eq. range := Util . applyOption(eq. range, evaluateExp);
217- eq. body := evaluateEquations(eq. body);
232+ eq. range := Util . applyOption(eq. range,
233+ function evaluateExp(constVariability = constVariability));
234+ eq. body := evaluateEquations(eq. body, constVariability);
218235 then
219236 eq;
220237
221238 case Equation . IF ()
222239 algorithm
223- eq. branches := list(evaluateEqBranch(b) for b in eq. branches);
240+ eq. branches := list(evaluateEqBranch(b, constVariability ) for b in eq. branches);
224241 then
225242 eq;
226243
227244 case Equation . WHEN ()
228245 algorithm
229- eq. branches := list(evaluateEqBranch(b) for b in eq. branches);
246+ eq. branches := list(evaluateEqBranch(b, constVariability ) for b in eq. branches);
230247 then
231248 eq;
232249
233250 case Equation . ASSERT ()
234251 algorithm
235- e1 := evaluateExp(eq. condition);
236- e2 := evaluateExp(eq. message);
237- e3 := evaluateExp(eq. level);
252+ e1 := evaluateExp(eq. condition, constVariability );
253+ e2 := evaluateExp(eq. message, constVariability );
254+ e3 := evaluateExp(eq. level, constVariability );
238255 then
239256 Equation . ASSERT (e1, e2, e3, eq. source);
240257
241258 case Equation . TERMINATE ()
242259 algorithm
243- eq. message := evaluateExp(eq. message);
260+ eq. message := evaluateExp(eq. message, constVariability );
244261 then
245262 eq;
246263
247264 case Equation . REINIT ()
248265 algorithm
249- eq. reinitExp := evaluateExp(eq. reinitExp);
266+ eq. reinitExp := evaluateExp(eq. reinitExp, constVariability );
250267 then
251268 eq;
252269
253270 case Equation . NORETCALL ()
254271 algorithm
255- eq. exp := evaluateExp(eq. exp);
272+ eq. exp := evaluateExp(eq. exp, constVariability );
256273 then
257274 eq;
258275
@@ -262,6 +279,7 @@ end evaluateEquation;
262279
263280function evaluateEqBranch
264281 input Branch branch;
282+ input Variability constVariability;
265283 output Branch outBranch;
266284algorithm
267285 outBranch := match branch
@@ -271,8 +289,8 @@ algorithm
271289
272290 case Branch . BRANCH (condition = condition, body = body)
273291 algorithm
274- condition := evaluateExp(condition);
275- body := evaluateEquations(body);
292+ condition := evaluateExp(condition, constVariability = Variability . STRUCTURAL_PARAMETER );
293+ body := evaluateEquations(body, constVariability );
276294 then
277295 Branch . BRANCH (condition, branch. conditionVar, body);
278296
@@ -282,22 +300,26 @@ end evaluateEqBranch;
282300
283301function evaluateAlgorithms
284302 input list< Algorithm > algs;
285- output list< Algorithm > outAlgs = list(evaluateAlgorithm(a) for a in algs);
303+ input Variability constVariability;
304+ output list< Algorithm > outAlgs = list(evaluateAlgorithm(a, constVariability) for a in algs);
286305end evaluateAlgorithms;
287306
288307function evaluateAlgorithm
289308 input output Algorithm alg;
309+ input Variability constVariability;
290310algorithm
291- alg. statements := evaluateStatements(alg. statements);
311+ alg. statements := evaluateStatements(alg. statements, constVariability );
292312end evaluateAlgorithm;
293313
294314function evaluateStatements
295315 input list< Statement > stmts;
296- output list< Statement > outStmts = list(evaluateStatement(s) for s in stmts);
316+ input Variability constVariability;
317+ output list< Statement > outStmts = list(evaluateStatement(s, constVariability) for s in stmts);
297318end evaluateStatements;
298319
299320function evaluateStatement
300321 input output Statement stmt;
322+ input Variability constVariability;
301323algorithm
302324 stmt := match stmt
303325 local
@@ -307,54 +329,55 @@ algorithm
307329 case Statement . ASSIGNMENT ()
308330 algorithm
309331 ty := Type . mapDims(stmt. ty, evaluateDimension);
310- e1 := evaluateExp(stmt. lhs);
311- e2 := evaluateExp(stmt. rhs);
332+ e1 := evaluateExp(stmt. lhs, constVariability );
333+ e2 := evaluateExp(stmt. rhs, constVariability );
312334 then
313335 Statement . ASSIGNMENT (e1, e2, ty, stmt. source);
314336
315337 case Statement . FOR ()
316338 algorithm
317- stmt. range := Util . applyOption(stmt. range, evaluateExp);
318- stmt. body := evaluateStatements(stmt. body);
339+ stmt. range := Util . applyOption(stmt. range,
340+ function evaluateExp(constVariability = constVariability));
341+ stmt. body := evaluateStatements(stmt. body, constVariability);
319342 then
320343 stmt;
321344
322345 case Statement . IF ()
323346 algorithm
324- stmt. branches := list(evaluateStmtBranch(b) for b in stmt. branches);
347+ stmt. branches := list(evaluateStmtBranch(b, constVariability ) for b in stmt. branches);
325348 then
326349 stmt;
327350
328351 case Statement . WHEN ()
329352 algorithm
330- stmt. branches := list(evaluateStmtBranch(b) for b in stmt. branches);
353+ stmt. branches := list(evaluateStmtBranch(b, constVariability ) for b in stmt. branches);
331354 then
332355 stmt;
333356
334357 case Statement . ASSERT ()
335358 algorithm
336- e1 := evaluateExp(stmt. condition);
337- e2 := evaluateExp(stmt. message);
338- e3 := evaluateExp(stmt. level);
359+ e1 := evaluateExp(stmt. condition, constVariability );
360+ e2 := evaluateExp(stmt. message, constVariability );
361+ e3 := evaluateExp(stmt. level, constVariability );
339362 then
340363 Statement . ASSERT (e1, e2, e3, stmt. source);
341364
342365 case Statement . TERMINATE ()
343366 algorithm
344- stmt. message := evaluateExp(stmt. message);
367+ stmt. message := evaluateExp(stmt. message, constVariability );
345368 then
346369 stmt;
347370
348371 case Statement . NORETCALL ()
349372 algorithm
350- stmt. exp := evaluateExp(stmt. exp);
373+ stmt. exp := evaluateExp(stmt. exp, constVariability );
351374 then
352375 stmt;
353376
354377 case Statement . WHILE ()
355378 algorithm
356- stmt. condition := evaluateExp(stmt. condition);
357- stmt. body := evaluateStatements(stmt. body);
379+ stmt. condition := evaluateExp(stmt. condition, constVariability );
380+ stmt. body := evaluateStatements(stmt. body, constVariability );
358381 then
359382 stmt;
360383
@@ -364,14 +387,15 @@ end evaluateStatement;
364387
365388function evaluateStmtBranch
366389 input tuple< Expression , list< Statement >> branch;
390+ input Variability constVariability;
367391 output tuple< Expression , list< Statement >> outBranch;
368392protected
369393 Expression cond;
370394 list< Statement > body;
371395algorithm
372396 (cond, body) := branch;
373- cond := evaluateExp(cond);
374- body := evaluateStatements(body);
397+ cond := evaluateExp(cond, constVariability = Variability . STRUCTURAL_PARAMETER );
398+ body := evaluateStatements(body, constVariability );
375399 outBranch := (cond, body);
376400end evaluateStmtBranch;
377401
0 commit comments