sp1_recursion_core_v2/
builder.rs

1use p3_air::AirBuilderWithPublicValues;
2use p3_field::AbstractField;
3use sp1_recursion_core::air::Block;
4use sp1_stark::{
5    air::{AirInteraction, BaseAirBuilder, MachineAirBuilder},
6    InteractionKind,
7};
8
9use crate::*;
10
11/// A trait which contains all helper methods for building SP1 recursion machine AIRs.
12pub trait SP1RecursionAirBuilder: MachineAirBuilder + RecursionAirBuilder {}
13
14impl<AB: AirBuilderWithPublicValues + RecursionAirBuilder> SP1RecursionAirBuilder for AB {}
15impl<AB: BaseAirBuilder> RecursionAirBuilder for AB {}
16
17pub trait RecursionAirBuilder: BaseAirBuilder {
18    fn send_single<E: Into<Self::Expr>>(
19        &mut self,
20        addr: Address<E>,
21        val: E,
22        mult: impl Into<Self::Expr>,
23    ) {
24        let mut padded_value = core::array::from_fn(|_| Self::Expr::zero());
25        padded_value[0] = val.into();
26        self.send_block(Address(addr.0.into()), Block(padded_value), mult)
27    }
28
29    fn send_block<E: Into<Self::Expr>>(
30        &mut self,
31        addr: Address<E>,
32        val: Block<E>,
33        mult: impl Into<Self::Expr>,
34    ) {
35        self.send(AirInteraction::new(
36            once(addr.0).chain(val).map(Into::into).collect(),
37            mult.into(),
38            InteractionKind::Memory,
39        ));
40    }
41
42    fn receive_single<E: Into<Self::Expr>>(
43        &mut self,
44        addr: Address<E>,
45        val: E,
46        mult: impl Into<Self::Expr>,
47    ) {
48        let mut padded_value = core::array::from_fn(|_| Self::Expr::zero());
49        padded_value[0] = val.into();
50        self.receive_block(Address(addr.0.into()), Block(padded_value), mult)
51    }
52
53    fn receive_block<E: Into<Self::Expr>>(
54        &mut self,
55        addr: Address<E>,
56        val: Block<E>,
57        mult: impl Into<Self::Expr>,
58    ) {
59        self.receive(AirInteraction::new(
60            once(addr.0).chain(val).map(Into::into).collect(),
61            mult.into(),
62            InteractionKind::Memory,
63        ));
64    }
65}