|
|
@ -1,7 +1,7 @@ |
|
|
|
use alloc::boxed::Box;
|
|
|
|
use alloc::string::String;
|
|
|
|
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::field::extension::Extendable;
|
|
|
@ -12,7 +12,7 @@ use plonky2::gates::packed_util::PackedEvaluableBase; |
|
|
|
use plonky2::gates::util::StridedConstraintConsumer;
|
|
|
|
use plonky2::hash::hash_types::RichField;
|
|
|
|
use plonky2::iop::ext_target::ExtensionTarget;
|
|
|
|
use plonky2::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGenerator};
|
|
|
|
use plonky2::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGeneratorRef};
|
|
|
|
use plonky2::iop::target::Target;
|
|
|
|
use plonky2::iop::wire::Wire;
|
|
|
|
use plonky2::iop::witness::{PartitionWitness, Witness, WitnessWrite};
|
|
|
@ -87,6 +87,15 @@ impl, const D: usize> Gate for U32Subtraction |
|
|
|
format!("{self:?}")
|
|
|
|
}
|
|
|
|
|
|
|
|
fn serialize(&self, dst: &mut Vec<u8>) -> IoResult<()> {
|
|
|
|
dst.write_usize(self.num_ops)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn deserialize(src: &mut Buffer) -> IoResult<Self> {
|
|
|
|
let num_ops = src.read_usize()?;
|
|
|
|
Ok(Self { num_ops, _phantom: PhantomData })
|
|
|
|
}
|
|
|
|
|
|
|
|
fn eval_unfiltered(&self, vars: EvaluationVars<F, D>) -> Vec<F::Extension> {
|
|
|
|
let mut constraints = Vec::with_capacity(self.num_constraints());
|
|
|
|
for i in 0..self.num_ops {
|
|
|
@ -186,10 +195,10 @@ impl, const D: usize> Gate for U32Subtraction |
|
|
|
constraints
|
|
|
|
}
|
|
|
|
|
|
|
|
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<Box<dyn WitnessGenerator<F>>> {
|
|
|
|
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F>> {
|
|
|
|
(0..self.num_ops)
|
|
|
|
.map(|i| {
|
|
|
|
let g: Box<dyn WitnessGenerator<F>> = Box::new(
|
|
|
|
let g = WitnessGeneratorRef::new(
|
|
|
|
U32SubtractionGenerator {
|
|
|
|
gate: *self,
|
|
|
|
row,
|
|
|
@ -273,6 +282,10 @@ struct U32SubtractionGenerator, const D: usize> { |
|
|
|
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F>
|
|
|
|
for U32SubtractionGenerator<F, D>
|
|
|
|
{
|
|
|
|
fn id(&self) -> String {
|
|
|
|
"U32SubtractionGenerator".to_string()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn dependencies(&self) -> Vec<Target> {
|
|
|
|
let local_target = |column| Target::wire(self.row, column);
|
|
|
|
|
|
|
@ -329,6 +342,20 @@ impl, const D: usize> SimpleGenerator |
|
|
|
out_buffer.set_wire(wire, output_limbs[j]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn serialize(&self, dst: &mut Vec<u8>) -> IoResult<()> {
|
|
|
|
self.gate.serialize(dst)?;
|
|
|
|
dst.write_usize(self.row)?;
|
|
|
|
dst.write_usize(self.i)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn deserialize(src: &mut Buffer) -> IoResult<Self> {
|
|
|
|
let gate = U32SubtractionGate::deserialize(src)?;
|
|
|
|
let row = src.read_usize()?;
|
|
|
|
let i = src.read_usize()?;
|
|
|
|
Ok(Self { gate, row, i, _phantom: PhantomData })
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|