openvm_deferral_guest/
ops.rs1#[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#[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#[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#[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#[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#[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#[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}