kimchi_stubs/
gate_vector.rs

1//! A GateVector: this is used to represent a list of gates.
2
3use kimchi::circuits::{
4    gate::{caml::CamlCircuitGate, Circuit, CircuitGate},
5    wires::caml::CamlWire,
6};
7use o1_utils::hasher::CryptoDigest;
8
9// TODO: get rid of this
10
11//
12// Fp
13//
14
15pub mod fp {
16    use super::*;
17    use crate::arkworks::CamlFp;
18    use mina_curves::pasta::Fp;
19
20    //
21    // CamlPastaFpPlonkGateVector
22    //
23
24    #[derive(ocaml_gen::CustomType)]
25    pub struct CamlPastaFpPlonkGateVector(pub Vec<CircuitGate<Fp>>);
26    pub type CamlPastaFpPlonkGateVectorPtr<'a> = ocaml::Pointer<'a, CamlPastaFpPlonkGateVector>;
27
28    extern "C" fn caml_pasta_fp_plonk_gate_vector_finalize(v: ocaml::Raw) {
29        unsafe {
30            let v: CamlPastaFpPlonkGateVectorPtr = v.as_pointer();
31            v.drop_in_place()
32        };
33    }
34
35    ocaml::custom!(CamlPastaFpPlonkGateVector {
36        finalize: caml_pasta_fp_plonk_gate_vector_finalize,
37    });
38
39    //
40    // Functions
41    //
42
43    #[ocaml_gen::func]
44    #[ocaml::func]
45    pub fn caml_pasta_fp_plonk_gate_vector_create() -> CamlPastaFpPlonkGateVector {
46        CamlPastaFpPlonkGateVector(Vec::new())
47    }
48
49    #[ocaml_gen::func]
50    #[ocaml::func]
51    pub fn caml_pasta_fp_plonk_gate_vector_add(
52        mut v: CamlPastaFpPlonkGateVectorPtr,
53        gate: CamlCircuitGate<CamlFp>,
54    ) {
55        let gate: CircuitGate<Fp> = gate.into();
56        v.as_mut().0.push(gate);
57    }
58
59    #[ocaml_gen::func]
60    #[ocaml::func]
61    pub fn caml_pasta_fp_plonk_gate_vector_get(
62        v: CamlPastaFpPlonkGateVectorPtr,
63        i: ocaml::Int,
64    ) -> CamlCircuitGate<CamlFp> {
65        let gate = &(v.as_ref().0)[i as usize];
66        gate.into()
67    }
68
69    #[ocaml_gen::func]
70    #[ocaml::func]
71    pub fn caml_pasta_fp_plonk_gate_vector_len(v: CamlPastaFpPlonkGateVectorPtr) -> usize {
72        v.as_ref().0.len()
73    }
74
75    // TODO: remove this function
76    #[ocaml_gen::func]
77    #[ocaml::func]
78    pub fn caml_pasta_fp_plonk_gate_vector_wrap(
79        mut v: CamlPastaFpPlonkGateVectorPtr,
80        t: CamlWire,
81        h: CamlWire,
82    ) {
83        (v.as_mut().0)[t.row as usize].wires[t.col as usize] = h.into();
84    }
85
86    #[ocaml_gen::func]
87    #[ocaml::func]
88    pub fn caml_pasta_fp_plonk_gate_vector_digest(
89        public_input_size: isize,
90        v: CamlPastaFpPlonkGateVectorPtr,
91    ) -> [u8; 32] {
92        Circuit::new(usize::try_from(public_input_size).unwrap(), &v.as_ref().0).digest()
93    }
94
95    #[ocaml_gen::func]
96    #[ocaml::func]
97    pub fn caml_pasta_fp_plonk_circuit_serialize(
98        public_input_size: isize,
99        v: CamlPastaFpPlonkGateVectorPtr,
100    ) -> String {
101        let circuit = Circuit::new(usize::try_from(public_input_size).unwrap(), &v.as_ref().0);
102        serde_json::to_string(&circuit).expect("couldn't serialize constraints")
103    }
104}
105
106//
107// Fq
108//
109
110pub mod fq {
111    use super::*;
112    use crate::arkworks::CamlFq;
113    use mina_curves::pasta::Fq;
114
115    //
116    // CamlPastaFqPlonkGateVector
117    //
118
119    #[derive(ocaml_gen::CustomType)]
120    pub struct CamlPastaFqPlonkGateVector(pub Vec<CircuitGate<Fq>>);
121    pub type CamlPastaFqPlonkGateVectorPtr<'a> = ocaml::Pointer<'a, CamlPastaFqPlonkGateVector>;
122
123    extern "C" fn caml_pasta_fq_plonk_gate_vector_finalize(v: ocaml::Raw) {
124        unsafe {
125            let v: CamlPastaFqPlonkGateVectorPtr = v.as_pointer();
126            v.drop_in_place()
127        };
128    }
129
130    ocaml::custom!(CamlPastaFqPlonkGateVector {
131        finalize: caml_pasta_fq_plonk_gate_vector_finalize,
132    });
133
134    //
135    // Functions
136    //
137
138    #[ocaml_gen::func]
139    #[ocaml::func]
140    pub fn caml_pasta_fq_plonk_gate_vector_create() -> CamlPastaFqPlonkGateVector {
141        CamlPastaFqPlonkGateVector(Vec::new())
142    }
143
144    #[ocaml_gen::func]
145    #[ocaml::func]
146    pub fn caml_pasta_fq_plonk_gate_vector_add(
147        mut v: CamlPastaFqPlonkGateVectorPtr,
148        gate: CamlCircuitGate<CamlFq>,
149    ) {
150        v.as_mut().0.push(gate.into());
151    }
152
153    #[ocaml_gen::func]
154    #[ocaml::func]
155    pub fn caml_pasta_fq_plonk_gate_vector_get(
156        v: CamlPastaFqPlonkGateVectorPtr,
157        i: ocaml::Int,
158    ) -> CamlCircuitGate<CamlFq> {
159        let gate = &(v.as_ref().0)[i as usize];
160        gate.into()
161    }
162
163    #[ocaml_gen::func]
164    #[ocaml::func]
165    pub fn caml_pasta_fq_plonk_gate_vector_len(v: CamlPastaFqPlonkGateVectorPtr) -> usize {
166        v.as_ref().0.len()
167    }
168
169    #[ocaml_gen::func]
170    #[ocaml::func]
171    pub fn caml_pasta_fq_plonk_gate_vector_wrap(
172        mut v: CamlPastaFqPlonkGateVectorPtr,
173        t: CamlWire,
174        h: CamlWire,
175    ) {
176        (v.as_mut().0)[t.row as usize].wires[t.col as usize] = h.into();
177    }
178
179    #[ocaml_gen::func]
180    #[ocaml::func]
181    pub fn caml_pasta_fq_plonk_gate_vector_digest(
182        public_input_size: isize,
183        v: CamlPastaFqPlonkGateVectorPtr,
184    ) -> [u8; 32] {
185        Circuit::new(usize::try_from(public_input_size).unwrap(), &v.as_ref().0).digest()
186    }
187
188    #[ocaml_gen::func]
189    #[ocaml::func]
190    pub fn caml_pasta_fq_plonk_circuit_serialize(
191        public_input_size: isize,
192        v: CamlPastaFqPlonkGateVectorPtr,
193    ) -> String {
194        let circuit = Circuit::new(usize::try_from(public_input_size).unwrap(), &v.as_ref().0);
195        serde_json::to_string(&circuit).expect("couldn't serialize constraints")
196    }
197}