format remap_preduce_yield.py
authorJacob Lifshay <programmerjake@gmail.com>
Thu, 27 Apr 2023 02:27:58 +0000 (19:27 -0700)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 2 Jun 2023 18:51:17 +0000 (19:51 +0100)
src/openpower/decoder/isa/remap_preduce_yield.py

index a8093803da46ef81a1254b2b2c5b00f153568578..a22d040b6e46bc216c33272f0dcd54a1e747b6f0 100644 (file)
@@ -1,9 +1,10 @@
-# a "yield" version of the Parallel Reduction REMAP algorithm. 
+# a "yield" version of the Parallel Reduction REMAP algorithm.
 # the algorithm is in-place. it does not perform "MV" operations.
 # instead, where a masked-out value *should* be read from is tracked
 from copy import deepcopy
 import operator
 
+
 # python "yield" can be iterated. use this to make it clear how
 # the indices are generated by using natural-looking nested loops
 def iterate_indices(SVSHAPE, pred=None):
@@ -12,17 +13,19 @@ def iterate_indices(SVSHAPE, pred=None):
     # create lists of indices to iterate over in each dimension
     ix = list(range(xd))
     # invert the indices if needed
-    if SVSHAPE.invxyz[0]: ix.reverse()
+    if SVSHAPE.invxyz[0]:
+        ix.reverse()
     # start a loop from the lowest step
-    step = 1 
+    step = 1
     steps = []
     while step < xd:
         step *= 2
         steps.append(step)
     # invert the indices if needed
-    if SVSHAPE.invxyz[1]: steps.reverse()
+    if SVSHAPE.invxyz[1]:
+        steps.reverse()
     for step in steps:
-        stepend = (step == steps[-1]) # note end of steps
+        stepend = (step == steps[-1])  # note end of steps
         idxs = list(range(0, xd, step))
         results = []
         for i in idxs:
@@ -31,17 +34,18 @@ def iterate_indices(SVSHAPE, pred=None):
             oi = ix[other] if other < xd else None
             other_pred = other < xd and (pred is None or pred[oi])
             if (pred is None or pred[ci]) and other_pred:
-                if SVSHAPE.skip == 0b00: # submode 00
+                if SVSHAPE.skip == 0b00:  # submode 00
                     result = ci
-                elif SVSHAPE.skip == 0b01: # submode 01
+                elif SVSHAPE.skip == 0b01:  # submode 01
                     result = oi
                 results.append([result + SVSHAPE.offset, 0])
             elif other_pred:
                 ix[i] = oi
         if results:
-            results[-1][1] = (stepend<<1) | 1  # notify end of loops
+            results[-1][1] = (stepend << 1) | 1  # notify end of loops
         yield from results
 
+
 def demo():
     # set the dimension sizes here
     xdim = 9
@@ -51,30 +55,29 @@ def demo():
         pass
     SVSHAPE0 = SVSHAPE()
     SVSHAPE0.lims = [xdim, 0, 0]
-    SVSHAPE0.order = [0,1,2]
+    SVSHAPE0.order = [0, 1, 2]
     SVSHAPE0.mode = 0b10
     SVSHAPE0.skip = 0b00
     SVSHAPE0.offset = 0       # experiment with different offset, here
-    SVSHAPE0.invxyz = [0,0,0] # inversion if desired
+    SVSHAPE0.invxyz = [0, 0, 0]  # inversion if desired
 
     SVSHAPE1 = SVSHAPE()
     SVSHAPE1.lims = [xdim, 0, 0]
-    SVSHAPE1.order = [0,1,2]
+    SVSHAPE1.order = [0, 1, 2]
     SVSHAPE1.mode = 0b10
     SVSHAPE1.skip = 0b01
     SVSHAPE1.offset = 0       # experiment with different offset, here
-    SVSHAPE1.invxyz = [0,0,0] # inversion if desired
+    SVSHAPE1.invxyz = [0, 0, 0]  # inversion if desired
 
     # enumerate over the iterator function, getting new indices
-    shapes = list(iterate_indices(SVSHAPE0)), \
-              list(iterate_indices(SVSHAPE1))
+    shapes = list(iterate_indices(SVSHAPE0)), list(iterate_indices(SVSHAPE1))
     for idx in range(len(shapes[0])):
         l = shapes[0][idx]
         r = shapes[1][idx]
         (l_idx, lend) = l
         (r_idx, rend) = r
-        print ("%d->%d:%d" % (idx, l_idx, r_idx),
-               "end", bin(lend)[2:], bin(rend)[2:])
+        print("%d->%d:%d" % (idx, l_idx, r_idx),
+              "end", bin(lend)[2:], bin(rend)[2:])
 
 
 def preduce_y(vec, pred=None, operation=None):
@@ -84,27 +87,27 @@ def preduce_y(vec, pred=None, operation=None):
     res = deepcopy(vec)
     xdim = len(vec)
     # set up an SVSHAPE
+
     class SVSHAPE:
         pass
     SVSHAPE0 = SVSHAPE()
     SVSHAPE0.lims = [xdim, 0, 0]
-    SVSHAPE0.order = [0,1,2]
+    SVSHAPE0.order = [0, 1, 2]
     SVSHAPE0.mode = 0b10
     SVSHAPE0.skip = 0b00
     SVSHAPE0.offset = 0       # experiment with different offset, here
-    SVSHAPE0.invxyz = [0,0,0] # inversion if desired
+    SVSHAPE0.invxyz = [0, 0, 0]  # inversion if desired
 
     SVSHAPE1 = SVSHAPE()
     SVSHAPE1.lims = [xdim, 0, 0]
-    SVSHAPE1.order = [0,1,2]
+    SVSHAPE1.order = [0, 1, 2]
     SVSHAPE1.mode = 0b10
     SVSHAPE1.skip = 0b01
     SVSHAPE1.offset = 0       # experiment with different offset, here
-    SVSHAPE1.invxyz = [0,0,0] # inversion if desired
+    SVSHAPE1.invxyz = [0, 0, 0]  # inversion if desired
 
     # enumerate over the iterator function, getting new indices
-    shapes = list(iterate_indices(SVSHAPE0)), \
-              list(iterate_indices(SVSHAPE1))
+    shapes = list(iterate_indices(SVSHAPE0)), list(iterate_indices(SVSHAPE1))
     for idx in range(len(shapes[0])):
         l = shapes[0][idx]
         r = shapes[1][idx]
@@ -113,10 +116,11 @@ def preduce_y(vec, pred=None, operation=None):
         res[l_idx] = operation(res[l_idx], res[r_idx])
     return res
 
+
 # run the demo
 if __name__ == '__main__':
     demo()
     vec = [1, 2, 3, 4, 9, 5, 6]
     res = preduce_y(vec)
-    print (vec)
-    print (res)
+    print(vec)
+    print(res)