Changeset 1019c41e in OpenModelica


Ignore:
Timestamp:
2020-10-21T15:09:21+02:00 (4 years ago)
Author:
Adrian Pop <adrian.pop@…>
Children:
9960cdcd
Parents:
5c431b26
git-author:
Per Östlund <perost86@…> (10/20/20 12:57:27)
git-committer:
Adrian Pop <adrian.pop@…> (10/21/20 15:09:21)
Message:

Array connection improvements.

  • Make sure all iterators get unique components when creating them and not sharing a constant literal, to make the simplification for removing unused for loops work correctly.
  • Avoid creating unnecessary for loops for ranges with the same lower and upper bound.
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • OMCompiler/Compiler/NFFrontEnd/NFArrayConnections.mo

    r5c431b26 r1019c41e  
    688688      iterators[i] := InstNode.fromComponent(
    689689        "$i" + String(i),
    690         Component.ITERATOR(Type.INTEGER(), Variability.IMPLICITLY_DISCRETE, AbsynUtil.dummyInfo),
     690        Component.newIterator(Type.INTEGER(), AbsynUtil.dummyInfo),
    691691        InstNode.EMPTY_NODE()
    692692      );
     
    716716    output Expression range;
    717717  protected
     718    Integer lo = SBInterval.lowerBound(interval);
    718719    Integer step = SBInterval.stepValue(interval);
    719   algorithm
    720     range := Expression.makeRange(
    721       Expression.INTEGER(SBInterval.lowerBound(interval)),
    722       if step == 1 then NONE() else SOME(Expression.INTEGER(step)),
    723       Expression.INTEGER(SBInterval.upperBound(interval))
    724     );
     720    Integer hi = SBInterval.upperBound(interval);
     721  algorithm
     722    if lo == hi then
     723      range := Expression.INTEGER(lo);
     724    else
     725      range := Expression.makeRange(
     726        Expression.INTEGER(lo),
     727        if step == 1 then NONE() else SOME(Expression.INTEGER(step)),
     728        Expression.INTEGER(hi)
     729      );
     730    end if;
    725731  end intervalToRange;
    726732
     
    759765
    760766      eql := generatePotentialEquations2(vars1, vars, iterExps, inds);
    761       equations := generateForLoop(eql, iterators, ranges) :: equations;
     767      equations := generateForLoop(eql, iterators, ranges, equations);
    762768    end for;
    763769  end generatePotentialEquations;
     
    858864      ty := Expression.typeOf(sum_exp);
    859865      eq := Equation.EQUALITY(sum_exp, Expression.makeZero(ty), ty, DAE.emptyElementSource);
    860       equations := generateForLoop({eq}, iterators, ranges) :: equations;
     866      equations := generateForLoop({eq}, iterators, ranges, equations);
    861867    end if;
    862868  end generateFlowEquation;
     
    878884
    879885  function generateForLoop
    880     input list<Equation> body;
     886    input list<Equation> connects;
    881887    input array<InstNode> iterators;
    882888    input array<Expression> ranges;
    883     output Equation forLoop;
    884   protected
    885     Integer icount = arrayLength(iterators);
    886   algorithm
    887     forLoop := Equation.FOR(iterators[icount], SOME(ranges[icount]), body, DAE.emptyElementSource);
    888 
    889     for i in icount-1:-1:1 loop
    890       forLoop := Equation.FOR(iterators[i], SOME(ranges[i]), {forLoop}, DAE.emptyElementSource);
    891     end for;
     889    input output list<Equation> equations;
     890  protected
     891    list<Equation> body = connects;
     892  algorithm
     893    for i in arrayLength(iterators):-1:1 loop
     894      if Expression.isInteger(ranges[i]) then
     895        // Scalar range means the interval had the same lower and upper bound,
     896        // in which case the iterator can be replaced with the scalar expression
     897        // instead of creating an unnecessary for loop here.
     898        body := Equation.mapExpList(body,
     899          function Expression.replaceIterator(iterator = iterators[i], iteratorValue = ranges[i]));
     900      else
     901        body := {Equation.FOR(iterators[i], SOME(ranges[i]), body, DAE.emptyElementSource)};
     902      end if;
     903    end for;
     904
     905    equations := List.append_reverse(body, equations);
    892906  end generateForLoop;
    893907
  • OMCompiler/Compiler/NFFrontEnd/NFComponent.mo

    re293f5a r1019c41e  
    237237  end newEnum;
    238238
     239  function newIterator
     240    input Type iterType;
     241    input SourceInfo info;
     242    output Component component;
     243  algorithm
     244    component := ITERATOR(iterType, Variability.IMPLICITLY_DISCRETE, info);
     245  end newIterator;
     246
    239247  function definition
    240248    input Component component;
  • OMCompiler/Compiler/NFFrontEnd/NFFlatten.mo

    r5c431b26 r1019c41e  
    781781
    782782  for dim in dimensions loop
    783     iter_comp := Component.ITERATOR(Type.INTEGER(),
    784       Variability.IMPLICITLY_DISCRETE, InstNode.info(prefix_node));
     783    iter_comp := Component.newIterator(Type.INTEGER(), InstNode.info(prefix_node));
    785784    iter := InstNode.fromComponent("$i" + String(index), iter_comp, InstNode.parent(prefix_node));
    786785    iterators := iter :: iterators;
  • OMCompiler/Compiler/NFFrontEnd/NFSimplifyModel.mo

    rc9471b8 r1019c41e  
    161161    case Equation.FOR(range = SOME(e))
    162162      algorithm
    163         if not Equation.containsExpList(eq.body, function Expression.containsIterator(iterator = eq.iterator)) then
    164           body := simplifyEquations(eq.body);
     163        body := simplifyEquations(eq.body);
     164
     165        if not Equation.containsExpList(body, function Expression.containsIterator(iterator = eq.iterator)) then
    165166          equations := List.append_reverse(body, equations);
    166167        else
     
    171172          //  e := Expression.applySubscript(Subscript.INDEX(Expression.INTEGER(1)), e);
    172173
    173           //  body := Equation.mapExpList(eq.body,
     174          //  body := Equation.mapExpList(body,
    174175          //    function Expression.replaceIterator(iterator = eq.iterator, iteratorValue = e));
    175176          //  body := simplifyEquations(body);
     
    177178          //elseif not Dimension.isZero(dim) then
    178179            eq.range := SimplifyExp.simplifyOpt(eq.range);
    179             eq.body := simplifyEquations(eq.body);
     180            eq.body := body;
    180181            equations := eq :: equations;
    181182          //end if;
  • testsuite/flattening/modelica/scodeinst/ArrayConnect1.mo

    rc9471b8 r1019c41e  
    5050//   Real G.n.f;
    5151// equation
    52 //   for $i1 in 1:1 loop
    53 //     R[$i1].p.e = S.p.e;
    54 //   end for;
    55 //   for $i1 in 1:1 loop
    56 //     S.p.f + R[$i1].p.f = 0.0;
    57 //   end for;
     52//   R[1].p.e = S.p.e;
     53//   S.p.f + R[1].p.f = 0.0;
    5854//   for $i1 in 1:1000 loop
    5955//     C[$i1].n.e = S.n.e;
     
    7066//     C[$i1 - 1].p.f + R[$i1 - 1].n.f + R[$i1].p.f = 0.0;
    7167//   end for;
    72 //   for $i1 in 1000:1000 loop
    73 //     C[$i1].p.e = R[$i1].n.e;
    74 //   end for;
    75 //   for $i1 in 1000:1000 loop
    76 //     C[$i1].p.f + R[$i1].n.f = 0.0;
    77 //   end for;
     68//   C[1000].p.e = R[1000].n.e;
     69//   C[1000].p.f + R[1000].n.f = 0.0;
    7870// end ArrayConnect1;
    7971// endResult
  • testsuite/flattening/modelica/scodeinst/ArrayConnect2.mo

    rc9471b8 r1019c41e  
    5353//   Real G.n.f;
    5454// equation
    55 //   for $i1 in 1:1 loop
    56 //     R[$i1].p.e = S.p.e;
    57 //   end for;
    58 //   for $i1 in 1:1 loop
    59 //     S.p.f + R[$i1].p.f = 0.0;
    60 //   end for;
    61 //   for $i1 in 1000:1000 loop
    62 //     C[$i1].n.e = S.n.e;
    63 //   end for;
     55//   R[1].p.e = S.p.e;
     56//   S.p.f + R[1].p.f = 0.0;
     57//   C[1000].n.e = S.n.e;
    6458//   for $i1 in 2:999 loop
    6559//     C[$i1].n.e = S.n.e;
    6660//   end for;
    67 //   for $i1 in 1:1 loop
    68 //     C[$i1].n.e = S.n.e;
    69 //   end for;
     61//   C[1].n.e = S.n.e;
    7062//   G.p.e = S.n.e;
    71 //   for $i1 in 1:1 loop
    72 //     S.n.f + G.p.f + C[$i1].n.f + sum(C[2:1:999].n.f) + C[$i1 + 999].n.f = 0.0;
    73 //   end for;
     63//   S.n.f + G.p.f + C[1].n.f + sum(C[2:1:999].n.f) + C[1000].n.f = 0.0;
    7464//   for $i1 in 1:999 loop
    7565//     R[$i1].n.e = R[$i1 + 1].p.e;
     
    8171//     C[$i1 - 1].p.f + R[$i1 - 1].n.f + R[$i1].p.f = 0.0;
    8272//   end for;
    83 //   for $i1 in 1000:1000 loop
    84 //     C[$i1].p.e = R[$i1].n.e;
    85 //   end for;
    86 //   for $i1 in 1000:1000 loop
    87 //     C[$i1].p.f + R[$i1].n.f = 0.0;
    88 //   end for;
     73//   C[1000].p.e = R[1000].n.e;
     74//   C[1000].p.f + R[1000].n.f = 0.0;
    8975// end ArrayConnect2;
    9076// endResult
  • testsuite/flattening/modelica/scodeinst/ArrayConnect3.mo

    rc9471b8 r1019c41e  
    6363//   end for;
    6464//   for $i1 in 1:999 loop
    65 //     for $i2 in 1:99 loop
    66 //       cells[$i1,$i1].r.f + cells[$i1,$i1 + 1].l.f = 0.0;
    67 //     end for;
     65//     cells[$i1,$i1].r.f + cells[$i1,$i1 + 1].l.f = 0.0;
    6866//   end for;
    6967//   for $i1 in 2:1000 loop
     
    7371//   end for;
    7472//   for $i1 in 1:999 loop
    75 //     for $i2 in 1:99 loop
    76 //       cells[$i1,$i1].d.f + cells[$i1 + 1,$i1].u.f = 0.0;
    77 //     end for;
     73//     cells[$i1,$i1].d.f + cells[$i1 + 1,$i1].u.f = 0.0;
    7874//   end for;
    7975//   for $i1 in 1:1000 loop
    80 //     for $i2 in 1:1 loop
    81 //       cells[$i1,$i2].l.e = cells[$i1,$i1 + 99].r.e;
    82 //     end for;
     76//     cells[$i1,1].l.e = cells[$i1,$i1 + 99].r.e;
    8377//   end for;
    8478//   for $i1 in 1:1000 loop
    85 //     for $i2 in 100:100 loop
    86 //       cells[$i1,$i1].r.f + cells[$i1,$i1 - 99].l.f = 0.0;
    87 //     end for;
     79//     cells[$i1,$i1].r.f + cells[$i1,$i1 - 99].l.f = 0.0;
    8880//   end for;
    89 //   for $i1 in 1000:1000 loop
    90 //     for $i2 in 1:99 loop
    91 //       cells[$i1,$i1].r.f = 0.0;
    92 //     end for;
     81//   cells[1000,1000].r.f = 0.0;
     82//   cells[1000,1000].l.f = 0.0;
     83//   cells[1000,1000].d.f = 0.0;
     84//   for $i1 in 1:999 loop
     85//     cells[$i1,$i1].d.f = 0.0;
    9386//   end for;
    94 //   for $i1 in 1000:1000 loop
    95 //     for $i2 in 2:100 loop
    96 //       cells[$i1,$i1].l.f = 0.0;
    97 //     end for;
    98 //   end for;
    99 //   for $i1 in 1000:1000 loop
    100 //     for $i2 in 1:100 loop
    101 //       cells[$i1,$i1].d.f = 0.0;
    102 //     end for;
    103 //   end for;
    104 //   for $i1 in 1:999 loop
    105 //     for $i2 in 100:100 loop
    106 //       cells[$i1,$i1].d.f = 0.0;
    107 //     end for;
    108 //   end for;
    109 //   for $i1 in 1:1 loop
    110 //     for $i2 in 1:100 loop
    111 //       cells[$i1,$i1].u.f = 0.0;
    112 //     end for;
    113 //   end for;
     87//   cells[1,1].u.f = 0.0;
    11488//   for $i1 in 2:1000 loop
    115 //     for $i2 in 100:100 loop
    116 //       cells[$i1,$i1].u.f = 0.0;
    117 //     end for;
     89//     cells[$i1,$i1].u.f = 0.0;
    11890//   end for;
    11991// end ArrayConnect3;
Note: See TracChangeset for help on using the changeset viewer.