sp1_core_machine/range/
air.rs1use core::borrow::Borrow;
2
3use slop_air::{Air, BaseAir, PairBuilder};
4use slop_algebra::{AbstractField, Field};
5use slop_matrix::Matrix;
6use sp1_core_executor::ByteOpcode;
7use sp1_hypercube::air::SP1AirBuilder;
8
9use super::{
10 columns::{RangeMultCols, RangePreprocessedCols, NUM_RANGE_MULT_COLS},
11 RangeChip,
12};
13
14impl<F: Field> BaseAir<F> for RangeChip<F> {
15 fn width(&self) -> usize {
16 NUM_RANGE_MULT_COLS
17 }
18}
19
20impl<AB: SP1AirBuilder + PairBuilder> Air<AB> for RangeChip<AB::F> {
21 fn eval(&self, builder: &mut AB) {
22 let main = builder.main();
23 let local_mult = main.row_slice(0);
24 let local_mult: &RangeMultCols<AB::Var> = (*local_mult).borrow();
25
26 let prep = builder.preprocessed();
27 let prep = prep.row_slice(0);
28 let local: &RangePreprocessedCols<AB::Var> = (*prep).borrow();
29
30 let field_op = ByteOpcode::Range.as_field::<AB::F>();
31 let mult = local_mult.multiplicity;
32 builder.receive_byte(field_op, local.a, local.bits, AB::F::zero(), mult);
33 }
34}