Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
alu_gadget.hpp
Go to the documentation of this file.
1 
14 #ifndef ALU_GADGET_HPP_
15 #define ALU_GADGET_HPP_
16 
19 
20 namespace libsnark
21 {
22 
23 template<typename FieldT>
24 class ALU_gadget : public tinyram_standard_gadget<FieldT>
25 {
26 private:
27  std::vector<std::shared_ptr<tinyram_standard_gadget<FieldT>>> components;
28 
29 public:
38 
49  const std::string &annotation_prefix = "")
52  , pc(pc)
53  , desval(desval)
54  , arg1val(arg1val)
55  , arg2val(arg2val)
56  , flag(flag)
59  {
60  components.resize(1ul << pb.ap.opcode_width());
61 
62  /* arithmetic */
63  components[tinyram_opcode_AND].reset(new ALU_and_gadget<FieldT>(
64  pb,
66  desval,
67  arg1val,
68  arg2val,
69  flag,
72  FMT(this->annotation_prefix, " AND")));
73 
74  components[tinyram_opcode_OR].reset(new ALU_or_gadget<FieldT>(
75  pb,
77  desval,
78  arg1val,
79  arg2val,
80  flag,
83  FMT(this->annotation_prefix, " OR")));
84 
85  components[tinyram_opcode_XOR].reset(new ALU_xor_gadget<FieldT>(
86  pb,
88  desval,
89  arg1val,
90  arg2val,
91  flag,
94  FMT(this->annotation_prefix, " XOR")));
95 
96  components[tinyram_opcode_NOT].reset(new ALU_not_gadget<FieldT>(
97  pb,
99  desval,
100  arg1val,
101  arg2val,
102  flag,
105  FMT(this->annotation_prefix, " NOT")));
106 
107  components[tinyram_opcode_ADD].reset(new ALU_add_gadget<FieldT>(
108  pb,
110  desval,
111  arg1val,
112  arg2val,
113  flag,
116  FMT(this->annotation_prefix, " ADD")));
117 
118  components[tinyram_opcode_SUB].reset(new ALU_sub_gadget<FieldT>(
119  pb,
121  desval,
122  arg1val,
123  arg2val,
124  flag,
127  FMT(this->annotation_prefix, " SUB")));
128 
129  components[tinyram_opcode_MOV].reset(new ALU_mov_gadget<FieldT>(
130  pb,
132  desval,
133  arg1val,
134  arg2val,
135  flag,
138  FMT(this->annotation_prefix, " MOV")));
139 
140  components[tinyram_opcode_CMOV].reset(new ALU_cmov_gadget<FieldT>(
141  pb,
143  desval,
144  arg1val,
145  arg2val,
146  flag,
149  FMT(this->annotation_prefix, " CMOV")));
150 
151  components[tinyram_opcode_CMPA].reset(new ALU_cmp_gadget<FieldT>(
152  pb,
154  desval,
155  arg1val,
156  arg2val,
157  flag,
164  FMT(this->annotation_prefix, " CMP_unsigned")));
165 
166  components[tinyram_opcode_CMPG].reset(new ALU_cmps_gadget<FieldT>(
167  pb,
169  desval,
170  arg1val,
171  arg2val,
172  flag,
177  FMT(this->annotation_prefix, " CMP_signed")));
178 
179  components[tinyram_opcode_UMULH].reset(new ALU_umul_gadget<FieldT>(
180  pb,
182  desval,
183  arg1val,
184  arg2val,
185  flag,
190  FMT(this->annotation_prefix, " MUL_unsigned")));
191 
192  components[tinyram_opcode_SMULH].reset(new ALU_smul_gadget<FieldT>(
193  pb,
195  desval,
196  arg1val,
197  arg2val,
198  flag,
201  FMT(this->annotation_prefix, " MUL_signed")));
202 
203  components[tinyram_opcode_UDIV].reset(new ALU_divmod_gadget<FieldT>(
204  pb,
206  desval,
207  arg1val,
208  arg2val,
209  flag,
214  FMT(this->annotation_prefix, " DIV")));
215 
216  components[tinyram_opcode_SHR].reset(new ALU_shr_shl_gadget<FieldT>(
217  pb,
219  desval,
220  arg1val,
221  arg2val,
222  flag,
227  FMT(this->annotation_prefix, " SHR_SHL")));
228 
229  /* control flow */
230  components[tinyram_opcode_JMP].reset(new ALU_jmp_gadget<FieldT>(
231  pb,
232  pc,
233  arg2val,
234  flag,
236  FMT(this->annotation_prefix, " JMP")));
237 
238  components[tinyram_opcode_CJMP].reset(new ALU_cjmp_gadget<FieldT>(
239  pb,
240  pc,
241  arg2val,
242  flag,
244  FMT(this->annotation_prefix, " CJMP")));
245 
246  components[tinyram_opcode_CNJMP].reset(new ALU_cnjmp_gadget<FieldT>(
247  pb,
248  pc,
249  arg2val,
250  flag,
252  FMT(this->annotation_prefix, " CNJMP")));
253  }
254 
256 
257  void generate_r1cs_witness();
258 };
259 
260 } // namespace libsnark
261 
263 
264 #endif // ALU_GADGET_HPP_
libsnark::ALU_cmov_gadget
Definition: alu_arithmetic.hpp:428
libsnark::tinyram_opcode_SHL
@ tinyram_opcode_SHL
Definition: tinyram_aux.hpp:38
libsnark::ALU_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::ALU_gadget::instruction_results
pb_variable_array< FieldT > instruction_results
Definition: alu_gadget.hpp:36
libsnark::gadget::annotation_prefix
const std::string annotation_prefix
Definition: gadget.hpp:20
libsnark::tinyram_opcode_JMP
@ tinyram_opcode_JMP
Definition: tinyram_aux.hpp:50
libsnark::ALU_cmps_gadget
Definition: alu_arithmetic.hpp:526
libsnark
Definition: accumulation_vector.hpp:18
libsnark::tinyram_opcode_CMPA
@ tinyram_opcode_CMPA
Definition: tinyram_aux.hpp:42
libsnark::ALU_jmp_gadget
Definition: alu_control_flow.hpp:49
libsnark::tinyram_opcode_UMOD
@ tinyram_opcode_UMOD
Definition: tinyram_aux.hpp:37
libsnark::tinyram_opcode_CMPE
@ tinyram_opcode_CMPE
Definition: tinyram_aux.hpp:41
libsnark::tinyram_opcode_CMPGE
@ tinyram_opcode_CMPGE
Definition: tinyram_aux.hpp:45
libsnark::tinyram_opcode_MOV
@ tinyram_opcode_MOV
Definition: tinyram_aux.hpp:47
alu_arithmetic.hpp
libsnark::tinyram_opcode_CMOV
@ tinyram_opcode_CMOV
Definition: tinyram_aux.hpp:48
libsnark::ALU_cjmp_gadget
Definition: alu_control_flow.hpp:71
libsnark::tinyram_opcode_SUB
@ tinyram_opcode_SUB
Definition: tinyram_aux.hpp:32
libsnark::tinyram_opcode_UMULH
@ tinyram_opcode_UMULH
Definition: tinyram_aux.hpp:34
libsnark::tinyram_opcode_SMULH
@ tinyram_opcode_SMULH
Definition: tinyram_aux.hpp:35
libsnark::tinyram_opcode_AND
@ tinyram_opcode_AND
Definition: tinyram_aux.hpp:27
libsnark::tinyram_opcode_MULL
@ tinyram_opcode_MULL
Definition: tinyram_aux.hpp:33
libsnark::ALU_gadget::opcode_indicators
pb_variable_array< FieldT > opcode_indicators
Definition: alu_gadget.hpp:30
libsnark::ALU_and_gadget
Definition: alu_arithmetic.hpp:60
libsnark::tinyram_opcode_SHR
@ tinyram_opcode_SHR
Definition: tinyram_aux.hpp:39
libsnark::ALU_cmp_gadget
Definition: alu_arithmetic.hpp:461
libsnark::ALU_shr_shl_gadget
Definition: alu_arithmetic.hpp:857
libsnark::tinyram_opcode_XOR
@ tinyram_opcode_XOR
Definition: tinyram_aux.hpp:29
libsnark::tinyram_opcode_CMPAE
@ tinyram_opcode_CMPAE
Definition: tinyram_aux.hpp:43
libsnark::tinyram_opcode_CNJMP
@ tinyram_opcode_CNJMP
Definition: tinyram_aux.hpp:52
libsnark::tinyram_opcode_NOT
@ tinyram_opcode_NOT
Definition: tinyram_aux.hpp:30
libsnark::ALU_not_gadget
Definition: alu_arithmetic.hpp:222
libsnark::ALU_gadget::arg1val
word_variable_gadget< FieldT > arg1val
Definition: alu_gadget.hpp:33
libsnark::ALU_mov_gadget
Definition: alu_arithmetic.hpp:395
libsnark::ALU_gadget::desval
word_variable_gadget< FieldT > desval
Definition: alu_gadget.hpp:32
libsnark::tinyram_opcode_CMPG
@ tinyram_opcode_CMPG
Definition: tinyram_aux.hpp:44
alu_control_flow.hpp
alu_gadget.tcc
libsnark::tinyram_gadget::pb
tinyram_protoboard< FieldT > & pb
Definition: tinyram_protoboard.hpp:34
libsnark::ALU_or_gadget
Definition: alu_arithmetic.hpp:114
libsnark::tinyram_protoboard
Definition: tinyram_protoboard.hpp:23
libsnark::pb_variable
Definition: pb_variable.hpp:24
libsnark::pb_variable_array
Definition: pb_variable.hpp:44
libsnark::ALU_divmod_gadget
Definition: alu_arithmetic.hpp:784
libsnark::ALU_xor_gadget
Definition: alu_arithmetic.hpp:168
libsnark::tinyram_standard_gadget
Definition: tinyram_protoboard.hpp:45
libsnark::ALU_gadget::arg2val
word_variable_gadget< FieldT > arg2val
Definition: alu_gadget.hpp:34
libsnark::word_variable_gadget
Definition: word_variable_gadget.hpp:24
libsnark::tinyram_opcode_CJMP
@ tinyram_opcode_CJMP
Definition: tinyram_aux.hpp:51
libsnark::ALU_smul_gadget
Definition: alu_arithmetic.hpp:701
libsnark::ALU_gadget
Definition: alu_gadget.hpp:24
libsnark::ALU_add_gadget
Definition: alu_arithmetic.hpp:277
libsnark::ALU_sub_gadget
Definition: alu_arithmetic.hpp:334
libsnark::ALU_umul_gadget
Definition: alu_arithmetic.hpp:619
libsnark::ALU_gadget::instruction_flags
pb_variable_array< FieldT > instruction_flags
Definition: alu_gadget.hpp:37
libsnark::ALU_gadget::flag
pb_variable< FieldT > flag
Definition: alu_gadget.hpp:35
libsnark::tinyram_opcode_UDIV
@ tinyram_opcode_UDIV
Definition: tinyram_aux.hpp:36
libsnark::tinyram_opcode_ADD
@ tinyram_opcode_ADD
Definition: tinyram_aux.hpp:31
libsnark::ALU_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::ALU_cnjmp_gadget
Definition: alu_control_flow.hpp:93
libsnark::ALU_gadget::pc
word_variable_gadget< FieldT > pc
Definition: alu_gadget.hpp:31
libsnark::tinyram_opcode_OR
@ tinyram_opcode_OR
Definition: tinyram_aux.hpp:28