From 8f503c42ff6caa0133a1ad9786226a008f379dee Mon Sep 17 00:00:00 2001 From: rfranke Date: Sat, 3 Jul 2021 12:48:38 +0200 Subject: [PATCH] Fix Cpp writeLhsCref to not use ArraySliceConst on lhs (#7648) * Fix Cpp writeLhsCref to not use ArraySliceConst on lhs Call 'daeExpCref(isLhs=true, ...)' instead of 'daeExpCrefRhs(...)' in scalarLhsCref. See e.g. PowerSystems.Examples.AC3ph.Precalculation.TransDatFromEqCirc raising: ERROR : init : SimManager: Can't assign array to ArraySliceConst * Whitespaces --- .../Compiler/Template/CodegenCppCommon.tpl | 58 +++++++++---------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/OMCompiler/Compiler/Template/CodegenCppCommon.tpl b/OMCompiler/Compiler/Template/CodegenCppCommon.tpl index 1b30cd77978..d5815af3337 100644 --- a/OMCompiler/Compiler/Template/CodegenCppCommon.tpl +++ b/OMCompiler/Compiler/Template/CodegenCppCommon.tpl @@ -2801,7 +2801,7 @@ match exp case ecr as CREF(componentRef=WILD(__)) then '' case ecr as CREF(componentRef=cr, ty=ty as DAE.T_ARRAY()) then - let lhsStr = scalarLhsCref(exp, context, &preExp /*BUFC*/, &varDecls /*BUFD*/,simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) + let lhsStr = scalarLhsCref(exp, context, &preExp, &varDecls, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) match cref2simvar(cr, simCode) case SIMVAR(varKind=varKind) then match varKind @@ -2817,8 +2817,8 @@ case ecr as CREF(componentRef=cr, ty=ty as DAE.T_ARRAY()) then >> end match end match -case UNARY(exp = e as CREF(ty= t as DAE.T_ARRAY(__))) then - let lhsStr = scalarLhsCref(e, context, &preExp /*BUFC*/, &varDecls /*BUFD*/,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) +case UNARY(exp = e as CREF(ty=t as DAE.T_ARRAY(__))) then + let lhsStr = scalarLhsCref(e, context, &preExp, &varDecls, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) match context case SIMULATION_CONTEXT(__) then << @@ -2830,9 +2830,12 @@ case UNARY(exp = e as CREF(ty= t as DAE.T_ARRAY(__))) then case CREF(componentRef = cr, ty=DAE.T_COMPLEX(varLst = varLst, complexClassType=RECORD(__))) then match context case FUNCTION_CONTEXT(__) then - writeLhsCref1(exp, rhsStr, context, &preExp /*BUFC*/, &varDecls /*BUFD*/, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) + let lhsStr = scalarLhsCref(exp, context, &preExp, &varDecls, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) + << + <%lhsStr%> = <%rhsStr%>; + >> else - let lhsStr = contextCref(crefStripSubs(cr), context, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) + let lhsStr = contextCref(crefStripSubs(cr), context, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) << <% varLst |> var as TYPES_VAR(__) hasindex i1 fromindex 0 => '_<%lhsStr%>P_<%var.name%>_ = <%rhsStr%>.<%var.name%>_;' @@ -2841,9 +2844,12 @@ case CREF(componentRef = cr, ty=DAE.T_COMPLEX(varLst = varLst, complexClassType= >> end match case CREF(__) then - writeLhsCref1(exp, rhsStr, context, &preExp /*BUFC*/, &varDecls /*BUFD*/, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) + let lhsStr = scalarLhsCref(exp, context, &preExp, &varDecls, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) + << + <%lhsStr%> = <%rhsStr%>; + >> case UNARY(exp = e as CREF(__)) then - let lhsStr = scalarLhsCref(e, context, &preExp /*BUFC*/, &varDecls /*BUFD*/,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) + let lhsStr = scalarLhsCref(e, context, &preExp, &varDecls, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) << <%lhsStr%> = -<%rhsStr%>; >> @@ -2851,13 +2857,13 @@ case ARRAY(array = {}) then << >> -case ARRAY(ty=T_ARRAY(ty=ty,dims=dims),array=expl) then +case ARRAY(ty=T_ARRAY(ty=ty, dims=dims), array=expl) then let typeShort = expTypeFromExpShort(exp) let fcallsuf = match listLength(dims) case 1 then "" case i then '_<%i%>D' let body = (List.zip(expl,dimsToAllIndexes(dims)) |> (lhs,indxs) => let lhsstr = scalarLhsCref(lhs, context, &preExp /*BUFC*/, &varDecls /*BUFD*/,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) let indxstr = (indxs |> i => '<%i%>' ;separator=",") - '<%lhsstr%> = <%typeShort%>_get<%fcallsuf%>(&<%rhsStr%>, <%indxstr%>);/*writeLhsCref2*/' + '<%lhsstr%> = <%typeShort%>_get<%fcallsuf%>(&<%rhsStr%>, <%indxstr%>);' ;separator="\n") << <%body%> @@ -2884,35 +2890,27 @@ else end writeLhsCref; -template writeLhsCref1(Exp exp, String rhsStr, Context context, Text &preExp,Text &varDecls, SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation) - "Generate a simple assignment of a tuple element" +template scalarLhsCref(Exp ecr, Context context, Text &preExp, Text &varDecls, SimCode simCode, Text& extraFuncs, Text& extraFuncsDecl, Text extraFuncsNamespace, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation) + "Generates a single lhs cref of an assignment" ::= - let lhsStr = scalarLhsCref(exp, context, &preExp /*BUFC*/, &varDecls /*BUFD*/,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) - << - <%lhsStr%> = <%rhsStr%> /*writeLhsCref1*/; - >> -end writeLhsCref1; - -template scalarLhsCref(Exp ecr, Context context, Text &preExp,Text &varDecls, SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation) ::= match ecr case ecr as CREF(componentRef=CREF_IDENT(subscriptLst=subs)) then if crefNoSub(ecr.componentRef) then - contextCref(ecr.componentRef, context,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) + contextCref(ecr.componentRef, context, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) else - daeExpCrefRhs(ecr, context, &preExp, &varDecls, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) + daeExpCref(true, ecr, context, &preExp, &varDecls, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) case ecr as CREF(componentRef=cr as CREF_QUAL(__)) then - if crefIsScalar(cr, context) then - contextCref(ecr.componentRef, context,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) - else - let arrName = contextCref(crefStripSubs(cr), context, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) - << - <%arrName%>(<%threadDimSubList(crefDims(cr),crefSubs(cr),context,&preExp,&varDecls,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%>) - >> - + if crefIsScalar(cr, context) then + contextCref(ecr.componentRef, context, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) + else + let arrName = contextCref(crefStripSubs(cr), context, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) + << + <%arrName%>(<%threadDimSubList(crefDims(cr), crefSubs(cr), context, &preExp, &varDecls, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%>) + >> case ecr as CREF(componentRef=CREF_QUAL(__)) then - contextCref(ecr.componentRef, context,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) + contextCref(ecr.componentRef, context, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) else - "ONLY_IDENT_OR_QUAL_CREF_SUPPORTED_SLHS" + error(sourceInfo(), 'scalarLhsCref UNSUPPORTED: <%ExpressionDumpTpl.dumpExp(ecr,"\"")%>') end scalarLhsCref;