if SVSHAPE.invxyz[1]: y_r.reverse()
if SVSHAPE.invxyz[2]: z_r.reverse()
# start an infinite (wrapping) loop
+ step = 0 # track src/dst step
while True:
for z in z_r: # loop over 1st order dimension
+ z_end = z == z_r[-1]
for y in y_r: # loop over 2nd order dimension
+ y_end = y == y_r[-1]
for x in x_r: # loop over 3rd order dimension
+ x_end = x == x_r[-1]
# ok work out which order to construct things in.
# start by creating a list of tuples of the dimension
# and its limit
vals[SVSHAPE.order[1]],
vals[SVSHAPE.order[2]]
]
- # some of the dimensions can be "skipped". the order
- # was actually selected above on all 3 dimensions,
- # e.g. [z][x][y] or [y][z][x]. "skip" allows one of
- # those to be knocked out
- if SVSHAPE.skip == 0b00:
- select = 0b111
- elif SVSHAPE.skip == 0b11:
- select = 0b011
- elif SVSHAPE.skip == 0b01:
- select = 0b110
- elif SVSHAPE.skip == 0b10:
- select = 0b101
- else:
- select = 0b111
- result = 0
- mult = 1
# ok now we can construct the result, using bits of
# "order" to say which ones get stacked on
+ result = 0
+ mult = 1
for i in range(3):
lim, idx, dbg = vals[i]
- if select & (1<<i):
- #print ("select %d %s" % (i, dbg))
- idx *= mult # shifts up by previous dimension(s)
- result += idx # adds on this dimension
- mult *= lim # for the next dimension
+ # some of the dimensions can be "skipped". the order
+ # was actually selected above on all 3 dimensions,
+ # e.g. [z][x][y] or [y][z][x]. "skip" allows one of
+ # those to be knocked out
+ if SVSHAPE.skip == i+1: continue
+ #print ("select %d %s" % (i, dbg))
+ idx *= mult # shifts up by previous dimension(s)
+ result += idx # adds on this dimension
+ mult *= lim # for the next dimension
- yield result + SVSHAPE.offset
+ loopends = (x_end |
+ ((y_end and x_end)<<1) |
+ ((y_end and x_end and z_end)<<2))
+ if hasattr(SVSHAPE, "postprocess"): # for Indexed mode
+ result = SVSHAPE.postprocess(result, step)
+ yield result + SVSHAPE.offset, loopends
+ step += 1
def demo():
# set the dimension sizes here
xdim = 3
ydim = 2
- zdim = 1
+ zdim = 4
# set total (can repeat, e.g. VL=x*y*z*4)
VL = xdim * ydim * zdim
SVSHAPE0.invxyz = [0,0,0] # inversion if desired
# enumerate over the iterator function, getting new indices
- for idx, new_idx in enumerate(iterate_indices(SVSHAPE0)):
+ for idx, (new_idx, end) in enumerate(iterate_indices(SVSHAPE0)):
if idx >= VL:
break
- print ("%d->%d" % (idx, new_idx))
+ print ("%d->%d" % (idx, new_idx), "end", bin(end)[2:])
# run the demo
if __name__ == '__main__':