Skip to content

Commit

Permalink
Integrate Verify Bitwise Xor 9
Browse files Browse the repository at this point in the history
  • Loading branch information
Gali-StarkWare committed Jan 30, 2025
1 parent c0e2b49 commit bf099e0
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 3 deletions.
41 changes: 40 additions & 1 deletion stwo_cairo_prover/crates/prover/src/cairo_air/air.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ use super::range_checks_air::{
RangeChecksInteractionElements,
};
use crate::components::memory::{memory_address_to_id, memory_id_to_big};
use crate::components::verify_instruction;
use crate::components::{verify_bitwise_xor_9, verify_instruction};
use crate::felt::split_f252;
use crate::input::ProverInput;
use crate::relations;
Expand Down Expand Up @@ -69,6 +69,7 @@ pub struct CairoClaim {
pub opcodes: OpcodeClaim,
pub verify_instruction: verify_instruction::Claim,
pub builtins: BuiltinsClaim,
pub verify_bitwise_xor_9: verify_bitwise_xor_9::Claim,
pub memory_address_to_id: memory_address_to_id::Claim,
pub memory_id_to_value: memory_id_to_big::Claim,
pub range_checks: RangeChecksClaim,
Expand All @@ -81,6 +82,7 @@ impl CairoClaim {
self.opcodes.mix_into(channel);
self.verify_instruction.mix_into(channel);
self.builtins.mix_into(channel);
self.verify_bitwise_xor_9.mix_into(channel);
self.memory_address_to_id.mix_into(channel);
self.memory_id_to_value.mix_into(channel);
self.range_checks.mix_into(channel);
Expand All @@ -91,6 +93,7 @@ impl CairoClaim {
self.opcodes.log_sizes(),
self.verify_instruction.log_sizes(),
self.builtins.log_sizes(),
self.verify_bitwise_xor_9.log_sizes(),
self.memory_address_to_id.log_sizes(),
self.memory_id_to_value.log_sizes(),
self.range_checks.log_sizes(),
Expand Down Expand Up @@ -160,6 +163,7 @@ pub struct CairoClaimGenerator {
// Internal components.
verify_instruction_trace_generator: verify_instruction::ClaimGenerator,
builtins: BuiltinsClaimGenerator,
verify_bitwise_xor_9_trace_generator: verify_bitwise_xor_9::ClaimGenerator,
memory_address_to_id_trace_generator: memory_address_to_id::ClaimGenerator,
memory_id_to_value_trace_generator: memory_id_to_big::ClaimGenerator,
range_checks_trace_generator: RangeChecksClaimGenerator,
Expand All @@ -173,6 +177,7 @@ impl CairoClaimGenerator {
let verify_instruction_trace_generator =
verify_instruction::ClaimGenerator::new(input.instruction_by_pc);
let builtins = BuiltinsClaimGenerator::new(input.builtins_segments);
let verify_bitwise_xor_9_trace_generator = verify_bitwise_xor_9::ClaimGenerator::new();
let memory_address_to_id_trace_generator =
memory_address_to_id::ClaimGenerator::new(&input.memory);
let memory_id_to_value_trace_generator =
Expand Down Expand Up @@ -212,6 +217,7 @@ impl CairoClaimGenerator {
opcodes,
verify_instruction_trace_generator,
builtins,
verify_bitwise_xor_9_trace_generator,
memory_address_to_id_trace_generator,
memory_id_to_value_trace_generator,
range_checks_trace_generator,
Expand Down Expand Up @@ -251,6 +257,9 @@ impl CairoClaimGenerator {
&self.memory_id_to_value_trace_generator,
&self.range_checks_trace_generator.rc_6_trace_generator,
);
let (verify_bitwise_xor_9_claim, verify_bitwise_xor_9_interaction_gen) = self
.verify_bitwise_xor_9_trace_generator
.write_trace(tree_builder);
let (memory_address_to_id_claim, memory_address_to_id_interaction_gen) = self
.memory_address_to_id_trace_generator
.write_trace(tree_builder);
Expand All @@ -268,6 +277,7 @@ impl CairoClaimGenerator {
opcodes: opcodes_claim,
verify_instruction: verify_instruction_claim,
builtins: builtins_claim,
verify_bitwise_xor_9: verify_bitwise_xor_9_claim,
memory_address_to_id: memory_address_to_id_claim,
memory_id_to_value: memory_id_to_value_claim,
range_checks: range_checks_claim,
Expand All @@ -276,6 +286,7 @@ impl CairoClaimGenerator {
opcodes_interaction_gen,
verify_instruction_interaction_gen,
builtins_interaction_gen,
verify_bitwise_xor_9_interaction_gen,
memory_address_to_id_interaction_gen,
memory_id_to_value_interaction_gen,
range_checks_interaction_gen,
Expand All @@ -288,6 +299,7 @@ pub struct CairoInteractionClaimGenerator {
opcodes_interaction_gen: OpcodesInteractionClaimGenerator,
verify_instruction_interaction_gen: verify_instruction::InteractionClaimGenerator,
builtins_interaction_gen: BuiltinsInteractionClaimGenerator,
verify_bitwise_xor_9_interaction_gen: verify_bitwise_xor_9::InteractionClaimGenerator,
memory_address_to_id_interaction_gen: memory_address_to_id::InteractionClaimGenerator,
memory_id_to_value_interaction_gen: memory_id_to_big::InteractionClaimGenerator,
range_checks_interaction_gen: RangeChecksInteractionClaimGenerator,
Expand Down Expand Up @@ -318,6 +330,9 @@ impl CairoInteractionClaimGenerator {
let builtins_interaction_claims = self
.builtins_interaction_gen
.write_interaction_trace(tree_builder, interaction_elements);
let verify_bitwise_xor_9_interaction_claim = self
.verify_bitwise_xor_9_interaction_gen
.write_interaction_trace(tree_builder, &interaction_elements.verify_bitwise_xor_9);
let memory_address_to_id_interaction_claim = self
.memory_address_to_id_interaction_gen
.write_interaction_trace(tree_builder, &interaction_elements.memory_address_to_id);
Expand All @@ -337,6 +352,7 @@ impl CairoInteractionClaimGenerator {
opcodes: opcodes_interaction_claims,
verify_instruction: verify_instruction_interaction_claim,
builtins: builtins_interaction_claims,
verify_bitwise_xor_9: verify_bitwise_xor_9_interaction_claim,
memory_address_to_id: memory_address_to_id_interaction_claim,
memory_id_to_value: memory_id_to_value_interaction_claim,
range_checks: range_checks_interaction_claim,
Expand All @@ -347,6 +363,7 @@ impl CairoInteractionClaimGenerator {
pub struct CairoInteractionElements {
pub opcodes: relations::Opcodes,
pub verify_instruction: relations::VerifyInstruction,
pub verify_bitwise_xor_9: relations::VerifyBitwiseXor_9,
pub memory_address_to_id: relations::MemoryAddressToId,
pub memory_id_to_value: relations::MemoryIdToBig,
pub range_checks: RangeChecksInteractionElements,
Expand All @@ -356,6 +373,7 @@ impl CairoInteractionElements {
CairoInteractionElements {
opcodes: relations::Opcodes::draw(channel),
verify_instruction: relations::VerifyInstruction::draw(channel),
verify_bitwise_xor_9: relations::VerifyBitwiseXor_9::draw(channel),
memory_address_to_id: relations::MemoryAddressToId::draw(channel),
memory_id_to_value: relations::MemoryIdToBig::draw(channel),
range_checks: RangeChecksInteractionElements::draw(channel),
Expand All @@ -368,6 +386,7 @@ pub struct CairoInteractionClaim {
pub opcodes: OpcodeInteractionClaim,
pub verify_instruction: verify_instruction::InteractionClaim,
pub builtins: BuiltinsInteractionClaim,
pub verify_bitwise_xor_9: verify_bitwise_xor_9::InteractionClaim,
pub memory_address_to_id: memory_address_to_id::InteractionClaim,
pub memory_id_to_value: memory_id_to_big::InteractionClaim,
pub range_checks: RangeChecksInteractionClaim,
Expand All @@ -377,6 +396,7 @@ impl CairoInteractionClaim {
self.opcodes.mix_into(channel);
self.verify_instruction.mix_into(channel);
self.builtins.mix_into(channel);
self.verify_bitwise_xor_9.mix_into(channel);
self.memory_address_to_id.mix_into(channel);
self.memory_id_to_value.mix_into(channel);
self.range_checks.mix_into(channel);
Expand All @@ -396,6 +416,7 @@ pub fn lookup_sum(
sum += interaction_claim.opcodes.sum();
sum += interaction_claim.verify_instruction.claimed_sum;
sum += interaction_claim.builtins.sum();
sum += interaction_claim.verify_bitwise_xor_9.logup_sums.0;
sum += interaction_claim.memory_address_to_id.claimed_sum;
sum += interaction_claim.memory_id_to_value.big_claimed_sum;
sum += interaction_claim.memory_id_to_value.small_claimed_sum;
Expand All @@ -407,6 +428,7 @@ pub struct CairoComponents {
opcodes: OpcodeComponents,
verify_instruction: verify_instruction::Component,
builtins: BuiltinComponents,
verify_bitwise_xor_9: verify_bitwise_xor_9::Component,
memory_address_to_id: memory_address_to_id::Component,
memory_id_to_value: (
memory_id_to_big::BigComponent,
Expand Down Expand Up @@ -457,6 +479,16 @@ impl CairoComponents {
interaction_elements,
&interaction_claim.builtins,
);
let verify_bitwise_xor_9_component = verify_bitwise_xor_9::Component::new(
tree_span_provider,
verify_bitwise_xor_9::Eval {
claim: cairo_claim.verify_bitwise_xor_9,
verify_bitwise_xor_9_lookup_elements: interaction_elements
.verify_bitwise_xor_9
.clone(),
},
interaction_claim.verify_bitwise_xor_9.logup_sums,
);
let memory_address_to_id_component = memory_address_to_id::Component::new(
tree_span_provider,
memory_address_to_id::Eval::new(
Expand Down Expand Up @@ -495,6 +527,7 @@ impl CairoComponents {
opcodes: opcode_components,
verify_instruction: verify_instruction_component,
builtins: builtin_components,
verify_bitwise_xor_9: verify_bitwise_xor_9_component,
memory_address_to_id: memory_address_to_id_component,
memory_id_to_value: (
memory_id_to_value_component,
Expand All @@ -510,6 +543,7 @@ impl CairoComponents {
[&self.verify_instruction as &dyn ComponentProver<SimdBackend>,],
self.builtins.provers(),
[
&self.verify_bitwise_xor_9 as &dyn ComponentProver<SimdBackend>,
&self.memory_address_to_id as &dyn ComponentProver<SimdBackend>,
&self.memory_id_to_value.0 as &dyn ComponentProver<SimdBackend>,
&self.memory_id_to_value.1 as &dyn ComponentProver<SimdBackend>,
Expand Down Expand Up @@ -537,6 +571,11 @@ impl std::fmt::Display for CairoComponents {
indented_component_display(&self.verify_instruction)
)?;
writeln!(f, "Builtins: {}", self.builtins)?;
writeln!(
f,
"VerifyBitwiseXor9: {}",
indented_component_display(&self.verify_bitwise_xor_9)
)?;
writeln!(
f,
"MemoryAddressToId: {}",
Expand Down
30 changes: 29 additions & 1 deletion stwo_cairo_prover/crates/prover/src/cairo_air/debug_tools.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ use crate::components::{
jump_opcode, jump_opcode_double_deref, jump_opcode_rel, jump_opcode_rel_imm,
memory_address_to_id, memory_id_to_big, mul_opcode, mul_opcode_imm, range_check_11,
range_check_19, range_check_4_3, range_check_6, range_check_7_2_5, range_check_9_9,
range_check_builtin_bits_128, range_check_builtin_bits_96, ret_opcode, verify_instruction,
range_check_builtin_bits_128, range_check_builtin_bits_96, ret_opcode, verify_bitwise_xor_9,
verify_instruction,
};
use crate::felt::split_f252;
use crate::relations;
Expand Down Expand Up @@ -501,6 +502,33 @@ where
);
}

if let Some(range_check_96_builtin) = claim.builtins.range_check_96_builtin {
entries.extend(
RelationTrackerComponent::new(
tree_span_provider,
range_check_builtin_bits_96::Eval {
claim: range_check_96_builtin,
memory_address_to_id_lookup_elements: relations::MemoryAddressToId::dummy(),
memory_id_to_big_lookup_elements: relations::MemoryIdToBig::dummy(),
range_check_6_lookup_elements: relations::RangeCheck_6::dummy(),
},
1 << range_check_96_builtin.log_size,
)
.entries(trace),
);
}

entries.extend(
RelationTrackerComponent::new(
tree_span_provider,
verify_bitwise_xor_9::Eval {
claim: claim.verify_bitwise_xor_9,
verify_bitwise_xor_9_lookup_elements: relations::VerifyBitwiseXor_9::dummy(),
},
1 << claim.verify_bitwise_xor_9.log_size,
)
.entries(trace),
);
// Memory.
entries.extend(
RelationTrackerComponent::new(
Expand Down
10 changes: 9 additions & 1 deletion stwo_cairo_prover/crates/prover/src/cairo_air/preprocessed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ const IS_FIRST_LOG_SIZES: [u32; N_PREPROCESSED_COLUMN_SIZES] = preprocessed_log_
// List of sizes to initialize the preprocessed trace with for `PreprocessedColumn::Seq`.
const SEQ_LOG_SIZES: [u32; N_PREPROCESSED_COLUMN_SIZES] = preprocessed_log_sizes();

// List of sizes to initialize the preprocessed trace with for `PreprocessedColumn::BitwiseXor`.
const BITWISE_XOR_LOG_SIZES: [u32; 1] = [9];

/// [LOG_MAX_ROWS, LOG_MAX_ROWS - 1, ..., LOG_N_LANES]
const fn preprocessed_log_sizes() -> [u32; N_PREPROCESSED_COLUMN_SIZES] {
let mut arr = [0; N_PREPROCESSED_COLUMN_SIZES];
Expand Down Expand Up @@ -81,7 +84,12 @@ pub fn preprocessed_trace_columns() -> Vec<PreProcessedColumn> {
let is_first_columns =
IS_FIRST_LOG_SIZES.map(|log_size| PreProcessedColumn::IsFirst(IsFirst::new(log_size)));
let seq_columns = SEQ_LOG_SIZES.map(|log_size| PreProcessedColumn::Seq(Seq::new(log_size)));
chain![is_first_columns, seq_columns]
let bitwise_xor_columns = BITWISE_XOR_LOG_SIZES.into_iter().flat_map(|log_size| {
(0..3).map(move |col_index| {
PreProcessedColumn::BitwiseXor(BitwiseXor::new(log_size, col_index))
})
});
chain![is_first_columns, seq_columns, bitwise_xor_columns]
.sorted_by_key(|column| std::cmp::Reverse(column.log_size()))
.collect_vec()
}
Expand Down

0 comments on commit bf099e0

Please sign in to comment.