Skip to content

Commit d404391

Browse files
committed
support clocked states of any base type
This is achieved by creating clocked vars along with initial equations.
1 parent c7257cc commit d404391

File tree

2 files changed

+44
-25
lines changed

2 files changed

+44
-25
lines changed

Compiler/BackEnd/BackendVariable.mo

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -818,12 +818,12 @@ algorithm
818818
list<BackendDAE.VarKind> kind_lst;
819819

820820
/* Real non discrete variable */
821-
case (BackendDAE.VAR(varKind = BackendDAE.CLOCKED_STATE(_)))
822-
then true;
821+
case (BackendDAE.VAR(varKind = BackendDAE.CLOCKED_STATE(_), varType = DAE.T_REAL(_,_)))
822+
then true;
823823

824824
case (BackendDAE.VAR(varKind = kind, varType = DAE.T_REAL(_,_))) equation
825825
kind_lst = {BackendDAE.VARIABLE(), BackendDAE.DUMMY_DER(), BackendDAE.DUMMY_STATE(), BackendDAE.OPT_INPUT_WITH_DER(), BackendDAE.OPT_INPUT_DER()};
826-
then listMember(kind, kind_lst) or isOptLoopInput(kind);
826+
then listMember(kind, kind_lst) or isOptLoopInput(kind);
827827

828828
else false;
829829
end match;
@@ -850,7 +850,7 @@ algorithm
850850

851851
/* Real discrete variable */
852852
case (BackendDAE.VAR(varKind = BackendDAE.DISCRETE(), varType = DAE.T_REAL(_,_)))
853-
then true;
853+
then true;
854854

855855
else false;
856856
end match;
@@ -868,9 +868,12 @@ algorithm
868868
list<BackendDAE.VarKind> kind_lst;
869869

870870
/* string variable */
871+
case (BackendDAE.VAR(varKind = BackendDAE.CLOCKED_STATE(_), varType = DAE.T_STRING()))
872+
then true;
873+
871874
case (BackendDAE.VAR(varKind = kind, varType = DAE.T_STRING())) equation
872875
kind_lst = {BackendDAE.VARIABLE(), BackendDAE.DISCRETE(), BackendDAE.DUMMY_DER(), BackendDAE.DUMMY_STATE()};
873-
then listMember(kind, kind_lst);
876+
then listMember(kind, kind_lst);
874877

875878
else false;
876879
end match;
@@ -886,6 +889,9 @@ algorithm
886889
BackendDAE.Type typeVar;
887890
list<BackendDAE.VarKind> kind_lst;
888891
/* int variable */
892+
case (BackendDAE.VAR(varKind = BackendDAE.CLOCKED_STATE(_), varType = DAE.T_INTEGER()))
893+
then true;
894+
889895
case (BackendDAE.VAR(varKind = kind,
890896
varType = DAE.T_INTEGER()))
891897
equation
@@ -916,12 +922,16 @@ algorithm
916922
BackendDAE.Type typeVar;
917923
list<BackendDAE.VarKind> kind_lst;
918924
/* int variable */
925+
case (BackendDAE.VAR(varKind = BackendDAE.CLOCKED_STATE(_), varType = DAE.T_BOOL()))
926+
then true;
927+
919928
case (BackendDAE.VAR(varKind = kind,
920929
varType = DAE.T_BOOL()))
921930
equation
922931
kind_lst = {BackendDAE.VARIABLE(), BackendDAE.DISCRETE(), BackendDAE.DUMMY_DER(),
923932
BackendDAE.DUMMY_STATE()};
924933
then listMember(kind, kind_lst);
934+
925935
else false;
926936
end matchcontinue;
927937
end isVarBoolAlg;

Compiler/BackEnd/Initialization.mo

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1962,14 +1962,13 @@ protected
19621962
algorithm
19631963
(vars, fixvars, eqns, reqns, hs, clkHS) := inTpl;
19641964

1965-
((vars, fixvars, eqns, hs, clkHS)) := BackendVariable.traverseBackendDAEVars(inEqSystem.orderedVars, collectInitialVars, (vars, fixvars, eqns, hs, clkHS));
1966-
19671965
outTpl := match inEqSystem
19681966
case BackendDAE.EQSYSTEM(partitionKind = BackendDAE.CLOCKED_PARTITION(_)) equation
1969-
((eqns, clkHS)) = BackendVariable.traverseBackendDAEVars(inEqSystem.orderedVars, createInitialClockedEqns, (eqns, clkHS));
1967+
((vars, eqns, clkHS)) = BackendVariable.traverseBackendDAEVars(inEqSystem.orderedVars, collectInitialClockedVarsEqns, (vars, eqns, clkHS));
19701968
then (vars, fixvars, eqns, reqns, hs, clkHS);
19711969

19721970
else equation
1971+
((vars, fixvars, eqns, hs, clkHS)) = BackendVariable.traverseBackendDAEVars(inEqSystem.orderedVars, collectInitialVars, (vars, fixvars, eqns, hs, clkHS));
19731972
((eqns, reqns)) = BackendEquation.traverseEquationArray(inEqSystem.orderedEqs, collectInitialEqns, (eqns, reqns));
19741973
//((fixvars, eqns)) = List.fold(inEqSystem.stateSets, collectInitialStateSetVars, (fixvars, eqns));
19751974
then (vars, fixvars, eqns, reqns, hs, clkHS);
@@ -2185,7 +2184,7 @@ algorithm
21852184
isInput = BackendVariable.isVarOnTopLevelAndInput(var);
21862185
startValue_ = BackendVariable.varStartValue(var);
21872186
preUsed = BaseHashSet.has(cr, hs);
2188-
previousUsed = BaseHashSet.has(cr, clkHS);
2187+
previousUsed = false; //BaseHashSet.has(cr, clkHS);
21892188

21902189
var = BackendVariable.setVarFixed(var, false);
21912190

@@ -2242,40 +2241,50 @@ algorithm
22422241
end matchcontinue;
22432242
end collectInitialVars;
22442243

2245-
protected function createInitialClockedEqns "author: rfranke
2244+
protected function collectInitialClockedVarsEqns "author: rfranke
22462245
This function creates initial equations for a clocked partition.
22472246
Previous states are initialized with the states. All other variables are initialized with start values."
22482247
input BackendDAE.Var inVar;
2249-
input tuple<BackendDAE.EquationArray, HashSet.HashSet> inTpl;
2248+
input tuple<BackendDAE.Variables, BackendDAE.EquationArray, HashSet.HashSet> inTpl;
22502249
output BackendDAE.Var outVar;
2251-
output tuple<BackendDAE.EquationArray, HashSet.HashSet> outTpl;
2250+
output tuple<BackendDAE.Variables, BackendDAE.EquationArray, HashSet.HashSet> outTpl;
22522251
protected
2252+
BackendDAE.Variables vars;
22532253
BackendDAE.EquationArray eqns;
22542254
HashSet.HashSet clkHS;
22552255
algorithm
2256-
(eqns, clkHS) := inTpl;
2256+
(vars, eqns, clkHS) := inTpl;
22572257
(outVar, outTpl) := match inVar
22582258
local
2259-
BackendDAE.Var var;
2260-
BackendDAE.Equation eqn;
2259+
BackendDAE.Var var, previousVar;
22612260
DAE.ComponentRef cr, previousCR;
2261+
DAE.Type ty;
22622262
DAE.Exp crExp, previousExp, startExp;
22632263
Boolean previousUsed;
2264-
case (var as BackendDAE.VAR(varName=cr)) equation
2264+
case (var as BackendDAE.VAR(varName=cr, varType=ty)) equation
22652265
previousUsed = BaseHashSet.has(cr, clkHS);
2266-
crExp = Expression.crefExp(cr);
22672266
previousCR = ComponentReference.crefPrefixPrevious(cr); // cr => $CLKPRRE.cr
2267+
previousVar = BackendVariable.copyVarNewName(previousCR, var);
2268+
crExp = Expression.crefExp(cr);
22682269
previousExp = Expression.crefExp(previousCR);
22692270
startExp = BackendVariable.varStartValue(var);
2270-
eqn = if previousUsed
2271-
then
2272-
BackendDAE.EQUATION(previousExp, crExp, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_INITIAL)
2273-
else
2274-
BackendDAE.EQUATION(crExp, startExp, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_INITIAL);
2275-
eqns = BackendEquation.addEquation(eqn, eqns);
2276-
then (var, (eqns, clkHS));
2271+
if previousUsed then
2272+
// create previous variable and initial equation
2273+
previousVar = BackendVariable.setVarDirection(previousVar, DAE.BIDIR());
2274+
previousVar = BackendVariable.setBindExp(previousVar, NONE());
2275+
previousVar = BackendVariable.setBindValue(previousVar, NONE());
2276+
previousVar = BackendVariable.setVarFixed(previousVar, true);
2277+
previousVar = BackendVariable.setVarStartValueOption(previousVar, SOME(DAE.CREF(cr, ty)));
2278+
vars = BackendVariable.addVar(previousVar, vars);
2279+
eqns = BackendEquation.addEquation(BackendDAE.EQUATION(previousExp, crExp, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_INITIAL), eqns);
2280+
var = BackendVariable.setVarKind(var, BackendDAE.CLOCKED_STATE(previousName = previousCR));
2281+
end if;
2282+
// add clocked variable and initial equation
2283+
vars = BackendVariable.addVar(var, vars);
2284+
eqns = BackendEquation.addEquation(BackendDAE.EQUATION(crExp, startExp, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_INITIAL), eqns);
2285+
then (var, (vars, eqns, clkHS));
22772286
end match;
2278-
end createInitialClockedEqns;
2287+
end collectInitialClockedVarsEqns;
22792288

22802289
protected function collectInitialEqns "author: lochel"
22812290
input BackendDAE.Equation inEq;

0 commit comments

Comments
 (0)