Skip to content

Commit

Permalink
Fix initialization of start attributes
Browse files Browse the repository at this point in the history
  • Loading branch information
lochel authored and OpenModelica-Hudson committed Mar 28, 2017
1 parent 803f52c commit 03e06df
Show file tree
Hide file tree
Showing 5 changed files with 134 additions and 34 deletions.
46 changes: 41 additions & 5 deletions Compiler/BackEnd/BackendDAEUtil.mo
Expand Up @@ -2739,12 +2739,20 @@ public function traversingIncidenceRowExpFinderBaseClock "author: lochel
algorithm
(outExp,cont,outTpl) := matchcontinue (inExp,inTpl)
local
list<Integer> p;
list<Integer> p, p2;
AvlSetInt.Tree pa;
DAE.ComponentRef cr;
BackendDAE.Variables vars;
DAE.Exp e;

case (DAE.CREF(componentRef=cr), (vars, pa))
equation
(_, p) = BackendVariable.getVar(cr, vars);
(_, p2) = BackendVariable.getVar(ComponentReference.crefPrefixStart(cr), vars);
pa = AvlSetInt.addList(pa, p);
pa = AvlSetInt.addList(pa, p2);
then (inExp, true, (vars, pa));

case (DAE.CREF(componentRef=cr), (vars, pa))
equation
(_, p) = BackendVariable.getVar(cr, vars);
Expand Down Expand Up @@ -2776,11 +2784,19 @@ public function traversingIncidenceRowExpFinderSubClock "author: lochel
algorithm
(outExp,cont,outTpl) := matchcontinue (inExp,inTpl)
local
list<Integer> p;
list<Integer> p, p2;
AvlSetInt.Tree pa, res;
DAE.ComponentRef cr;
BackendDAE.Variables vars;

case (DAE.CREF(componentRef=cr), (vars, pa))
equation
(_, p) = BackendVariable.getVar(cr, vars);
(_, p2) = BackendVariable.getVar(ComponentReference.crefPrefixStart(cr), vars);
res = AvlSetInt.addList(pa, p);
res = AvlSetInt.addList(res, p2);
then (inExp, true, (vars, res));

case (DAE.CREF(componentRef=cr), (vars, pa))
equation
(_, p) = BackendVariable.getVar(cr, vars);
Expand Down Expand Up @@ -2817,7 +2833,7 @@ public function traversingincidenceRowExpFinder "
algorithm
(outExp,cont,outTpl) := matchcontinue(inExp,inTpl)
local
list<Integer> p;
list<Integer> p, p2;
AvlSetInt.Tree pa,res;
DAE.ComponentRef cr;
BackendDAE.Variables vars;
Expand All @@ -2827,11 +2843,22 @@ algorithm
Integer i;
String str;

// var and var.start
case (e as DAE.CREF(componentRef=cr), (vars, pa))
equation
(varslst, p) = BackendVariable.getVar(cr, vars);
(varslst, p2) = BackendVariable.getVar(ComponentReference.crefPrefixStart(cr), vars);

res = incidenceRowExp1(varslst, p, pa, 0);
res = incidenceRowExp1(varslst, p2, res, 0);
then (e, true, (vars, res));

// only var
case (e as DAE.CREF(componentRef = cr),(vars,pa))
equation
(varslst,p) = BackendVariable.getVar(cr, vars);
res = incidenceRowExp1(varslst,p,pa,0);
then (e,true,(vars,res));
then (e, true, (vars,res));

case (e as DAE.CALL(path = Absyn.IDENT(name = "der"),expLst = {DAE.CREF(componentRef = cr)}),(vars,pa))
equation
Expand Down Expand Up @@ -2944,11 +2971,20 @@ algorithm
res = incidenceRowExp1withInput(varslst,p,pa,0);
then (inExp,false,(vars,res));

case (DAE.CREF(componentRef=cr), (vars, pa))
equation
(varslst, p) = BackendVariable.getVar(cr, vars);
res = incidenceRowExp1withInput(varslst, p, pa, 0);

(varslst, p) = BackendVariable.getVar(ComponentReference.crefPrefixStart(cr), vars);
res = incidenceRowExp1withInput(varslst, p, res, 0);
then (inExp, true, (vars, res));

case (DAE.CREF(componentRef = cr),(vars,pa))
equation
(varslst,p) = BackendVariable.getVar(cr, vars);
res = incidenceRowExp1withInput(varslst,p,pa,0);
then (inExp,false,(vars,res));
then (inExp, true, (vars, res));

case (DAE.CALL(path = Absyn.IDENT(name = "der"),expLst = {DAE.CREF(componentRef = cr)}),(vars,pa))
equation
Expand Down
82 changes: 67 additions & 15 deletions Compiler/BackEnd/Initialization.mo
Expand Up @@ -1437,7 +1437,7 @@ algorithm

e := Expression.crefExp(cref);
tp := Expression.typeof(e);
startExp := Expression.makePureBuiltinCall("$_start", {e}, tp);
startExp := Expression.crefExp(ComponentReference.crefPrefixStart(cref));

eqn := BackendDAE.EQUATION(crefExp, startExp, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_INITIAL);
outEqns := BackendEquation.addEquation(eqn, outEqns);
Expand Down Expand Up @@ -1915,6 +1915,7 @@ algorithm
parameters = ComponentReference.crefStr(componentRef)::parameters;
then ((parameters, anyStartValue), true);

// TODO: REMOVE THIS CASE
case DAE.CALL(path=Absyn.IDENT(name="$_start"))
then ((parameters, true), false);

Expand Down Expand Up @@ -2057,11 +2058,11 @@ protected function collectInitialVars "author: lochel
algorithm
(outVar, outTpl) := matchcontinue (inVar, inTpl)
local
BackendDAE.Var var, preVar, derVar;
BackendDAE.Var var, preVar, derVar, startVar;
BackendDAE.Variables vars, fixvars;
BackendDAE.EquationArray eqns;
BackendDAE.Equation eqn;
DAE.ComponentRef cr, preCR, derCR;
DAE.ComponentRef cr, preCR, derCR, startCR;
Boolean isFixed, isInput, b, preUsed;
DAE.Type ty;
DAE.InstDims arryDim;
Expand All @@ -2078,19 +2079,31 @@ algorithm
// state
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.STATE(), varType=ty), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
isFixed = BackendVariable.varFixed(var);
_ = BackendVariable.varStartValueOption(var);
//_ = BackendVariable.varStartValueOption(var);
preUsed = BaseHashSet.has(cr, hs);

if isFixed then
crefExp = Expression.crefExp(cr);
crefExp = Expression.crefExp(cr);

startExp = BackendVariable.varStartValue(var);
parameters = Expression.getAllCrefs(startExp);
startCR = ComponentReference.crefPrefixStart(cr);
startVar = BackendVariable.copyVarNewName(startCR, var);
startVar = BackendVariable.setBindExp(startVar, NONE());
startVar = BackendVariable.setVarDirection(startVar, DAE.BIDIR());
startVar = BackendVariable.setVarFixed(startVar, false);
startVar = BackendVariable.setVarKind(startVar, BackendDAE.VARIABLE());
startVar = BackendVariable.setVarStartValueOption(startVar, NONE());

if areCrefsPrimaryParameters(parameters, allPrimaryParameters) then
startExp = Expression.makePureBuiltinCall("$_start", {crefExp}, ty);
end if;
eqn = BackendDAE.EQUATION(crefExp, startExp, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_INITIAL);
startExp = BackendVariable.varStartValue(var);
parameters = Expression.getAllCrefs(startExp);

if not areCrefsPrimaryParameters(parameters, allPrimaryParameters) then
eqn = BackendDAE.EQUATION(Expression.crefExp(startCR), startExp, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_INITIAL);
eqns = BackendEquation.addEquation(eqn, eqns);

vars = BackendVariable.addVar(startVar, vars);
end if;

if isFixed then
eqn = BackendDAE.EQUATION(crefExp, Expression.crefExp(startCR), DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_INITIAL);
eqns = BackendEquation.addEquation(eqn, eqns);
end if;

Expand Down Expand Up @@ -2166,7 +2179,7 @@ algorithm

// e = Expression.crefExp(cr);
// ty = Expression.typeof(e);
// startExp = Expression.makePureBuiltinCall("$_start", {e}, ty);
// startExp = Expression.crefExp(ComponentReference.crefPrefixStart(cr));

var = BackendVariable.setVarKind(var, BackendDAE.VARIABLE());
var = BackendVariable.setBindExp(var, SOME(startExp));
Expand Down Expand Up @@ -2258,9 +2271,28 @@ algorithm
case (var as BackendDAE.VAR(varName=cr, varType=ty), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
true = BackendVariable.varFixed(var);
isInput = BackendVariable.isVarOnTopLevelAndInput(var);
startValue_ = BackendVariable.varStartValue(var);
preUsed = BaseHashSet.has(cr, hs);

crefExp = Expression.crefExp(cr);

startCR = ComponentReference.crefPrefixStart(cr);
startVar = BackendVariable.copyVarNewName(startCR, var);
startVar = BackendVariable.setBindExp(startVar, NONE());
startVar = BackendVariable.setVarDirection(startVar, DAE.BIDIR());
startVar = BackendVariable.setVarFixed(startVar, false);
startVar = BackendVariable.setVarKind(startVar, BackendDAE.VARIABLE());
startVar = BackendVariable.setVarStartValueOption(startVar, NONE());

startExp = BackendVariable.varStartValue(var);
parameters = Expression.getAllCrefs(startExp);

if not areCrefsPrimaryParameters(parameters, allPrimaryParameters) then
eqn = BackendDAE.EQUATION(Expression.crefExp(startCR), startExp, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_INITIAL);
eqns = BackendEquation.addEquation(eqn, eqns);

vars = BackendVariable.addVar(startVar, vars);
end if;

var = BackendVariable.setVarFixed(var, false);

preCR = ComponentReference.crefPrefixPre(cr); // cr => $PRE.cr
Expand All @@ -2270,7 +2302,7 @@ algorithm
preVar = BackendVariable.setVarFixed(preVar, true);
preVar = BackendVariable.setVarStartValueOption(preVar, SOME(DAE.CREF(cr, ty)));

eqn = BackendDAE.EQUATION(DAE.CREF(cr, ty), startValue_, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_INITIAL);
eqn = BackendDAE.EQUATION(DAE.CREF(cr, ty), Expression.crefExp(startCR), DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_INITIAL);

vars = if not isInput then BackendVariable.addVar(var, vars) else vars;
fixvars = if isInput then BackendVariable.addVar(var, fixvars) else fixvars;
Expand All @@ -2287,6 +2319,26 @@ algorithm
isInput = BackendVariable.isVarOnTopLevelAndInput(var);
preUsed = BaseHashSet.has(cr, hs);

crefExp = Expression.crefExp(cr);

startCR = ComponentReference.crefPrefixStart(cr);
startVar = BackendVariable.copyVarNewName(startCR, var);
startVar = BackendVariable.setBindExp(startVar, NONE());
startVar = BackendVariable.setVarDirection(startVar, DAE.BIDIR());
startVar = BackendVariable.setVarFixed(startVar, false);
startVar = BackendVariable.setVarKind(startVar, BackendDAE.VARIABLE());
startVar = BackendVariable.setVarStartValueOption(startVar, NONE());

startExp = BackendVariable.varStartValue(var);
parameters = Expression.getAllCrefs(startExp);

if not areCrefsPrimaryParameters(parameters, allPrimaryParameters) then
eqn = BackendDAE.EQUATION(Expression.crefExp(startCR), startExp, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_INITIAL);
eqns = BackendEquation.addEquation(eqn, eqns);

vars = BackendVariable.addVar(startVar, vars);
end if;

preCR = ComponentReference.crefPrefixPre(cr); // cr => $PRE.cr
preVar = BackendVariable.copyVarNewName(preCR, var);
preVar = BackendVariable.setVarDirection(preVar, DAE.BIDIR());
Expand Down
12 changes: 11 additions & 1 deletion Compiler/FrontEnd/ComponentReference.mo
Expand Up @@ -1258,11 +1258,21 @@ public function isPreCref
output Boolean b;
algorithm
b := match(cr)
case(DAE.CREF_QUAL(ident = "$PRE")) then true;
case(DAE.CREF_QUAL(ident=DAE.preNamePrefix)) then true;
else false;
end match;
end isPreCref;

public function isStartCref
input DAE.ComponentRef cr;
output Boolean b;
algorithm
b := match(cr)
case(DAE.CREF_QUAL(ident=DAE.startNamePrefix)) then true;
else false;
end match;
end isStartCref;

public function popPreCref
input DAE.ComponentRef inCR;
output DAE.ComponentRef outCR;
Expand Down
2 changes: 1 addition & 1 deletion Compiler/SimCode/SimCodeUtil.mo
Expand Up @@ -7287,7 +7287,7 @@ protected function extractVarsFromList
input BackendDAE.Variables aliasVars, vars;
input array<HashSet.HashSet> hs;
algorithm
if if ComponentReference.isPreCref(var.varName) then false else not BaseHashSet.has(var.varName, arrayGet(hs,1)) then
if if ComponentReference.isPreCref(var.varName) or ComponentReference.isStartCref(var.varName) then false else not BaseHashSet.has(var.varName, arrayGet(hs,1)) then
/* ignore variable, since they are treated by kind in the codegen */
if not BackendVariable.isAlgebraicOldState(var) then
extractVarFromVar(var, aliasVars, vars, simVars, hs);
Expand Down
26 changes: 14 additions & 12 deletions Compiler/Template/CodegenCFunctions.tpl
Expand Up @@ -4060,7 +4060,7 @@ end contextIteratorName;
case CREF_IDENT(ident = "time") then "data->localData[0]->timeValue"
case CREF_IDENT(ident = "__OMC_DT") then "data->simulationInfo->inlineData->dt"
case WILD(__) then ''
else crefToCStr(cr, 0, false)
else crefToCStr(cr, 0, false, false)
end cref;

/* public */ template crefOld(ComponentRef cr, Integer ix)
Expand All @@ -4071,7 +4071,7 @@ end cref;
case CREF_IDENT(ident = "xloc") then crefStr(cr)
case CREF_IDENT(ident = "time") then "data->localData[<%ix%>]->timeValue"
case WILD(__) then ''
else crefToCStr(cr, ix, false)
else crefToCStr(cr, ix, false, false)
end crefOld;

/* public */ template crefPre(ComponentRef cr)
Expand All @@ -4080,7 +4080,7 @@ end crefOld;
::=
match cr
case CREF_IDENT(ident = "time") then "data->localData[0]->timeValueOld" // ??? Should
else crefToCStr(cr, 0, true)
else crefToCStr(cr, 0, true, false)
end crefPre;

/* public */ template crefDefine(ComponentRef cr)
Expand All @@ -4094,13 +4094,15 @@ end crefPre;
else "$P" + crefToCStrDefine(cr)
end crefDefine;

template crefToCStr(ComponentRef cr, Integer ix, Boolean isPre)
template crefToCStr(ComponentRef cr, Integer ix, Boolean isPre, Boolean isStart)
"Helper function to cref."
::=
match cr
case CREF_QUAL(ident="$PRE", subscriptLst={}) then
(if isPre then error(sourceInfo(), 'Got $PRE for something that is already pre: <%crefStr(cr)%>')
else crefToCStr(componentRef, ix, true))
else crefToCStr(componentRef, ix, true, isStart))
case CREF_QUAL(ident="$START") then
crefToCStr(componentRef, ix, isPre, true)
else match cref2simvar(cr, getSimCode())
case SIMVAR(varKind=ALG_STATE_OLD(), index=index)
then
Expand All @@ -4114,7 +4116,7 @@ template crefToCStr(ComponentRef cr, Integer ix, Boolean isPre)
if intEq(ix,0) then (if isPre then "$P$PRE")+crefDefine(cr)
else '_<%if isPre then "$P$PRE"%><%crefDefine(cr)%>(<%ix%>)'
case var as SIMVAR(index=-1) then error(sourceInfo(), 'crefToCStr got index=-1 for <%variabilityString(varKind)%> <%crefStr(name)%>')
case var as SIMVAR(__) then '<%varArrayNameValues(var, ix, isPre)%>[<%index%>] /* <%Util.escapeModelicaStringToCString(crefStr(name))%> <%variabilityString(varKind)%> */'
case var as SIMVAR(__) then '<%varArrayNameValues(var, ix, isPre, isStart)%>'
else "CREF_NOT_IDENT_OR_QUAL"
end crefToCStr;

Expand Down Expand Up @@ -4160,7 +4162,7 @@ template contextArrayCref(ComponentRef cr, Context context)
match context
case FUNCTION_CONTEXT(__) then "_" + arrayCrefStr(cr)
case PARALLEL_FUNCTION_CONTEXT(__) then "_" + arrayCrefStr(cr)
else crefToCStr(cr, 0, false)
else crefToCStr(cr, 0, false, false)
end contextArrayCref;

template arrayCrefStr(ComponentRef cr)
Expand Down Expand Up @@ -6932,14 +6934,14 @@ template crefShortType(ComponentRef cr) "template crefType
end match
end crefShortType;

template varArrayNameValues(SimVar var, Integer ix, Boolean isPre)
template varArrayNameValues(SimVar var, Integer ix, Boolean isPre, Boolean isStart)
::=
match var
case SIMVAR(varKind=PARAM())
case SIMVAR(varKind=OPT_TGRID())
then 'data->simulationInfo-><%crefShortType(name)%>Parameter'
case SIMVAR(varKind=EXTOBJ()) then 'data->simulationInfo->extObjs'
case SIMVAR(__) then 'data-><%if isPre then "simulationInfo" else 'localData[<%ix%>]'%>-><%crefShortType(name)%>Vars<%if isPre then "Pre"%>'
then 'data->simulationInfo-><%crefShortType(name)%>Parameter[<%index%>]'
case SIMVAR(varKind=EXTOBJ()) then 'data->simulationInfo->extObjs[<%index%>]'
case SIMVAR(__) then '<%if isStart then '<%varAttributes(var)%>.start' else if isPre then 'data->simulationInfo-><%crefShortType(name)%>VarsPre[<%index%>] /* <%Util.escapeModelicaStringToCString(crefStr(name))%> <%variabilityString(varKind)%> */' else 'data->localData[<%ix%>]-><%crefShortType(name)%>Vars[<%index%>] /* <%Util.escapeModelicaStringToCString(crefStr(name))%> <%variabilityString(varKind)%> */'%>'
end varArrayNameValues;

template varArrayName(SimVar var)
Expand All @@ -6961,7 +6963,7 @@ template varAttributes(SimVar var)
match var
case SIMVAR(index=-1) then crefAttributes(name) // input variable?
case SIMVAR(__) then
'data->modelData-><%varArrayName(var)%>Data[<%index%>].attribute /* <%Util.escapeModelicaStringToCString(crefStr(name))%> */'
'data->modelData-><%varArrayName(var)%>Data[<%index%>].attribute /* <%Util.escapeModelicaStringToCString(crefStr(name))%> <%variabilityString(varKind)%> */'
end varAttributes;

template crefAttributes(ComponentRef cr)
Expand Down

0 comments on commit 03e06df

Please sign in to comment.