arnaucube
arnaucube/plonky2-u32Public Self-hosted repository
plonky2-u32/src/witness.rs
src/witness.rsRaw
 1use anyhow::Result;
 2use plonky2::field::types::{Field, PrimeField64};
 3use plonky2::iop::generator::GeneratedValues;
 4use plonky2::iop::witness::{Witness, WitnessWrite};
 5
 6use crate::gadgets::arithmetic_u32::U32Target;
 7
 8pub trait WitnessU32<F: PrimeField64>: Witness<F> {
 9    fn set_u32_target(&mut self, target: U32Target, value: u32) -> Result<()>;
10    fn get_u32_target(&self, target: U32Target) -> (u32, u32);
11}
12
13impl<T: Witness<F>, F: PrimeField64> WitnessU32<F> for T {
14    fn set_u32_target(&mut self, target: U32Target, value: u32) -> Result<()> {
15        self.set_target(target.0, F::from_canonical_u32(value))
16    }
17
18    fn get_u32_target(&self, target: U32Target) -> (u32, u32) {
19        let x_u64 = self.get_target(target.0).to_canonical_u64();
20        let low = x_u64 as u32;
21        let high = (x_u64 >> 32) as u32;
22        (low, high)
23    }
24}
25
26pub trait GeneratedValuesU32<F: Field> {
27    fn set_u32_target(&mut self, target: U32Target, value: u32) -> Result<()>;
28}
29
30impl<F: Field> GeneratedValuesU32<F> for GeneratedValues<F> {
31    fn set_u32_target(&mut self, target: U32Target, value: u32) -> Result<()> {
32        self.set_target(target.0, F::from_canonical_u32(value))
33    }
34}