From 956b34c2e960ff45c719e0e09589e053131c8236 Mon Sep 17 00:00:00 2001 From: Nicholas Ward Date: Fri, 15 Oct 2021 12:12:09 -0700 Subject: [PATCH] add_many_u32 --- src/gadgets/arithmetic_u32.rs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/gadgets/arithmetic_u32.rs b/src/gadgets/arithmetic_u32.rs index 91c658b1..e53c1761 100644 --- a/src/gadgets/arithmetic_u32.rs +++ b/src/gadgets/arithmetic_u32.rs @@ -7,7 +7,7 @@ use crate::gates::subtraction_u32::U32SubtractionGate; use crate::iop::target::Target; use crate::plonk::circuit_builder::CircuitBuilder; -#[derive(Clone)] +#[derive(Clone, Copy)] pub struct U32Target(pub Target); impl, const D: usize> CircuitBuilder { @@ -87,6 +87,25 @@ impl, const D: usize> CircuitBuilder { (final_low, combined_carry) } + pub fn add_many_u32(&mut self, to_add: Vec) -> (U32Target, U32Target) { + match to_add.len() { + 0 => (self.zero_u32(), self.zero_u32()), + 1 => (to_add[0], self.zero_u32()), + 2 => self.add_u32(to_add[0], to_add[1]), + 3 => self.add_three_u32(to_add[0], to_add[1], to_add[2]), + _ => { + let (mut low, mut carry) = self.add_u32(to_add[0], to_add[1]); + for i in 2..to_add.len() { + let (new_low, new_carry) = self.add_u32(to_add[i], low); + let (combined_carry, _zero) = self.add_u32(carry, new_carry); + low = new_low; + carry = combined_carry; + } + (low, carry) + } + } + } + pub fn mul_u32(&mut self, a: U32Target, b: U32Target) -> (U32Target, U32Target) { let zero = self.zero_u32(); self.mul_add_u32(a, b, zero)