openvm_deferral_guest/
ops.rs

1#[allow(unused_imports)]
2use crate::{
3    encode_deferral_imm, Commit, DeferralImmOpcode, OutputKey, COMMIT_NUM_BYTES, DEFERRAL_FUNCT3,
4    MAX_DEF_CIRCUITS, OPCODE,
5};
6
7/// Macro to generate CALL opcode
8#[cfg(target_os = "zkvm")]
9#[macro_export]
10macro_rules! deferral_call {
11    ($output_key_ptr:expr, $input_commit_ptr:expr, $deferral_idx:expr) => {{
12        openvm_custom_insn::custom_insn_i!(
13            opcode = OPCODE,
14            funct3 = DEFERRAL_FUNCT3,
15            rd = In $output_key_ptr,
16            rs1 = In $input_commit_ptr,
17            imm = Const encode_deferral_imm($deferral_idx, DeferralImmOpcode::Call),
18        )
19    }};
20}
21
22/// Macro to generate OUTPUT opcode
23#[cfg(target_os = "zkvm")]
24#[macro_export]
25macro_rules! deferral_output {
26    ($output_ptr:expr, $output_key_ptr:expr, $deferral_idx:expr) => {{
27        openvm_custom_insn::custom_insn_i!(
28            opcode = OPCODE,
29            funct3 = DEFERRAL_FUNCT3,
30            rd = In $output_ptr,
31            rs1 = In $output_key_ptr,
32            imm = Const encode_deferral_imm($deferral_idx, DeferralImmOpcode::Output),
33        )
34    }};
35}
36
37/// Execute a deferral call for a compile-time deferral index using raw pointers
38#[inline(always)]
39#[allow(unused_variables)]
40pub fn deferred_compute_raw<const DEFERRAL_IDX: u16>(
41    output_key_ptr: *mut u8,
42    input_commit_ptr: *const u8,
43) {
44    const { assert!(DEFERRAL_IDX < MAX_DEF_CIRCUITS) };
45
46    #[cfg(target_os = "zkvm")]
47    deferral_call!(output_key_ptr, input_commit_ptr, DEFERRAL_IDX);
48
49    #[cfg(not(target_os = "zkvm"))]
50    unimplemented!("Deferral framework is only available with zkvm")
51}
52
53/// Retrieve deferral output for a compile-time deferral index using raw pointers
54#[inline(always)]
55#[allow(unused_variables)]
56pub fn get_deferred_output_raw<const DEFERRAL_IDX: u16>(
57    output_ptr: *mut u8,
58    output_key_ptr: *const u8,
59) {
60    const { assert!(DEFERRAL_IDX < MAX_DEF_CIRCUITS) };
61
62    #[cfg(target_os = "zkvm")]
63    deferral_output!(output_ptr, output_key_ptr, DEFERRAL_IDX);
64
65    #[cfg(not(target_os = "zkvm"))]
66    unimplemented!("Deferral framework is only available with zkvm")
67}
68
69/// Execute a deferral call for a compile-time deferral index
70#[inline(always)]
71#[allow(unused_variables)]
72pub fn deferred_compute<const DEFERRAL_IDX: u16>(input_commit: &Commit) -> OutputKey {
73    #[cfg(target_os = "zkvm")]
74    let ret = {
75        let mut output_key = OutputKey::new([0u8; COMMIT_NUM_BYTES], 0);
76        deferred_compute_raw::<DEFERRAL_IDX>(output_key.as_mut_ptr(), input_commit.as_ptr());
77        output_key
78    };
79    #[cfg(target_os = "zkvm")]
80    return ret;
81
82    #[cfg(not(target_os = "zkvm"))]
83    unimplemented!("Deferral framework is only available with zkvm")
84}
85
86/// Retrieve deferral output for a compile-time deferral index into a caller-provided buffer
87#[inline(always)]
88#[allow(unused_variables)]
89pub fn get_deferred_output<const DEFERRAL_IDX: u16>(output: &mut [u8], output_key: &OutputKey) {
90    assert_eq!(output.len(), output_key.output_len as usize);
91
92    #[cfg(target_os = "zkvm")]
93    get_deferred_output_raw::<DEFERRAL_IDX>(output.as_mut_ptr(), output_key.as_ptr());
94
95    #[cfg(not(target_os = "zkvm"))]
96    unimplemented!("Deferral framework is only available with zkvm")
97}