use core::ops::Range;
use miden_core::{Felt, ONE, ZERO, operations::Operation, utils::range};
pub const ADDR_COL_IDX: usize = 0;
pub const OP_BITS_OFFSET: usize = ADDR_COL_IDX + 1;
pub const NUM_OP_BITS: usize = Operation::OP_BITS;
pub const OP_BITS_RANGE: Range<usize> = range(OP_BITS_OFFSET, NUM_OP_BITS);
pub const HASHER_STATE_OFFSET: usize = OP_BITS_RANGE.end;
pub const NUM_HASHER_COLUMNS: usize = 8;
pub const NUM_USER_OP_HELPERS: usize = 6;
pub const USER_OP_HELPERS_OFFSET: usize = HASHER_STATE_OFFSET + 2;
pub const HASHER_STATE_RANGE: Range<usize> = range(HASHER_STATE_OFFSET, NUM_HASHER_COLUMNS);
pub const IN_SPAN_COL_IDX: usize = HASHER_STATE_RANGE.end;
pub const GROUP_COUNT_COL_IDX: usize = IN_SPAN_COL_IDX + 1;
pub const OP_INDEX_COL_IDX: usize = GROUP_COUNT_COL_IDX + 1;
pub const OP_BATCH_FLAGS_OFFSET: usize = OP_INDEX_COL_IDX + 1;
pub const NUM_OP_BATCH_FLAGS: usize = 3;
pub const OP_BATCH_FLAGS_RANGE: Range<usize> = range(OP_BATCH_FLAGS_OFFSET, NUM_OP_BATCH_FLAGS);
pub const OP_BATCH_8_GROUPS: [Felt; NUM_OP_BATCH_FLAGS] = [ONE, ZERO, ZERO];
pub const OP_BATCH_4_GROUPS: [Felt; NUM_OP_BATCH_FLAGS] = [ZERO, ONE, ZERO];
pub const OP_BATCH_2_GROUPS: [Felt; NUM_OP_BATCH_FLAGS] = [ZERO, ZERO, ONE];
pub const OP_BATCH_1_GROUPS: [Felt; NUM_OP_BATCH_FLAGS] = [ZERO, ONE, ONE];
pub const OP_BITS_EXTRA_COLS_OFFSET: usize = OP_BATCH_FLAGS_RANGE.end;
pub const NUM_OP_BITS_EXTRA_COLS: usize = 2;
pub const OP_BITS_EXTRA_COLS_RANGE: Range<usize> =
range(OP_BITS_EXTRA_COLS_OFFSET, NUM_OP_BITS_EXTRA_COLS);
pub const IS_LOOP_BODY_FLAG_COL_IDX: usize = HASHER_STATE_RANGE.start + 4;
pub const IS_LOOP_FLAG_COL_IDX: usize = HASHER_STATE_RANGE.start + 5;
pub const IS_CALL_FLAG_COL_IDX: usize = HASHER_STATE_RANGE.start + 6;
pub const IS_SYSCALL_FLAG_COL_IDX: usize = HASHER_STATE_RANGE.start + 7;
pub const DECODER_OP_BITS_OFFSET: usize = super::DECODER_TRACE_OFFSET + OP_BITS_OFFSET;
pub const DECODER_USER_OP_HELPERS_OFFSET: usize =
super::DECODER_TRACE_OFFSET + USER_OP_HELPERS_OFFSET;