Skip to content

Commit 06e511f

Browse files
perostOpenModelica-Hudson
authored andcommitted
[NF] Array equation fixes.
- Use DAE.UMINUS_ARR in NFOperator.toDAE for array types instead of the scalar operator DAE.UMINUS. - Simplify InlineArrayEquations.getScalarArrayEqns1. Belonging to [master]: - OpenModelica/OMCompiler#2575
1 parent 65d1390 commit 06e511f

File tree

3 files changed

+42
-59
lines changed

3 files changed

+42
-59
lines changed

Compiler/BackEnd/InlineArrayEquations.mo

Lines changed: 40 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -134,67 +134,50 @@ protected function getScalarArrayEqns1
134134
output list<BackendDAE.Equation> outEqnLst;
135135
output Boolean outFound;
136136
algorithm
137-
(outEqnLst, outFound) := matchcontinue(inEqn, inAccEqnLst)
137+
(outEqnLst, outFound) := matchcontinue inEqn
138138
local
139139
DAE.ElementSource source;
140-
DAE.Exp lhs, rhs, e1_1, e2_1;
140+
DAE.Exp lhs, rhs, e1, e2;
141141
list<DAE.Exp> ea1, ea2;
142142
list<BackendDAE.Equation> eqns;
143-
BackendDAE.EquationAttributes eqAttr;
144-
145-
case (BackendDAE.ARRAY_EQUATION(left=lhs, right=rhs, source=source, attr=eqAttr), _) equation
146-
true = Expression.isArray(lhs) or Expression.isMatrix(lhs);
147-
true = Expression.isArray(rhs) or Expression.isMatrix(rhs);
148-
ea1 = Expression.flattenArrayExpToList(lhs);
149-
ea2 = Expression.flattenArrayExpToList(rhs);
150-
((_, eqns)) = List.threadFold3(ea1, ea2, generateScalarArrayEqns2, source, eqAttr, DAE.EQUALITY_EXPS(lhs, rhs), (1, inAccEqnLst));
151-
then (eqns, true);
152-
153-
case (BackendDAE.ARRAY_EQUATION(left=(lhs as DAE.CREF()), right=rhs, source=source, attr=eqAttr), _) equation
154-
// the lhs array is expressed as a cref
155-
true = Expression.isArray(rhs) or Expression.isMatrix(rhs);
156-
(e1_1, _) = Expression.extendArrExp(lhs, false);
157-
ea1 = Expression.flattenArrayExpToList(e1_1);
158-
ea2 = Expression.flattenArrayExpToList(rhs);
159-
((_, eqns)) = List.threadFold3(ea1, ea2, generateScalarArrayEqns2, source, eqAttr, DAE.EQUALITY_EXPS(lhs, rhs), (1, inAccEqnLst));
160-
then (eqns, true);
161-
162-
case (BackendDAE.ARRAY_EQUATION(left=lhs, right=rhs as DAE.CREF(), source=source, attr=eqAttr), _) equation
163-
true = Expression.isArray(lhs) or Expression.isMatrix(lhs);
164-
(e2_1, _) = Expression.extendArrExp(rhs,false);
165-
ea1 = Expression.flattenArrayExpToList(lhs);
166-
ea2 = Expression.flattenArrayExpToList(e2_1);
167-
((_, eqns)) = List.threadFold3(ea1, ea2, generateScalarArrayEqns2, source, eqAttr, DAE.EQUALITY_EXPS(lhs, rhs), (1, inAccEqnLst));
168-
then (eqns,true);
169-
170-
case (BackendDAE.ARRAY_EQUATION(left=lhs as DAE.CREF(),right=rhs as DAE.CREF(), source=source, attr=eqAttr), _) equation
171-
(e1_1, _) = Expression.extendArrExp(lhs, false);
172-
(e2_1, _) = Expression.extendArrExp(rhs, false);
173-
ea1 = Expression.flattenArrayExpToList(e1_1);
174-
ea2 = Expression.flattenArrayExpToList(e2_1);
175-
((_, eqns)) = List.threadFold3(ea1, ea2, generateScalarArrayEqns2, source, eqAttr, DAE.EQUALITY_EXPS(lhs, rhs), (1, inAccEqnLst));
176-
then (eqns, true);
177-
178-
case (BackendDAE.ARRAY_EQUATION(left=lhs,right=rhs, source=source, attr=eqAttr), _) equation
179-
(e1_1, _) = Expression.extendArrExp(lhs, false);
180-
(e2_1, _) = Expression.extendArrExp(rhs, false);
181-
(e1_1,_) = ExpressionSimplify.simplify(e1_1);
182-
(e2_1,_) = ExpressionSimplify.simplify(e2_1);
183-
true = Expression.isArray(e1_1) or Expression.isMatrix(e1_1);
184-
true = Expression.isArray(e2_1) or Expression.isMatrix(e2_1);
185-
ea1 = Expression.flattenArrayExpToList(e1_1);
186-
ea2 = Expression.flattenArrayExpToList(e2_1);
187-
((_, eqns)) = List.threadFold3(ea1, ea2, generateScalarArrayEqns2, source, eqAttr, DAE.EQUALITY_EXPS(lhs, rhs), (1, inAccEqnLst));
188-
then (eqns, true);
189-
190-
case (BackendDAE.COMPLEX_EQUATION(left=lhs, right=rhs, source=source, attr=eqAttr), _) equation
191-
ea1 = Expression.splitRecord(lhs,Expression.typeof(lhs));
192-
ea2 = Expression.splitRecord(rhs,Expression.typeof(rhs));
193-
((_, eqns)) = List.threadFold3(ea1, ea2, generateScalarArrayEqns2, source, eqAttr, DAE.EQUALITY_EXPS(lhs, rhs), (1, inAccEqnLst));
194-
then (eqns, true);
195-
196-
case (_, _)
197-
then (inEqn::inAccEqnLst, false);
143+
BackendDAE.EquationAttributes attr;
144+
DAE.Exp e1_1, e2_1;
145+
146+
case BackendDAE.ARRAY_EQUATION(left = lhs, right = rhs, source = source, attr = attr)
147+
algorithm
148+
if Expression.isArray(lhs) or Expression.isMatrix(lhs) then
149+
ea1 := Expression.flattenArrayExpToList(lhs);
150+
else
151+
e1 := Expression.extendArrExp(lhs);
152+
e1 := ExpressionSimplify.simplify(e1);
153+
true := Expression.isArray(e1) or Expression.isMatrix(e1);
154+
ea1 := Expression.flattenArrayExpToList(e1);
155+
end if;
156+
157+
if Expression.isArray(rhs) or Expression.isMatrix(rhs) then
158+
ea2 := Expression.flattenArrayExpToList(rhs);
159+
else
160+
e2 := Expression.extendArrExp(rhs);
161+
e2 := ExpressionSimplify.simplify(e2);
162+
true := Expression.isArray(e2) or Expression.isMatrix(e2);
163+
ea2 := Expression.flattenArrayExpToList(e2);
164+
end if;
165+
166+
((_, eqns)) := List.threadFold3(ea1, ea2, generateScalarArrayEqns2,
167+
source, attr, DAE.EQUALITY_EXPS(lhs, rhs), (1, inAccEqnLst));
168+
then
169+
(eqns, true);
170+
171+
case BackendDAE.COMPLEX_EQUATION(left = lhs, right = rhs, source = source, attr = attr)
172+
algorithm
173+
ea1 := Expression.splitRecord(lhs, Expression.typeof(lhs));
174+
ea2 := Expression.splitRecord(rhs, Expression.typeof(rhs));
175+
((_, eqns)) := List.threadFold3(ea1, ea2, generateScalarArrayEqns2,
176+
source, attr, DAE.EQUALITY_EXPS(lhs, rhs), (1, inAccEqnLst));
177+
then
178+
(eqns, true);
179+
180+
else (inEqn :: inAccEqnLst, false);
198181
end matchcontinue;
199182
end getScalarArrayEqns1;
200183

Compiler/FrontEnd/Expression.mo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12093,7 +12093,7 @@ end expandExpression;
1209312093
public function extendArrExp "author: Frenkel TUD 2010-07
1209412094
alternative name: vectorizeExp"
1209512095
input DAE.Exp inExp;
12096-
input Boolean inExpanded "True if something was expanded, otherwise false.";
12096+
input Boolean inExpanded = false "True if something was expanded, otherwise false.";
1209712097
output DAE.Exp outExp;
1209812098
output Boolean outExpanded;
1209912099
algorithm

Compiler/NFFrontEnd/NFOperator.mo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ public
165165
case Op.POW_SCALAR_ARRAY then DAE.POW_SCALAR_ARRAY(ty);
166166
case Op.POW_ARRAY_SCALAR then DAE.POW_ARRAY_SCALAR(ty);
167167
case Op.POW_MATRIX then DAE.POW_ARR(ty);
168-
case Op.UMINUS then DAE.UMINUS(ty);
168+
case Op.UMINUS then if Type.isArray(op.ty) then DAE.UMINUS_ARR(ty) else DAE.UMINUS(ty);
169169
case Op.AND then DAE.AND(ty);
170170
case Op.OR then DAE.OR(ty);
171171
case Op.NOT then DAE.NOT(ty);

0 commit comments

Comments
 (0)