Skip to content

Commit

Permalink
Fix Cpp writeLhsCref to not use ArraySliceConst on lhs (#7648)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
rfranke committed Jul 3, 2021
1 parent 8440874 commit 8f503c4
Showing 1 changed file with 28 additions and 30 deletions.
58 changes: 28 additions & 30 deletions OMCompiler/Compiler/Template/CodegenCppCommon.tpl
Expand Up @@ -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
Expand All @@ -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
<<
Expand All @@ -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%>_;'
Expand All @@ -2841,23 +2844,26 @@ 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%>;
>>
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%>
Expand All @@ -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;


Expand Down

0 comments on commit 8f503c4

Please sign in to comment.