Skip to content

Commit

Permalink
Fixes for bug #1272:
Browse files Browse the repository at this point in the history
- Fixed checkModel of for-loop with unbound parameter range.


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@6160 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
perost committed Sep 21, 2010
1 parent fd225f2 commit 42ed1b8
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 15 deletions.
19 changes: 17 additions & 2 deletions Compiler/Inst.mo
Expand Up @@ -11104,7 +11104,7 @@ algorithm
list<SCode.EEquation> b,tb1,fb,el,eel;
list<list<SCode.EEquation>> tb;
list<tuple<Absyn.Exp, list<SCode.EEquation>>> eex;
tuple<DAE.TType, Option<Absyn.Path>> id_t;
DAE.Type id_t;
Values.Value v;
DAE.ComponentRef cr_1;
SCode.EEquation eqn,eq;
Expand Down Expand Up @@ -11376,13 +11376,28 @@ algorithm
equation
(cache,e_1,DAE.PROP(type_ = (DAE.T_ARRAY(arrayType = id_t), _), constFlag = cnst),_,fdae1) = Static.elabExp(cache,env, e, impl, NONE,true, pre);
env_1 = addForLoopScope(env, i, id_t, SCode.VAR(), SOME(cnst));
(cache,v,_) = Ceval.ceval(cache,env, e_1, impl, NONE, NONE, Ceval.MSG()) "FIXME: Check bounds" ;
(cache,v,_) = Ceval.ceval(cache,env, e_1, impl, NONE, NONE, Ceval.NO_MSG()) "FIXME: Check bounds" ;
(cache,dae,csets_1,graph) = unroll(cache, env_1, mod, pre, csets, ci_state, i, id_t, v, el, initial_, impl,graph);
ci_state_1 = instEquationCommonCiTrans(ci_state, initial_);
dae = DAEUtil.joinDaes(dae,fdae1);
then
(cache,env,ih,dae,csets_1,ci_state_1,graph);

// A for-equation with a parameter range without binding, which is ok when
// doing checkModel. Use a range {1} to check that the loop can be
// instantiated.
case (cache, env, ih, mod, pre, csets, ci_state, SCode.EQ_FOR(index = i, range = e, eEquationLst = el), initial_, impl, graph)
equation
true = OptManager.getOption("checkModel");
(cache, e_1, DAE.PROP(type_ = (DAE.T_ARRAY(arrayType = id_t), _), constFlag = cnst as DAE.C_PARAM), _, fdae1) =
Static.elabExp(cache, env, e, impl, NONE, true, pre);
env_1 = addForLoopScope(env, i, id_t, SCode.VAR(), SOME(cnst));
v = Values.ARRAY({Values.INTEGER(1)}, {1});
(cache, dae, csets_1, graph) = unroll(cache, env_1, mod, pre, csets, ci_state, i, id_t, v, el, initial_, impl, graph);
ci_state_1 = instEquationCommonCiTrans(ci_state, initial_);
then
(cache, env, ih, dae, csets_1, ci_state_1, graph);

/* for i in <expr> loop .. end for;
where <expr> is not constant or parameter expression */
case (cache,env,ih,mod,pre,csets,ci_state,SCode.EQ_FOR(index = i,range = e,eEquationLst = el),initial_,impl,graph)
Expand Down
26 changes: 13 additions & 13 deletions Compiler/Static.mo
Expand Up @@ -1935,18 +1935,18 @@ algorithm
Prefix pre;
case (cache,env,start,NONE,stop,const,_,impl,pre) /* impl as false */
equation
(cache,Values.INTEGER(startv),_) = Ceval.ceval(cache,env, start, impl, NONE, NONE, Ceval.MSG());
(cache,Values.INTEGER(stopv),_) = Ceval.ceval(cache,env, stop, impl, NONE, NONE, Ceval.MSG());
(cache,Values.INTEGER(startv),_) = Ceval.ceval(cache,env, start, impl, NONE, NONE, Ceval.NO_MSG());
(cache,Values.INTEGER(stopv),_) = Ceval.ceval(cache,env, stop, impl, NONE, NONE, Ceval.NO_MSG());
n = stopv - startv;
n_1 = n + 1;
then
(cache,(
DAE.T_ARRAY(DAE.DIM_INTEGER(n_1),DAE.T_INTEGER_DEFAULT),NONE));
case (cache,env,start,SOME(step),stop,const,_,impl,_) /* as false */
equation
(cache,Values.INTEGER(startv),_) = Ceval.ceval(cache,env, start, impl, NONE, NONE, Ceval.MSG());
(cache,Values.INTEGER(stepv),_) = Ceval.ceval(cache,env, step, impl, NONE, NONE, Ceval.MSG());
(cache,Values.INTEGER(stopv),_) = Ceval.ceval(cache,env, stop, impl, NONE, NONE, Ceval.MSG());
(cache,Values.INTEGER(startv),_) = Ceval.ceval(cache,env, start, impl, NONE, NONE, Ceval.NO_MSG());
(cache,Values.INTEGER(stepv),_) = Ceval.ceval(cache,env, step, impl, NONE, NONE, Ceval.NO_MSG());
(cache,Values.INTEGER(stopv),_) = Ceval.ceval(cache,env, stop, impl, NONE, NONE, Ceval.NO_MSG());
n = stopv - startv;
n_1 = n/stepv;
n_2 = n_1 + 1;
Expand All @@ -1957,8 +1957,8 @@ algorithm
case (cache,env,start,NONE,stop,const,_,impl,_) /* impl as false */
local list<String> names; Absyn.Path p;
equation
(cache,Values.ENUM_LITERAL(name = p, index = startv),_) = Ceval.ceval(cache,env, start, impl, NONE, NONE, Ceval.MSG());
(cache,Values.ENUM_LITERAL(index = stopv),_) = Ceval.ceval(cache,env, stop, impl, NONE, NONE, Ceval.MSG());
(cache,Values.ENUM_LITERAL(name = p, index = startv),_) = Ceval.ceval(cache,env, start, impl, NONE, NONE, Ceval.NO_MSG());
(cache,Values.ENUM_LITERAL(index = stopv),_) = Ceval.ceval(cache,env, stop, impl, NONE, NONE, Ceval.NO_MSG());
n = stopv - startv;
n_1 = n + 1;
p = Absyn.pathPrefix(p);
Expand All @@ -1968,8 +1968,8 @@ algorithm
case (cache,env,start,NONE,stop,const,_,impl,_) /* as false */
local Real startv,stopv,n,n_2;
equation
(cache,Values.REAL(startv),_) = Ceval.ceval(cache,env, start, impl, NONE, NONE, Ceval.MSG());
(cache,Values.REAL(stopv),_) = Ceval.ceval(cache,env, stop, impl, NONE, NONE, Ceval.MSG());
(cache,Values.REAL(startv),_) = Ceval.ceval(cache,env, start, impl, NONE, NONE, Ceval.NO_MSG());
(cache,Values.REAL(stopv),_) = Ceval.ceval(cache,env, stop, impl, NONE, NONE, Ceval.NO_MSG());
n = stopv -. startv;
n_2 = realFloor(n);
n_3 = realInt(n_2);
Expand All @@ -1980,9 +1980,9 @@ algorithm
case (cache,env,start,SOME(step),stop,const,_,impl,_) /* as false */
local Real startv,stepv,stopv,n,n_1,n_3;
equation
(cache,Values.REAL(startv),_) = Ceval.ceval(cache,env, start, impl, NONE, NONE, Ceval.MSG());
(cache,Values.REAL(stepv),_) = Ceval.ceval(cache,env, step, impl, NONE, NONE, Ceval.MSG());
(cache,Values.REAL(stopv),_) = Ceval.ceval(cache,env, stop, impl, NONE, NONE, Ceval.MSG());
(cache,Values.REAL(startv),_) = Ceval.ceval(cache,env, start, impl, NONE, NONE, Ceval.NO_MSG());
(cache,Values.REAL(stepv),_) = Ceval.ceval(cache,env, step, impl, NONE, NONE, Ceval.NO_MSG());
(cache,Values.REAL(stopv),_) = Ceval.ceval(cache,env, stop, impl, NONE, NONE, Ceval.NO_MSG());
n = stopv -. startv;
n_1 = n /. stepv;
n_3 = realFloor(n_1);
Expand All @@ -2002,7 +2002,7 @@ algorithm
local Option<DAE.Exp> step;
equation
true = RTOpts.debugFlag("failtrace");
Debug.fprint("failtrace", "- elab_range_type failed: ");
Debug.fprint("failtrace", "- Static.elabRangeType failed: ");
sp = PrefixUtil.printPrefixStr(pre);
s1 = Exp.printExpStr(start);
s2opt = Util.applyOption(step, Exp.printExpStr);
Expand Down

0 comments on commit 42ed1b8

Please sign in to comment.