use std::iter::once;
use p3_field::PrimeField64;
use serde::{Deserialize, Serialize};
use sp1_derive::AlignedBorrow;
use sp1_recursion_core::air::{Block, RecursionPublicValues};
pub mod air;
pub mod builder;
pub mod chips;
pub mod machine;
pub mod runtime;
pub mod shape;
pub use runtime::*;
pub use sp1_recursion_core::stark;
use crate::chips::poseidon2_skinny::WIDTH;
#[derive(
AlignedBorrow, Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, Default,
)]
#[repr(transparent)]
pub struct Address<F>(pub F);
impl<F: PrimeField64> Address<F> {
#[inline]
pub fn as_usize(&self) -> usize {
self.0.as_canonical_u64() as usize
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[repr(C)]
pub struct BaseAluIo<V> {
pub out: V,
pub in1: V,
pub in2: V,
}
pub type BaseAluEvent<F> = BaseAluIo<F>;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct BaseAluInstr<F> {
pub opcode: BaseAluOpcode,
pub mult: F,
pub addrs: BaseAluIo<Address<F>>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[repr(C)]
pub struct ExtAluIo<V> {
pub out: V,
pub in1: V,
pub in2: V,
}
pub type ExtAluEvent<F> = ExtAluIo<Block<F>>;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ExtAluInstr<F> {
pub opcode: ExtAluOpcode,
pub mult: F,
pub addrs: ExtAluIo<Address<F>>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct MemIo<V> {
pub inner: V,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct MemInstr<F> {
pub addrs: MemIo<Address<F>>,
pub vals: MemIo<Block<F>>,
pub mult: F,
pub kind: MemAccessKind,
}
pub type MemEvent<F> = MemIo<Block<F>>;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum MemAccessKind {
Read,
Write,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct Poseidon2Io<V> {
pub input: [V; WIDTH],
pub output: [V; WIDTH],
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Poseidon2SkinnyInstr<F> {
pub addrs: Poseidon2Io<Address<F>>,
pub mults: [F; WIDTH],
}
pub type Poseidon2Event<F> = Poseidon2Io<F>;
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ExpReverseBitsIo<V> {
pub base: V,
pub exp: Vec<V>,
pub result: V,
}
pub type Poseidon2WideEvent<F> = Poseidon2Io<F>;
pub type Poseidon2Instr<F> = Poseidon2SkinnyInstr<F>;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ExpReverseBitsInstr<F> {
pub addrs: ExpReverseBitsIo<Address<F>>,
pub mult: F,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ExpReverseBitsEvent<F> {
pub base: F,
pub exp: Vec<F>,
pub result: F,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct FriFoldIo<V> {
pub ext_single: FriFoldExtSingleIo<Block<V>>,
pub ext_vec: FriFoldExtVecIo<Vec<Block<V>>>,
pub base_single: FriFoldBaseIo<V>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct FriFoldExtSingleIo<V> {
pub z: V,
pub alpha: V,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct FriFoldExtVecIo<V> {
pub mat_opening: V,
pub ps_at_z: V,
pub alpha_pow_input: V,
pub ro_input: V,
pub alpha_pow_output: V,
pub ro_output: V,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct FriFoldBaseIo<V> {
pub x: V,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct FriFoldInstr<F> {
pub base_single_addrs: FriFoldBaseIo<Address<F>>,
pub ext_single_addrs: FriFoldExtSingleIo<Address<F>>,
pub ext_vec_addrs: FriFoldExtVecIo<Vec<Address<F>>>,
pub alpha_pow_mults: Vec<F>,
pub ro_mults: Vec<F>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct FriFoldEvent<F> {
pub base_single: FriFoldBaseIo<F>,
pub ext_single: FriFoldExtSingleIo<Block<F>>,
pub ext_vec: FriFoldExtVecIo<Block<F>>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CommitPublicValuesInstr<F> {
pub pv_addrs: RecursionPublicValues<Address<F>>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CommitPublicValuesEvent<F> {
pub public_values: RecursionPublicValues<F>,
}