|
|
@ -1,8 +1,8 @@ |
|
|
|
use alloc::string::{String, ToString};
|
|
|
|
use alloc::vec::Vec;
|
|
|
|
use alloc::{format, vec};
|
|
|
|
use plonky2::util::serialization::{Buffer, IoResult, Read, Write};
|
|
|
|
use core::marker::PhantomData;
|
|
|
|
use plonky2::util::serialization::{Buffer, IoResult, Read, Write};
|
|
|
|
|
|
|
|
use itertools::unfold;
|
|
|
|
use plonky2::field::extension::Extendable;
|
|
|
@ -18,7 +18,7 @@ use plonky2::iop::target::Target; |
|
|
|
use plonky2::iop::wire::Wire;
|
|
|
|
use plonky2::iop::witness::{PartitionWitness, Witness, WitnessWrite};
|
|
|
|
use plonky2::plonk::circuit_builder::CircuitBuilder;
|
|
|
|
use plonky2::plonk::circuit_data::CircuitConfig;
|
|
|
|
use plonky2::plonk::circuit_data::{CircuitConfig, CommonCircuitData};
|
|
|
|
use plonky2::plonk::vars::{
|
|
|
|
EvaluationTargets, EvaluationVars, EvaluationVarsBase, EvaluationVarsBaseBatch,
|
|
|
|
EvaluationVarsBasePacked,
|
|
|
@ -93,13 +93,16 @@ impl, const D: usize> Gate for U32ArithmeticG |
|
|
|
format!("{self:?}")
|
|
|
|
}
|
|
|
|
|
|
|
|
fn serialize(&self, dst: &mut Vec<u8>) -> IoResult<()> {
|
|
|
|
fn serialize(&self, dst: &mut Vec<u8>, _common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
|
|
|
|
dst.write_usize(self.num_ops)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn deserialize(src: &mut Buffer) -> IoResult<Self> {
|
|
|
|
fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData<F, D>) -> IoResult<Self> {
|
|
|
|
let num_ops = src.read_usize()?;
|
|
|
|
Ok(Self { num_ops, _phantom: PhantomData })
|
|
|
|
Ok(Self {
|
|
|
|
num_ops,
|
|
|
|
_phantom: PhantomData,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
fn eval_unfiltered(&self, vars: EvaluationVars<F, D>) -> Vec<F::Extension> {
|
|
|
@ -249,10 +252,10 @@ impl, const D: usize> Gate for U32ArithmeticG |
|
|
|
constraints
|
|
|
|
}
|
|
|
|
|
|
|
|
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F>> {
|
|
|
|
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F, D>> {
|
|
|
|
(0..self.num_ops)
|
|
|
|
.map(|i| {
|
|
|
|
let g: WitnessGeneratorRef<F> = WitnessGeneratorRef::new(
|
|
|
|
let g: WitnessGeneratorRef<F, D> = WitnessGeneratorRef::new(
|
|
|
|
U32ArithmeticGenerator {
|
|
|
|
gate: *self,
|
|
|
|
row,
|
|
|
@ -356,7 +359,7 @@ struct U32ArithmeticGenerator, const D: usize> { |
|
|
|
_phantom: PhantomData<F>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F>
|
|
|
|
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D>
|
|
|
|
for U32ArithmeticGenerator<F, D>
|
|
|
|
{
|
|
|
|
fn id(&self) -> String {
|
|
|
@ -425,17 +428,22 @@ impl, const D: usize> SimpleGenerator |
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn serialize(&self, dst: &mut Vec<u8>) -> IoResult<()> {
|
|
|
|
self.gate.serialize(dst)?;
|
|
|
|
fn serialize(&self, dst: &mut Vec<u8>, common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
|
|
|
|
self.gate.serialize(dst, common_data)?;
|
|
|
|
dst.write_usize(self.row)?;
|
|
|
|
dst.write_usize(self.i)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn deserialize(src: &mut Buffer) -> IoResult<Self> {
|
|
|
|
let gate = U32ArithmeticGate::deserialize(src)?;
|
|
|
|
fn deserialize(src: &mut Buffer, common_data: &CommonCircuitData<F, D>) -> IoResult<Self> {
|
|
|
|
let gate = U32ArithmeticGate::deserialize(src, common_data)?;
|
|
|
|
let row = src.read_usize()?;
|
|
|
|
let i = src.read_usize()?;
|
|
|
|
Ok(Self { gate, row, i, _phantom: PhantomData })
|
|
|
|
Ok(Self {
|
|
|
|
gate,
|
|
|
|
row,
|
|
|
|
i,
|
|
|
|
_phantom: PhantomData,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|