import ( "fft.lib.dsp" ) ;
import ( "complex.lib" ) ;

evens = case {
	(2) => _ , ! ;
	(n) => _ , ! , evens(n - 2);
};
odds = case {
	(2) => ! , _ ;
	(n) => ! , _ , odds(n - 2);
};

eo(n) = evens(n), odds(n);

shuffling = case {
	(2) => eo(2);
	(n) => (evens(n) <: shuffling(n/2)), (odds(n) <: shuffling(n/2));
};

shuffle(n) = bus(n) <: shuffling(n);

input2complex(n) = par(i, n, (sca2pcplx));

fft(n) =  input2complex(n) : shuffle(n) : xbutterflies(n);

picks(n) = par(i, n, [i]);

concats = case {
	(1) => vectorize(1);
	(n) => concats(n-1) # vectorize(1);
};

modules_vector(n) = concats(n);

fft_test(n) = _ : vectorize(n) <: picks(n) : fft(n) : pcplx_moduls(n) : modules_vector(n) : serialize;
//process =  1 : W(8);
//process = +, _ : + : fft_test(128);
process = fft_test(128);
//process = (0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7) <: shuffle(8);