use crate::{
    air::Block,
    chips::{
        alu_base::{BaseAluAccessCols, BaseAluValueCols},
        alu_ext::{ExtAluAccessCols, ExtAluValueCols},
        batch_fri::{BatchFRICols, BatchFRIPreprocessedCols},
        exp_reverse_bits::{ExpReverseBitsLenCols, ExpReverseBitsLenPreprocessedCols},
        fri_fold::{FriFoldCols, FriFoldPreprocessedCols},
        poseidon2_skinny::columns::{preprocessed::Poseidon2PreprocessedColsSkinny, Poseidon2},
        poseidon2_wide::columns::preprocessed::Poseidon2PreprocessedColsWide,
        public_values::{PublicValuesCols, PublicValuesPreprocessedCols},
        select::{SelectCols, SelectPreprocessedCols},
    },
    BaseAluInstr, BaseAluIo, BatchFRIEvent, BatchFRIInstrFFI, CommitPublicValuesEvent,
    CommitPublicValuesInstr, ExpReverseBitsEventFFI, ExpReverseBitsInstrFFI, ExtAluInstr, ExtAluIo,
    FriFoldEvent, FriFoldInstrFFI, Poseidon2Event, Poseidon2Instr, SelectEvent, SelectInstr,
};
use p3_baby_bear::BabyBear;
#[link(name = "sp1-recursion-core-sys", kind = "static")]
extern "C-unwind" {
    pub fn alu_base_event_to_row_babybear(
        io: &BaseAluIo<BabyBear>,
        cols: &mut BaseAluValueCols<BabyBear>,
    );
    pub fn alu_base_instr_to_row_babybear(
        instr: &BaseAluInstr<BabyBear>,
        cols: &mut BaseAluAccessCols<BabyBear>,
    );
    pub fn alu_ext_event_to_row_babybear(
        io: &ExtAluIo<Block<BabyBear>>,
        cols: &mut ExtAluValueCols<BabyBear>,
    );
    pub fn alu_ext_instr_to_row_babybear(
        instr: &ExtAluInstr<BabyBear>,
        cols: &mut ExtAluAccessCols<BabyBear>,
    );
    pub fn batch_fri_event_to_row_babybear(
        io: &BatchFRIEvent<BabyBear>,
        cols: &mut BatchFRICols<BabyBear>,
    );
    pub fn batch_fri_instr_to_row_babybear(
        instr: &BatchFRIInstrFFI<BabyBear>,
        cols: &mut BatchFRIPreprocessedCols<BabyBear>,
        index: usize,
    );
    pub fn exp_reverse_bits_event_to_row_babybear(
        io: &ExpReverseBitsEventFFI<BabyBear>,
        i: usize,
        cols: &mut ExpReverseBitsLenCols<BabyBear>,
    );
    pub fn exp_reverse_bits_instr_to_row_babybear(
        instr: &ExpReverseBitsInstrFFI<BabyBear>,
        i: usize,
        len: usize,
        cols: &mut ExpReverseBitsLenPreprocessedCols<BabyBear>,
    );
    pub fn fri_fold_event_to_row_babybear(
        io: &FriFoldEvent<BabyBear>,
        cols: &mut FriFoldCols<BabyBear>,
    );
    pub fn fri_fold_instr_to_row_babybear(
        instr: &FriFoldInstrFFI<BabyBear>,
        i: usize,
        cols: &mut FriFoldPreprocessedCols<BabyBear>,
    );
    pub fn public_values_event_to_row_babybear(
        io: &CommitPublicValuesEvent<BabyBear>,
        digest_idx: usize,
        cols: &mut PublicValuesCols<BabyBear>,
    );
    pub fn public_values_instr_to_row_babybear(
        instr: &CommitPublicValuesInstr<BabyBear>,
        digest_idx: usize,
        cols: &mut PublicValuesPreprocessedCols<BabyBear>,
    );
    pub fn select_event_to_row_babybear(
        io: &SelectEvent<BabyBear>,
        cols: &mut SelectCols<BabyBear>,
    );
    pub fn select_instr_to_row_babybear(
        instr: &SelectInstr<BabyBear>,
        cols: &mut SelectPreprocessedCols<BabyBear>,
    );
    pub fn poseidon2_skinny_event_to_row_babybear(
        io: &Poseidon2Event<BabyBear>,
        cols: *mut Poseidon2<BabyBear>,
    );
    pub fn poseidon2_skinny_instr_to_row_babybear(
        instr: &Poseidon2Instr<BabyBear>,
        i: usize,
        cols: &mut Poseidon2PreprocessedColsSkinny<BabyBear>,
    );
    pub fn poseidon2_wide_event_to_row_babybear(
        input: *const BabyBear,
        input_row: *mut BabyBear,
        sbox_state: bool,
    );
    pub fn poseidon2_wide_instr_to_row_babybear(
        instr: &Poseidon2Instr<BabyBear>,
        cols: &mut Poseidon2PreprocessedColsWide<BabyBear>,
    );
}