sp1_recursion_core_v2/
lib.rs

1use std::iter::once;
2
3use p3_field::PrimeField64;
4use serde::{Deserialize, Serialize};
5use sp1_derive::AlignedBorrow;
6use sp1_recursion_core::air::{Block, RecursionPublicValues};
7
8pub mod air;
9pub mod builder;
10pub mod chips;
11pub mod machine;
12pub mod runtime;
13
14pub use runtime::*;
15
16// Re-export the stark stuff from `sp1_recursion_core` for now, until we will migrate it here.
17pub use sp1_recursion_core::stark;
18
19use crate::chips::poseidon2_skinny::WIDTH;
20
21#[derive(
22    AlignedBorrow, Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, Default,
23)]
24#[repr(transparent)]
25pub struct Address<F>(pub F);
26
27impl<F: PrimeField64> Address<F> {
28    #[inline]
29    pub fn as_usize(&self) -> usize {
30        self.0.as_canonical_u64() as usize
31    }
32}
33
34// -------------------------------------------------------------------------------------------------
35
36/// The inputs and outputs to an operation of the base field ALU.
37#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
38#[repr(C)]
39pub struct BaseAluIo<V> {
40    pub out: V,
41    pub in1: V,
42    pub in2: V,
43}
44
45pub type BaseAluEvent<F> = BaseAluIo<F>;
46
47/// An instruction invoking the extension field ALU.
48#[derive(Clone, Debug, Serialize, Deserialize)]
49pub struct BaseAluInstr<F> {
50    pub opcode: BaseAluOpcode,
51    pub mult: F,
52    pub addrs: BaseAluIo<Address<F>>,
53}
54
55// -------------------------------------------------------------------------------------------------
56
57/// The inputs and outputs to an operation of the extension field ALU.
58#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
59#[repr(C)]
60pub struct ExtAluIo<V> {
61    pub out: V,
62    pub in1: V,
63    pub in2: V,
64}
65
66pub type ExtAluEvent<F> = ExtAluIo<Block<F>>;
67
68/// An instruction invoking the extension field ALU.
69#[derive(Clone, Debug, Serialize, Deserialize)]
70pub struct ExtAluInstr<F> {
71    pub opcode: ExtAluOpcode,
72    pub mult: F,
73    pub addrs: ExtAluIo<Address<F>>,
74}
75
76// -------------------------------------------------------------------------------------------------
77
78/// The inputs and outputs to the manual memory management/memory initialization table.
79#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
80pub struct MemIo<V> {
81    pub inner: V,
82}
83
84#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
85pub struct MemInstr<F> {
86    pub addrs: MemIo<Address<F>>,
87    pub vals: MemIo<Block<F>>,
88    pub mult: F,
89    pub kind: MemAccessKind,
90}
91
92pub type MemEvent<F> = MemIo<Block<F>>;
93
94// -------------------------------------------------------------------------------------------------
95
96#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
97pub enum MemAccessKind {
98    Read,
99    Write,
100}
101
102/// The inputs and outputs to a Poseidon2 permutation.
103#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
104pub struct Poseidon2Io<V> {
105    pub input: [V; WIDTH],
106    pub output: [V; WIDTH],
107}
108
109/// An instruction invoking the Poseidon2 permutation.
110#[derive(Clone, Debug, Serialize, Deserialize)]
111pub struct Poseidon2SkinnyInstr<F> {
112    pub addrs: Poseidon2Io<Address<F>>,
113    pub mults: [F; WIDTH],
114}
115
116pub type Poseidon2Event<F> = Poseidon2Io<F>;
117
118/// The inputs and outputs to an exp-reverse-bits operation.
119#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
120pub struct ExpReverseBitsIo<V> {
121    pub base: V,
122    // The bits of the exponent in little-endian order in a vec.
123    pub exp: Vec<V>,
124    pub result: V,
125}
126
127pub type Poseidon2WideEvent<F> = Poseidon2Io<F>;
128pub type Poseidon2Instr<F> = Poseidon2SkinnyInstr<F>;
129
130/// An instruction invoking the exp-reverse-bits operation.
131#[derive(Clone, Debug, Serialize, Deserialize)]
132pub struct ExpReverseBitsInstr<F> {
133    pub addrs: ExpReverseBitsIo<Address<F>>,
134    pub mult: F,
135}
136
137/// The event encoding the inputs and outputs of an exp-reverse-bits operation. The `len` operand is
138/// now stored as the length of the `exp` field.
139#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
140pub struct ExpReverseBitsEvent<F> {
141    pub base: F,
142    pub exp: Vec<F>,
143    pub result: F,
144}
145
146#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
147pub struct FriFoldIo<V> {
148    pub ext_single: FriFoldExtSingleIo<Block<V>>,
149    pub ext_vec: FriFoldExtVecIo<Vec<Block<V>>>,
150    pub base_single: FriFoldBaseIo<V>,
151}
152
153/// The extension-field-valued single inputs to the FRI fold operation.
154#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
155pub struct FriFoldExtSingleIo<V> {
156    pub z: V,
157    pub alpha: V,
158}
159
160/// The extension-field-valued vector inputs to the FRI fold operation.
161#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
162pub struct FriFoldExtVecIo<V> {
163    pub mat_opening: V,
164    pub ps_at_z: V,
165    pub alpha_pow_input: V,
166    pub ro_input: V,
167    pub alpha_pow_output: V,
168    pub ro_output: V,
169}
170
171/// The base-field-valued inputs to the FRI fold operation.
172#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
173pub struct FriFoldBaseIo<V> {
174    pub x: V,
175}
176
177/// An instruction invoking the FRI fold operation. Addresses for extension field elements are of
178/// the same type as for base field elements.
179#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
180pub struct FriFoldInstr<F> {
181    pub base_single_addrs: FriFoldBaseIo<Address<F>>,
182    pub ext_single_addrs: FriFoldExtSingleIo<Address<F>>,
183    pub ext_vec_addrs: FriFoldExtVecIo<Vec<Address<F>>>,
184    pub alpha_pow_mults: Vec<F>,
185    pub ro_mults: Vec<F>,
186}
187
188/// The event encoding the data of a single iteration within the FRI fold operation.
189/// For any given event, we are accessing a single element of the `Vec` inputs, so that the event
190/// is not a type alias for `FriFoldIo` like many of the other events.
191#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
192pub struct FriFoldEvent<F> {
193    pub base_single: FriFoldBaseIo<F>,
194    pub ext_single: FriFoldExtSingleIo<Block<F>>,
195    pub ext_vec: FriFoldExtVecIo<Block<F>>,
196}
197
198/// An instruction that will save the public values to the execution record and will commit to
199/// it's digest.
200#[derive(Clone, Debug, Serialize, Deserialize)]
201pub struct CommitPublicValuesInstr<F> {
202    pub pv_addrs: RecursionPublicValues<Address<F>>,
203}
204
205/// The event for committing to the public values.
206#[derive(Clone, Debug, Serialize, Deserialize)]
207pub struct CommitPublicValuesEvent<F> {
208    pub public_values: RecursionPublicValues<F>,
209}