use ark_ff::PrimeField;
mod external;
mod internal;
use crate::{alpha, input::InputParameters, round_constants, rounds};
use poseidon_parameters::v2::{PoseidonParameters, SquareMatrix};
pub mod poseidon_build {
pub use crate::poseidon_build::v2_compile as compile;
}
pub fn generate<F: PrimeField>(
M: usize,
t: usize,
p: F::BigInt,
allow_inverse: bool,
) -> PoseidonParameters<F> {
let input = InputParameters::generate(M, t, p, allow_inverse);
let alpha = alpha::generate::<F>(p, allow_inverse);
let rounds = rounds::v2_generate(&input, &alpha);
let arc = round_constants::v2_generate(&input, rounds, alpha);
let m_i: SquareMatrix<F> = internal::generate(t);
if t < 4 {
PoseidonParameters::<F> {
M: input.M,
t: input.t,
alpha,
rounds,
arc,
m_i: m_i.clone(),
m_e: m_i,
}
} else {
let m_e = external::generate(t);
PoseidonParameters::<F> {
M: input.M,
t: input.t,
alpha,
rounds,
arc,
m_e,
m_i,
}
}
}