whoops, no ability to add comments in between functions in pseudocode
[openpower-isa.git] / src / openpower / decoder / isa / remap_fft_yield.py
index f7ed5ad501844b228e46509399c8c0adfe56274f..422c2187867bba75c5a33d395e74d2d1081199d1 100644 (file)
@@ -2,22 +2,22 @@
 # original code for the FFT Tukey-Cooley schedul:
 # https://www.nayuki.io/res/free-small-fft-in-multiple-languages/fft.py
 """
-       # Radix-2 decimation-in-time FFT
-       size = 2
-       while size <= n:
-               halfsize = size // 2
-               tablestep = n // size
-               for i in range(0, n, size):
-                       k = 0
-                       for j in range(i, i + halfsize):
+    # Radix-2 decimation-in-time FFT (real, not complex)
+    size = 2
+    while size <= n:
+        halfsize = size // 2
+        tablestep = n // size
+        for i in range(0, n, size):
+            k = 0
+            for j in range(i, i + halfsize):
                 jh = j+halfsize
                 jl = j
-                               temp1 = vec[jh] * exptable[k]
-                               temp2 = vec[jl]
-                               vec[jh] = temp2 - temp1
-                               vec[jl] = temp2 + temp1
-                               k += tablestep
-               size *= 2
+                temp1 = vec[jh] * exptable[k]
+                temp2 = vec[jl]
+                vec[jh] = temp2 - temp1
+                vec[jl] = temp2 + temp1
+                k += tablestep
+        size *= 2
 """
 
 # python "yield" can be iterated. use this to make it clear how
@@ -43,6 +43,7 @@ def iterate_butterfly_indices(SVSHAPE):
     skip = 0
     while True:
         for size in x_r:           # loop over 3rd order dimension (size)
+            x_end = size == x_r[-1]
             # y_r schedule depends on size
             halfsize = size // 2
             tablestep = n // size
@@ -52,6 +53,7 @@ def iterate_butterfly_indices(SVSHAPE):
             # invert if requested
             if SVSHAPE.invxyz[1]: y_r.reverse()
             for i in y_r:       # loop over 2nd order dimension
+                y_end = i == y_r[-1]
                 k_r = []
                 j_r = []
                 k = 0
@@ -63,10 +65,7 @@ def iterate_butterfly_indices(SVSHAPE):
                 if SVSHAPE.invxyz[2]: k_r.reverse()
                 if SVSHAPE.invxyz[2]: j_r.reverse()
                 for j, k in zip(j_r, k_r):   # loop over 1st order dimension
-                    # skip the first entries up to offset
-                    if skip < SVSHAPE.offset:
-                        skip += 1
-                        continue
+                    z_end = j == j_r[-1]
                     # now depending on MODE return the index
                     if SVSHAPE.skip == 0b00:
                         result = j              # for vec[j]
@@ -75,7 +74,11 @@ def iterate_butterfly_indices(SVSHAPE):
                     elif SVSHAPE.skip == 0b10:
                         result = k              # for exptable[k]
 
-                    yield result
+                    loopends = (z_end |
+                               ((y_end and z_end)<<1) |
+                                ((y_end and x_end and z_end)<<2))
+
+                    yield result + SVSHAPE.offset, loopends
 
 def demo():
     # set the dimension sizes here
@@ -145,11 +148,13 @@ def demo():
             prefix = "i %d\t" % i
             k = 0
             for j in range(i, i + halfsize):
-                jl, jh, ks = schedule[idx]
+                (jl, je), (jh, he), (ks, ke) = schedule[idx]
                 print ("  %-3d\t%s j=%-2d jh=%-2d k=%-2d -> "
-                        "j[jl=%-2d] j[jh=%-2d] exptable[k=%d]" % \
+                        "j[jl=%-2d] j[jh=%-2d] ex[k=%d]" % \
                                 (idx, prefix, j, j+halfsize, k,
-                                      jl, jh, ks))
+                                      jl, jh, ks,
+                                ),
+                                "end", bin(je)[2:], bin(je)[2:], bin(ke)[2:])
                 k += tablestep
                 idx += 1
         size *= 2