|
| 1 | +use crate::circuit_claim::{CircuitClaim, CircuitInteractionClaim, CircuitInteractionElements}; |
| 2 | +use crate::components::{ |
| 3 | + blake_g, blake_gate, blake_output, blake_round, blake_round_sigma, eq, qm31_ops, |
| 4 | + range_check_15, range_check_16, triple_xor_32, verify_bitwise_xor_4, verify_bitwise_xor_7, |
| 5 | + verify_bitwise_xor_8, verify_bitwise_xor_9, verify_bitwise_xor_12, |
| 6 | +}; |
| 7 | +use stwo::core::air::Component; |
| 8 | +use stwo_constraint_framework::TraceLocationAllocator; |
| 9 | +use stwo_constraint_framework::preprocessed_columns::PreProcessedColumnId; |
| 10 | + |
| 11 | +macro_rules! define_component_list { |
| 12 | + ($($variant:ident),* $(,)?) => { |
| 13 | + pub enum ComponentList { |
| 14 | + $($variant),* |
| 15 | + } |
| 16 | + pub const N_COMPONENTS: usize = [$(stringify!($variant)),*].len(); |
| 17 | + }; |
| 18 | +} |
| 19 | + |
| 20 | +define_component_list! { |
| 21 | + Eq, |
| 22 | + Qm31Ops, |
| 23 | + BlakeGate, |
| 24 | + BlakeRound, |
| 25 | + BlakeRoundSigma, |
| 26 | + BlakeG, |
| 27 | + BlakeOutput, |
| 28 | + TripleXor32, |
| 29 | + VerifyBitwiseXor8, |
| 30 | + VerifyBitwiseXor12, |
| 31 | + VerifyBitwiseXor4, |
| 32 | + VerifyBitwiseXor7, |
| 33 | + VerifyBitwiseXor9, |
| 34 | + RangeCheck15, |
| 35 | + RangeCheck16, |
| 36 | +} |
| 37 | + |
| 38 | +pub struct CircuitComponents { |
| 39 | + pub eq: eq::Component, |
| 40 | + pub qm31_ops: qm31_ops::Component, |
| 41 | + pub blake_gate: blake_gate::Component, |
| 42 | + pub blake_round: blake_round::Component, |
| 43 | + pub blake_round_sigma: blake_round_sigma::Component, |
| 44 | + pub blake_g: blake_g::Component, |
| 45 | + pub blake_output: blake_output::Component, |
| 46 | + pub triple_xor_32: triple_xor_32::Component, |
| 47 | + pub verify_bitwise_xor_8: verify_bitwise_xor_8::Component, |
| 48 | + pub verify_bitwise_xor_12: verify_bitwise_xor_12::Component, |
| 49 | + pub verify_bitwise_xor_4: verify_bitwise_xor_4::Component, |
| 50 | + pub verify_bitwise_xor_7: verify_bitwise_xor_7::Component, |
| 51 | + pub verify_bitwise_xor_9: verify_bitwise_xor_9::Component, |
| 52 | + pub range_check_15: range_check_15::Component, |
| 53 | + pub range_check_16: range_check_16::Component, |
| 54 | +} |
| 55 | +impl CircuitComponents { |
| 56 | + pub fn new( |
| 57 | + circuit_claim: &CircuitClaim, |
| 58 | + interaction_elements: &CircuitInteractionElements, |
| 59 | + interaction_claim: &CircuitInteractionClaim, |
| 60 | + // Describes the structure of the preprocessed trace. Sensitive to order. |
| 61 | + preprocessed_column_ids: &[PreProcessedColumnId], |
| 62 | + ) -> Self { |
| 63 | + let tree_span_provider = |
| 64 | + &mut TraceLocationAllocator::new_with_preprocessed_columns(preprocessed_column_ids); |
| 65 | + |
| 66 | + let eq_component = eq::Component::new( |
| 67 | + tree_span_provider, |
| 68 | + eq::Eval { |
| 69 | + log_size: circuit_claim.log_sizes[ComponentList::Eq as usize], |
| 70 | + common_lookup_elements: interaction_elements.common_lookup_elements.clone(), |
| 71 | + }, |
| 72 | + interaction_claim.claimed_sums[ComponentList::Eq as usize], |
| 73 | + ); |
| 74 | + let qm31_ops_component = qm31_ops::Component::new( |
| 75 | + tree_span_provider, |
| 76 | + qm31_ops::Eval { |
| 77 | + log_size: circuit_claim.log_sizes[ComponentList::Qm31Ops as usize], |
| 78 | + common_lookup_elements: interaction_elements.common_lookup_elements.clone(), |
| 79 | + }, |
| 80 | + interaction_claim.claimed_sums[ComponentList::Qm31Ops as usize], |
| 81 | + ); |
| 82 | + let blake_gate_component = blake_gate::Component::new( |
| 83 | + tree_span_provider, |
| 84 | + blake_gate::Eval { |
| 85 | + claim: blake_gate::Claim { |
| 86 | + log_size: circuit_claim.log_sizes[ComponentList::BlakeGate as usize], |
| 87 | + }, |
| 88 | + common_lookup_elements: interaction_elements.common_lookup_elements.clone(), |
| 89 | + }, |
| 90 | + interaction_claim.claimed_sums[ComponentList::BlakeGate as usize], |
| 91 | + ); |
| 92 | + let blake_round_component = blake_round::Component::new( |
| 93 | + tree_span_provider, |
| 94 | + blake_round::Eval { |
| 95 | + claim: blake_round::Claim { |
| 96 | + log_size: circuit_claim.log_sizes[ComponentList::BlakeRound as usize], |
| 97 | + }, |
| 98 | + common_lookup_elements: interaction_elements.common_lookup_elements.clone(), |
| 99 | + }, |
| 100 | + interaction_claim.claimed_sums[ComponentList::BlakeRound as usize], |
| 101 | + ); |
| 102 | + let blake_round_sigma_component = blake_round_sigma::Component::new( |
| 103 | + tree_span_provider, |
| 104 | + blake_round_sigma::Eval { |
| 105 | + claim: blake_round_sigma::Claim {}, |
| 106 | + common_lookup_elements: interaction_elements.common_lookup_elements.clone(), |
| 107 | + }, |
| 108 | + interaction_claim.claimed_sums[ComponentList::BlakeRoundSigma as usize], |
| 109 | + ); |
| 110 | + let blake_g_component = blake_g::Component::new( |
| 111 | + tree_span_provider, |
| 112 | + blake_g::Eval { |
| 113 | + claim: blake_g::Claim { |
| 114 | + log_size: circuit_claim.log_sizes[ComponentList::BlakeG as usize], |
| 115 | + }, |
| 116 | + common_lookup_elements: interaction_elements.common_lookup_elements.clone(), |
| 117 | + }, |
| 118 | + interaction_claim.claimed_sums[ComponentList::BlakeG as usize], |
| 119 | + ); |
| 120 | + let blake_output_component = blake_output::Component::new( |
| 121 | + tree_span_provider, |
| 122 | + blake_output::Eval { |
| 123 | + claim: blake_output::Claim { |
| 124 | + log_size: circuit_claim.log_sizes[ComponentList::BlakeOutput as usize], |
| 125 | + }, |
| 126 | + common_lookup_elements: interaction_elements.common_lookup_elements.clone(), |
| 127 | + }, |
| 128 | + interaction_claim.claimed_sums[ComponentList::BlakeOutput as usize], |
| 129 | + ); |
| 130 | + let triple_xor_32_component = triple_xor_32::Component::new( |
| 131 | + tree_span_provider, |
| 132 | + triple_xor_32::Eval { |
| 133 | + claim: triple_xor_32::Claim { |
| 134 | + log_size: circuit_claim.log_sizes[ComponentList::TripleXor32 as usize], |
| 135 | + }, |
| 136 | + common_lookup_elements: interaction_elements.common_lookup_elements.clone(), |
| 137 | + }, |
| 138 | + interaction_claim.claimed_sums[ComponentList::TripleXor32 as usize], |
| 139 | + ); |
| 140 | + let verify_bitwise_xor_8_component = verify_bitwise_xor_8::Component::new( |
| 141 | + tree_span_provider, |
| 142 | + verify_bitwise_xor_8::Eval { |
| 143 | + claim: verify_bitwise_xor_8::Claim {}, |
| 144 | + common_lookup_elements: interaction_elements.common_lookup_elements.clone(), |
| 145 | + }, |
| 146 | + interaction_claim.claimed_sums[ComponentList::VerifyBitwiseXor8 as usize], |
| 147 | + ); |
| 148 | + let verify_bitwise_xor_12_component = verify_bitwise_xor_12::Component::new( |
| 149 | + tree_span_provider, |
| 150 | + verify_bitwise_xor_12::Eval { |
| 151 | + claim: verify_bitwise_xor_12::Claim {}, |
| 152 | + common_lookup_elements: interaction_elements.common_lookup_elements.clone(), |
| 153 | + }, |
| 154 | + interaction_claim.claimed_sums[ComponentList::VerifyBitwiseXor12 as usize], |
| 155 | + ); |
| 156 | + let verify_bitwise_xor_4_component = verify_bitwise_xor_4::Component::new( |
| 157 | + tree_span_provider, |
| 158 | + verify_bitwise_xor_4::Eval { |
| 159 | + claim: verify_bitwise_xor_4::Claim {}, |
| 160 | + common_lookup_elements: interaction_elements.common_lookup_elements.clone(), |
| 161 | + }, |
| 162 | + interaction_claim.claimed_sums[ComponentList::VerifyBitwiseXor4 as usize], |
| 163 | + ); |
| 164 | + let verify_bitwise_xor_7_component = verify_bitwise_xor_7::Component::new( |
| 165 | + tree_span_provider, |
| 166 | + verify_bitwise_xor_7::Eval { |
| 167 | + claim: verify_bitwise_xor_7::Claim {}, |
| 168 | + common_lookup_elements: interaction_elements.common_lookup_elements.clone(), |
| 169 | + }, |
| 170 | + interaction_claim.claimed_sums[ComponentList::VerifyBitwiseXor7 as usize], |
| 171 | + ); |
| 172 | + let verify_bitwise_xor_9_component = verify_bitwise_xor_9::Component::new( |
| 173 | + tree_span_provider, |
| 174 | + verify_bitwise_xor_9::Eval { |
| 175 | + claim: verify_bitwise_xor_9::Claim {}, |
| 176 | + common_lookup_elements: interaction_elements.common_lookup_elements.clone(), |
| 177 | + }, |
| 178 | + interaction_claim.claimed_sums[ComponentList::VerifyBitwiseXor9 as usize], |
| 179 | + ); |
| 180 | + let range_check_15_component = range_check_15::Component::new( |
| 181 | + tree_span_provider, |
| 182 | + range_check_15::Eval { |
| 183 | + claim: range_check_15::Claim {}, |
| 184 | + common_lookup_elements: interaction_elements.common_lookup_elements.clone(), |
| 185 | + }, |
| 186 | + interaction_claim.claimed_sums[ComponentList::RangeCheck15 as usize], |
| 187 | + ); |
| 188 | + let range_check_16_component = range_check_16::Component::new( |
| 189 | + tree_span_provider, |
| 190 | + range_check_16::Eval { |
| 191 | + claim: range_check_16::Claim {}, |
| 192 | + common_lookup_elements: interaction_elements.common_lookup_elements.clone(), |
| 193 | + }, |
| 194 | + interaction_claim.claimed_sums[ComponentList::RangeCheck16 as usize], |
| 195 | + ); |
| 196 | + Self { |
| 197 | + eq: eq_component, |
| 198 | + qm31_ops: qm31_ops_component, |
| 199 | + blake_gate: blake_gate_component, |
| 200 | + blake_round: blake_round_component, |
| 201 | + blake_round_sigma: blake_round_sigma_component, |
| 202 | + blake_g: blake_g_component, |
| 203 | + blake_output: blake_output_component, |
| 204 | + triple_xor_32: triple_xor_32_component, |
| 205 | + verify_bitwise_xor_8: verify_bitwise_xor_8_component, |
| 206 | + verify_bitwise_xor_12: verify_bitwise_xor_12_component, |
| 207 | + verify_bitwise_xor_4: verify_bitwise_xor_4_component, |
| 208 | + verify_bitwise_xor_7: verify_bitwise_xor_7_component, |
| 209 | + verify_bitwise_xor_9: verify_bitwise_xor_9_component, |
| 210 | + range_check_15: range_check_15_component, |
| 211 | + range_check_16: range_check_16_component, |
| 212 | + } |
| 213 | + } |
| 214 | + |
| 215 | + pub fn components(self) -> Vec<Box<dyn Component>> { |
| 216 | + vec![ |
| 217 | + Box::new(self.eq) as Box<dyn Component>, |
| 218 | + Box::new(self.qm31_ops) as Box<dyn Component>, |
| 219 | + Box::new(self.blake_gate) as Box<dyn Component>, |
| 220 | + Box::new(self.blake_round) as Box<dyn Component>, |
| 221 | + Box::new(self.blake_round_sigma) as Box<dyn Component>, |
| 222 | + Box::new(self.blake_g) as Box<dyn Component>, |
| 223 | + Box::new(self.blake_output) as Box<dyn Component>, |
| 224 | + Box::new(self.triple_xor_32) as Box<dyn Component>, |
| 225 | + Box::new(self.verify_bitwise_xor_8) as Box<dyn Component>, |
| 226 | + Box::new(self.verify_bitwise_xor_12) as Box<dyn Component>, |
| 227 | + Box::new(self.verify_bitwise_xor_4) as Box<dyn Component>, |
| 228 | + Box::new(self.verify_bitwise_xor_7) as Box<dyn Component>, |
| 229 | + Box::new(self.verify_bitwise_xor_9) as Box<dyn Component>, |
| 230 | + Box::new(self.range_check_15) as Box<dyn Component>, |
| 231 | + Box::new(self.range_check_16) as Box<dyn Component>, |
| 232 | + ] |
| 233 | + } |
| 234 | +} |
0 commit comments