@@ -355,7 +355,7 @@ public
355355 (var_start, _) := mapping. var_AtS[var_arr_idx];
356356 sizes := ComponentRef . sizes(stripped, false );
357357 int_subs := ComponentRef . subscriptsToInteger(cref);
358- var_scal_idx := locationToIndex(List . zip( sizes, int_subs) , var_start);
358+ var_scal_idx := locationToIndex(sizes, int_subs, var_start);
359359 indices := var_scal_idx :: indices;
360360 end for ;
361361 // remove duplicates and sort
@@ -682,14 +682,16 @@ public
682682 function locationToIndex
683683 "reverse function to indexToLocation()
684684 maps a frame location to a scalar index starting from first index (one based!)"
685- input list< tuple< Integer ,Integer >> size_val_tpl_lst;
685+ input list< Integer > sizes;
686+ input list< Integer > values;
686687 input output Integer index;
687688 protected
688- Integer size, val, factor = 1 ;
689+ Integer factor = 1 , size;
690+ list< Integer > rest_sizes = sizes;
689691 algorithm
690- for tpl in size_val_tpl_lst loop
691- ( size, val) := tpl ;
692- index := index + (val - 1 ) * factor;
692+ for v in values loop
693+ size :: rest_sizes := rest_sizes ;
694+ index := index + (v - 1 ) * factor;
693695 factor := factor * size;
694696 end for ;
695697 end locationToIndex;
@@ -1083,7 +1085,7 @@ public
10831085 (var_start, _) := mapping. var_AtS[var_arr_idx];
10841086 sizes := ComponentRef . sizes(stripped, false );
10851087 int_subs := ComponentRef . subscriptsToInteger(replaced);
1086- var_scal_idx := locationToIndex(List . zip( sizes, int_subs) , var_start);
1088+ var_scal_idx := locationToIndex(sizes, int_subs, var_start);
10871089 indices := var_scal_idx :: indices;
10881090 end for ;
10891091 end upgradeRowFull;
@@ -1205,7 +1207,7 @@ protected
12051207 // skip to an array element
12061208 case (Type . ARRAY (), rest) guard List . compareLength(rest, ty. dimensions) >= 0 algorithm
12071209 (rest, tail) := List . split(rest, listLength(ty. dimensions));
1208- index := locationToIndex(List . zip( list(Dimension . size(dim, true ) for dim in ty. dimensions), rest) , index);
1210+ index := locationToIndex(list(Dimension . size(dim, true ) for dim in ty. dimensions), rest, index);
12091211 then resolveSkips(index, ty. elementType, tail, cref, fullmap);
12101212
12111213 // skip for tuple or array, but the skip is too large
@@ -1594,15 +1596,15 @@ protected
15941596 Expression range;
15951597 Option < Iterator > map;
15961598 Integer start, step, stop;
1597- list< list< tuple < Integer , Integer >>> ranges ;
1599+ list< list< Integer >> values ;
15981600 list< Expression > iterator_exps;
15991601 list< Integer > iterator_lst;
16001602 Integer sub_idx;
16011603
16021604 // only occurs for non-for-loop equations (no frames to replace)
16031605 case {} algorithm
1604- ranges := resolveDimensionsSubscripts(sizes, subs, replacements);
1605- then list(locationToIndex(r, first) for r in ranges );
1606+ values := resolveDimensionsSubscripts(sizes, subs, replacements);
1607+ then list(locationToIndex(sizes, v, first) for v in values );
16061608
16071609 // extract numeric information about the range
16081610 case (iterator, range, map) :: rest algorithm
@@ -1630,9 +1632,9 @@ protected
16301632
16311633 if listEmpty(rest) then
16321634 // bottom line, resolve current configuration and create index for it
1633- ranges := resolveDimensionsSubscripts(sizes, subs, replacements);
1634- for r in listReverse(ranges ) loop
1635- indices := locationToIndex(r , first) :: indices;
1635+ values := resolveDimensionsSubscripts(sizes, subs, replacements);
1636+ for v in listReverse(values ) loop
1637+ indices := locationToIndex(sizes, v , first) :: indices;
16361638 end for ;
16371639 else
16381640 // not last frame, go deeper
@@ -1694,31 +1696,28 @@ protected
16941696
16951697 function resolveDimensionsSubscripts
16961698 "uses the replacement module to replace all iterator crefs in the subscript with the current position.
1697- Returns a list of tuples containing the size of each subscript and current position ."
1699+ Returns the current positions for each subscript."
16981700 input list< Integer > sizes "dimension sizes" ;
16991701 input list< Expression > subs "subscript expressions" ;
17001702 input UnorderedMap < ComponentRef , Expression > replacements "replacement map for iterator crefs" ;
1701- output list< list< tuple < Integer , Integer >>> ranges "tuple pairs (size, pos)" ;
1703+ output list< list< Integer >> values ;
17021704 protected
17031705 list< Expression > replaced;
1704- list< list< Integer >> values;
17051706 algorithm
17061707 // get all possible subscript combinations
17071708 replaced := list(Expression . map(sub, function Replacements . applySimpleExp(replacements = replacements)) for sub in subs);
1708- values := list(resolveDimensionsSubscript(tpl) for tpl in List . zip( replaced, sizes) );
1709+ values := list(resolveDimensionsSubscript(exp, size) threaded for exp in replaced, size in sizes);
17091710 values := List . combination(values);
1710- ranges := list(List . zip(sizes, v) for v in values);
17111711 end resolveDimensionsSubscripts;
17121712
17131713 function resolveDimensionsSubscript
1714- input tuple< Expression , Integer > tpl;
1714+ input Expression replaced;
1715+ input Integer size;
17151716 output list< Integer > res;
17161717 protected
17171718 Expression rep;
1718- Integer size;
17191719 algorithm
1720- (rep, size) := tpl;
1721- rep := SimplifyExp . simplifyDump(rep, true , getInstanceName());
1720+ rep := SimplifyExp . simplifyDump(replaced, true , getInstanceName());
17221721 res := match rep
17231722 local
17241723 Integer start, step, stop;
@@ -1733,7 +1732,7 @@ protected
17331732
17341733 // resolve individual array elements
17351734 case Expression . ARRAY ()
1736- then List . flatten(list(resolveDimensionsSubscript(( e, size) ) for e in rep. elements));
1735+ then List . flatten(list(resolveDimensionsSubscript(e, size) for e in rep. elements));
17371736
17381737 // assume full dependency if it cannot be evaluated
17391738 else List . intRange(size);
0 commit comments