Skip to content

Commit

Permalink
Tail recursion
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@17685 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
sjoelund committed Oct 14, 2013
1 parent af948b4 commit 677fc4b
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 20 deletions.
15 changes: 3 additions & 12 deletions Compiler/BackEnd/BackendEquation.mo
Expand Up @@ -157,19 +157,10 @@ protected function equationList2 "author: PA
input list<BackendDAE.Equation> iAcc;
output list<BackendDAE.Equation> outEquationLst;
algorithm
outEquationLst := matchcontinue(arr, pos, iAcc)
local
BackendDAE.Equation e;

outEquationLst := match (arr, pos, iAcc)
case (_,0,_) then iAcc;

case (_,_,_) equation
SOME(e) = arr[pos];
then equationList2(arr,pos-1,e::iAcc);

case (_,_,_)
then equationList2(arr,pos-1,iAcc);
end matchcontinue;
else equationList2(arr,pos-1,List.consOption(arr[pos],iAcc));
end match;
end equationList2;

public function getWhenEquationExpr
Expand Down
46 changes: 38 additions & 8 deletions Compiler/BackEnd/EvaluateParameter.mo
Expand Up @@ -323,8 +323,7 @@ protected function evaluateSelectedParameters
output BackendVarTransform.VariableReplacements oReplEvaluate;
output Integer oMark;
algorithm
(oKnVars,oCache,oRepl,oReplEvaluate,oMark) :=
matchcontinue(iSelected,iKnVars,m,inIEqns,iCache,env,iMark,markarr,iRepl,iReplEvaluate)
(oKnVars,oCache,oRepl,oReplEvaluate,oMark) := match (iSelected,iKnVars,m,inIEqns,iCache,env,iMark,markarr,iRepl,iReplEvaluate)
local
Integer i,mark;
list<Integer> rest;
Expand All @@ -334,6 +333,40 @@ algorithm
Env.Cache cache;
case ({},_,_,_,_,_,_,_,_,_) then (iKnVars,iCache,iRepl,iReplEvaluate,iMark);
case (i::rest,_,_,_,_,_,_,_,_,_)
equation
(knVars,cache,repl,repleval,mark) = evaluateSelectedParameters0(i,iKnVars,m,inIEqns,iCache,env,iMark,markarr,iRepl,iReplEvaluate);
(knVars,cache,repl,repleval,mark) = evaluateSelectedParameters(rest,knVars,m,inIEqns,cache,env,mark,markarr,repl,repleval);
then (knVars,cache,repl,repleval,mark);
end match;
end evaluateSelectedParameters;

protected function evaluateSelectedParameters0
"author Frenkel TUD"
input Integer i;
input BackendDAE.Variables iKnVars;
input BackendDAE.IncidenceMatrix m;
input BackendDAE.EquationArray inIEqns;
input Env.Cache iCache;
input Env.Env env;
input Integer iMark;
input array<Integer> markarr;
input BackendVarTransform.VariableReplacements iRepl;
input BackendVarTransform.VariableReplacements iReplEvaluate;
output BackendDAE.Variables oKnVars;
output Env.Cache oCache;
output BackendVarTransform.VariableReplacements oRepl;
output BackendVarTransform.VariableReplacements oReplEvaluate;
output Integer oMark;
algorithm
(oKnVars,oCache,oRepl,oReplEvaluate,oMark) := matchcontinue(i,iKnVars,m,inIEqns,iCache,env,iMark,markarr,iRepl,iReplEvaluate)
local
Integer mark;
list<Integer> rest;
BackendDAE.Variables knVars;
BackendVarTransform.VariableReplacements repl,repleval;
BackendDAE.Var v;
Env.Cache cache;
case (_,_,_,_,_,_,_,_,_,_)
equation
false = intGt(markarr[i],0) "not allready evaluated";
_ = arrayUpdate(markarr,i,iMark);
Expand All @@ -343,19 +376,16 @@ algorithm
v = BackendVariable.getVarAt(knVars,i);
(v,knVars,cache,repl,mark) = evaluateFixedAttribute(v,true,knVars,m,inIEqns,cache,env,mark,markarr,repl);
(knVars,cache,repl,repleval) = evaluateSelectedParameter(v,i,knVars,inIEqns,repl,iReplEvaluate,cache,env);
(knVars,cache,repl,repleval,mark) = evaluateSelectedParameters(rest,knVars,m,inIEqns,cache,env,mark,markarr,repl,repleval);
then
(knVars,cache,repl,repleval,mark);
case (i::rest,_,_,_,_,_,_,_,_,_)
case (_,_,_,_,_,_,_,_,_,_)
equation
// evaluate parameter
v = BackendVariable.getVarAt(iKnVars,i);
(knVars,cache,repl,repleval) = evaluateSelectedParameter(v,i,iKnVars,inIEqns,iRepl,iReplEvaluate,iCache,env);
(knVars,cache,repl,repleval,mark) = evaluateSelectedParameters(rest,knVars,m,inIEqns,cache,env,iMark,markarr,repl,repleval);
then
(knVars,cache,repl,repleval,mark);
then (knVars,cache,repl,repleval,iMark);
end matchcontinue;
end evaluateSelectedParameters;
end evaluateSelectedParameters0;

protected function evaluateSelectedParameters1
"author Frenkel TUD"
Expand Down

0 comments on commit 677fc4b

Please sign in to comment.