Skip to content

Commit

Permalink
cleanup creation of non-clocked variables
Browse files Browse the repository at this point in the history
  • Loading branch information
rfranke committed Oct 14, 2015
1 parent d404391 commit b297e3a
Showing 1 changed file with 30 additions and 35 deletions.
65 changes: 30 additions & 35 deletions Compiler/BackEnd/Initialization.mo
Expand Up @@ -127,7 +127,7 @@ algorithm
reeqns := BackendEquation.emptyEqns();

((vars, fixvars, eqns, _)) := BackendVariable.traverseBackendDAEVars(dae.shared.aliasVars, introducePreVarsForAliasVariables, (vars, fixvars, eqns, hs));
((vars, fixvars, eqns, _, _)) := BackendVariable.traverseBackendDAEVars(dae.shared.knownVars, collectInitialVars, (vars, fixvars, eqns, hs, clkHS));
((vars, fixvars, eqns, _)) := BackendVariable.traverseBackendDAEVars(dae.shared.knownVars, collectInitialVars, (vars, fixvars, eqns, hs));
((eqns, reeqns)) := BackendEquation.traverseEquationArray(dae.shared.initialEqs, collectInitialEqns, (eqns, reeqns));
//if Flags.isSet(Flags.DUMP_INITIAL_SYSTEM) then
// BackendDump.dumpEquationArray(eqns, "initial equations");
Expand Down Expand Up @@ -1968,7 +1968,7 @@ algorithm
then (vars, fixvars, eqns, reqns, hs, clkHS);

else equation
((vars, fixvars, eqns, hs, clkHS)) = BackendVariable.traverseBackendDAEVars(inEqSystem.orderedVars, collectInitialVars, (vars, fixvars, eqns, hs, clkHS));
((vars, fixvars, eqns, hs)) = BackendVariable.traverseBackendDAEVars(inEqSystem.orderedVars, collectInitialVars, (vars, fixvars, eqns, hs));
((eqns, reqns)) = BackendEquation.traverseEquationArray(inEqSystem.orderedEqs, collectInitialEqns, (eqns, reqns));
//((fixvars, eqns)) = List.fold(inEqSystem.stateSets, collectInitialStateSetVars, (fixvars, eqns));
then (vars, fixvars, eqns, reqns, hs, clkHS);
Expand All @@ -1979,9 +1979,9 @@ protected function collectInitialVars "author: lochel
This function collects all the vars for the initial system.
TODO: return additional equations for pre-variables"
input BackendDAE.Var inVar;
input tuple<BackendDAE.Variables, BackendDAE.Variables, BackendDAE.EquationArray, HashSet.HashSet, HashSet.HashSet> inTpl;
input tuple<BackendDAE.Variables, BackendDAE.Variables, BackendDAE.EquationArray, HashSet.HashSet> inTpl;
output BackendDAE.Var outVar;
output tuple<BackendDAE.Variables, BackendDAE.Variables, BackendDAE.EquationArray, HashSet.HashSet, HashSet.HashSet> outTpl;
output tuple<BackendDAE.Variables, BackendDAE.Variables, BackendDAE.EquationArray, HashSet.HashSet> outTpl;
algorithm
(outVar, outTpl) := matchcontinue (inVar, inTpl)
local
Expand All @@ -1990,19 +1990,19 @@ algorithm
BackendDAE.EquationArray eqns;
BackendDAE.Equation eqn;
DAE.ComponentRef cr, preCR, derCR;
Boolean isFixed, isInput, b, preUsed, previousUsed;
Boolean isFixed, isInput, b, preUsed;
DAE.Type ty;
DAE.InstDims arryDim;
Option<DAE.Exp> startValue;
DAE.Exp startValue_;
DAE.Exp startExp, bindExp, crefExp, e;
BackendDAE.VarKind varKind;
HashSet.HashSet hs, clkHS;
HashSet.HashSet hs;
String s, str, sv;
SourceInfo info;

// state
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.STATE(), varType=ty), (vars, fixvars, eqns, hs, clkHS)) equation
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.STATE(), varType=ty), (vars, fixvars, eqns, hs)) equation
isFixed = BackendVariable.varFixed(var);
_ = BackendVariable.varStartValueOption(var);
preUsed = BaseHashSet.has(cr, hs);
Expand Down Expand Up @@ -2037,10 +2037,10 @@ algorithm
vars = BackendVariable.addVar(var, vars);
vars = if preUsed then BackendVariable.addVar(preVar, vars) else vars;
eqns = if preUsed then BackendEquation.addEquation(eqn, eqns) else eqns;
then (var, (vars, fixvars, eqns, hs, clkHS));
then (var, (vars, fixvars, eqns, hs));

// discrete (preUsed=true)
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.DISCRETE(), varType=ty), (vars, fixvars, eqns, hs, clkHS)) equation
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.DISCRETE(), varType=ty), (vars, fixvars, eqns, hs)) equation
true = BaseHashSet.has(cr, hs);
true = BackendVariable.varFixed(var);
startValue_ = BackendVariable.varStartValue(var);
Expand All @@ -2060,10 +2060,10 @@ algorithm
vars = BackendVariable.addVar(var, vars);
vars = BackendVariable.addVar(preVar, vars);
eqns = BackendEquation.addEquation(eqn, eqns);
then (var, (vars, fixvars, eqns, hs, clkHS));
then (var, (vars, fixvars, eqns, hs));

// discrete
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.DISCRETE()), (vars, fixvars, eqns, hs, clkHS)) equation
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.DISCRETE()), (vars, fixvars, eqns, hs)) equation
preUsed = BaseHashSet.has(cr, hs);
startValue = BackendVariable.varStartValueOption(var);

Expand All @@ -2079,10 +2079,10 @@ algorithm

vars = BackendVariable.addVar(var, vars);
vars = if preUsed then BackendVariable.addVar(preVar, vars) else vars;
then (var, (vars, fixvars, eqns, hs, clkHS));
then (var, (vars, fixvars, eqns, hs));

// parameter without binding and fixed=true
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=NONE()), (vars, fixvars, eqns, hs, clkHS)) equation
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=NONE()), (vars, fixvars, eqns, hs)) equation
true = BackendVariable.varFixed(var);
startExp = BackendVariable.varStartValueType(var);

Expand All @@ -2101,10 +2101,10 @@ algorithm
Error.addSourceMessage(Error.UNBOUND_PARAMETER_WITH_START_VALUE_WARNING, {s, str}, info);

//vars = BackendVariable.addVar(var, vars);
then (var, (vars, fixvars, eqns, hs, clkHS));
then (var, (vars, fixvars, eqns, hs));

// parameter with binding and fixed=false
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp), varType=ty), (vars, fixvars, eqns, hs, clkHS)) equation
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp), varType=ty), (vars, fixvars, eqns, hs)) equation
true = intGt(Flags.getConfigEnum(Flags.LANGUAGE_STANDARD), 31);
false = BackendVariable.varFixed(var);
var = BackendVariable.setVarKind(var, BackendDAE.VARIABLE());
Expand All @@ -2119,12 +2119,12 @@ algorithm
eqns = BackendEquation.addEquation(eqn, eqns);

vars = BackendVariable.addVar(var, vars);
then (var, (vars, fixvars, eqns, hs, clkHS));
then (var, (vars, fixvars, eqns, hs));

// *** MODELICA 3.1 COMPATIBLE ***
// parameter with binding and fixed=false and no start value
// use the binding as start value
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp)), (vars, fixvars, eqns, hs, clkHS)) equation
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp)), (vars, fixvars, eqns, hs)) equation
true = intLe(Flags.getConfigEnum(Flags.LANGUAGE_STANDARD), 31);
false = BackendVariable.varFixed(var);
var = BackendVariable.setVarKind(var, BackendDAE.VARIABLE());
Expand All @@ -2138,12 +2138,12 @@ algorithm
Error.addSourceMessage(Error.UNFIXED_PARAMETER_WITH_BINDING_31, {s, s, str}, info);

vars = BackendVariable.addVar(var, vars);
then (var, (vars, fixvars, eqns, hs, clkHS));
then (var, (vars, fixvars, eqns, hs));

// *** MODELICA 3.1 COMPATIBLE ***
// parameter with binding and fixed=false and a start value
// ignore the binding and use the start value
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp)), (vars, fixvars, eqns, hs, clkHS)) equation
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp)), (vars, fixvars, eqns, hs)) equation
true = intLe(Flags.getConfigEnum(Flags.LANGUAGE_STANDARD), 31);
false = BackendVariable.varFixed(var);
var = BackendVariable.setVarKind(var, BackendDAE.VARIABLE());
Expand All @@ -2157,20 +2157,20 @@ algorithm
Error.addSourceMessage(Error.UNFIXED_PARAMETER_WITH_BINDING_AND_START_VALUE_31, {s, sv, s, str}, info);

vars = BackendVariable.addVar(var, vars);
then (var, (vars, fixvars, eqns, hs, clkHS));
then (var, (vars, fixvars, eqns, hs));

// parameter with constant binding
// skip these parameters (#3050)
case (var as BackendDAE.VAR(varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp)), (vars, fixvars, eqns, hs, clkHS)) equation
case (var as BackendDAE.VAR(varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp)), (vars, fixvars, eqns, hs)) equation
true = Expression.isConst(bindExp);
//fixvars = BackendVariable.addVar(var, fixvars);
then (var, (vars, fixvars, eqns, hs, clkHS));
then (var, (vars, fixvars, eqns, hs));

// parameter
case (var as BackendDAE.VAR(varKind=BackendDAE.PARAM()), (vars, fixvars, eqns, hs, clkHS)) equation
case (var as BackendDAE.VAR(varKind=BackendDAE.PARAM()), (vars, fixvars, eqns, hs)) equation
var = BackendVariable.setVarKind(var, BackendDAE.VARIABLE());
vars = BackendVariable.addVar(var, vars);
then (var, (vars, fixvars, eqns, hs, clkHS));
then (var, (vars, fixvars, eqns, hs));

// skip constant
case (var as BackendDAE.VAR(varKind=BackendDAE.CONST()), _) // equation
Expand All @@ -2179,40 +2179,35 @@ algorithm

// VARIABLE (fixed=true)
// DUMMY_STATE
case (var as BackendDAE.VAR(varName=cr, varType=ty), (vars, fixvars, eqns, hs, clkHS)) equation
case (var as BackendDAE.VAR(varName=cr, varType=ty), (vars, fixvars, eqns, hs)) equation
true = BackendVariable.varFixed(var);
isInput = BackendVariable.isVarOnTopLevelAndInput(var);
startValue_ = BackendVariable.varStartValue(var);
preUsed = BaseHashSet.has(cr, hs);
previousUsed = false; //BaseHashSet.has(cr, clkHS);

var = BackendVariable.setVarFixed(var, false);

preCR = if previousUsed then ComponentReference.crefPrefixPrevious(cr) else ComponentReference.crefPrefixPre(cr); // cr => $PRE.cr
preCR = 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;
fixvars = if isInput then BackendVariable.addVar(var, fixvars) else fixvars;
vars = if preUsed or previousUsed then BackendVariable.addVar(preVar, vars) else vars;
vars = if preUsed then BackendVariable.addVar(preVar, vars) else vars;
eqns = BackendEquation.addEquation(eqn, eqns);

// Error.addCompilerNotification("VARIABLE (fixed=true): " + BackendDump.varString(var));
then (var, (vars, fixvars, eqns, hs, clkHS));
then (var, (vars, fixvars, eqns, hs));

// VARIABLE (fixed=false)
// DUMMY_STATE
case (var as BackendDAE.VAR(varName=cr, varType=ty), (vars, fixvars, eqns, hs, clkHS)) equation
case (var as BackendDAE.VAR(varName=cr, varType=ty), (vars, fixvars, eqns, hs)) equation
false = BackendVariable.varFixed(var);
isInput = BackendVariable.isVarOnTopLevelAndInput(var);
preUsed = BaseHashSet.has(cr, hs);
Expand All @@ -2233,7 +2228,7 @@ algorithm
eqns = if preUsed then BackendEquation.addEquation(eqn, eqns) else eqns;

// Error.addCompilerNotification("VARIABLE (fixed=false); " + BackendDump.varString(var));
then (var, (vars, fixvars, eqns, hs, clkHS));
then (var, (vars, fixvars, eqns, hs));

else equation
Error.addInternalError("function collectInitialVars failed for: " + BackendDump.varString(inVar), sourceInfo());
Expand Down

0 comments on commit b297e3a

Please sign in to comment.