sp1_core_machine/air/
program.rsuse std::iter::once;
use p3_air::AirBuilder;
use sp1_stark::{
air::{AirInteraction, BaseAirBuilder, InteractionScope},
InteractionKind,
};
use crate::cpu::columns::{InstructionCols, OpcodeSelectorCols};
pub trait ProgramAirBuilder: BaseAirBuilder {
fn send_program(
&mut self,
pc: impl Into<Self::Expr>,
instruction: InstructionCols<impl Into<Self::Expr> + Copy>,
selectors: OpcodeSelectorCols<impl Into<Self::Expr> + Copy>,
shard: impl Into<Self::Expr> + Copy,
multiplicity: impl Into<Self::Expr>,
) {
let values = once(pc.into())
.chain(once(instruction.opcode.into()))
.chain(instruction.into_iter().map(|x| x.into()))
.chain(selectors.into_iter().map(|x| x.into()))
.chain(once(shard.into()))
.collect();
self.send(
AirInteraction::new(values, multiplicity.into(), InteractionKind::Program),
InteractionScope::Local,
);
}
fn receive_program(
&mut self,
pc: impl Into<Self::Expr>,
instruction: InstructionCols<impl Into<Self::Expr> + Copy>,
selectors: OpcodeSelectorCols<impl Into<Self::Expr> + Copy>,
shard: impl Into<Self::Expr> + Copy,
multiplicity: impl Into<Self::Expr>,
) {
let values: Vec<<Self as AirBuilder>::Expr> = once(pc.into())
.chain(once(instruction.opcode.into()))
.chain(instruction.into_iter().map(|x| x.into()))
.chain(selectors.into_iter().map(|x| x.into()))
.chain(once(shard.into()))
.collect();
self.receive(
AirInteraction::new(values, multiplicity.into(), InteractionKind::Program),
InteractionScope::Local,
);
}
}