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
16pub 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#[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#[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#[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#[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#[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#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
97pub enum MemAccessKind {
98 Read,
99 Write,
100}
101
102#[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#[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#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
120pub struct ExpReverseBitsIo<V> {
121 pub base: V,
122 pub exp: Vec<V>,
124 pub result: V,
125}
126
127pub type Poseidon2WideEvent<F> = Poseidon2Io<F>;
128pub type Poseidon2Instr<F> = Poseidon2SkinnyInstr<F>;
129
130#[derive(Clone, Debug, Serialize, Deserialize)]
132pub struct ExpReverseBitsInstr<F> {
133 pub addrs: ExpReverseBitsIo<Address<F>>,
134 pub mult: F,
135}
136
137#[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#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
155pub struct FriFoldExtSingleIo<V> {
156 pub z: V,
157 pub alpha: V,
158}
159
160#[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#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
173pub struct FriFoldBaseIo<V> {
174 pub x: V,
175}
176
177#[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#[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#[derive(Clone, Debug, Serialize, Deserialize)]
201pub struct CommitPublicValuesInstr<F> {
202 pub pv_addrs: RecursionPublicValues<Address<F>>,
203}
204
205#[derive(Clone, Debug, Serialize, Deserialize)]
207pub struct CommitPublicValuesEvent<F> {
208 pub public_values: RecursionPublicValues<F>,
209}