Skip to content

Commit

Permalink
Fix multi-dimensional arrays in Cpp init.xml, ticket:4072
Browse files Browse the repository at this point in the history
  • Loading branch information
rfranke committed Oct 17, 2016
1 parent db80ad1 commit 8b1f74e
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 5 deletions.
14 changes: 12 additions & 2 deletions Compiler/SimCode/SimCodeUtil.mo
Expand Up @@ -12577,14 +12577,24 @@ public function getValueReference
algorithm
outValueReference := match (inSimVar, inElimNegAliases, Config.simCodeTarget())
local
SimCodeVar.SimVar simVar;
DAE.ComponentRef cref;
String valueReference;
case (SimCodeVar.SIMVAR(aliasvar = SimCodeVar.NEGATEDALIAS(_)), false, _) then
getDefaultValueReference(inSimVar, inSimCode.modelInfo.varInfo);
case (_, _, "Cpp") algorithm
valueReference := getVarIndexByMapping(inSimCode.varToArrayIndexMapping, inSimVar.name, true, "-1");
// resolve aliases to get multi-dimensional arrays right
// (this should possibly be done in getVarIndexByMapping?)
simVar := match inSimVar
case SimCodeVar.SIMVAR(aliasvar = SimCodeVar.ALIAS(varName = cref))
then SimCodeFunctionUtil.cref2simvar(cref, inSimCode);
case SimCodeVar.SIMVAR(aliasvar = SimCodeVar.NEGATEDALIAS(varName = cref))
then SimCodeFunctionUtil.cref2simvar(cref, inSimCode);
else inSimVar;
end match;
valueReference := getVarIndexByMapping(inSimCode.varToArrayIndexMapping, simVar.name, true, "-1");
if stringEqual(valueReference, "-1") then
Error.addInternalError("invalid return value from getVarIndexByMapping for "+simVarString(inSimVar), sourceInfo());
Error.addInternalError("invalid return value from getVarIndexByMapping for " + simVarString(simVar), sourceInfo());
end if;
then valueReference;
case (SimCodeVar.SIMVAR(aliasvar = SimCodeVar.ALIAS(varName = cref)), _, _) then
Expand Down
6 changes: 3 additions & 3 deletions Compiler/Template/CodegenCppInit.tpl
Expand Up @@ -122,18 +122,18 @@ template scalarVariableXML(SimCode simCode, SimVar simVar, HashTableCrIListArray
let variableCode = if generateFMUModelDescription then CodegenFMUCommon.ScalarVariableType(simVar) else
ScalarVariableType(simCode, name, aliasvar, unit, displayUnit, minValue, maxValue, initialValue, nominalValue, isFixed, type_, complexStartExpressions, stateDerVectorName)
<<
<ScalarVariable <%scalarVariableAttributeXML(simVar, varToArrayIndexMapping, indexForUndefinedReferences, generateFMUModelDescription)%>>
<ScalarVariable <%scalarVariableAttributeXML(simVar, simCode, indexForUndefinedReferences, generateFMUModelDescription)%>>
<%variableCode%>
</ScalarVariable>
>>
end scalarVariableXML;

template scalarVariableAttributeXML(SimVar simVar, HashTableCrIListArray.HashTable varToArrayIndexMapping, String indexForUndefinedReferences, Boolean generateFMUModelDescription)
template scalarVariableAttributeXML(SimVar simVar, SimCode simCode, String indexForUndefinedReferences, Boolean generateFMUModelDescription)
"Generates code for ScalarVariable Attribute file for FMU target."
::=
match simVar
case SIMVAR(source = SOURCE(info = info)) then
let valueReference = SimCodeUtil.getVarIndexByMapping(varToArrayIndexMapping,name,true,indexForUndefinedReferences)
let valueReference = SimCodeUtil.getValueReference(simVar, simCode, true)
let alias = getAliasAttribute(aliasvar)
let causalityAtt = CodegenFMUCommon.getCausality(causality)
let variability = getVariablity(varKind)
Expand Down

0 comments on commit 8b1f74e

Please sign in to comment.