def fft(clk, s0, s1, valid, num_stages): for stage in reversed(list(range(num_stages))): m = 2**stage #generate constants twiddles = [i/(2*m) for i in range(m)] twiddles = [exp(-2.0j*pi*i) for i in twiddles] twiddle_type = Complex(SFixed(s0.i.subtype.bits+2, s0.i.subtype.bits)) #butterfly s0, s1 = s0+s1, s0-s1 s0 = delay(clk, s0, 1) s1 = delay(clk, s1, 1) valid = delay(clk, valid, 1) #rotate if stage: count, _ = counter(clk, 0, m//2-1, 1, valid) s1 = s1 * twiddle_type.rom(count, *twiddles) s0 = delay(clk, s0, 1) s1 = delay(clk, s1, 1) valid = delay(clk, valid, 1) #reorder s0, s1, valid = reorder(clk, s0, s1, valid, stage) return bit_reverse_order(clk, s0, s1, valid, 2**(num_stages-1))