Skip to content

Commit

Permalink
Introduce clocked state variables
Browse files Browse the repository at this point in the history
See ModelicaSpec33, section 16.4 Discrete States.
The actual variable is declared as CLOCKED_STATE. It contains
a component ref to previousName (cf. STATE containing derName).
  • Loading branch information
rfranke committed Oct 10, 2015
1 parent e28a98f commit 0a6d92e
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 3 deletions.
3 changes: 3 additions & 0 deletions Compiler/BackEnd/BackendDAE.mo
Expand Up @@ -243,6 +243,9 @@ uniontype VarKind "variable kind"
record STATE_DER end STATE_DER;
record DUMMY_DER end DUMMY_DER;
record DUMMY_STATE end DUMMY_STATE;
record CLOCKED_STATE
.DAE.ComponentRef previousName "the name of the previous variable";
end CLOCKED_STATE;
record DISCRETE end DISCRETE;
record PARAM end PARAM;
record CONST end CONST;
Expand Down
1 change: 1 addition & 0 deletions Compiler/BackEnd/BackendDump.mo
Expand Up @@ -2309,6 +2309,7 @@ algorithm
case BackendDAE.STATE_DER() then "STATE_DER";
case BackendDAE.DUMMY_DER() then "DUMMY_DER";
case BackendDAE.DUMMY_STATE() then "DUMMY_STATE";
case BackendDAE.CLOCKED_STATE() then "CLOCKED_STATE";
case BackendDAE.DISCRETE() then "DISCRETE";
case BackendDAE.PARAM() then "PARAM";
case BackendDAE.CONST() then "CONST";
Expand Down
3 changes: 3 additions & 0 deletions Compiler/BackEnd/BackendVariable.mo
Expand Up @@ -818,6 +818,9 @@ algorithm
list<BackendDAE.VarKind> kind_lst;

/* Real non discrete variable */
case (BackendDAE.VAR(varKind = BackendDAE.CLOCKED_STATE(_)))
then true;

case (BackendDAE.VAR(varKind = kind, varType = DAE.T_REAL(_,_))) equation
kind_lst = {BackendDAE.VARIABLE(), BackendDAE.DUMMY_DER(), BackendDAE.DUMMY_STATE(), BackendDAE.OPT_INPUT_WITH_DER(), BackendDAE.OPT_INPUT_DER()};
then listMember(kind, kind_lst) or isOptLoopInput(kind);
Expand Down
11 changes: 8 additions & 3 deletions Compiler/BackEnd/Initialization.mo
Expand Up @@ -1984,7 +1984,7 @@ algorithm
BackendDAE.EquationArray eqns;
BackendDAE.Equation eqn;
DAE.ComponentRef cr, preCR, derCR;
Boolean isFixed, isInput, b, preUsed;
Boolean isFixed, isInput, b, preUsed, previousUsed;
DAE.Type ty;
DAE.InstDims arryDim;
Option<DAE.Exp> startValue;
Expand Down Expand Up @@ -2177,18 +2177,23 @@ algorithm
true = BackendVariable.varFixed(var);
isInput = BackendVariable.isVarOnTopLevelAndInput(var);
startValue_ = BackendVariable.varStartValue(var);
preUsed = BaseHashSet.has(cr, hs) or BaseHashSet.has(cr, clkHS);
previousUsed = BaseHashSet.has(cr, clkHS);
preUsed = BaseHashSet.has(cr, hs) or previousUsed;

var = BackendVariable.setVarFixed(var, false);

preCR = if BaseHashSet.has(cr, clkHS) then ComponentReference.crefPrefixString("$CLKPRE", cr) else ComponentReference.crefPrefixPre(cr); // cr => $PRE.cr
preCR = if previousUsed then ComponentReference.crefPrefixString("$CLKPRE", cr) else ComponentReference.crefPrefixPre(cr); // cr => $PRE.cr
preVar = BackendVariable.copyVarNewName(preCR, var);
preVar = BackendVariable.setVarDirection(preVar, DAE.BIDIR());
preVar = BackendVariable.setBindExp(preVar, NONE());
preVar = BackendVariable.setBindValue(preVar, NONE());
preVar = BackendVariable.setVarFixed(preVar, true);
preVar = BackendVariable.setVarStartValueOption(preVar, SOME(DAE.CREF(cr, ty)));

if previousUsed then
var = BackendVariable.setVarKind(var, BackendDAE.CLOCKED_STATE(previousName = preCR));
end if;

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

vars = if not isInput then BackendVariable.addVar(var, vars) else vars;
Expand Down

0 comments on commit 0a6d92e

Please sign in to comment.