Changeset 1019c41e in OpenModelica
- Timestamp:
- 2020-10-21T15:09:21+02:00 (4 years ago)
- 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)
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
OMCompiler/Compiler/NFFrontEnd/NFArrayConnections.mo
r5c431b26 r1019c41e 688 688 iterators[i] := InstNode.fromComponent( 689 689 "$i" + String(i), 690 Component. ITERATOR(Type.INTEGER(), Variability.IMPLICITLY_DISCRETE, AbsynUtil.dummyInfo),690 Component.newIterator(Type.INTEGER(), AbsynUtil.dummyInfo), 691 691 InstNode.EMPTY_NODE() 692 692 ); … … 716 716 output Expression range; 717 717 protected 718 Integer lo = SBInterval.lowerBound(interval); 718 719 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; 725 731 end intervalToRange; 726 732 … … 759 765 760 766 eql := generatePotentialEquations2(vars1, vars, iterExps, inds); 761 equations := generateForLoop(eql, iterators, ranges ) :: equations;767 equations := generateForLoop(eql, iterators, ranges, equations); 762 768 end for; 763 769 end generatePotentialEquations; … … 858 864 ty := Expression.typeOf(sum_exp); 859 865 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); 861 867 end if; 862 868 end generateFlowEquation; … … 878 884 879 885 function generateForLoop 880 input list<Equation> body;886 input list<Equation> connects; 881 887 input array<InstNode> iterators; 882 888 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); 892 906 end generateForLoop; 893 907 -
OMCompiler/Compiler/NFFrontEnd/NFComponent.mo
re293f5a r1019c41e 237 237 end newEnum; 238 238 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 239 247 function definition 240 248 input Component component; -
OMCompiler/Compiler/NFFrontEnd/NFFlatten.mo
r5c431b26 r1019c41e 781 781 782 782 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)); 785 784 iter := InstNode.fromComponent("$i" + String(index), iter_comp, InstNode.parent(prefix_node)); 786 785 iterators := iter :: iterators; -
OMCompiler/Compiler/NFFrontEnd/NFSimplifyModel.mo
rc9471b8 r1019c41e 161 161 case Equation.FOR(range = SOME(e)) 162 162 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 165 166 equations := List.append_reverse(body, equations); 166 167 else … … 171 172 // e := Expression.applySubscript(Subscript.INDEX(Expression.INTEGER(1)), e); 172 173 173 // body := Equation.mapExpList( eq.body,174 // body := Equation.mapExpList(body, 174 175 // function Expression.replaceIterator(iterator = eq.iterator, iteratorValue = e)); 175 176 // body := simplifyEquations(body); … … 177 178 //elseif not Dimension.isZero(dim) then 178 179 eq.range := SimplifyExp.simplifyOpt(eq.range); 179 eq.body := simplifyEquations(eq.body);180 eq.body := body; 180 181 equations := eq :: equations; 181 182 //end if; -
testsuite/flattening/modelica/scodeinst/ArrayConnect1.mo
rc9471b8 r1019c41e 50 50 // Real G.n.f; 51 51 // 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; 58 54 // for $i1 in 1:1000 loop 59 55 // C[$i1].n.e = S.n.e; … … 70 66 // C[$i1 - 1].p.f + R[$i1 - 1].n.f + R[$i1].p.f = 0.0; 71 67 // 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; 78 70 // end ArrayConnect1; 79 71 // endResult -
testsuite/flattening/modelica/scodeinst/ArrayConnect2.mo
rc9471b8 r1019c41e 53 53 // Real G.n.f; 54 54 // 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; 64 58 // for $i1 in 2:999 loop 65 59 // C[$i1].n.e = S.n.e; 66 60 // 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; 70 62 // 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; 74 64 // for $i1 in 1:999 loop 75 65 // R[$i1].n.e = R[$i1 + 1].p.e; … … 81 71 // C[$i1 - 1].p.f + R[$i1 - 1].n.f + R[$i1].p.f = 0.0; 82 72 // 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; 89 75 // end ArrayConnect2; 90 76 // endResult -
testsuite/flattening/modelica/scodeinst/ArrayConnect3.mo
rc9471b8 r1019c41e 63 63 // end for; 64 64 // 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; 68 66 // end for; 69 67 // for $i1 in 2:1000 loop … … 73 71 // end for; 74 72 // 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; 78 74 // end for; 79 75 // 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; 83 77 // end for; 84 78 // 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; 88 80 // 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; 93 86 // 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; 114 88 // 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; 118 90 // end for; 119 91 // end ArrayConnect3;
Note: See TracChangeset
for help on using the changeset viewer.