@@ -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>>
1127011246end 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+
1127211289template preCallForArray(Dimensions dims,String tmp)
1127311290::=
1127411291 let operatorCall= dims |> dim hasindex i0 =>
@@ -11281,17 +11298,36 @@ template preCallForArray(Dimensions dims,String tmp)
1128111298end 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>>
1129511331end whenAssign;
1129611332
1129711333template 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