openvm_circuit/arch/
deferral.rs

1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5pub type InputRaw = Vec<u8>;
6pub type OutputRaw = Vec<u8>;
7pub type InputCommit = Vec<u8>;
8pub type OutputCommit = Vec<u8>;
9
10#[derive(Clone, Debug, Serialize, Deserialize)]
11pub enum InputMapVal {
12    Raw(InputRaw),
13    Output(OutputCommit),
14}
15
16#[derive(Clone, Debug, derive_new::new)]
17pub struct DeferralResult {
18    pub input: InputCommit,
19    pub output_commit: OutputCommit,
20    pub output_raw: OutputRaw,
21}
22
23#[derive(Clone, Debug, Default, Serialize, Deserialize)]
24pub struct DeferralState {
25    input_map: HashMap<InputCommit, InputMapVal>,
26    output_map: HashMap<OutputCommit, OutputRaw>,
27}
28
29impl DeferralState {
30    pub fn new(generated: Vec<DeferralResult>) -> Self {
31        let (input_map, output_map) = generated
32            .into_iter()
33            .map(|res| {
34                (
35                    (res.input, InputMapVal::Output(res.output_commit.clone())),
36                    (res.output_commit, res.output_raw),
37                )
38            })
39            .unzip();
40        Self {
41            input_map,
42            output_map,
43        }
44    }
45
46    pub fn store_input(&mut self, input_commit: InputCommit, input_raw: InputRaw) {
47        self.input_map
48            .insert(input_commit, InputMapVal::Raw(input_raw));
49    }
50
51    pub fn store_output(
52        &mut self,
53        input_commit: &InputCommit,
54        output_commit: OutputCommit,
55        output_raw: OutputRaw,
56    ) {
57        *(self.input_map.get_mut(input_commit).unwrap()) =
58            InputMapVal::Output(output_commit.clone());
59        self.output_map.insert(output_commit, output_raw);
60    }
61
62    pub fn get_input(&self, input_commit: &InputCommit) -> &InputMapVal {
63        self.input_map.get(input_commit).unwrap()
64    }
65
66    pub fn get_output(&self, output_commit: &OutputCommit) -> &OutputRaw {
67        self.output_map.get(output_commit).unwrap()
68    }
69}