Clearmatics Libsnark
0.1
C++ library for zkSNARK proofs
libsnark
gadgetlib1
gadgets
cpu_checkers
tinyram
components
alu_gadget.hpp
Go to the documentation of this file.
1
14
#ifndef ALU_GADGET_HPP_
15
#define ALU_GADGET_HPP_
16
17
#include <
libsnark/gadgetlib1/gadgets/cpu_checkers/tinyram/components/alu_arithmetic.hpp
>
18
#include <
libsnark/gadgetlib1/gadgets/cpu_checkers/tinyram/components/alu_control_flow.hpp
>
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
:
30
pb_variable_array<FieldT>
opcode_indicators
;
31
word_variable_gadget<FieldT>
pc
;
32
word_variable_gadget<FieldT>
desval
;
33
word_variable_gadget<FieldT>
arg1val
;
34
word_variable_gadget<FieldT>
arg2val
;
35
pb_variable<FieldT>
flag
;
36
pb_variable_array<FieldT>
instruction_results
;
37
pb_variable_array<FieldT>
instruction_flags
;
38
39
ALU_gadget<FieldT>
(
40
tinyram_protoboard<FieldT>
&
pb
,
41
const
pb_variable_array<FieldT>
&
opcode_indicators
,
42
const
word_variable_gadget<FieldT>
&
pc
,
43
const
word_variable_gadget<FieldT>
&
desval
,
44
const
word_variable_gadget<FieldT>
&
arg1val
,
45
const
word_variable_gadget<FieldT>
&
arg2val
,
46
const
pb_variable<FieldT>
&
flag
,
47
const
pb_variable_array<FieldT>
&
instruction_results
,
48
const
pb_variable_array<FieldT>
&
instruction_flags
,
49
const
std::string &
annotation_prefix
=
""
)
50
:
tinyram_standard_gadget
<FieldT>(
pb
,
annotation_prefix
)
51
,
opcode_indicators
(
opcode_indicators
)
52
,
pc
(
pc
)
53
,
desval
(
desval
)
54
,
arg1val
(
arg1val
)
55
,
arg2val
(
arg2val
)
56
,
flag
(
flag
)
57
,
instruction_results
(
instruction_results
)
58
,
instruction_flags
(
instruction_flags
)
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
,
65
opcode_indicators
,
66
desval
,
67
arg1val
,
68
arg2val
,
69
flag
,
70
instruction_results
[
tinyram_opcode_AND
],
71
instruction_flags
[
tinyram_opcode_AND
],
72
FMT(this->
annotation_prefix
,
" AND"
)));
73
74
components[
tinyram_opcode_OR
].reset(
new
ALU_or_gadget<FieldT>
(
75
pb
,
76
opcode_indicators
,
77
desval
,
78
arg1val
,
79
arg2val
,
80
flag
,
81
instruction_results
[
tinyram_opcode_OR
],
82
instruction_flags
[
tinyram_opcode_OR
],
83
FMT(this->
annotation_prefix
,
" OR"
)));
84
85
components[
tinyram_opcode_XOR
].reset(
new
ALU_xor_gadget<FieldT>
(
86
pb
,
87
opcode_indicators
,
88
desval
,
89
arg1val
,
90
arg2val
,
91
flag
,
92
instruction_results
[
tinyram_opcode_XOR
],
93
instruction_flags
[
tinyram_opcode_XOR
],
94
FMT(this->
annotation_prefix
,
" XOR"
)));
95
96
components[
tinyram_opcode_NOT
].reset(
new
ALU_not_gadget<FieldT>
(
97
pb
,
98
opcode_indicators
,
99
desval
,
100
arg1val
,
101
arg2val
,
102
flag
,
103
instruction_results
[
tinyram_opcode_NOT
],
104
instruction_flags
[
tinyram_opcode_NOT
],
105
FMT(this->
annotation_prefix
,
" NOT"
)));
106
107
components[
tinyram_opcode_ADD
].reset(
new
ALU_add_gadget<FieldT>
(
108
pb
,
109
opcode_indicators
,
110
desval
,
111
arg1val
,
112
arg2val
,
113
flag
,
114
instruction_results
[
tinyram_opcode_ADD
],
115
instruction_flags
[
tinyram_opcode_ADD
],
116
FMT(this->
annotation_prefix
,
" ADD"
)));
117
118
components[
tinyram_opcode_SUB
].reset(
new
ALU_sub_gadget<FieldT>
(
119
pb
,
120
opcode_indicators
,
121
desval
,
122
arg1val
,
123
arg2val
,
124
flag
,
125
instruction_results
[
tinyram_opcode_SUB
],
126
instruction_flags
[
tinyram_opcode_SUB
],
127
FMT(this->
annotation_prefix
,
" SUB"
)));
128
129
components[
tinyram_opcode_MOV
].reset(
new
ALU_mov_gadget<FieldT>
(
130
pb
,
131
opcode_indicators
,
132
desval
,
133
arg1val
,
134
arg2val
,
135
flag
,
136
instruction_results
[
tinyram_opcode_MOV
],
137
instruction_flags
[
tinyram_opcode_MOV
],
138
FMT(this->
annotation_prefix
,
" MOV"
)));
139
140
components[
tinyram_opcode_CMOV
].reset(
new
ALU_cmov_gadget<FieldT>
(
141
pb
,
142
opcode_indicators
,
143
desval
,
144
arg1val
,
145
arg2val
,
146
flag
,
147
instruction_results
[
tinyram_opcode_CMOV
],
148
instruction_flags
[
tinyram_opcode_CMOV
],
149
FMT(this->
annotation_prefix
,
" CMOV"
)));
150
151
components[
tinyram_opcode_CMPA
].reset(
new
ALU_cmp_gadget<FieldT>
(
152
pb
,
153
opcode_indicators
,
154
desval
,
155
arg1val
,
156
arg2val
,
157
flag
,
158
instruction_results
[
tinyram_opcode_CMPE
],
159
instruction_flags
[
tinyram_opcode_CMPE
],
160
instruction_results
[
tinyram_opcode_CMPA
],
161
instruction_flags
[
tinyram_opcode_CMPA
],
162
instruction_results
[
tinyram_opcode_CMPAE
],
163
instruction_flags
[
tinyram_opcode_CMPAE
],
164
FMT(this->
annotation_prefix
,
" CMP_unsigned"
)));
165
166
components[
tinyram_opcode_CMPG
].reset(
new
ALU_cmps_gadget<FieldT>
(
167
pb
,
168
opcode_indicators
,
169
desval
,
170
arg1val
,
171
arg2val
,
172
flag
,
173
instruction_results
[
tinyram_opcode_CMPG
],
174
instruction_flags
[
tinyram_opcode_CMPG
],
175
instruction_results
[
tinyram_opcode_CMPGE
],
176
instruction_flags
[
tinyram_opcode_CMPGE
],
177
FMT(this->
annotation_prefix
,
" CMP_signed"
)));
178
179
components[
tinyram_opcode_UMULH
].reset(
new
ALU_umul_gadget<FieldT>
(
180
pb
,
181
opcode_indicators
,
182
desval
,
183
arg1val
,
184
arg2val
,
185
flag
,
186
instruction_results
[
tinyram_opcode_MULL
],
187
instruction_flags
[
tinyram_opcode_MULL
],
188
instruction_results
[
tinyram_opcode_UMULH
],
189
instruction_flags
[
tinyram_opcode_UMULH
],
190
FMT(this->
annotation_prefix
,
" MUL_unsigned"
)));
191
192
components[
tinyram_opcode_SMULH
].reset(
new
ALU_smul_gadget<FieldT>
(
193
pb
,
194
opcode_indicators
,
195
desval
,
196
arg1val
,
197
arg2val
,
198
flag
,
199
instruction_results
[
tinyram_opcode_SMULH
],
200
instruction_flags
[
tinyram_opcode_SMULH
],
201
FMT(this->
annotation_prefix
,
" MUL_signed"
)));
202
203
components[
tinyram_opcode_UDIV
].reset(
new
ALU_divmod_gadget<FieldT>
(
204
pb
,
205
opcode_indicators
,
206
desval
,
207
arg1val
,
208
arg2val
,
209
flag
,
210
instruction_results
[
tinyram_opcode_UDIV
],
211
instruction_flags
[
tinyram_opcode_UDIV
],
212
instruction_results
[
tinyram_opcode_UMOD
],
213
instruction_flags
[
tinyram_opcode_UMOD
],
214
FMT(this->
annotation_prefix
,
" DIV"
)));
215
216
components[
tinyram_opcode_SHR
].reset(
new
ALU_shr_shl_gadget<FieldT>
(
217
pb
,
218
opcode_indicators
,
219
desval
,
220
arg1val
,
221
arg2val
,
222
flag
,
223
instruction_results
[
tinyram_opcode_SHR
],
224
instruction_flags
[
tinyram_opcode_SHR
],
225
instruction_results
[
tinyram_opcode_SHL
],
226
instruction_flags
[
tinyram_opcode_SHL
],
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
,
235
instruction_results
[
tinyram_opcode_JMP
],
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
,
243
instruction_results
[
tinyram_opcode_CJMP
],
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
,
251
instruction_results
[
tinyram_opcode_CNJMP
],
252
FMT(this->
annotation_prefix
,
" CNJMP"
)));
253
}
254
255
void
generate_r1cs_constraints
();
256
257
void
generate_r1cs_witness
();
258
};
259
260
}
// namespace libsnark
261
262
#include <
libsnark/gadgetlib1/gadgets/cpu_checkers/tinyram/components/alu_gadget.tcc
>
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
Generated on Wed Jan 25 2023 11:05:57 for Clearmatics Libsnark by
1.8.17