p3_mersenne_31/no_packing/
poseidon2.rs

1//! This file contains simple wrapper structs on top of which we can implement Poseidon2 Internal/ExternalLayer.
2//!
3//! They are used only in the case that none of the vectorization architectures (AVX2/AVX512/NEON) are available.
4
5use alloc::vec::Vec;
6
7use p3_poseidon2::{ExternalLayerConstants, ExternalLayerConstructor, InternalLayerConstructor};
8
9use crate::Mersenne31;
10
11/// The internal layers of the Poseidon2 permutation.
12#[derive(Debug, Clone)]
13pub struct Poseidon2InternalLayerMersenne31 {
14    pub(crate) internal_constants: Vec<Mersenne31>,
15}
16
17/// The external layers of the Poseidon2 permutation.
18#[derive(Clone)]
19pub struct Poseidon2ExternalLayerMersenne31<const WIDTH: usize> {
20    pub(crate) external_constants: ExternalLayerConstants<Mersenne31, WIDTH>,
21}
22
23impl InternalLayerConstructor<Mersenne31> for Poseidon2InternalLayerMersenne31 {
24    fn new_from_constants(internal_constants: Vec<Mersenne31>) -> Self {
25        Self { internal_constants }
26    }
27}
28
29impl<const WIDTH: usize> ExternalLayerConstructor<Mersenne31, WIDTH>
30    for Poseidon2ExternalLayerMersenne31<WIDTH>
31{
32    fn new_from_constants(external_constants: ExternalLayerConstants<Mersenne31, WIDTH>) -> Self {
33        Self { external_constants }
34    }
35}