sp1_core_machine/air/
program.rs

1use 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
11/// A trait which contains methods related to program interactions in an AIR.
12pub trait ProgramAirBuilder: BaseAirBuilder {
13    /// Sends an instruction.
14    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    /// Receives an instruction.
32    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}