diff --git a/plonky2/src/gates/lookup.rs b/plonky2/src/gates/lookup.rs index 5b27abf8..36dab8bf 100644 --- a/plonky2/src/gates/lookup.rs +++ b/plonky2/src/gates/lookup.rs @@ -1,6 +1,5 @@ use alloc::format; use alloc::string::String; -use alloc::sync::Arc; use alloc::vec::Vec; use core::usize; @@ -60,18 +59,24 @@ impl, const D: usize> Gate for LookupGate { format!("{self:?}") } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_slots)?; - dst.write_lut(&self.lut) + for (i, lut) in cd.luts.iter().enumerate() { + if lut == &self.lut { + return dst.write_usize(i); + } + } + + panic!("The associated lookup table couldn't be found.") } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult { let num_slots = src.read_usize()?; - let lut = src.read_lut()?; + let lut_index = src.read_usize()?; Ok(Self { num_slots, - lut: Arc::new(lut), + lut: cd.luts[lut_index].clone(), }) } @@ -184,20 +189,26 @@ impl, const D: usize> SimpleGenerator for Loo out_buffer.set_target(out_wire, output_val); } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; - dst.write_lut(&self.lut)?; - dst.write_usize(self.slot_nb) + dst.write_usize(self.slot_nb)?; + for (i, lut) in cd.luts.iter().enumerate() { + if lut == &self.lut { + return dst.write_usize(i); + } + } + + panic!("The associated lookup table couldn't be found.") } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; - let lut = src.read_lut()?; let slot_nb = src.read_usize()?; + let lut_index = src.read_usize()?; Ok(Self { row, - lut: Arc::new(lut), + lut: cd.luts[lut_index].clone(), slot_nb, }) } diff --git a/plonky2/src/gates/lookup_table.rs b/plonky2/src/gates/lookup_table.rs index e80e1898..99b8f8e1 100644 --- a/plonky2/src/gates/lookup_table.rs +++ b/plonky2/src/gates/lookup_table.rs @@ -72,20 +72,26 @@ impl, const D: usize> Gate for LookupTableGat format!("{self:?}") } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_slots)?; - dst.write_lut(&self.lut)?; - dst.write_usize(self.last_lut_row) + dst.write_usize(self.last_lut_row)?; + for (i, lut) in cd.luts.iter().enumerate() { + if lut == &self.lut { + return dst.write_usize(i); + } + } + + panic!("The associated lookup table couldn't be found.") } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult { let num_slots = src.read_usize()?; - let lut = src.read_lut()?; let last_lut_row = src.read_usize()?; + let lut_index = src.read_usize()?; Ok(Self { num_slots, - lut: Arc::new(lut), + lut: cd.luts[lut_index].clone(), last_lut_row, }) } @@ -202,24 +208,30 @@ impl, const D: usize> SimpleGenerator for Loo } } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; - dst.write_lut(&self.lut)?; dst.write_usize(self.slot_nb)?; dst.write_usize(self.num_slots)?; - dst.write_usize(self.last_lut_row) + dst.write_usize(self.last_lut_row)?; + for (i, lut) in cd.luts.iter().enumerate() { + if lut == &self.lut { + return dst.write_usize(i); + } + } + + panic!("The associated lookup table couldn't be found.") } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; - let lut = src.read_lut()?; let slot_nb = src.read_usize()?; let num_slots = src.read_usize()?; let last_lut_row = src.read_usize()?; + let lut_index = src.read_usize()?; Ok(Self { row, - lut: Arc::new(lut), + lut: cd.luts[lut_index].clone(), slot_nb, num_slots, last_lut_row,