risc0_circuit_recursion_sys/
lib.rs

1// Copyright 2025 RISC Zero, Inc.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use risc0_core::field::baby_bear::{BabyBearElem, BabyBearExtElem};
16
17#[repr(C)]
18pub struct RawExecBuffers {
19    pub ctrl: *const BabyBearElem,
20    pub data: *const BabyBearElem,
21    pub global: *const BabyBearElem,
22}
23
24#[repr(C)]
25pub struct RawAccumBuffers {
26    pub ctrl: *const BabyBearElem,
27    pub global: *const BabyBearElem,
28    pub data: *const BabyBearElem,
29    pub mix: *const BabyBearElem,
30    pub accum: *const BabyBearElem,
31}
32
33#[derive(Clone, Debug, PartialEq)]
34#[repr(C)]
35pub struct RawPreflightCycle {
36    pub iop_idx: u32,
37    pub is_par_safe: u32,
38}
39
40#[repr(C)]
41pub struct RawPreflightTrace {
42    pub wom: *const BabyBearExtElem,
43    pub cycles: *const RawPreflightCycle,
44    pub iops: *const BabyBearExtElem,
45    pub num_woms: u32,
46    pub num_cycles: u32,
47    pub num_iops: u32,
48}
49
50#[derive(Clone, Copy, PartialEq)]
51#[repr(u32)]
52pub enum StepMode {
53    Parallel,
54    SeqForward,
55    SeqReverse,
56}
57
58extern "C" {
59    pub fn risc0_circuit_recursion_cpu_witgen(
60        mode: StepMode,
61        buffers: *const RawExecBuffers,
62        preflight: *const RawPreflightTrace,
63        total_cycles: u32,
64    ) -> *const std::os::raw::c_char;
65
66    pub fn risc0_circuit_recursion_cpu_accum(
67        buffers: *const RawAccumBuffers,
68        work_cycles: u32,
69        total_cycles: u32,
70    ) -> *const std::os::raw::c_char;
71
72    pub fn risc0_circuit_recursion_cpu_eval_check(
73        buffers: *const RawAccumBuffers,
74        poly_mix: *const BabyBearExtElem,
75        check: *const BabyBearElem,
76        rou: BabyBearElem,
77        po2: u32,
78        steps: u32,
79    ) -> *const std::os::raw::c_char;
80}
81
82#[cfg(feature = "cuda")]
83extern "C" {
84    pub fn risc0_circuit_recursion_cuda_witgen(
85        mode: StepMode,
86        buffers: *const RawExecBuffers,
87        preflight: *const RawPreflightTrace,
88        steps: u32,
89    ) -> *const std::os::raw::c_char;
90
91    pub fn risc0_circuit_recursion_cuda_accum(
92        buffers: *const RawAccumBuffers,
93        steps: u32,
94        cycles: u32,
95    ) -> *const std::os::raw::c_char;
96
97    pub fn risc0_circuit_recursion_cuda_eval_check(
98        check: *const BabyBearElem,
99        ctrl: *const BabyBearElem,
100        data: *const BabyBearElem,
101        accum: *const BabyBearElem,
102        mix: *const BabyBearElem,
103        out: *const BabyBearElem,
104        rou: *const BabyBearElem,
105        po2: u32,
106        domain: u32,
107        poly_mix: *const BabyBearExtElem,
108    ) -> *const std::os::raw::c_char;
109}