Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit d2540cc

Browse files
perostOpenModelica-Hudson
authored andcommitted
[NF] Improve unit checking.
- Make constant variability configurable in EvalConstants, and use it to not evaluate structural parameters in general when checking a model. Belonging to [master]: - OpenModelica/OpenModelica#170 - #3082
1 parent 6cebda4 commit d2540cc

File tree

2 files changed

+77
-48
lines changed

2 files changed

+77
-48
lines changed

Compiler/NFFrontEnd/NFEvalConstants.mo

Lines changed: 72 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -59,33 +59,41 @@ import Package = NFPackage;
5959
public
6060
function evaluate
6161
input output FlatModel flatModel;
62+
protected
63+
Variability const_var;
6264
algorithm
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());
7075
end evaluate;
7176

7277
function evaluateVariable
7378
input output Variable var;
79+
input Variability constVariability;
7480
protected
7581
Binding binding;
7682
algorithm
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);
8491
end evaluateVariable;
8592

8693
function evaluateBinding
8794
input output Binding binding;
8895
input Boolean structural;
96+
input Variability constVariability;
8997
protected
9098
Expression exp, eexp;
9199
algorithm
@@ -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

107115
function evaluateTypeAttribute
108116
input output tuple<String, Binding> attribute;
117+
input Variability constVariability;
109118
protected
110119
String name;
111120
Binding binding, sbinding;
112121
Boolean structural;
113122
algorithm
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

123132
function evaluateExp
124133
input Expression exp;
134+
input Variability constVariability;
125135
output Expression outExp;
126136
algorithm
127-
outExp := evaluateExpTraverser(exp, false);
137+
outExp := evaluateExpTraverser(exp, constVariability, false);
128138
end evaluateExp;
129139

130140
function evaluateExpTraverser
131141
input Expression exp;
142+
input Variability constVariability;
132143
input Boolean changed;
133144
output Expression outExp;
134145
output Boolean outChanged;
135146
protected
136147
Expression e;
137148
ComponentRef cref;
138149
Type ty;
150+
Variability var;
139151
algorithm
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

186200
function 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);
189204
end evaluateEquations;
190205

191206
function evaluateEquation
192207
input output Equation eq;
208+
input Variability constVariability;
193209
algorithm
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

263280
function evaluateEqBranch
264281
input Branch branch;
282+
input Variability constVariability;
265283
output Branch outBranch;
266284
algorithm
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

283301
function 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);
286305
end evaluateAlgorithms;
287306

288307
function evaluateAlgorithm
289308
input output Algorithm alg;
309+
input Variability constVariability;
290310
algorithm
291-
alg.statements := evaluateStatements(alg.statements);
311+
alg.statements := evaluateStatements(alg.statements, constVariability);
292312
end evaluateAlgorithm;
293313

294314
function 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);
297318
end evaluateStatements;
298319

299320
function evaluateStatement
300321
input output Statement stmt;
322+
input Variability constVariability;
301323
algorithm
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

365388
function evaluateStmtBranch
366389
input tuple<Expression, list<Statement>> branch;
390+
input Variability constVariability;
367391
output tuple<Expression, list<Statement>> outBranch;
368392
protected
369393
Expression cond;
370394
list<Statement> body;
371395
algorithm
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);
376400
end evaluateStmtBranch;
377401

Compiler/NFFrontEnd/NFVariable.mo

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@ public
8686
variable.attributes.variability <= Variability.STRUCTURAL_PARAMETER;
8787
end isStructural;
8888

89+
function variability
90+
input Variable variable;
91+
output Variability variability = variable.attributes.variability;
92+
end variability;
93+
8994
function isEmptyArray
9095
input Variable variable;
9196
output Boolean isEmpty = Type.isEmptyArray(variable.ty);

0 commit comments

Comments
 (0)