Skip to content

Commit 1580918

Browse files
vwaurichOpenModelica-Hudson
authored andcommitted
fix cpp codegen for tuple assignments in whenOperators
1 parent 3fd4d4f commit 1580918

File tree

1 file changed

+68
-32
lines changed

1 file changed

+68
-32
lines changed

Compiler/Template/CodegenCpp.tpl

Lines changed: 68 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -11234,41 +11234,58 @@ template preCall(list<WhenOperator> whenOps, Context context, Text &varDecls, Si
1123411234
Text extraFuncsNamespace, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation)
1123511235
"Generates assignment for when."
1123611236
::=
11237-
let body = (whenOps |> whenOp =>
11238-
match whenOp
11239-
case e as ASSIGN(left= lhs as DAE.CREF(componentRef = cr)) then
11240-
match typeof(e.right)
11241-
case T_ARRAY(dims=dims) then
11242-
let dimensions = checkDimension(dims)
11243-
let i_tmp_var= System.tmpTick()
11244-
let forLoopIteration = preCallForArray(dims,i_tmp_var)
11245-
let forloop = match listLength(dims) case 1 then
11246-
<<
11247-
<%forLoopIteration%>
11248-
<%cref1(cr, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDecls, stateDerVectorName, useFlatArrayNotation)%>(i0_<%i_tmp_var%>) = _discrete_events->pre(<%cref1(cr, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDecls, stateDerVectorName, useFlatArrayNotation)%>(i0_<%i_tmp_var%>));
11249-
>>
11250-
case 2 then
11251-
<<
11252-
<%forLoopIteration%>
11253-
<%cref1(cr, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDecls, stateDerVectorName, useFlatArrayNotation)%>(i0_<%i_tmp_var%>,i1_<%i_tmp_var%>) = _discrete_events->pre(<%cref1(cr, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDecls, stateDerVectorName, useFlatArrayNotation)%>(i0_<%i_tmp_var%>,i1_<%i_tmp_var%>));
11254-
>>
11255-
else
11256-
error(sourceInfo(), 'No support for this sort of pre call')
11257-
end match
11258-
forloop
11259-
else
11260-
<<
11261-
<%cref1(cr, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDecls, stateDerVectorName, useFlatArrayNotation)%> = _discrete_events->pre(<%cref1(cr, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDecls, stateDerVectorName, useFlatArrayNotation)%>);
11262-
>>
11263-
end match
11264-
else
11265-
<<; // nothing to do>>
11237+
let body = (whenOps |> whenOp => match whenOp
11238+
case whenOp as ASSIGN(__) then
11239+
preCallExp(left, right, context, &varDecls, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
11240+
else
11241+
<<; // nothing to do>>
1126611242
;separator="\n")
1126711243
<<
1126811244
<%body%>
1126911245
>>
1127011246
end preCall;
1127111247

11248+
template preCallExp(Exp left, Exp right, Context context, Text &varDecls, SimCode simCode, Text& extraFuncs, Text& extraFuncsDecl,
11249+
Text extraFuncsNamespace, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation)
11250+
"Generates assignment for when."
11251+
::=
11252+
match left
11253+
case left as DAE.TUPLE(PR = eLst) then
11254+
(eLst |> e => preCallExp(e, right, context, &varDecls, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation);separator="\n")
11255+
case left as DAE.CREF(componentRef = cr) then
11256+
match typeof(right)
11257+
case T_ARRAY(dims=dims) then
11258+
let dimensions = checkDimension(dims)
11259+
let i_tmp_var= System.tmpTick()
11260+
let forLoopIteration = preCallForArray(dims,i_tmp_var)
11261+
let forloop =
11262+
match listLength(dims)
11263+
case 1 then
11264+
<<
11265+
<%forLoopIteration%>
11266+
<%cref1(cr, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDecls, stateDerVectorName, useFlatArrayNotation)%>(i0_<%i_tmp_var%>) = _discrete_events->pre(<%cref1(cr, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDecls, stateDerVectorName, useFlatArrayNotation)%>(i0_<%i_tmp_var%>));
11267+
>>
11268+
case 2 then
11269+
<<
11270+
<%forLoopIteration%>
11271+
<%cref1(cr, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDecls, stateDerVectorName, useFlatArrayNotation)%>(i0_<%i_tmp_var%>,i1_<%i_tmp_var%>) = _discrete_events->pre(<%cref1(cr, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDecls, stateDerVectorName, useFlatArrayNotation)%>(i0_<%i_tmp_var%>,i1_<%i_tmp_var%>));
11272+
>>
11273+
else
11274+
error(sourceInfo(), 'No support for this sort of pre call')
11275+
end match
11276+
<<
11277+
<%forloop%>
11278+
>>
11279+
else
11280+
<<
11281+
<%cref1(cr, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDecls, stateDerVectorName, useFlatArrayNotation)%> = _discrete_events->pre(<%cref1(cr, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDecls, stateDerVectorName, useFlatArrayNotation)%>);
11282+
>>
11283+
end match
11284+
else
11285+
<<; // nothing to do>>
11286+
end match
11287+
end preCallExp;
11288+
1127211289
template preCallForArray(Dimensions dims,String tmp)
1127311290
::=
1127411291
let operatorCall= dims |> dim hasindex i0 =>
@@ -11281,17 +11298,36 @@ template preCallForArray(Dimensions dims,String tmp)
1128111298
end preCallForArray;
1128211299

1128311300

11284-
template whenAssign(ComponentRef left, Type ty, Exp right, Context context, Text &varDecls, SimCode simCode, Text& extraFuncs, Text& extraFuncsDecl,
11301+
template whenAssign(Exp left, Type ty, Exp right, Context context, Text &varDecls, SimCode simCode, Text& extraFuncs, Text& extraFuncsDecl,
1128511302
Text extraFuncsNamespace, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation)
1128611303
"Generates assignment for when."
1128711304
::=
11305+
match left
11306+
case left as DAE.CREF(componentRef = cr) then
1128811307
let &preExp = buffer "" /*BUFD*/
1128911308
let exp = daeExp(right, context, &preExp, &varDecls, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
11290-
let lhs = cref1(left, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, context, varDecls, stateDerVectorName, useFlatArrayNotation)
11309+
let lhs = cref1(cr, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, context, varDecls, stateDerVectorName, useFlatArrayNotation)
1129111310
<<
1129211311
<%preExp%>
1129311312
<%lhs%> = <%exp%>;
1129411313
>>
11314+
case left as DAE.TUPLE(PR = expLst) then
11315+
let &preExp = buffer "" /*BUFD*/
11316+
let crefs = (expLst |> e => ExpressionDumpTpl.dumpExp(e,"\"") ;separator=", ")
11317+
let marker = '(<%crefs%>) = <%ExpressionDumpTpl.dumpExp(right,"\"")%>'
11318+
let retStruct = daeExp(right, context, &preExp, &varDecls, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
11319+
let lhsCrefs = (expLst |> cr hasindex i1 fromindex 0 =>
11320+
let rhsStr = 'get<<%i1%>>(<%retStruct%>.data)'
11321+
writeLhsCref(cr, rhsStr, context, &preExp, &varDecls, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
11322+
;separator="\n";empty)
11323+
<<
11324+
// whenAssign: preExp <%marker%>
11325+
<%preExp%>
11326+
// whenAssign: writeLhsCref
11327+
<%lhsCrefs%>
11328+
>>
11329+
else
11330+
<<dont know whenAssign lhs-type>>
1129511331
end whenAssign;
1129611332

1129711333
template equationIfEquation(SimEqSystem eq, Context context,Text &varDecls /*BUFP*/, SimCode simCode, Text& extraFuncs, Text& extraFuncsDecl, Text extraFuncsNamespace, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation)
@@ -11365,7 +11401,7 @@ template whenOperators(list<WhenOperator> whenOps, Context context, Text &varDec
1136511401
::=
1136611402
let body = (whenOps |> whenOp =>
1136711403
match whenOp
11368-
case ASSIGN(left = lhs as DAE.CREF(componentRef = left)) then whenAssign(left, typeof(right), right, context, &varDecls, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
11404+
case ASSIGN(left = lhs) then whenAssign(lhs, typeof(right), right, context, &varDecls, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
1136911405
case REINIT(__) then
1137011406
let &preExp = buffer "" /*BUFD*/
1137111407
let &varDeclsCref = buffer "" /*BUFD*/

0 commit comments

Comments
 (0)