use p3_field::AbstractField;
use crate::air::WordAirBuilder;
use crate::cpu::columns::CpuCols;
use crate::memory::MemoryCols;
use crate::runtime::MemoryAccessPosition;
use crate::stark::{CpuChip, SP1AirBuilder};
impl CpuChip {
pub(crate) fn eval_registers<AB: SP1AirBuilder>(
&self,
builder: &mut AB,
local: &CpuCols<AB::Var>,
is_branch_instruction: AB::Expr,
) {
builder
.when(local.selectors.imm_b)
.assert_word_eq(local.op_b_val(), local.instruction.op_b);
builder
.when(local.selectors.imm_c)
.assert_word_eq(local.op_c_val(), local.instruction.op_c);
builder.eval_memory_access(
local.shard,
local.channel,
local.clk + AB::F::from_canonical_u32(MemoryAccessPosition::B as u32),
local.instruction.op_b[0],
&local.op_b_access,
AB::Expr::one() - local.selectors.imm_b,
);
builder.eval_memory_access(
local.shard,
local.channel,
local.clk + AB::F::from_canonical_u32(MemoryAccessPosition::C as u32),
local.instruction.op_c[0],
&local.op_c_access,
AB::Expr::one() - local.selectors.imm_c,
);
builder
.when(local.instruction.op_a_0)
.assert_word_zero(*local.op_a_access.value());
builder.eval_memory_access(
local.shard,
local.channel,
local.clk + AB::F::from_canonical_u32(MemoryAccessPosition::A as u32),
local.instruction.op_a[0],
&local.op_a_access,
local.is_real,
);
builder.slice_range_check_u8(
&local.op_a_access.access.value.0,
local.shard,
local.channel,
local.is_real,
);
builder
.when(is_branch_instruction.clone() + self.is_store_instruction::<AB>(&local.selectors))
.assert_word_eq(local.op_a_val(), local.op_a_access.prev_value);
}
}