|
@ -1,8 +1,8 @@ |
|
|
use alloc::string::{String, ToString};
|
|
|
use alloc::string::{String, ToString};
|
|
|
use alloc::vec::Vec;
|
|
|
use alloc::vec::Vec;
|
|
|
use alloc::{format, vec};
|
|
|
use alloc::{format, vec};
|
|
|
use plonky2::util::serialization::{Buffer, IoResult, Read, Write};
|
|
|
|
|
|
use core::marker::PhantomData;
|
|
|
use core::marker::PhantomData;
|
|
|
|
|
|
use plonky2::util::serialization::{Buffer, IoResult, Read, Write};
|
|
|
|
|
|
|
|
|
use plonky2::field::extension::Extendable;
|
|
|
use plonky2::field::extension::Extendable;
|
|
|
use plonky2::field::packed::PackedField;
|
|
|
use plonky2::field::packed::PackedField;
|
|
@ -17,7 +17,7 @@ use plonky2::iop::target::Target; |
|
|
use plonky2::iop::wire::Wire;
|
|
|
use plonky2::iop::wire::Wire;
|
|
|
use plonky2::iop::witness::{PartitionWitness, Witness, WitnessWrite};
|
|
|
use plonky2::iop::witness::{PartitionWitness, Witness, WitnessWrite};
|
|
|
use plonky2::plonk::circuit_builder::CircuitBuilder;
|
|
|
use plonky2::plonk::circuit_builder::CircuitBuilder;
|
|
|
use plonky2::plonk::circuit_data::CircuitConfig;
|
|
|
|
|
|
|
|
|
use plonky2::plonk::circuit_data::{CircuitConfig, CommonCircuitData};
|
|
|
use plonky2::plonk::vars::{
|
|
|
use plonky2::plonk::vars::{
|
|
|
EvaluationTargets, EvaluationVars, EvaluationVarsBase, EvaluationVarsBaseBatch,
|
|
|
EvaluationTargets, EvaluationVars, EvaluationVarsBase, EvaluationVarsBaseBatch,
|
|
|
EvaluationVarsBasePacked,
|
|
|
EvaluationVarsBasePacked,
|
|
@ -87,13 +87,16 @@ impl, const D: usize> Gate for U32Subtraction |
|
|
format!("{self:?}")
|
|
|
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)
|
|
|
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()?;
|
|
|
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> {
|
|
|
fn eval_unfiltered(&self, vars: EvaluationVars<F, D>) -> Vec<F::Extension> {
|
|
@ -195,7 +198,7 @@ impl, const D: usize> Gate for U32Subtraction |
|
|
constraints
|
|
|
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)
|
|
|
(0..self.num_ops)
|
|
|
.map(|i| {
|
|
|
.map(|i| {
|
|
|
let g = WitnessGeneratorRef::new(
|
|
|
let g = WitnessGeneratorRef::new(
|
|
@ -279,7 +282,7 @@ struct U32SubtractionGenerator, const D: usize> { |
|
|
_phantom: PhantomData<F>,
|
|
|
_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 U32SubtractionGenerator<F, D>
|
|
|
for U32SubtractionGenerator<F, D>
|
|
|
{
|
|
|
{
|
|
|
fn id(&self) -> String {
|
|
|
fn id(&self) -> String {
|
|
@ -343,19 +346,23 @@ 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.row)?;
|
|
|
dst.write_usize(self.i)
|
|
|
dst.write_usize(self.i)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
fn deserialize(src: &mut Buffer) -> IoResult<Self> {
|
|
|
|
|
|
let gate = U32SubtractionGate::deserialize(src)?;
|
|
|
|
|
|
|
|
|
fn deserialize(src: &mut Buffer, common_data: &CommonCircuitData<F, D>) -> IoResult<Self> {
|
|
|
|
|
|
let gate = U32SubtractionGate::deserialize(src, common_data)?;
|
|
|
let row = src.read_usize()?;
|
|
|
let row = src.read_usize()?;
|
|
|
let i = src.read_usize()?;
|
|
|
let i = src.read_usize()?;
|
|
|
Ok(Self { gate, row, i, _phantom: PhantomData })
|
|
|
|
|
|
|
|
|
Ok(Self {
|
|
|
|
|
|
gate,
|
|
|
|
|
|
row,
|
|
|
|
|
|
i,
|
|
|
|
|
|
_phantom: PhantomData,
|
|
|
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
#[cfg(test)]
|
|
|