@@ -127,14 +127,14 @@ algorithm
127127 reeqns := BackendEquation . emptyEqns();
128128
129129 ((vars, fixvars, eqns, _)) := BackendVariable . traverseBackendDAEVars(dae. shared . aliasVars, introducePreVarsForAliasVariables, (vars, fixvars, eqns, hs));
130- ((vars, fixvars, eqns, _)) := BackendVariable . traverseBackendDAEVars(dae. shared . knownVars, collectInitialVars, (vars, fixvars, eqns, hs));
130+ ((vars, fixvars, eqns, _, _ )) := BackendVariable . traverseBackendDAEVars(dae. shared . knownVars, collectInitialVars, (vars, fixvars, eqns, hs, outAllPrimaryParameters ));
131131 ((eqns, reeqns)) := BackendEquation . traverseEquationArray(dae. shared . initialEqs, collectInitialEqns, (eqns, reeqns));
132132 // if Flags.isSet(Flags.DUMP_INITIAL_SYSTEM) then
133133 // BackendDump.dumpEquationArray(eqns, "initial equations");
134134 // end if;
135135 SimCodeFunctionUtil . execStat("collectInitialEqns (initialization)" );
136136
137- ((vars, fixvars, eqns, reeqns, _, _)) := List . fold(dae. eqs, collectInitialVarsEqnsSystem, ((vars, fixvars, eqns, reeqns, hs, clkHS)));
137+ ((vars, fixvars, eqns, reeqns, _, _, _ )) := List . fold(dae. eqs, collectInitialVarsEqnsSystem, ((vars, fixvars, eqns, reeqns, hs, clkHS, outAllPrimaryParameters )));
138138 ((eqns, reeqns)) := BackendVariable . traverseBackendDAEVars(vars, collectInitialBindings, (eqns, reeqns));
139139 SimCodeFunctionUtil . execStat("collectInitialBindings (initialization)" );
140140
@@ -1953,35 +1953,62 @@ end introducePreVarsForAliasVariables;
19531953protected function collectInitialVarsEqnsSystem "author: lochel
19541954 This function collects variables and equations for the initial system out of an given EqSystem."
19551955 input BackendDAE . EqSystem inEqSystem;
1956- input tuple< BackendDAE . Variables , BackendDAE . Variables , BackendDAE . EquationArray , BackendDAE . EquationArray , HashSet . HashSet , HashSet . HashSet > inTpl;
1957- output tuple< BackendDAE . Variables , BackendDAE . Variables , BackendDAE . EquationArray , BackendDAE . EquationArray , HashSet . HashSet , HashSet . HashSet > outTpl;
1956+ input tuple< BackendDAE . Variables , BackendDAE . Variables , BackendDAE . EquationArray , BackendDAE . EquationArray , HashSet . HashSet , HashSet . HashSet , list < BackendDAE . Var > > inTpl;
1957+ output tuple< BackendDAE . Variables , BackendDAE . Variables , BackendDAE . EquationArray , BackendDAE . EquationArray , HashSet . HashSet , HashSet . HashSet , list < BackendDAE . Var > > outTpl;
19581958protected
19591959 BackendDAE . Variables vars, fixvars;
19601960 BackendDAE . EquationArray eqns, reqns;
19611961 HashSet . HashSet hs, clkHS;
1962+ list< BackendDAE . Var > allPrimaryParameters;
19621963algorithm
1963- (vars, fixvars, eqns, reqns, hs, clkHS) := inTpl;
1964+ (vars, fixvars, eqns, reqns, hs, clkHS, allPrimaryParameters ) := inTpl;
19641965
19651966 outTpl := match inEqSystem
19661967 case BackendDAE . EQSYSTEM (partitionKind = BackendDAE . CLOCKED_PARTITION (_)) equation
19671968 ((vars, eqns, clkHS)) = BackendVariable . traverseBackendDAEVars(inEqSystem. orderedVars, collectInitialClockedVarsEqns, (vars, eqns, clkHS));
1968- then (vars, fixvars, eqns, reqns, hs, clkHS);
1969+ then (vars, fixvars, eqns, reqns, hs, clkHS, allPrimaryParameters );
19691970
19701971 else equation
1971- ((vars, fixvars, eqns, hs)) = BackendVariable . traverseBackendDAEVars(inEqSystem. orderedVars, collectInitialVars, (vars, fixvars, eqns, hs));
1972+ ((vars, fixvars, eqns, hs, _ )) = BackendVariable . traverseBackendDAEVars(inEqSystem. orderedVars, collectInitialVars, (vars, fixvars, eqns, hs, allPrimaryParameters ));
19721973 ((eqns, reqns)) = BackendEquation . traverseEquationArray(inEqSystem. orderedEqs, collectInitialEqns, (eqns, reqns));
19731974 // ((fixvars, eqns)) = List.fold(inEqSystem.stateSets, collectInitialStateSetVars, (fixvars, eqns));
1974- then (vars, fixvars, eqns, reqns, hs, clkHS);
1975+ then (vars, fixvars, eqns, reqns, hs, clkHS, allPrimaryParameters );
19751976 end match;
19761977end collectInitialVarsEqnsSystem;
19771978
1979+ protected function isCrefPrimaryParameter
1980+ input DAE . ComponentRef inCref;
1981+ input list< BackendDAE . Var > inAllPrimaryParameters;
1982+ output Boolean isPrimary = false ;
1983+ algorithm
1984+ for v in inAllPrimaryParameters loop
1985+ if ComponentReference . crefEqual(BackendVariable . varCref(v), inCref) then
1986+ isPrimary := true ;
1987+ return ;
1988+ end if ;
1989+ end for ;
1990+ end isCrefPrimaryParameter;
1991+
1992+ protected function areCrefsPrimaryParameters
1993+ input list< DAE . ComponentRef > inCrefs;
1994+ input list< BackendDAE . Var > inAllPrimaryParameters;
1995+ output Boolean isPrimary = true ;
1996+ algorithm
1997+ for cref in inCrefs loop
1998+ if not isCrefPrimaryParameter(cref, inAllPrimaryParameters) then
1999+ isPrimary := false ;
2000+ return ;
2001+ end if ;
2002+ end for ;
2003+ end areCrefsPrimaryParameters;
2004+
19782005protected function collectInitialVars "author: lochel
19792006 This function collects all the vars for the initial system.
19802007 TODO: return additional equations for pre-variables"
19812008 input BackendDAE . Var inVar;
1982- input tuple< BackendDAE . Variables , BackendDAE . Variables , BackendDAE . EquationArray , HashSet . HashSet > inTpl;
2009+ input tuple< BackendDAE . Variables , BackendDAE . Variables , BackendDAE . EquationArray , HashSet . HashSet , list < BackendDAE . Var > > inTpl;
19832010 output BackendDAE . Var outVar;
1984- output tuple< BackendDAE . Variables , BackendDAE . Variables , BackendDAE . EquationArray , HashSet . HashSet > outTpl;
2011+ output tuple< BackendDAE . Variables , BackendDAE . Variables , BackendDAE . EquationArray , HashSet . HashSet , list < BackendDAE . Var > > outTpl;
19852012algorithm
19862013 (outVar, outTpl) := matchcontinue (inVar, inTpl)
19872014 local
@@ -2000,18 +2027,25 @@ algorithm
20002027 HashSet . HashSet hs;
20012028 String s, str, sv;
20022029 SourceInfo info;
2030+ list< BackendDAE . Var > allPrimaryParameters;
2031+ list< DAE . ComponentRef > parameters;
20032032
20042033 // state
2005- case (var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . STATE (), varType= ty), (vars, fixvars, eqns, hs)) equation
2034+ case (var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . STATE (), varType= ty), (vars, fixvars, eqns, hs, allPrimaryParameters )) equation
20062035 isFixed = BackendVariable . varFixed(var );
20072036 _ = BackendVariable . varStartValueOption(var );
20082037 preUsed = BaseHashSet . has(cr, hs);
20092038
2010- crefExp = Expression . crefExp(cr);
2011- // startExp = Expression.makePureBuiltinCall("$_start", {crefExp}, ty);
2012- startExp = BackendVariable . varStartValue(var );
2013- eqn = BackendDAE . EQUATION (crefExp, startExp, DAE . emptyElementSource, BackendDAE . EQ_ATTR_DEFAULT_INITIAL );
20142039 if isFixed then
2040+ crefExp = Expression . crefExp(cr);
2041+
2042+ startExp = BackendVariable . varStartValue(var );
2043+ parameters = Expression . getAllCrefs(startExp);
2044+
2045+ if areCrefsPrimaryParameters(parameters, allPrimaryParameters) then
2046+ startExp = Expression . makePureBuiltinCall("$_start" , {crefExp}, ty);
2047+ end if ;
2048+ eqn = BackendDAE . EQUATION (crefExp, startExp, DAE . emptyElementSource, BackendDAE . EQ_ATTR_DEFAULT_INITIAL );
20152049 eqns = BackendEquation . addEquation(eqn, eqns);
20162050 end if ;
20172051
@@ -2037,10 +2071,10 @@ algorithm
20372071 vars = BackendVariable . addVar(var , vars);
20382072 vars = if preUsed then BackendVariable . addVar(preVar, vars) else vars;
20392073 eqns = if preUsed then BackendEquation . addEquation(eqn, eqns) else eqns;
2040- then (var , (vars, fixvars, eqns, hs));
2074+ then (var , (vars, fixvars, eqns, hs, allPrimaryParameters ));
20412075
20422076 // discrete (preUsed=true)
2043- case (var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . DISCRETE (), varType= ty), (vars, fixvars, eqns, hs)) equation
2077+ case (var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . DISCRETE (), varType= ty), (vars, fixvars, eqns, hs, allPrimaryParameters )) equation
20442078 true = BaseHashSet . has(cr, hs);
20452079 true = BackendVariable . varFixed(var );
20462080 startValue_ = BackendVariable . varStartValue(var );
@@ -2060,10 +2094,10 @@ algorithm
20602094 vars = BackendVariable . addVar(var , vars);
20612095 vars = BackendVariable . addVar(preVar, vars);
20622096 eqns = BackendEquation . addEquation(eqn, eqns);
2063- then (var , (vars, fixvars, eqns, hs));
2097+ then (var , (vars, fixvars, eqns, hs, allPrimaryParameters ));
20642098
20652099 // discrete
2066- case (var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . DISCRETE ()), (vars, fixvars, eqns, hs)) equation
2100+ case (var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . DISCRETE ()), (vars, fixvars, eqns, hs, allPrimaryParameters )) equation
20672101 preUsed = BaseHashSet . has(cr, hs);
20682102 startValue = BackendVariable . varStartValueOption(var );
20692103
@@ -2079,10 +2113,10 @@ algorithm
20792113
20802114 vars = BackendVariable . addVar(var , vars);
20812115 vars = if preUsed then BackendVariable . addVar(preVar, vars) else vars;
2082- then (var , (vars, fixvars, eqns, hs));
2116+ then (var , (vars, fixvars, eqns, hs, allPrimaryParameters ));
20832117
20842118 // parameter without binding and fixed=true
2085- case (var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . PARAM (), bindExp= NONE ()), (vars, fixvars, eqns, hs)) equation
2119+ case (var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . PARAM (), bindExp= NONE ()), (vars, fixvars, eqns, hs, allPrimaryParameters )) equation
20862120 true = BackendVariable . varFixed(var );
20872121 startExp = BackendVariable . varStartValueType(var );
20882122
@@ -2101,10 +2135,10 @@ algorithm
21012135 Error . addSourceMessage(Error . UNBOUND_PARAMETER_WITH_START_VALUE_WARNING , {s, str}, info);
21022136
21032137 // vars = BackendVariable.addVar(var, vars);
2104- then (var , (vars, fixvars, eqns, hs));
2138+ then (var , (vars, fixvars, eqns, hs, allPrimaryParameters ));
21052139
21062140 // parameter with binding and fixed=false
2107- case (var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . PARAM (), bindExp= SOME (bindExp), varType= ty), (vars, fixvars, eqns, hs)) equation
2141+ case (var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . PARAM (), bindExp= SOME (bindExp), varType= ty), (vars, fixvars, eqns, hs, allPrimaryParameters )) equation
21082142 true = intGt(Flags . getConfigEnum(Flags . LANGUAGE_STANDARD ), 31 );
21092143 false = BackendVariable . varFixed(var );
21102144 var = BackendVariable . setVarKind(var , BackendDAE . VARIABLE ());
@@ -2119,12 +2153,12 @@ algorithm
21192153 eqns = BackendEquation . addEquation(eqn, eqns);
21202154
21212155 vars = BackendVariable . addVar(var , vars);
2122- then (var , (vars, fixvars, eqns, hs));
2156+ then (var , (vars, fixvars, eqns, hs, allPrimaryParameters ));
21232157
21242158 // *** MODELICA 3.1 COMPATIBLE ***
21252159 // parameter with binding and fixed=false and no start value
21262160 // use the binding as start value
2127- case (var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . PARAM (), bindExp= SOME (bindExp)), (vars, fixvars, eqns, hs)) equation
2161+ case (var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . PARAM (), bindExp= SOME (bindExp)), (vars, fixvars, eqns, hs, allPrimaryParameters )) equation
21282162 true = intLe(Flags . getConfigEnum(Flags . LANGUAGE_STANDARD ), 31 );
21292163 false = BackendVariable . varFixed(var );
21302164 var = BackendVariable . setVarKind(var , BackendDAE . VARIABLE ());
@@ -2138,12 +2172,12 @@ algorithm
21382172 Error . addSourceMessage(Error . UNFIXED_PARAMETER_WITH_BINDING_31 , {s, s, str}, info);
21392173
21402174 vars = BackendVariable . addVar(var , vars);
2141- then (var , (vars, fixvars, eqns, hs));
2175+ then (var , (vars, fixvars, eqns, hs, allPrimaryParameters ));
21422176
21432177 // *** MODELICA 3.1 COMPATIBLE ***
21442178 // parameter with binding and fixed=false and a start value
21452179 // ignore the binding and use the start value
2146- case (var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . PARAM (), bindExp= SOME (bindExp)), (vars, fixvars, eqns, hs)) equation
2180+ case (var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . PARAM (), bindExp= SOME (bindExp)), (vars, fixvars, eqns, hs, allPrimaryParameters )) equation
21472181 true = intLe(Flags . getConfigEnum(Flags . LANGUAGE_STANDARD ), 31 );
21482182 false = BackendVariable . varFixed(var );
21492183 var = BackendVariable . setVarKind(var , BackendDAE . VARIABLE ());
@@ -2157,20 +2191,20 @@ algorithm
21572191 Error . addSourceMessage(Error . UNFIXED_PARAMETER_WITH_BINDING_AND_START_VALUE_31 , {s, sv, s, str}, info);
21582192
21592193 vars = BackendVariable . addVar(var , vars);
2160- then (var , (vars, fixvars, eqns, hs));
2194+ then (var , (vars, fixvars, eqns, hs, allPrimaryParameters ));
21612195
21622196 // parameter with constant binding
21632197 // skip these parameters (#3050)
2164- case (var as BackendDAE . VAR (varKind= BackendDAE . PARAM (), bindExp= SOME (bindExp)), (vars, fixvars, eqns, hs)) equation
2198+ case (var as BackendDAE . VAR (varKind= BackendDAE . PARAM (), bindExp= SOME (bindExp)), (vars, fixvars, eqns, hs, allPrimaryParameters )) equation
21652199 true = Expression . isConst(bindExp);
21662200 // fixvars = BackendVariable.addVar(var, fixvars);
2167- then (var , (vars, fixvars, eqns, hs));
2201+ then (var , (vars, fixvars, eqns, hs, allPrimaryParameters ));
21682202
21692203 // parameter
2170- case (var as BackendDAE . VAR (varKind= BackendDAE . PARAM ()), (vars, fixvars, eqns, hs)) equation
2204+ case (var as BackendDAE . VAR (varKind= BackendDAE . PARAM ()), (vars, fixvars, eqns, hs, allPrimaryParameters )) equation
21712205 var = BackendVariable . setVarKind(var , BackendDAE . VARIABLE ());
21722206 vars = BackendVariable . addVar(var , vars);
2173- then (var , (vars, fixvars, eqns, hs));
2207+ then (var , (vars, fixvars, eqns, hs, allPrimaryParameters ));
21742208
21752209 // skip constant
21762210 case (var as BackendDAE . VAR (varKind= BackendDAE . CONST ()), _) // equation
@@ -2179,7 +2213,7 @@ algorithm
21792213
21802214 // VARIABLE (fixed=true)
21812215 // DUMMY_STATE
2182- case (var as BackendDAE . VAR (varName= cr, varType= ty), (vars, fixvars, eqns, hs)) equation
2216+ case (var as BackendDAE . VAR (varName= cr, varType= ty), (vars, fixvars, eqns, hs, allPrimaryParameters )) equation
21832217 true = BackendVariable . varFixed(var );
21842218 isInput = BackendVariable . isVarOnTopLevelAndInput(var );
21852219 startValue_ = BackendVariable . varStartValue(var );
@@ -2203,11 +2237,11 @@ algorithm
22032237 eqns = BackendEquation . addEquation(eqn, eqns);
22042238
22052239 // Error.addCompilerNotification("VARIABLE (fixed=true): " + BackendDump.varString(var));
2206- then (var , (vars, fixvars, eqns, hs));
2240+ then (var , (vars, fixvars, eqns, hs, allPrimaryParameters ));
22072241
22082242 // VARIABLE (fixed=false)
22092243 // DUMMY_STATE
2210- case (var as BackendDAE . VAR (varName= cr, varType= ty), (vars, fixvars, eqns, hs)) equation
2244+ case (var as BackendDAE . VAR (varName= cr, varType= ty), (vars, fixvars, eqns, hs, allPrimaryParameters )) equation
22112245 false = BackendVariable . varFixed(var );
22122246 isInput = BackendVariable . isVarOnTopLevelAndInput(var );
22132247 preUsed = BaseHashSet . has(cr, hs);
@@ -2228,7 +2262,7 @@ algorithm
22282262 eqns = if preUsed then BackendEquation . addEquation(eqn, eqns) else eqns;
22292263
22302264 // Error.addCompilerNotification("VARIABLE (fixed=false); " + BackendDump.varString(var));
2231- then (var , (vars, fixvars, eqns, hs));
2265+ then (var , (vars, fixvars, eqns, hs, allPrimaryParameters ));
22322266
22332267 else equation
22342268 Error . addInternalError("function collectInitialVars failed for: " + BackendDump . varString(inVar), sourceInfo());
0 commit comments