Skip to content
This repository has been archived by the owner on May 18, 2019. It is now read-only.

Commit

Permalink
Support external object constructors depend on variables
Browse files Browse the repository at this point in the history
  • Loading branch information
lochel authored and OpenModelica-Hudson committed Feb 21, 2017
1 parent 5aeafb1 commit 4b89b3c
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 4 deletions.
26 changes: 22 additions & 4 deletions Compiler/BackEnd/Initialization.mo
Original file line number Diff line number Diff line change
Expand Up @@ -797,6 +797,8 @@ protected
array<Integer> secondary;
BackendDAE.Var p;
DAE.Exp bindExp;
HashSet.HashSet hs;
list<DAE.ComponentRef> crefs;
algorithm
outInitVars := selectInitializationVariables(dae.eqs);
outInitVars := BackendVariable.traverseBackendDAEVars(dae.shared.globalKnownVars, selectInitializationVariables2, outInitVars);
Expand Down Expand Up @@ -840,19 +842,22 @@ algorithm
//BackendDump.dumpMatchingVars(secondary);

// get primary and secondary parameters
hs := HashSet.emptyHashSetSized(2*nParam+1);
for i in flatComps loop
p := BackendVariable.getVarAt(allParameters, i);
if 1 == secondary[i] then
bindExp := BackendVariable.varBindExpStartValueNoFail(p);
crefs := Expression.getAllCrefs(bindExp);
if 1 == secondary[i] or not BaseHashSet.hasAll(crefs, hs) then
otherVariables := BackendVariable.addVar(p, otherVariables);
p := BackendVariable.setVarFixed(p, false);
outInitVars := BackendVariable.addVar(p, outInitVars);
outGlobalKnownVars := BackendVariable.addVar(p, outGlobalKnownVars);
else
outAllPrimaryParameters := p::outAllPrimaryParameters;
bindExp := BackendVariable.varBindExpStartValueNoFail(p);
if (not Expression.isConst(bindExp)) or BackendVariable.isFinalOrProtectedVar(p) or BackendVariable.isExtObj(p) then
outPrimaryParameters := p::outPrimaryParameters "this is used in SimCode to generate parameter equations";
end if;
hs := BaseHashSet.add(BackendVariable.varCref(p), hs);
end if;
end for;

Expand Down Expand Up @@ -994,8 +999,8 @@ algorithm

// external object with binding
case (BackendDAE.VAR(varKind=BackendDAE.EXTOBJ(), bindExp=SOME(bindExp)), (vars, eqns, otherVars)) equation
var = BackendVariable.setVarFixed(inVar, true);
vars = BackendVariable.addVar(var, vars);
var = BackendVariable.setVarFixed(inVar, true);
vars = BackendVariable.addVar(var, vars);

cref = BackendVariable.varCref(inVar);
crefExp = Expression.crefExp(cref);
Expand Down Expand Up @@ -2238,6 +2243,13 @@ algorithm
vars = BackendVariable.addVar(var, vars);
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));

// external objects
case (var as BackendDAE.VAR(varKind=BackendDAE.EXTOBJ()), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
//var = BackendVariable.setVarFixed(var, false);
//var = BackendVariable.setVarKind(var, BackendDAE.VARIABLE());
vars = BackendVariable.addVar(var, vars);
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));

// skip constant
case (var as BackendDAE.VAR(varKind=BackendDAE.CONST()), _) // equation
// fixvars = BackendVariable.addVar(var, fixvars);
Expand Down Expand Up @@ -2425,6 +2437,12 @@ algorithm
case (var as BackendDAE.VAR(bindExp=NONE()), _) equation
then (var, inTpl);

// external object with binding
case (var as BackendDAE.VAR(varName=cr, bindExp=SOME(bindExp), varKind=BackendDAE.EXTOBJ(), source=source), (eqns, reeqns)) equation
eqn = BackendDAE.SOLVED_EQUATION(cr, bindExp, source, BackendDAE.EQ_ATTR_DEFAULT_INITIAL);
eqns = BackendEquation.addEquation(eqn, eqns);
then (var, (eqns, reeqns));

// binding
case (var as BackendDAE.VAR(varName=cr, bindExp=SOME(bindExp), varType=ty, source=source), (eqns, reeqns)) equation
crefExp = DAE.CREF(cr, ty);
Expand Down
14 changes: 14 additions & 0 deletions Compiler/Util/BaseHashSet.mo
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,20 @@ algorithm
end matchcontinue;
end has;

public function hasAll "Returns true if all keys are in the HashSet."
input list<Key> keys;
input HashSet hashSet;
output Boolean b = true;
algorithm
for key in keys loop
b := has(key, hashSet);

if not b then
return;
end if;
end for;
end hasAll;

public function get
"Returns Key from the HashSet. Fails if not present"
input Key key;
Expand Down

0 comments on commit 4b89b3c

Please sign in to comment.