kimchi_stubs/
gate_vector.rs1use kimchi::circuits::{
4 gate::{caml::CamlCircuitGate, Circuit, CircuitGate},
5 wires::caml::CamlWire,
6};
7use o1_utils::hasher::CryptoDigest;
8
9pub mod fp {
16 use super::*;
17 use crate::arkworks::CamlFp;
18 use mina_curves::pasta::Fp;
19
20 #[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 #[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 #[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
106pub mod fq {
111 use super::*;
112 use crate::arkworks::CamlFq;
113 use mina_curves::pasta::Fq;
114
115 #[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 #[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}