use oxifft_codegen_impl::{gen_notw, gen_rdft, gen_simd, gen_twiddle, symbolic};
use proc_macro2::TokenStream;
use quote::quote;
fn count_tokens(ts: &TokenStream) -> usize {
ts.clone().into_iter().count()
}
fn count_lines(ts: &TokenStream) -> usize {
ts.to_string().lines().count()
}
fn symbolic_op_count(n: usize) -> Option<usize> {
if n.is_power_of_two() && (2..=64).contains(&n) {
let sym = symbolic::SymbolicFFT::radix2_dit(n, true);
Some(sym.op_count())
} else {
None
}
}
fn print_row(kind: &str, label: &str, ts: &TokenStream, op_count: Option<usize>) {
let ops = op_count.map_or_else(|| "-".to_string(), |n| n.to_string());
println!(
"{kind}\t{label}\t{}\t{}\t{ops}",
count_tokens(ts),
count_lines(ts),
);
}
fn main() {
println!("kind\tlabel\ttokens\tlines\top_count");
for &n in &[2_usize, 4, 8, 16, 32, 64] {
let ts = gen_notw::generate(quote! { #n }).expect("gen_notw::generate failed");
print_row("notw", &n.to_string(), &ts, symbolic_op_count(n));
}
for &r in &[2_usize, 4, 8, 16] {
let ts = gen_twiddle::generate(quote! { #r }).expect("gen_twiddle::generate failed");
print_row("twiddle", &r.to_string(), &ts, None);
}
{
let ts = gen_twiddle::generate_split_radix(TokenStream::new())
.expect("gen_twiddle::generate_split_radix (generic) failed");
print_row("split_radix_twiddle", "generic", &ts, None);
}
for &n in &[8_usize, 16] {
let ts = gen_twiddle::generate_split_radix(quote! { #n })
.expect("gen_twiddle::generate_split_radix failed");
print_row("split_radix_twiddle", &n.to_string(), &ts, None);
}
for &sz in &[2_usize, 4, 8] {
for (kind_str, kind_tokens) in &[
("R2hc", quote! { size = #sz, kind = R2hc }),
("Hc2r", quote! { size = #sz, kind = Hc2r }),
] {
let ts = gen_rdft::generate(kind_tokens.clone()).expect("gen_rdft::generate failed");
let label = format!("{sz}_{kind_str}");
print_row("rdft", &label, &ts, None);
}
}
for &n in &[2_usize, 4, 8] {
let ts = gen_simd::generate(quote! { #n }).expect("gen_simd::generate failed");
print_row("simd", &n.to_string(), &ts, None);
}
}