|
|
@ -1,6 +1,8 @@ |
|
|
|
use alloc::format;
|
|
|
|
use alloc::string::{String, ToString};
|
|
|
|
use alloc::vec::Vec;
|
|
|
|
use anyhow::Result;
|
|
|
|
use num::integer::div_ceil;
|
|
|
|
use core::marker::PhantomData;
|
|
|
|
use plonky2::util::serialization::{Buffer, IoResult, Read, Write};
|
|
|
|
|
|
|
@ -18,7 +20,6 @@ use plonky2::iop::witness::{PartitionWitness, Witness, WitnessWrite}; |
|
|
|
use plonky2::plonk::circuit_builder::CircuitBuilder;
|
|
|
|
use plonky2::plonk::circuit_data::{CircuitConfig, CommonCircuitData};
|
|
|
|
use plonky2::plonk::vars::{EvaluationTargets, EvaluationVars, EvaluationVarsBase};
|
|
|
|
use plonky2::util::ceil_div_usize;
|
|
|
|
|
|
|
|
const LOG2_MAX_NUM_ADDENDS: usize = 4;
|
|
|
|
const MAX_NUM_ADDENDS: usize = 16;
|
|
|
@ -70,10 +71,10 @@ impl, const D: usize> U32AddManyGate { |
|
|
|
2
|
|
|
|
}
|
|
|
|
pub fn num_result_limbs() -> usize {
|
|
|
|
ceil_div_usize(32, Self::limb_bits())
|
|
|
|
div_ceil(32, Self::limb_bits())
|
|
|
|
}
|
|
|
|
pub fn num_carry_limbs() -> usize {
|
|
|
|
ceil_div_usize(LOG2_MAX_NUM_ADDENDS, Self::limb_bits())
|
|
|
|
div_ceil(LOG2_MAX_NUM_ADDENDS, Self::limb_bits())
|
|
|
|
}
|
|
|
|
pub fn num_limbs() -> usize {
|
|
|
|
Self::num_result_limbs() + Self::num_carry_limbs()
|
|
|
@ -326,7 +327,7 @@ impl, const D: usize> SimpleGenerator |
|
|
|
.collect()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn run_once(&self, witness: &PartitionWitness<F>, out_buffer: &mut GeneratedValues<F>) {
|
|
|
|
fn run_once(&self, witness: &PartitionWitness<F>, out_buffer: &mut GeneratedValues<F>) -> Result<()> {
|
|
|
|
let local_wire = |column| Wire {
|
|
|
|
row: self.row,
|
|
|
|
column,
|
|
|
@ -351,8 +352,8 @@ impl, const D: usize> SimpleGenerator |
|
|
|
let output_carry_wire = local_wire(self.gate.wire_ith_output_carry(self.i));
|
|
|
|
let output_result_wire = local_wire(self.gate.wire_ith_output_result(self.i));
|
|
|
|
|
|
|
|
out_buffer.set_wire(output_carry_wire, output_carry);
|
|
|
|
out_buffer.set_wire(output_result_wire, output_result);
|
|
|
|
out_buffer.set_wire(output_carry_wire, output_carry)?;
|
|
|
|
out_buffer.set_wire(output_result_wire, output_result)?;
|
|
|
|
|
|
|
|
let num_result_limbs = U32AddManyGate::<F, D>::num_result_limbs();
|
|
|
|
let num_carry_limbs = U32AddManyGate::<F, D>::num_carry_limbs();
|
|
|
@ -373,8 +374,10 @@ impl, const D: usize> SimpleGenerator |
|
|
|
|
|
|
|
for (j, limb) in result_limbs.chain(carry_limbs).enumerate() {
|
|
|
|
let wire = local_wire(self.gate.wire_ith_output_jth_limb(self.i, j));
|
|
|
|
out_buffer.set_wire(wire, limb);
|
|
|
|
out_buffer.set_wire(wire, limb)?;
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|