pub mod air;
pub mod columns;
pub mod event;
pub mod opcode;
pub mod trace;
pub use event::RangeCheckEvent;
pub use opcode::*;
use alloc::collections::BTreeMap;
use core::borrow::BorrowMut;
use std::marker::PhantomData;
use p3_field::Field;
use p3_matrix::dense::RowMajorMatrix;
use self::columns::{RangeCheckPreprocessedCols, NUM_RANGE_CHECK_PREPROCESSED_COLS};
use crate::range_check::trace::NUM_ROWS;
pub const NUM_RANGE_CHECK_OPS: usize = 2;
#[derive(Debug, Clone, Copy, Default)]
pub struct RangeCheckChip<F>(PhantomData<F>);
impl<F: Field> RangeCheckChip<F> {
pub fn trace_and_map() -> (RowMajorMatrix<F>, BTreeMap<RangeCheckEvent, (usize, usize)>) {
let mut event_map = BTreeMap::new();
let mut initial_trace = RowMajorMatrix::new(
vec![F::zero(); NUM_ROWS * NUM_RANGE_CHECK_PREPROCESSED_COLS],
NUM_RANGE_CHECK_PREPROCESSED_COLS,
);
let opcodes = RangeCheckOpcode::all();
for (row_index, val) in (0..=u16::MAX).enumerate() {
let col: &mut RangeCheckPreprocessedCols<F> =
initial_trace.row_mut(row_index).borrow_mut();
col.value_u16 = F::from_canonical_u16(val);
for (i, opcode) in opcodes.iter().enumerate() {
if *opcode == RangeCheckOpcode::U12 {
col.u12_out_range = F::from_bool(val > 0xFFF);
}
let event = RangeCheckEvent::new(*opcode, val);
event_map.insert(event, (row_index, i));
}
}
(initial_trace, event_map)
}
}