sp1_recursion_core_v2/
builder.rs1use 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
11pub 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}