Changeset 5c431b26 in OpenModelica
- Timestamp:
- 2020-10-21T15:08:49+02:00 (3 years ago)
- Children:
- 1019c41e
- Parents:
- c9471b8
- git-author:
- Per Östlund <perost86@…> (10/20/20 11:00:13)
- git-committer:
- Adrian Pop <adrian.pop@…> (10/21/20 15:08:49)
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
OMCompiler/Compiler/NFFrontEnd/NFArrayConnections.mo
rc9471b8 r5c431b26 887 887 forLoop := Equation.FOR(iterators[icount], SOME(ranges[icount]), body, DAE.emptyElementSource); 888 888 889 for i in 1:icount-1 loop889 for i in icount-1:-1:1 loop 890 890 forLoop := Equation.FOR(iterators[i], SOME(ranges[i]), {forLoop}, DAE.emptyElementSource); 891 891 end for; -
OMCompiler/Compiler/NFFrontEnd/NFFlatten.mo
rc9471b8 r5c431b26 689 689 veqn := match eqn 690 690 local 691 InstNode prefix_node,iter;692 Integer stop;691 InstNode iter; 692 list<InstNode> iters; 693 693 Expression range; 694 list<Expression> ranges; 695 list<Subscript> subs; 696 DAE.ElementSource src; 697 698 // convert simple equality of crefs to array equality 694 699 case Equation.EQUALITY(lhs = Expression.CREF(), rhs = Expression.CREF()) 695 // convert simple equality of crefs to array equality696 700 then Equation.ARRAY_EQUALITY(eqn.lhs, eqn.rhs, Type.liftArrayLeftList(eqn.ty, dimensions), eqn.source); 701 702 // wrap general equation into for loop 697 703 else 698 // wrap general equation into for loop 699 algorithm 700 iter := match ComponentRef.node(prefix) 701 case prefix_node as InstNode.COMPONENT_NODE() 702 then InstNode.COMPONENT_NODE( 703 "$i", prefix_node.visibility, 704 Pointer.create(Component.ITERATOR(Type.INTEGER(), Variability.IMPLICITLY_DISCRETE, 705 Component.info(Pointer.access(prefix_node.component)))), 706 prefix_node.parent, InstNodeType.NORMAL_COMP()); 707 end match; 708 {Dimension.INTEGER(size = stop)} := dimensions; 709 range := Expression.RANGE(Type.ARRAY(Type.INTEGER(), dimensions), Expression.INTEGER(1), NONE(), Expression.INTEGER(stop)); 710 veqn := Equation.mapExp(eqn, function addIterator(prefix = prefix, subscript = Subscript.INDEX(Expression.CREF(Type.INTEGER(), ComponentRef.makeIterator(iter, Type.INTEGER()))))); 711 then 712 Equation.FOR(iter, SOME(range), {veqn}, Equation.source(eqn)); 704 algorithm 705 (iters, ranges, subs) := makeIterators(prefix, dimensions); 706 subs := listReverseInPlace(subs); 707 veqn := Equation.mapExp(eqn, function addIterator(prefix = prefix, subscripts = subs)); 708 src := Equation.source(eqn); 709 710 iter :: iters := iters; 711 range :: ranges := ranges; 712 veqn := Equation.FOR(iter, SOME(range), {veqn}, src); 713 714 while not listEmpty(iters) loop 715 iter :: iters := iters; 716 range :: ranges := ranges; 717 veqn := Equation.FOR(iter, SOME(range), {veqn}, src); 718 end while; 719 then 720 veqn; 721 713 722 end match; 714 723 end vectorizeEquation; … … 722 731 valg := match alg 723 732 local 724 InstNode prefix_node,iter;725 Integer stop;733 InstNode iter; 734 list<InstNode> iters; 726 735 Expression range; 736 list<Expression> ranges; 737 list<Subscript> subs; 727 738 list<Statement> body; 739 Statement stmt; 740 741 // let simple assignment as is 728 742 case Algorithm.ALGORITHM(statements = {Statement.ASSIGNMENT(lhs = Expression.CREF(), rhs = Expression.CREF())}) 729 // let simple assignment as is730 743 then alg; 744 745 // wrap general algorithm into for loop 731 746 else 732 // wrap general algorithm into for loop 733 algorithm 734 iter := match ComponentRef.node(prefix) 735 case prefix_node as InstNode.COMPONENT_NODE() 736 then InstNode.COMPONENT_NODE( 737 "$i", prefix_node.visibility, 738 Pointer.create(Component.ITERATOR(Type.INTEGER(), Variability.IMPLICITLY_DISCRETE, 739 Component.info(Pointer.access(prefix_node.component)))), 740 prefix_node.parent, InstNodeType.NORMAL_COMP()); 741 end match; 742 {Dimension.INTEGER(size = stop)} := dimensions; 743 range := Expression.RANGE(Type.ARRAY(Type.INTEGER(), dimensions), Expression.INTEGER(1), NONE(), Expression.INTEGER(stop)); 744 body := Statement.mapExpList(alg.statements, function addIterator(prefix = prefix, subscript = Subscript.INDEX(Expression.CREF(Type.INTEGER(), ComponentRef.makeIterator(iter, Type.INTEGER()))))); 745 then 746 Algorithm.ALGORITHM({Statement.FOR(iter, SOME(range), body, alg.source)}, alg.source); 747 algorithm 748 (iters, ranges, subs) := makeIterators(prefix, dimensions); 749 subs := listReverseInPlace(subs); 750 body := Statement.mapExpList(alg.statements, function addIterator(prefix = prefix, subscripts = subs)); 751 752 iter :: iters := iters; 753 range :: ranges := ranges; 754 stmt := Statement.FOR(iter, SOME(range), body, alg.source); 755 756 while not listEmpty(iters) loop 757 iter :: iters := iters; 758 range :: ranges := ranges; 759 stmt := Statement.FOR(iter, SOME(range), body, alg.source); 760 end while; 761 then 762 Algorithm.ALGORITHM({stmt}, alg.source); 763 747 764 end match; 748 765 end vectorizeAlgorithm; 766 767 function makeIterators 768 input ComponentRef prefix; 769 input list<Dimension> dimensions; 770 output list<InstNode> iterators = {}; 771 output list<Expression> ranges = {}; 772 output list<Subscript> subscripts = {}; 773 protected 774 Component iter_comp; 775 InstNode prefix_node, iter; 776 Expression range; 777 Integer index = 1; 778 Subscript sub; 779 algorithm 780 prefix_node := ComponentRef.node(prefix); 781 782 for dim in dimensions loop 783 iter_comp := Component.ITERATOR(Type.INTEGER(), 784 Variability.IMPLICITLY_DISCRETE, InstNode.info(prefix_node)); 785 iter := InstNode.fromComponent("$i" + String(index), iter_comp, InstNode.parent(prefix_node)); 786 iterators := iter :: iterators; 787 index := index + 1; 788 789 range := Expression.makeRange(Expression.INTEGER(1), NONE(), Dimension.sizeExp(dim)); 790 ranges := range :: ranges; 791 792 sub := Subscript.INDEX(Expression.CREF(Type.INTEGER(), ComponentRef.makeIterator(iter, Type.INTEGER()))); 793 subscripts := sub :: subscripts; 794 end for; 795 end makeIterators; 749 796 750 797 function addIterator 751 798 input output Expression exp; 752 799 input ComponentRef prefix; 753 input Subscript subscript;754 algorithm 755 exp := Expression.map(exp, function addIterator_traverse(prefix = prefix, subscript = subscript));800 input list<Subscript> subscripts; 801 algorithm 802 exp := Expression.map(exp, function addIterator_traverse(prefix = prefix, subscripts = subscripts)); 756 803 end addIterator; 757 804 … … 759 806 input output Expression exp; 760 807 input ComponentRef prefix; 761 input Subscript subscript;808 input list<Subscript> subscripts; 762 809 protected 763 810 String restString, prefixString = ComponentRef.toString(prefix); … … 771 818 restString := ComponentRef.toString(restCref); 772 819 if prefixLength <= stringLength(restString) and prefixString == substring(restString, 1, prefixLength) then 773 exp.cref := ComponentRef.mergeSubscripts( {subscript}, exp.cref, applyToScope = true);820 exp.cref := ComponentRef.mergeSubscripts(subscripts, exp.cref, applyToScope = true); 774 821 end if; 775 822 then -
testsuite/openmodelica/cppruntime/testVectorizedBlocks.mos
r1a64c7d r5c431b26 70 70 // 3/21 (10): integrator1.y = y [dynamic |0|0|0|0|] 71 71 // 4/31 (10): assignClock1.y = assignClock1.u [dynamic |0|0|0|0|] 72 // 5/41 (10): for $i in 1 : 10 loop73 // der(integrator1[$i ].y) = integrator1[$i].k * integrator1[$i].u; end for; [dynamic |0|0|0|0|]72 // 5/41 (10): for $i1 in 1 : 10 loop 73 // der(integrator1[$i1].y) = integrator1[$i1].k * integrator1[$i1].u; end for; [dynamic |0|0|0|0|] 74 74 // 75 75 // … … 134 134 // 3/21 (10): integrator1.y = y [dynamic |0|0|0|0|] 135 135 // 4/31 (10): assignClock1.y = assignClock1.u [dynamic |0|0|0|0|] 136 // 5/41 (10): for $i in 1 : 10 loop137 // $DER.integrator1[$i ].y = integrator1[$i].k * integrator1[$i].u; end for; [dynamic |0|0|0|0|]136 // 5/41 (10): for $i1 in 1 : 10 loop 137 // $DER.integrator1[$i1].y = integrator1[$i1].k * integrator1[$i1].u; end for; [dynamic |0|0|0|0|] 138 138 // 6/51 (10): for i in 1 : 10 loop 139 139 // (integrator1[i].y - previous(integrator1[i].y)) / interval() = if firstTick() then 0.0 else $DER.integrator1[i].y; end for; [dynamic |0|0|0|0|] -
testsuite/openmodelica/cppruntime/testVectorizedPowerSystem.mos
rc9471b8 r5c431b26 176 176 // 5/9 (1): fixedVoltageSource1.p = {fixedVoltageSource1.terminal.v * fixedVoltageSource1.terminal.i} [dynamic |0|0|0|0|] 177 177 // 6/10 (1): fixedVoltageSource1.terminal.v = {fixedVoltageSource1.V} [dynamic |0|0|0|0|] 178 // 7/11 (3): for $i in 1 : 3 loop179 // fixedLoad1[$i ].p = {fixedLoad1[$i].terminal.v * fixedLoad1[$i].terminal.i}; end for; [dynamic |0|0|0|0|]180 // 8/14 (3): for $i in 1 : 3 loop181 // fixedLoad1[$i ].terminal.v * fixedLoad1[$i].terminal.i = fixedLoad1[$i].P; end for; [dynamic |0|0|0|0|]178 // 7/11 (3): for $i1 in 1 : 3 loop 179 // fixedLoad1[$i1].p = {fixedLoad1[$i1].terminal.v * fixedLoad1[$i1].terminal.i}; end for; [dynamic |0|0|0|0|] 180 // 8/14 (3): for $i1 in 1 : 3 loop 181 // fixedLoad1[$i1].terminal.v * fixedLoad1[$i1].terminal.i = fixedLoad1[$i1].P; end for; [dynamic |0|0|0|0|] 182 182 // 9/17 (1): busBar1.v = busBar1.terminal_p.v [dynamic |0|0|0|0|] 183 183 // 10/18 (1): busBar1.i = busBar1.terminal_p.i [dynamic |0|0|0|0|] … … 422 422 // 5/9 (1): fixedVoltageSource1.p = {fixedVoltageSource1.terminal.v * fixedVoltageSource1.terminal.i} [dynamic |0|0|0|0|] 423 423 // 6/10 (1): fixedVoltageSource1.terminal.v = {fixedVoltageSource1.V} [dynamic |0|0|0|0|] 424 // 7/11 (3): for $i in 1 : 3 loop425 // fixedLoad1[$i ].p = {fixedLoad1[$i].terminal.v * fixedLoad1[$i].terminal.i}; end for; [dynamic |0|0|0|0|]426 // 8/14 (3): for $i in 1 : 3 loop427 // fixedLoad1[$i ].terminal.v * fixedLoad1[$i].terminal.i = fixedLoad1[$i].P; end for; [dynamic |0|0|0|0|]424 // 7/11 (3): for $i1 in 1 : 3 loop 425 // fixedLoad1[$i1].p = {fixedLoad1[$i1].terminal.v * fixedLoad1[$i1].terminal.i}; end for; [dynamic |0|0|0|0|] 426 // 8/14 (3): for $i1 in 1 : 3 loop 427 // fixedLoad1[$i1].terminal.v * fixedLoad1[$i1].terminal.i = fixedLoad1[$i1].P; end for; [dynamic |0|0|0|0|] 428 428 // 9/17 (1): busBar1.v = busBar1.terminal_p.v [dynamic |0|0|0|0|] 429 429 // 10/18 (1): busBar1.i = busBar1.terminal_p.i [dynamic |0|0|0|0|] -
testsuite/openmodelica/cppruntime/testVectorizedSolarSystem.mos
r84f52c5 r5c431b26 53 53 // 1/1 (1000): plant.term.v = grid.terms.v [dynamic |0|0|0|0|] 54 54 // 2/1001 (1000): plant.term.i + grid.terms.i = 0.0 [dynamic |0|0|0|0|] 55 // 3/2001 (1000): for $i in 1 : 1000 loop56 // plant[$i ].term.v * plant[$i].term.i = if plant[$i].on then plant[$i].eta * plant[$i].P_solar else 0.0; end for; [dynamic |0|0|0|0|]55 // 3/2001 (1000): for $i1 in 1 : 1000 loop 56 // plant[$i1].term.v * plant[$i1].term.i = if plant[$i1].on then plant[$i1].eta * plant[$i1].P_solar else 0.0; end for; [dynamic |0|0|0|0|] 57 57 // 4/3001 (1000): for i in 1 : 1000 loop 58 58 // grid.terms[i].v = grid.V; end for; [dynamic |0|0|0|0|] … … 101 101 // 1/1 (1000): plant.term.v = grid.terms.v [dynamic |0|0|0|0|] 102 102 // 2/1001 (1000): plant.term.i + grid.terms.i = 0.0 [dynamic |0|0|0|0|] 103 // 3/2001 (1000): for $i in 1 : 1000 loop104 // plant[$i ].term.v * plant[$i].term.i = if plant[$i].on then plant[$i].eta * plant[$i].P_solar else 0.0; end for; [dynamic |0|0|0|0|]103 // 3/2001 (1000): for $i1 in 1 : 1000 loop 104 // plant[$i1].term.v * plant[$i1].term.i = if plant[$i1].on then plant[$i1].eta * plant[$i1].P_solar else 0.0; end for; [dynamic |0|0|0|0|] 105 105 // 4/3001 (1000): for i in 1 : 1000 loop 106 106 // grid.terms[i].v = grid.V; end for; [dynamic |0|0|0|0|]
Note: See TracChangeset
for help on using the changeset viewer.