1use ark_ff::PrimeField;
2
3use crate::{alpha, input::InputParameters, mds, round_constants, rounds};
4use poseidon_parameters::v1::PoseidonParameters;
5
6pub mod poseidon_build {
8 pub use crate::poseidon_build::v1_compile as compile;
9}
10
11pub fn generate<F: PrimeField>(
18 M: usize,
19 t: usize,
20 p: F::BigInt,
21 allow_inverse: bool,
22) -> PoseidonParameters<F> {
23 let input = InputParameters::generate(M, t, p, allow_inverse);
24 let alpha = alpha::generate::<F>(p, allow_inverse);
25 let rounds = rounds::v1_generate(&input, &alpha);
26 let mds = mds::v1_generate(&input);
27 let arc = round_constants::v1_generate(&input, rounds, alpha);
28 let optimized_mds = mds::generate_optimized(&mds, t, &rounds);
29 let optimized_arc = round_constants::generate_optimized(&arc, &mds, &rounds);
30
31 PoseidonParameters::<F> {
32 M: input.M,
33 t: input.t,
34 alpha,
35 rounds,
36 mds,
37 arc,
38 optimized_mds,
39 optimized_arc,
40 }
41}