From cb12a095a9493ab6caa4c1502757dbd46b6334e7 Mon Sep 17 00:00:00 2001 From: Gali Michlevich Date: Tue, 21 Jan 2025 11:45:34 +0200 Subject: [PATCH] Add Bitwise Xor to Preprocessed Column Enum --- .../crates/prover/src/cairo_air/preprocessed.rs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/stwo_cairo_prover/crates/prover/src/cairo_air/preprocessed.rs b/stwo_cairo_prover/crates/prover/src/cairo_air/preprocessed.rs index d21d0a00..598158d8 100644 --- a/stwo_cairo_prover/crates/prover/src/cairo_air/preprocessed.rs +++ b/stwo_cairo_prover/crates/prover/src/cairo_air/preprocessed.rs @@ -32,27 +32,34 @@ const fn preprocessed_log_sizes() -> [u32; N_PREPROCESSED_COLUMN_SIZES] { arr } +// TODO(Gali): Convert to dyn trait. pub enum PreProcessedColumn { IsFirst(IsFirst), Seq(Seq), + BitwiseXor(BitwiseXor), } impl PreProcessedColumn { pub fn log_size(&self) -> u32 { match self { PreProcessedColumn::IsFirst(column) => column.log_size, PreProcessedColumn::Seq(column) => column.log_size, + PreProcessedColumn::BitwiseXor(column) => column.log_size(), } } + pub fn id(&self) -> PreProcessedColumnId { match self { PreProcessedColumn::IsFirst(column) => column.id(), PreProcessedColumn::Seq(column) => column.id(), + PreProcessedColumn::BitwiseXor(column) => column.id(), } } + pub fn gen_column_simd(&self) -> CircleEvaluation { match self { PreProcessedColumn::IsFirst(column) => column.gen_column_simd(), PreProcessedColumn::Seq(column) => column.gen_column_simd(), + PreProcessedColumn::BitwiseXor(column) => column.gen_column_simd(), } } } @@ -78,7 +85,6 @@ impl Seq { } pub fn packed_at(&self, vec_row: usize) -> PackedM31 { - assert!(vec_row < (1 << self.log_size) / N_LANES); PackedM31::broadcast(M31::from(vec_row * N_LANES)) + unsafe { PackedM31::from_simd_unchecked(SIMD_ENUMERATION_0) } } @@ -140,6 +146,13 @@ impl BitwiseXor { }; unsafe { PackedM31::from_simd_unchecked(simd) } } + + pub fn gen_column_simd(&self) -> CircleEvaluation { + let col: Col = (0..((1 << self.log_size()) / N_LANES)) + .flat_map(|i| self.packed_at(i).to_array()) + .collect(); + CircleEvaluation::new(CanonicCoset::new(self.log_size()).circle_domain(), col) + } } #[cfg(test)]