sp1_core_machine/air/
program.rs1use std::iter::once;
2
3use p3_air::AirBuilder;
4use sp1_stark::{
5 air::{AirInteraction, BaseAirBuilder, InteractionScope},
6 InteractionKind,
7};
8
9use crate::cpu::columns::InstructionCols;
10
11pub trait ProgramAirBuilder: BaseAirBuilder {
13 fn send_program(
15 &mut self,
16 pc: impl Into<Self::Expr>,
17 instruction: InstructionCols<impl Into<Self::Expr> + Copy>,
18 multiplicity: impl Into<Self::Expr>,
19 ) {
20 let values = once(pc.into())
21 .chain(once(instruction.opcode.into()))
22 .chain(instruction.into_iter().map(|x| x.into()))
23 .collect();
24
25 self.send(
26 AirInteraction::new(values, multiplicity.into(), InteractionKind::Program),
27 InteractionScope::Local,
28 );
29 }
30
31 fn receive_program(
33 &mut self,
34 pc: impl Into<Self::Expr>,
35 instruction: InstructionCols<impl Into<Self::Expr> + Copy>,
36 multiplicity: impl Into<Self::Expr>,
37 ) {
38 let values: Vec<<Self as AirBuilder>::Expr> = once(pc.into())
39 .chain(once(instruction.opcode.into()))
40 .chain(instruction.into_iter().map(|x| x.into()))
41 .collect();
42
43 self.receive(
44 AirInteraction::new(values, multiplicity.into(), InteractionKind::Program),
45 InteractionScope::Local,
46 );
47 }
48}