Changeset 3b96b9d9 in OpenModelica


Ignore:
Timestamp:
2021-11-24T14:12:51+01:00 (2 years ago)
Author:
Per Östlund <perost86@…>
Parents:
7c3ddb9c
git-author:
Per Östlund <perost86@…> (11/24/21 12:52:33)
git-committer:
Per Östlund <perost86@…> (11/24/21 14:12:51)
Message:

Improve flattening without scalarization

  • Flatten equations and algorithms with an empty prefix when not doing scalarization, to get rid of any remaining split indices.
Files:
3 edited

Legend:

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

    r9f0cb452 r3b96b9d9  
    137137end FlattenSettings;
    138138
     139constant ComponentRef EMPTY_PREFIX = ComponentRef.EMPTY();
     140
    139141function flatten
    140142  input InstNode classInst;
     
    165167  deleted_vars := UnorderedSet.new(ComponentRef.hash, ComponentRef.isEqual);
    166168
    167   (vars, sections) := flattenClass(InstNode.getClass(classInst), ComponentRef.EMPTY(),
     169  (vars, sections) := flattenClass(InstNode.getClass(classInst), EMPTY_PREFIX,
    168170    Visibility.PUBLIC, NONE(), {}, sections, deleted_vars, settings);
    169171  vars := listReverseInPlace(vars);
     
    737739      algorithm
    738740        for eqn in listReverse(sects.equations) loop
    739           sections := Sections.prependEquation(vectorizeEquation(eqn, dimensions, prefix), sections);
     741          sections := Sections.prependEquation(vectorizeEquation(eqn, dimensions, prefix, settings), sections);
    740742        end for;
    741743        for eqn in listReverse(sects.initialEquations) loop
    742           sections := Sections.prependEquation(vectorizeEquation(eqn, dimensions, prefix), sections, true);
     744          sections := Sections.prependEquation(vectorizeEquation(eqn, dimensions, prefix, settings), sections, true);
    743745        end for;
    744746        for alg in listReverse(sects.algorithms) loop
     
    753755
    754756function vectorizeEquation
    755   input Equation eqn;
     757  input output Equation eqn;
    756758  input list<Dimension> dimensions;
    757759  input ComponentRef prefix;
    758   output Equation veqn;
    759 algorithm
    760   veqn := match eqn
     760  input FlattenSettings settings;
     761algorithm
     762  // Flatten with an empty prefix to get rid of any split indices.
     763  {eqn} := flattenEquation(eqn, EMPTY_PREFIX, {}, settings);
     764
     765  eqn := match eqn
    761766    local
    762767      InstNode iter;
     
    776781        (iters, ranges, subs) := makeIterators(prefix, dimensions);
    777782        subs := listReverseInPlace(subs);
    778         veqn := Equation.mapExp(eqn, function addIterator(prefix = prefix, subscripts = subs));
     783        eqn := Equation.mapExp(eqn, function addIterator(prefix = prefix, subscripts = subs));
    779784        src := Equation.source(eqn);
    780785
    781786        iter :: iters := iters;
    782787        range :: ranges := ranges;
    783         veqn := Equation.FOR(iter, SOME(range), {veqn}, src);
     788        eqn := Equation.FOR(iter, SOME(range), {eqn}, src);
    784789
    785790        while not listEmpty(iters) loop
    786791          iter :: iters := iters;
    787792          range :: ranges := ranges;
    788           veqn := Equation.FOR(iter, SOME(range), {veqn}, src);
     793          eqn := Equation.FOR(iter, SOME(range), {eqn}, src);
    789794        end while;
    790795      then
    791         veqn;
     796        eqn;
    792797
    793798  end match;
     
    795800
    796801function vectorizeAlgorithm
    797   input Algorithm alg;
     802  input output Algorithm alg;
    798803  input list<Dimension> dimensions;
    799804  input ComponentRef prefix;
    800   output Algorithm valg;
    801 algorithm
    802   valg := match alg
     805algorithm
     806  // Flatten with an empty prefix to get rid of any split indices.
     807  alg.statements := flattenStatements(alg.statements, EMPTY_PREFIX);
     808
     809  alg := match alg
    803810    local
    804811      InstNode iter;
     
    12011208      algorithm
    12021209        if settings.arrayConnect then
     1210          eq.body := flattenEquations(eq.body, EMPTY_PREFIX, settings);
    12031211          eql := eq :: equations;
    12041212        elseif not settings.scalarize then
     
    14231431algorithm
    14241432  Equation.FOR(iter, range, body, src) := forLoop;
     1433  body := flattenEquations(body, EMPTY_PREFIX, settings);
    14251434  (connects, non_connects) := splitForLoop2(body);
    14261435
  • testsuite/flattening/modelica/scodeinst/ArrayConnect3.mo

    ra197fa55 r3b96b9d9  
    5757//   Real[1000, 100] cells.l.e;
    5858// equation
     59//   for $i1 in 2:1000 loop
     60//     for $i2 in 1:99 loop
     61//       cells[$i1,$i2].u.e = cells[$i1 - 1,$i2].d.e;
     62//     end for;
     63//   end for;
     64//   for $i1 in 1:999 loop
     65//     for $i2 in 1:99 loop
     66//       cells[$i1,$i2].d.f + cells[$i1 + 1,$i2].u.f = 0.0;
     67//     end for;
     68//   end for;
    5969//   for $i1 in 1:999 loop
    6070//     for $i2 in 2:100 loop
     
    6777//     end for;
    6878//   end for;
    69 //   for $i1 in 2:1000 loop
    70 //     for $i2 in 1:99 loop
    71 //       cells[$i1,$i2].u.e = cells[$i1 - 1,$i2].d.e;
    72 //     end for;
    73 //   end for;
    74 //   for $i1 in 1:999 loop
    75 //     for $i2 in 1:99 loop
    76 //       cells[$i1,$i2].d.f + cells[$i1 + 1,$i2].u.f = 0.0;
    77 //     end for;
    78 //   end for;
    7979//   for $i1 in 1:1000 loop
    8080//     cells[$i1,1].l.e = cells[$i1,100].r.e;
     
    8484//   end for;
    8585//   for $i2 in 1:100 loop
     86//     cells[1000,$i2].d.e = S.n.e;
     87//   end for;
     88//   sum(cells[1000,:].d.f) + S.n.f = 0.0;
     89//   for $i2 in 1:100 loop
    8690//     cells[1,$i2].u.e = S.p.e;
    8791//   end for;
    8892//   sum(cells[1,:].u.f) + S.p.f = 0.0;
    89 //   for $i2 in 1:100 loop
    90 //     cells[1000,$i2].d.e = S.n.e;
    91 //   end for;
    92 //   sum(cells[1000,:].d.f) + S.n.f = 0.0;
    9393//   for $i1 in 1:999 loop
    9494//     cells[$i1,100].d.f = 0.0;
  • testsuite/flattening/modelica/scodeinst/PrintRecordTypes1.mo

    rd8aa7d6 r3b96b9d9  
    4646// equation
    4747//   for i in 1:100 loop
     48//     b[i].c[10] = R2(R1(1.0, 0.0), R1(/*Real*/(i), 1.0));
    4849//     b[i].c[1].rb = R1(/*Real*/(i), 0.0);
    49 //     b[i].c[10] = R2(R1(1.0, 0.0), R1(/*Real*/(i), 1.0));
    5050//   end for;
    5151// end PrintRecordTypes1;
Note: See TracChangeset for help on using the changeset viewer.