Skip to content

Commit

Permalink
- avoid events in inlined functions
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@13871 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Jens Frenkel committed Nov 12, 2012
1 parent f63133c commit f4d2ce6
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 16 deletions.
36 changes: 20 additions & 16 deletions Compiler/BackEnd/BackendDAECreate.mo
Expand Up @@ -3539,7 +3539,7 @@ algorithm
BackendDAE.Variables vars,knvars;
list<BackendDAE.ZeroCrossing> zeroCrossings, zc_lst, relations, samples;
DAE.Operator op;
Integer eq_count,wc_count,itmp,numRelations;
Integer eq_count,wc_count,itmp,numRelations,numRelations1;
BackendDAE.ZeroCrossing zc;

case (((e as DAE.CALL(path = Absyn.IDENT(name = "noEvent"))),((zeroCrossings,relations,samples,numRelations),(eq_count,wc_count,vars,knvars))))
Expand Down Expand Up @@ -3585,15 +3585,16 @@ algorithm
equation
Debug.fcall(Flags.RELIDX,print, "continues LBINARY: " +& intString(numRelations) +& "\n");
Debug.fcall(Flags.RELIDX, BackendDump.debugExpStr, (e, "\n"));
((e_1,((_,relations,samples,numRelations),(eq_count,wc_count,vars,knvars)))) = Expression.traverseExpTopDown(e1, collectZC, ((zeroCrossings,relations,samples,numRelations),(eq_count,wc_count,vars,knvars)));
((e_2,((_,relations,samples,numRelations),(eq_count,wc_count,vars,knvars)))) = Expression.traverseExpTopDown(e2, collectZC, ((zeroCrossings,relations,samples,numRelations),(eq_count,wc_count,vars,knvars)));
((e_1,((_,relations,samples,numRelations1),(eq_count,wc_count,vars,knvars)))) = Expression.traverseExpTopDown(e1, collectZC, ((zeroCrossings,relations,samples,numRelations),(eq_count,wc_count,vars,knvars)));
((e_2,((_,relations,samples,numRelations1),(eq_count,wc_count,vars,knvars)))) = Expression.traverseExpTopDown(e2, collectZC, ((zeroCrossings,relations,samples,numRelations1),(eq_count,wc_count,vars,knvars)));
true = intGt(numRelations1,numRelations);
e_1 = DAE.LBINARY(e_1,op,e_2);
{zc} = makeZeroCrossings({e_1}, {eq_count}, {wc_count});
zc_lst = List.select1(zeroCrossings, sameZeroCrossing, zc);
zeroCrossings = Util.if_(listLength(zc_lst)==0,listAppend(zeroCrossings,{zc}),zeroCrossings);
print(Debug.fcallret1(Flags.RELIDX, BackendDump.dumpZcStr1, zeroCrossings, ""));
then
((e_1,false,((zeroCrossings,relations,samples,numRelations),(eq_count,wc_count,vars,knvars))));
((e_1,false,((zeroCrossings,relations,samples,numRelations1),(eq_count,wc_count,vars,knvars))));
// function with discrete expressions generate no zerocrossing
case (((e as DAE.RELATION(exp1 = e1,operator = op,exp2 = e2)),((zeroCrossings,relations,samples,numRelations),(eq_count,wc_count,vars,knvars))))
equation
Expand Down Expand Up @@ -3635,7 +3636,7 @@ algorithm
BackendDAE.Variables vars,knvars;
list<BackendDAE.ZeroCrossing> zeroCrossings, zc_lst, relations, samples;
DAE.Operator op;
Integer numRelations,alg_indx,new_idx,itmp;
Integer numRelations,alg_indx,new_idx,itmp,numRelations1;
BackendDAE.ZeroCrossing zc;

case (((e as DAE.CALL(path = Absyn.IDENT(name = "noEvent"))),(iterator,le,range,(zeroCrossings,relations,samples,numRelations),(alg_indx,vars,knvars))))
Expand Down Expand Up @@ -3678,15 +3679,16 @@ algorithm
equation
Debug.fcall(Flags.RELIDX,print, "continues LBINARY: " +& intString(numRelations) +& "\n");
Debug.fcall(Flags.RELIDX, BackendDump.debugExpStr, (e, "\n"));
((e_1,(iterator,le,range,(_,relations,samples,numRelations),(alg_indx,vars,knvars)))) = Expression.traverseExpTopDown(e1, collectZCAlgs, (iterator,le,range,(zeroCrossings,relations,samples,numRelations),(alg_indx,vars,knvars)));
((e_2,(iterator,le,range,(_,relations,samples,numRelations),(alg_indx,vars,knvars)))) = Expression.traverseExpTopDown(e2, collectZCAlgs, (iterator,le,range,(zeroCrossings,relations,samples,numRelations),(alg_indx,vars,knvars)));
((e_1,(iterator,le,range,(_,relations,samples,numRelations1),(alg_indx,vars,knvars)))) = Expression.traverseExpTopDown(e1, collectZCAlgs, (iterator,le,range,(zeroCrossings,relations,samples,numRelations),(alg_indx,vars,knvars)));
((e_2,(iterator,le,range,(_,relations,samples,numRelations1),(alg_indx,vars,knvars)))) = Expression.traverseExpTopDown(e2, collectZCAlgs, (iterator,le,range,(zeroCrossings,relations,samples,numRelations1),(alg_indx,vars,knvars)));
true = intGt(numRelations1,numRelations);
e_1 = DAE.LBINARY(e_1,op,e_2);
{zc} = makeZeroCrossings({e_1}, {alg_indx}, {});
zc_lst = List.select1(zeroCrossings, sameZeroCrossing, zc);
zeroCrossings = Util.if_(listLength(zc_lst)==0,listAppend(zeroCrossings,{zc}),zeroCrossings);
print(Debug.fcallret1(Flags.RELIDX, BackendDump.dumpZcStr1, zeroCrossings, ""));
then
((e_1,false,(iterator,le,range,(zeroCrossings,relations,samples,numRelations),(alg_indx,vars,knvars))));
((e_1,false,(iterator,le,range,(zeroCrossings,relations,samples,numRelations1),(alg_indx,vars,knvars))));
// function with discrete expressions generate no zerocrossing
case (((e as DAE.RELATION(exp1 = e1,operator = op,exp2 = e2)),(iterator,le,range,(zeroCrossings,relations,samples,numRelations),(alg_indx,vars,knvars))))
equation
Expand Down Expand Up @@ -3723,7 +3725,7 @@ algorithm
BackendDAE.Variables vars,knvars;
list<BackendDAE.ZeroCrossing> zeroCrossings,zc_lst,zcLstNew,relations,samples;
DAE.Operator op;
Integer numRelations,alg_indx,itmp;
Integer numRelations,alg_indx,itmp,numRelations1;
list<Integer> eqs;
Boolean b1,b2;
DAE.Exp startvalue,stepvalue;
Expand Down Expand Up @@ -3791,31 +3793,33 @@ algorithm
b1 = Expression.expContains(e1,iterator);
b2 = Expression.expContains(e2,iterator);
true = Util.boolOrList({b1,b2});
((e_1,(iterator,inExpLst,range,(_,relations,samples,numRelations),(alg_indx,vars,knvars)))) = Expression.traverseExpTopDown(e1, collectZCAlgsFor, (iterator,inExpLst,range,(zeroCrossings,relations,samples,numRelations),(alg_indx,vars,knvars)));
((e_2,(iterator,inExpLst,range,(_,relations,samples,numRelations),(alg_indx,vars,knvars)))) = Expression.traverseExpTopDown(e2, collectZCAlgsFor, (iterator,inExpLst,range,(zeroCrossings,relations,samples,numRelations),(alg_indx,vars,knvars)));
((e_1,(iterator,inExpLst,range,(_,relations,samples,numRelations1),(alg_indx,vars,knvars)))) = Expression.traverseExpTopDown(e1, collectZCAlgsFor, (iterator,inExpLst,range,(zeroCrossings,relations,samples,numRelations),(alg_indx,vars,knvars)));
((e_2,(iterator,inExpLst,range,(_,relations,samples,numRelations1),(alg_indx,vars,knvars)))) = Expression.traverseExpTopDown(e2, collectZCAlgsFor, (iterator,inExpLst,range,(zeroCrossings,relations,samples,numRelations1),(alg_indx,vars,knvars)));
true = intGt(numRelations1,numRelations);
e_1 = DAE.LBINARY(e_1,op,e_2);
(explst,itmp) = replaceIteratorwithStaticValues(e_1,iterator,inExpLst,numRelations);
(explst,itmp) = replaceIteratorwithStaticValues(e_1,iterator,inExpLst,numRelations1);
zc_lst = makeZeroCrossings(explst, {alg_indx}, {});
zc_lst = listAppend(zeroCrossings, zc_lst);
zc_lst = mergeZeroCrossings(zc_lst);
itmp = (listLength(zc_lst)-listLength(zeroCrossings));
zeroCrossings = Util.if_(itmp>0,zc_lst,zeroCrossings);
print(Debug.fcallret1(Flags.RELIDX, BackendDump.dumpZcStr1, zeroCrossings, ""));
then
((e_1,false,(iterator,inExpLst,range,(zeroCrossings,relations,samples,numRelations),(alg_indx,vars,knvars))));
((e_1,false,(iterator,inExpLst,range,(zeroCrossings,relations,samples,numRelations1),(alg_indx,vars,knvars))));
case (((e as DAE.LBINARY(exp1 = e1,operator = op,exp2 = e2)),(iterator,inExpLst,range,(zeroCrossings,relations,samples,numRelations),(alg_indx,vars,knvars))))
equation
Debug.fcall(Flags.RELIDX,print, "continues LBINARY: " +& intString(numRelations) +& "\n");
Debug.fcall(Flags.RELIDX, BackendDump.debugExpStr, (e, "\n"));
((e_1,(iterator,inExpLst,range,(_,relations,samples,numRelations),(alg_indx,vars,knvars)))) = Expression.traverseExpTopDown(e1, collectZCAlgsFor, (iterator,inExpLst,range,(zeroCrossings,relations,samples,numRelations),(alg_indx,vars,knvars)));
((e_2,(iterator,inExpLst,range,(_,relations,samples,numRelations),(alg_indx,vars,knvars)))) = Expression.traverseExpTopDown(e2, collectZCAlgsFor, (iterator,inExpLst,range,(zeroCrossings,relations,samples,numRelations),(alg_indx,vars,knvars)));
((e_1,(iterator,inExpLst,range,(_,relations,samples,numRelations1),(alg_indx,vars,knvars)))) = Expression.traverseExpTopDown(e1, collectZCAlgsFor, (iterator,inExpLst,range,(zeroCrossings,relations,samples,numRelations),(alg_indx,vars,knvars)));
((e_2,(iterator,inExpLst,range,(_,relations,samples,numRelations1),(alg_indx,vars,knvars)))) = Expression.traverseExpTopDown(e2, collectZCAlgsFor, (iterator,inExpLst,range,(zeroCrossings,relations,samples,numRelations1),(alg_indx,vars,knvars)));
true = intGt(numRelations1,numRelations);
e_1 = DAE.LBINARY(e_1,op,e_2);
{zc} = makeZeroCrossings({e_1}, {alg_indx}, {});
zc_lst = List.select1(zeroCrossings, sameZeroCrossing, zc);
zeroCrossings = Util.if_(listLength(zc_lst)==0,listAppend(zeroCrossings,{zc}),zeroCrossings);
print(Debug.fcallret1(Flags.RELIDX, BackendDump.dumpZcStr1, zeroCrossings, ""));
then
((e_1,false,(iterator,inExpLst,range,(zeroCrossings,relations,samples,numRelations),(alg_indx,vars,knvars))));
((e_1,false,(iterator,inExpLst,range,(zeroCrossings,relations,samples,numRelations1),(alg_indx,vars,knvars))));
// function with discrete expressions generate no zerocrossing.
case (((e as DAE.RELATION(exp1 = e1,operator = op,exp2 = e2)),(iterator,inExpLst,range,(zeroCrossings,relations,samples,numRelations),(alg_indx,vars,knvars))))
equation
Expand Down
23 changes: 23 additions & 0 deletions Compiler/FrontEnd/Expression.mo
Expand Up @@ -686,6 +686,29 @@ algorithm
end matchcontinue;
end addNoEventToRelationExp;

public function addNoEventToRelationsAndConds
"Function that adds a noEvent() call to all relations in an expression"
input DAE.Exp e;
output DAE.Exp outE;
algorithm
((outE,_)) := traverseExp(e,addNoEventToRelationandCondExp,0);
end addNoEventToRelationsAndConds;

protected function addNoEventToRelationandCondExp "
traversal function for addNoEventToRelationsAndConds"
input tuple<DAE.Exp,Integer/*dummy*/> inTpl;
output tuple<DAE.Exp,Integer> outTpl;
algorithm
outTpl := matchcontinue(inTpl)
local
DAE.Exp e,e1,e2;
Integer i;
case((e as DAE.RELATION(exp1=_),i)) then ((DAE.CALL(Absyn.IDENT("noEvent"),{e},DAE.callAttrBuiltinBool),i+1));
case((DAE.IFEXP(e,e1,e2),i)) then ((DAE.IFEXP(DAE.CALL(Absyn.IDENT("noEvent"),{e},DAE.callAttrBuiltinBool),e1,e2),i+1));
case((e,i)) then ((e,i));
end matchcontinue;
end addNoEventToRelationandCondExp;

public function addNoEventToEventTriggeringFunctions
" Function that adds a noEvent() call to all event triggering functions in an expression"
input DAE.Exp e;
Expand Down
3 changes: 3 additions & 0 deletions Compiler/FrontEnd/Inline.mo
Expand Up @@ -1429,6 +1429,9 @@ algorithm
newExp = getRhsExp(fn);
// compare types
true = checkExpsTypeEquiv(e1, newExp);
// add noEvent to avoid events as usually for functions
// MSL3.3 GenerateEvents
newExp = Expression.addNoEventToRelationsAndConds(newExp);
((newExp,(_,_,true))) = Expression.traverseExp(newExp,replaceArgs,(argmap,checkcr,true));
// for inlinecalls in functions
((newExp1,(fns1,_))) = Expression.traverseExp(newExp,inlineCall,(fns,true));
Expand Down

0 comments on commit f4d2ce6

Please sign in to comment.