#[allow(
unfulfilled_lint_expectations,
reason = "stable Rust does not emit this nightly-only deprecation"
)]
#[expect(
deprecated,
reason = "tracked by https://github.com/commonwarexyz/monorepo/issues/4414"
)]
mod cpu_features {
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
cpufeatures::new!(has_avx2, "avx2");
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
cpufeatures::new!(has_ssse3, "ssse3");
#[cfg(target_arch = "aarch64")]
cpufeatures::new!(has_neon, "neon");
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
pub(super) use self::{has_avx2::get as avx2, has_ssse3::get as ssse3};
#[cfg(target_arch = "aarch64")]
pub(super) use has_neon::get as neon;
}
#[cfg(target_arch = "aarch64")]
pub use self::engine_neon::Neon;
pub(crate) use self::shards::Shards;
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
pub use self::{engine_avx2::Avx2, engine_ssse3::Ssse3};
pub use self::{
engine_default::DefaultEngine, engine_naive::Naive, engine_nosimd::NoSimd, shards::ShardsRefMut,
};
pub(crate) use utils::{fft_skew_end, formal_derivative, ifft_skew_end, xor_within};
mod engine_default;
mod engine_naive;
mod engine_nosimd;
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
mod engine_avx2;
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
mod engine_ssse3;
#[cfg(target_arch = "aarch64")]
mod engine_neon;
mod fwht;
mod shards;
pub mod tables;
pub mod utils;
pub const GF_BITS: usize = 16;
pub const GF_ORDER: usize = 65536;
pub const GF_MODULUS: GfElement = 65535;
pub const GF_POLYNOMIAL: usize = 0x1002D;
pub const SHARD_CHUNK_BYTES: usize = 64;
pub const CANTOR_BASIS: [GfElement; GF_BITS] = [
0x0001, 0xACCA, 0x3C0E, 0x163E, 0xC582, 0xED2E, 0x914C, 0x4012, 0x6C98, 0x10D8, 0x6A72, 0xB900,
0xFDB8, 0xFB34, 0xFF38, 0x991E,
];
pub type GfElement = u16;
pub trait Engine {
fn fft(
&self,
data: &mut ShardsRefMut<'_>,
pos: usize,
size: usize,
truncated_size: usize,
skew_delta: usize,
);
fn ifft(
&self,
data: &mut ShardsRefMut<'_>,
pos: usize,
size: usize,
truncated_size: usize,
skew_delta: usize,
);
fn mul(&self, x: &mut [[u8; SHARD_CHUNK_BYTES]], log_m: GfElement);
fn eval_poly(erasures: &mut [GfElement; GF_ORDER], truncated_size: usize)
where
Self: Sized,
{
utils::eval_poly(erasures, truncated_size);
}
}