1use num::BigInt;
2
3use crate::{API, VariableIniter, variable::CircuitVariable};
4
5pub trait Circuit {
11 fn define(&self, api: &mut impl API);
12}
13
14pub trait CircuitWitness: CircuitPublicWitness {
20 #[doc(hidden)]
21 type PrivateElement;
22 #[doc(hidden)]
23 type PublicElement;
24
25 type PublicWitness: CircuitPublicWitness;
27
28 #[doc(hidden)]
29 fn create_public(initer: &mut VariableIniter, is_private: bool) -> Self::PublicElement;
30
31 #[doc(hidden)]
32 fn create_private(initer: &mut VariableIniter) -> Self::PrivateElement;
33
34 fn into_public_witness(self) -> Self::PublicWitness;
42
43 #[doc(hidden)]
44 fn append_witness(&self, public: &mut Vec<BigInt>, private: &mut Vec<BigInt>, is_private: bool);
45}
46
47pub trait CircuitPublicWitness {
53 fn append_public_witness(&self, witness: &mut Vec<BigInt>, is_private: bool);
54}
55
56#[doc(hidden)]
57pub type PrivateCircuitElement<T> = <T as CircuitWitness>::PrivateElement;
58#[doc(hidden)]
59pub type PublicCircuitElement<T> = <T as CircuitWitness>::PublicElement;
60
61pub type CircuitDefine<T> = <T as CircuitWitness>::PrivateElement;
66
67pub type PublicWitness<T> = <T as CircuitWitness>::PublicWitness;
72
73macro_rules! define_circuit_element_for_from_u256 {
74 ($t:ty) => {
75 impl CircuitWitness for $t {
76 type PrivateElement = CircuitVariable;
77 type PublicElement = CircuitVariable;
78 type PublicWitness = $t;
79
80 fn create_public(initer: &mut VariableIniter, is_private: bool) -> Self::PublicElement {
81 initer.new_public(is_private)
82 }
83
84 fn create_private(initer: &mut VariableIniter) -> Self::PrivateElement {
85 initer.new_private()
86 }
87
88 fn append_witness(
89 &self,
90 public: &mut Vec<BigInt>,
91 private: &mut Vec<BigInt>,
92 is_private: bool,
93 ) {
94 let x = BigInt::from(*self);
95 if is_private {
96 private.push(x);
97 } else {
98 public.push(x);
99 }
100 }
101
102 fn into_public_witness(self) -> Self::PublicWitness {
103 self
104 }
105 }
106
107 impl CircuitPublicWitness for $t {
108 fn append_public_witness(&self, witness: &mut Vec<BigInt>, is_private: bool) {
109 let x = BigInt::from(*self);
110 if !is_private {
111 witness.push(x);
112 }
113 }
114 }
115 };
116}
117
118define_circuit_element_for_from_u256!(u128);
119define_circuit_element_for_from_u256!(u64);
120define_circuit_element_for_from_u256!(u32);
121define_circuit_element_for_from_u256!(u16);
122define_circuit_element_for_from_u256!(u8);
123define_circuit_element_for_from_u256!(i128);
124define_circuit_element_for_from_u256!(i64);
125define_circuit_element_for_from_u256!(i32);
126define_circuit_element_for_from_u256!(i16);
127define_circuit_element_for_from_u256!(i8);
128define_circuit_element_for_from_u256!(bool);