Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
instruction_spec.cpp
Go to the documentation of this file.
2
5
6#include <array>
7
8namespace bb::avm2 {
9
10namespace {
11
12// This structure is code-generated (but manually set) by the test:
13// DecompositionSelectors.CodeGen (op_decomposition.test.cpp)
15 { WireOpCode::ADD_8, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
16 { WireOpCode::ADD_16, { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
17 { WireOpCode::SUB_8, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
18 { WireOpCode::SUB_16, { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
19 { WireOpCode::MUL_8, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
20 { WireOpCode::MUL_16, { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
21 { WireOpCode::DIV_8, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
22 { WireOpCode::DIV_16, { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
23 { WireOpCode::FDIV_8, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
24 { WireOpCode::FDIV_16, { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
25 { WireOpCode::EQ_8, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
26 { WireOpCode::EQ_16, { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
27 { WireOpCode::LT_8, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
28 { WireOpCode::LT_16, { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
29 { WireOpCode::LTE_8, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
30 { WireOpCode::LTE_16, { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
31 { WireOpCode::AND_8, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
32 { WireOpCode::AND_16, { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
33 { WireOpCode::OR_8, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
34 { WireOpCode::OR_16, { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
35 { WireOpCode::XOR_8, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
36 { WireOpCode::XOR_16, { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
37 { WireOpCode::NOT_8, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
38 { WireOpCode::NOT_16, { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
39 { WireOpCode::SHL_8, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
40 { WireOpCode::SHL_16, { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
41 { WireOpCode::SHR_8, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
42 { WireOpCode::SHR_16, { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
43 { WireOpCode::CAST_8, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
44 { WireOpCode::CAST_16, { 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
45 { WireOpCode::GETENVVAR_16, { 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 } },
46 { WireOpCode::CALLDATACOPY, { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
47 { WireOpCode::SUCCESSCOPY, { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
48 { WireOpCode::RETURNDATASIZE, { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
49 { WireOpCode::RETURNDATACOPY, { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
50 { WireOpCode::JUMP_32, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 } },
51 { WireOpCode::JUMPI_32, { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } },
52 { WireOpCode::INTERNALCALL, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 } },
53 { WireOpCode::INTERNALRETURN, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
54 { WireOpCode::SET_8, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
55 { WireOpCode::SET_16, { 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0 } },
56 { WireOpCode::SET_32, { 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 } },
57 { WireOpCode::SET_64, { 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0 } },
58 { WireOpCode::SET_128, { 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0 } },
59 { WireOpCode::SET_FF, { 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0 } },
60 { WireOpCode::MOV_8, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
61 { WireOpCode::MOV_16, { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
62 { WireOpCode::SLOAD, { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
63 { WireOpCode::SSTORE, { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
64 { WireOpCode::NOTEHASHEXISTS, { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
65 { WireOpCode::EMITNOTEHASH, { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
66 { WireOpCode::NULLIFIEREXISTS, { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
67 { WireOpCode::EMITNULLIFIER, { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
68 { WireOpCode::L1TOL2MSGEXISTS, { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
69 { WireOpCode::GETCONTRACTINSTANCE, { 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
70 { WireOpCode::EMITUNENCRYPTEDLOG, { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
71 { WireOpCode::SENDL2TOL1MSG, { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
72 { WireOpCode::CALL, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
73 { WireOpCode::STATICCALL, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
74 { WireOpCode::RETURN, { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
75 { WireOpCode::REVERT_8, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
76 { WireOpCode::REVERT_16, { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
77 { WireOpCode::DEBUGLOG, { 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
78 { WireOpCode::POSEIDON2PERM, { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
79 { WireOpCode::SHA256COMPRESSION, { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
80 { WireOpCode::KECCAKF1600, { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
81 { WireOpCode::ECADD, { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
82 { WireOpCode::TORADIXBE, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
83};
84
85} // namespace
86
89 { .exec_opcode = ExecutionOpCode::ADD,
90 .size_in_bytes = 5,
91 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::ADD_8) } },
93 { .exec_opcode = ExecutionOpCode::ADD,
94 .size_in_bytes = 8,
95 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::ADD_16) } },
97 { .exec_opcode = ExecutionOpCode::SUB,
98 .size_in_bytes = 5,
99 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::SUB_8) } },
101 { .exec_opcode = ExecutionOpCode::SUB,
102 .size_in_bytes = 8,
103 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::SUB_16) } },
105 { .exec_opcode = ExecutionOpCode::MUL,
106 .size_in_bytes = 5,
107 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::MUL_8) } },
109 { .exec_opcode = ExecutionOpCode::MUL,
110 .size_in_bytes = 8,
111 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::MUL_16) } },
113 { .exec_opcode = ExecutionOpCode::DIV,
114 .size_in_bytes = 5,
115 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::DIV_8) } },
117 { .exec_opcode = ExecutionOpCode::DIV,
118 .size_in_bytes = 8,
119 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::DIV_16) } },
121 { .exec_opcode = ExecutionOpCode::FDIV,
122 .size_in_bytes = 5,
123 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::FDIV_8) } },
125 { .exec_opcode = ExecutionOpCode::FDIV,
126 .size_in_bytes = 8,
127 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::FDIV_16) } },
129 { .exec_opcode = ExecutionOpCode::EQ,
130 .size_in_bytes = 5,
131 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::EQ_8) } },
133 { .exec_opcode = ExecutionOpCode::EQ,
134 .size_in_bytes = 8,
135 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::EQ_16) } },
137 { .exec_opcode = ExecutionOpCode::LT,
138 .size_in_bytes = 5,
139 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::LT_8) } },
141 { .exec_opcode = ExecutionOpCode::LT,
142 .size_in_bytes = 8,
143 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::LT_16) } },
145 { .exec_opcode = ExecutionOpCode::LTE,
146 .size_in_bytes = 5,
147 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::LTE_8) } },
149 { .exec_opcode = ExecutionOpCode::LTE,
150 .size_in_bytes = 8,
151 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::LTE_16) } },
153 { .exec_opcode = ExecutionOpCode::AND,
154 .size_in_bytes = 5,
155 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::AND_8) } },
157 { .exec_opcode = ExecutionOpCode::AND,
158 .size_in_bytes = 8,
159 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::AND_16) } },
161 { .exec_opcode = ExecutionOpCode::OR,
162 .size_in_bytes = 5,
163 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::OR_8) } },
165 { .exec_opcode = ExecutionOpCode::OR,
166 .size_in_bytes = 8,
167 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::OR_16) } },
169 { .exec_opcode = ExecutionOpCode::XOR,
170 .size_in_bytes = 5,
171 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::XOR_8) } },
173 { .exec_opcode = ExecutionOpCode::XOR,
174 .size_in_bytes = 8,
175 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::XOR_16) } },
177 { .exec_opcode = ExecutionOpCode::NOT,
178 .size_in_bytes = 4,
179 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::NOT_8) } },
181 { .exec_opcode = ExecutionOpCode::NOT,
182 .size_in_bytes = 6,
183 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::NOT_16) } },
185 { .exec_opcode = ExecutionOpCode::SHL,
186 .size_in_bytes = 5,
187 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::SHL_8) } },
189 { .exec_opcode = ExecutionOpCode::SHL,
190 .size_in_bytes = 8,
191 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::SHL_16) } },
193 { .exec_opcode = ExecutionOpCode::SHR,
194 .size_in_bytes = 5,
195 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::SHR_8) } },
197 { .exec_opcode = ExecutionOpCode::SHR,
198 .size_in_bytes = 8,
199 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::SHR_16) } },
201 {
202 .exec_opcode = ExecutionOpCode::CAST,
203 .size_in_bytes = 5,
204 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::CAST_8),
205 .tag_operand_idx = 3, // op3
206 } },
208 {
209 .exec_opcode = ExecutionOpCode::CAST,
210 .size_in_bytes = 7,
211 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::CAST_16),
212 .tag_operand_idx = 3, // op3
213 } },
215 { .exec_opcode = ExecutionOpCode::GETENVVAR,
216 .size_in_bytes = 5,
217 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::GETENVVAR_16) } },
219 { .exec_opcode = ExecutionOpCode::CALLDATACOPY,
220 .size_in_bytes = 8,
221 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::CALLDATACOPY) } },
223 { .exec_opcode = ExecutionOpCode::SUCCESSCOPY,
224 .size_in_bytes = 4,
225 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::SUCCESSCOPY) } },
227 { .exec_opcode = ExecutionOpCode::RETURNDATASIZE,
228 .size_in_bytes = 4,
229 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::RETURNDATASIZE) } },
231 { .exec_opcode = ExecutionOpCode::RETURNDATACOPY,
232 .size_in_bytes = 8,
233 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::RETURNDATACOPY) } },
235 { .exec_opcode = ExecutionOpCode::JUMP,
236 .size_in_bytes = 5,
237 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::JUMP_32) } },
239 { .exec_opcode = ExecutionOpCode::JUMPI,
240 .size_in_bytes = 8,
241 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::JUMPI_32) } },
243 { .exec_opcode = ExecutionOpCode::INTERNALCALL,
244 .size_in_bytes = 5,
245 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::INTERNALCALL) } },
247 { .exec_opcode = ExecutionOpCode::INTERNALRETURN,
248 .size_in_bytes = 1,
249 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::INTERNALRETURN) } },
251 {
252 .exec_opcode = ExecutionOpCode::SET,
253 .size_in_bytes = 5,
254 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::SET_8),
255 .tag_operand_idx = 2, // op2
256 } },
258 {
259 .exec_opcode = ExecutionOpCode::SET,
260 .size_in_bytes = 7,
261 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::SET_16),
262 .tag_operand_idx = 2, // op2
263 } },
265 {
266 .exec_opcode = ExecutionOpCode::SET,
267 .size_in_bytes = 9,
268 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::SET_32),
269 .tag_operand_idx = 2, // op2
270 } },
272 {
273 .exec_opcode = ExecutionOpCode::SET,
274 .size_in_bytes = 13,
275 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::SET_64),
276 .tag_operand_idx = 2, // op2
277 } },
279 {
280 .exec_opcode = ExecutionOpCode::SET,
281 .size_in_bytes = 21,
282 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::SET_128),
283 .tag_operand_idx = 2, // op2
284 } },
286 {
287 .exec_opcode = ExecutionOpCode::SET,
288 .size_in_bytes = 37,
289 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::SET_FF),
290 .tag_operand_idx = 2, // op2
291 } },
293 { .exec_opcode = ExecutionOpCode::MOV,
294 .size_in_bytes = 4,
295 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::MOV_8) } },
297 { .exec_opcode = ExecutionOpCode::MOV,
298 .size_in_bytes = 6,
299 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::MOV_16) } },
301 { .exec_opcode = ExecutionOpCode::SLOAD,
302 .size_in_bytes = 6,
303 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::SLOAD) } },
305 { .exec_opcode = ExecutionOpCode::SSTORE,
306 .size_in_bytes = 6,
307 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::SSTORE) } },
309 { .exec_opcode = ExecutionOpCode::NOTEHASHEXISTS,
310 .size_in_bytes = 8,
311 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::NOTEHASHEXISTS) } },
313 { .exec_opcode = ExecutionOpCode::EMITNOTEHASH,
314 .size_in_bytes = 4,
315 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::EMITNOTEHASH) } },
317 { .exec_opcode = ExecutionOpCode::NULLIFIEREXISTS,
318 .size_in_bytes = 8,
319 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::NULLIFIEREXISTS) } },
321 { .exec_opcode = ExecutionOpCode::EMITNULLIFIER,
322 .size_in_bytes = 4,
323 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::EMITNULLIFIER) } },
325 { .exec_opcode = ExecutionOpCode::L1TOL2MSGEXISTS,
326 .size_in_bytes = 8,
327 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::L1TOL2MSGEXISTS) } },
330 .size_in_bytes = 7,
331 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::GETCONTRACTINSTANCE) } },
334 .size_in_bytes = 6,
335 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::EMITUNENCRYPTEDLOG) } },
337 { .exec_opcode = ExecutionOpCode::SENDL2TOL1MSG,
338 .size_in_bytes = 6,
339 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::SENDL2TOL1MSG) } },
341 { .exec_opcode = ExecutionOpCode::CALL,
342 .size_in_bytes = 13,
343 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::CALL) } },
345 { .exec_opcode = ExecutionOpCode::STATICCALL,
346 .size_in_bytes = 13,
347 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::STATICCALL) } },
349 { .exec_opcode = ExecutionOpCode::RETURN,
350 .size_in_bytes = 6,
351 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::RETURN) } },
353 { .exec_opcode = ExecutionOpCode::REVERT,
354 .size_in_bytes = 4,
355 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::REVERT_8) } },
357 { .exec_opcode = ExecutionOpCode::REVERT,
358 .size_in_bytes = 6,
359 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::REVERT_16) } },
361 { .exec_opcode = ExecutionOpCode::DEBUGLOG,
362 .size_in_bytes = 10,
363 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::DEBUGLOG) } },
365 { .exec_opcode = ExecutionOpCode::POSEIDON2PERM,
366 .size_in_bytes = 6,
367 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::POSEIDON2PERM) } },
369 { .exec_opcode = ExecutionOpCode::SHA256COMPRESSION,
370 .size_in_bytes = 8,
371 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::SHA256COMPRESSION) } },
373 { .exec_opcode = ExecutionOpCode::KECCAKF1600,
374 .size_in_bytes = 6,
375 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::KECCAKF1600) } },
377 { .exec_opcode = ExecutionOpCode::ECADD,
378 .size_in_bytes = 17,
379 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::ECADD) } },
381 { .exec_opcode = ExecutionOpCode::TORADIXBE,
382 .size_in_bytes = 13,
383 .op_dc_selectors = WireOpCode_DC_SELECTORS.at(WireOpCode::TORADIXBE) } },
384};
385
387
389{
390 inputs.push_back(tag);
391 return *this;
392}
393
395{
396 inputs.insert(inputs.end(), tags.begin(), tags.end());
397 return *this;
398}
399
401{
402 has_output = true;
403 return *this;
404}
405
406bool RegisterInfo::is_active(size_t index) const
407{
408 return index < total_registers();
409}
410
411bool RegisterInfo::is_write(size_t index) const
412{
413 return index >= inputs.size() && index < total_registers();
414}
415
416bool RegisterInfo::need_tag_check(size_t index) const
417{
418 return index < inputs.size() && inputs.at(index).has_value();
419}
420
422{
423 return index < inputs.size() ? inputs.at(index) : std::nullopt;
424}
425
428 { .num_addresses = 3,
429 .gas_cost = { .opcode_gas = AVM_ADD_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
430 .register_info = RegisterInfo()
432 /*b*/ RegisterInfo::ANY_TAG })
433 .add_output(/*c*/) } },
435 { .num_addresses = 3,
436 .gas_cost = { .opcode_gas = AVM_SUB_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
437 .register_info = RegisterInfo()
439 /*b*/ RegisterInfo::ANY_TAG })
440 .add_output(/*c*/) } },
442 { .num_addresses = 3,
443 .gas_cost = { .opcode_gas = AVM_MUL_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
444 .register_info = RegisterInfo()
446 /*b*/ RegisterInfo::ANY_TAG })
447 .add_output(/*c*/) } },
449 { .num_addresses = 3,
450 .gas_cost = { .opcode_gas = AVM_DIV_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
451 .register_info = RegisterInfo()
453 /*b*/ RegisterInfo::ANY_TAG })
454 .add_output(/*c*/) } },
456 { .num_addresses = 3,
457 .gas_cost = { .opcode_gas = AVM_FDIV_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
458 .register_info = RegisterInfo()
459 .add_inputs({ /*a*/ ValueTag::FF,
460 /*b*/ ValueTag::FF })
461 .add_output(/*c*/) } },
463 { .num_addresses = 3,
464 .gas_cost = { .opcode_gas = AVM_EQ_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
465 .register_info = RegisterInfo()
467 /*b*/ RegisterInfo::ANY_TAG })
468 .add_output(/*c*/) } },
470 { .num_addresses = 3,
471 .gas_cost = { .opcode_gas = AVM_LT_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
472 .register_info = RegisterInfo()
474 /*b*/ RegisterInfo::ANY_TAG })
475 .add_output(/*c*/) } },
477 { .num_addresses = 3,
478 .gas_cost = { .opcode_gas = AVM_LTE_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
479 .register_info = RegisterInfo()
481 /*b*/ RegisterInfo::ANY_TAG })
482 .add_output(/*c*/) } },
484 { .num_addresses = 2,
485 .gas_cost = { .opcode_gas = AVM_NOT_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
486 .register_info = RegisterInfo().add_inputs({ /*a*/ RegisterInfo::ANY_TAG }).add_output(/*b*/) } },
488 { .num_addresses = 3,
489 .gas_cost = { .opcode_gas = AVM_SHL_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
490 .register_info = RegisterInfo()
492 /*b*/ RegisterInfo::ANY_TAG })
493 .add_output(/*c*/) } },
495 { .num_addresses = 3,
496 .gas_cost = { .opcode_gas = AVM_SHR_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
497 .register_info = RegisterInfo()
499 /*b*/ RegisterInfo::ANY_TAG })
500 .add_output(/*c*/) } },
502 { .num_addresses = 2,
503 .gas_cost = { .opcode_gas = AVM_CAST_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
504 .register_info = RegisterInfo().add_input(/*a*/ RegisterInfo::ANY_TAG).add_output(/*c*/) } },
506 { .num_addresses = 1,
507 .gas_cost = { .opcode_gas = AVM_GETENVVAR_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
508 .register_info = RegisterInfo().add_output(/*dst*/) } },
510 { .num_addresses = 1,
511 .gas_cost = { .opcode_gas = AVM_SET_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
512 .register_info = RegisterInfo().add_output(/*dst*/) } },
514 { .num_addresses = 2,
515 .gas_cost = { .opcode_gas = AVM_MOV_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
516 .register_info = RegisterInfo().add_input(/*src*/).add_output(/*dst*/) } },
518 { .num_addresses = 5,
519 .gas_cost = { .opcode_gas = AVM_CALL_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
520 .register_info = RegisterInfo().add_inputs({ /*l2_gas*/ ValueTag::U32,
521 /*da_gas*/ ValueTag::U32,
522 /*contract_address*/ ValueTag::FF,
523 /*cd_size*/ ValueTag::U32 }) } },
525 { .num_addresses = 5,
526 .gas_cost = { .opcode_gas = AVM_STATICCALL_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
527 .register_info = RegisterInfo().add_inputs({ /*l2_gas*/ ValueTag::U32,
528 /*da_gas*/ ValueTag::U32,
529 /*contract_address*/ ValueTag::FF,
530 /*cd_size*/ ValueTag::U32 }) } },
531
533 { .num_addresses = 2,
534 .gas_cost = { .opcode_gas = AVM_RETURN_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
535 .register_info = RegisterInfo().add_input(/*rd_size*/ ValueTag::U32) } },
537 { .num_addresses = 0,
538 .gas_cost = { .opcode_gas = AVM_JUMP_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 } } },
540 { .num_addresses = 1,
541 .gas_cost = { .opcode_gas = AVM_JUMPI_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
542 .register_info = RegisterInfo().add_input(/*cond*/ ValueTag::U1) } },
544 { .num_addresses = 3,
545 .gas_cost = { .opcode_gas = AVM_CALLDATACOPY_BASE_L2_GAS,
546 .base_da = 0,
548 .dyn_da = 0 },
549 .dyn_gas_id = AVM_DYN_GAS_ID_CALLDATACOPY,
550 .register_info =
551 RegisterInfo().add_inputs({ /*cd_copy_size*/ ValueTag::U32, /*cd_offset_read*/ ValueTag::U32 }) } },
553 { .num_addresses = 1,
554 .gas_cost = { .opcode_gas = AVM_SUCCESSCOPY_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
555 .register_info = RegisterInfo().add_output(/*dst*/) } },
557 { .num_addresses = 3,
558 .gas_cost = { .opcode_gas = AVM_RETURNDATACOPY_BASE_L2_GAS,
559 .base_da = 0,
561 .dyn_da = 0 },
562 .dyn_gas_id = AVM_DYN_GAS_ID_RETURNDATACOPY,
563 .register_info =
564 RegisterInfo().add_inputs({ /*rd_copy_size*/ ValueTag::U32, /*rd_offset_read*/ ValueTag::U32 }) } },
566 {
567 .num_addresses = 0,
568 .gas_cost = { .opcode_gas = AVM_INTERNALCALL_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
569 } },
571 { .num_addresses = 0,
572 .gas_cost = { .opcode_gas = AVM_INTERNALRETURN_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 } } },
574 { .num_addresses = 5,
575 .gas_cost = { .opcode_gas = AVM_STATICCALL_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 } } },
577 { .num_addresses = 2,
578 .gas_cost = { .opcode_gas = AVM_REVERT_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
579 .register_info = RegisterInfo().add_input(/*rev_size*/ ValueTag::U32) } },
581 { .num_addresses = 2,
582 .gas_cost = { .opcode_gas = AVM_KECCAKF1600_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 } } },
584 { .num_addresses = 1,
585 .gas_cost = { .opcode_gas = AVM_RETURNDATASIZE_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
586 .register_info = RegisterInfo().add_output(/*dst*/) } },
588 { .num_addresses = 3,
589 .gas_cost = { .opcode_gas = AVM_DEBUGLOG_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
590 // We don't set the right inputs for debuglog because we make it a noop.
591 .register_info = RegisterInfo() } },
592 // Bitwise
594 { .num_addresses = 3,
595 .gas_cost = { .opcode_gas = AVM_AND_BASE_L2_GAS, .base_da = 0, .dyn_l2 = AVM_BITWISE_DYN_L2_GAS, .dyn_da = 0 },
596 .dyn_gas_id = AVM_DYN_GAS_ID_BITWISE,
597 .register_info = RegisterInfo()
599 .add_output(/*c*/) } },
601 { .num_addresses = 3,
602 .gas_cost = { .opcode_gas = AVM_OR_BASE_L2_GAS, .base_da = 0, .dyn_l2 = AVM_BITWISE_DYN_L2_GAS, .dyn_da = 0 },
603 .dyn_gas_id = AVM_DYN_GAS_ID_BITWISE,
604 .register_info = RegisterInfo()
606 .add_output(/*c*/) } },
608 { .num_addresses = 3,
609 .gas_cost = { .opcode_gas = AVM_XOR_BASE_L2_GAS, .base_da = 0, .dyn_l2 = AVM_BITWISE_DYN_L2_GAS, .dyn_da = 0 },
610 .dyn_gas_id = AVM_DYN_GAS_ID_BITWISE,
611 .register_info = RegisterInfo()
613 .add_output(/*c*/) } },
615 { .num_addresses = 2,
616 .gas_cost = { .opcode_gas = AVM_SLOAD_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
617 .register_info = RegisterInfo().add_input(/*slot*/ ValueTag::FF).add_output(/*dst*/) } },
619 { .num_addresses = 2,
620 .gas_cost = { .opcode_gas = AVM_SSTORE_BASE_L2_GAS,
621 .base_da = 0,
622 .dyn_l2 = 0,
623 .dyn_da = AVM_SSTORE_DYN_DA_GAS },
624 .dyn_gas_id = AVM_DYN_GAS_ID_SSTORE,
625 .register_info = RegisterInfo().add_inputs({ /*src*/ ValueTag::FF, /*slot*/ ValueTag::FF }) } },
627 { .num_addresses = 3,
628 .gas_cost = { .opcode_gas = AVM_NOTEHASHEXISTS_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
629 .register_info = RegisterInfo()
630 .add_inputs({ /*unique_note_hash*/ ValueTag::FF, /*leaf_index*/ ValueTag::U64 })
631 .add_output(/*exists*/) } },
633 { .num_addresses = 3,
634 .gas_cost = { .opcode_gas = AVM_NULLIFIEREXISTS_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
635 .register_info = RegisterInfo()
636 .add_inputs({ /*nullifier*/ ValueTag::FF,
637 /*address*/ ValueTag::FF })
638 .add_output(/*exists*/) } },
640 { .num_addresses = 1,
641 .gas_cost = { .opcode_gas = AVM_EMITNULLIFIER_BASE_L2_GAS,
643 .dyn_l2 = 0,
644 .dyn_da = 0 },
645 .register_info = RegisterInfo().add_input(/*nullifier*/ ValueTag::FF) } },
647 { .num_addresses = 2,
648 .gas_cost = { .opcode_gas = AVM_GETCONTRACTINSTANCE_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
649 .register_info = RegisterInfo().add_input(/*contract_address*/ ValueTag::FF) } },
651 { .num_addresses = 1,
652 .gas_cost = { .opcode_gas = AVM_EMITNOTEHASH_BASE_L2_GAS,
654 .dyn_l2 = 0,
655 .dyn_da = 0 },
656 .register_info = RegisterInfo().add_input(/*note_hash*/ ValueTag::FF) } },
658 { .num_addresses = 3,
659 .gas_cost = { .opcode_gas = AVM_L1TOL2MSGEXISTS_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
660 .register_info = RegisterInfo()
661 .add_inputs({ /*msg_hash*/ ValueTag::FF, /*leaf_index*/ ValueTag::U64 })
662 .add_output(/*exists*/) } },
664 { .num_addresses = 2,
665 .gas_cost = { .opcode_gas = AVM_POSEIDON2_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 } } },
667 { .num_addresses = 7,
668 .gas_cost = { .opcode_gas = AVM_ECADD_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 },
669 .register_info = RegisterInfo().add_inputs({ /*p_x=*/ValueTag::FF,
670 /*p_y=*/ValueTag::FF,
671 /*p_inf*/ ValueTag::U1,
672 /*q_x*/ ValueTag::FF,
673 /*q_y*/ ValueTag::FF,
674 /*q_inf*/ ValueTag::U1 }) } },
676 { .num_addresses = 5,
677 .gas_cost = { .opcode_gas = AVM_TORADIXBE_BASE_L2_GAS,
678 .base_da = 0,
679 .dyn_l2 = AVM_TORADIXBE_DYN_L2_GAS,
680 .dyn_da = 0 },
681 .dyn_gas_id = AVM_DYN_GAS_ID_TORADIX,
682 .register_info = RegisterInfo().add_inputs({ /*value*/ ValueTag::FF,
683 /*radix*/ ValueTag::U32,
684 /*num_limbs*/ ValueTag::U32,
685 /*is_output_bit*/ ValueTag::U1 }) } },
687 { .num_addresses = 2,
688 .gas_cost = { .opcode_gas = AVM_EMITUNENCRYPTEDLOG_BASE_L2_GAS,
689 .base_da = 0,
690 .dyn_l2 = 0,
693 .register_info = RegisterInfo().add_inputs({ RegisterInfo::ANY_TAG, ValueTag::U32 }) } },
695 { .num_addresses = 2,
696 .gas_cost = { .opcode_gas = AVM_SENDL2TOL1MSG_BASE_L2_GAS,
698 .dyn_l2 = 0,
699 .dyn_da = 0 },
700 .register_info = RegisterInfo().add_inputs({ /* recipient */ ValueTag::FF, /* content */ ValueTag::FF }) } },
701
702 {
704 { .num_addresses = 3,
705 .gas_cost = { .opcode_gas = AVM_SHA256COMPRESSION_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 } },
706 },
707};
708
709} // namespace bb::avm2
#define AVM_JUMPI_BASE_L2_GAS
#define AVM_DYN_GAS_ID_RETURNDATACOPY
#define AVM_SHL_BASE_L2_GAS
#define AVM_RETURN_BASE_L2_GAS
#define AVM_MUL_BASE_L2_GAS
#define AVM_CAST_BASE_L2_GAS
#define AVM_POSEIDON2_BASE_L2_GAS
#define AVM_CALLDATACOPY_DYN_L2_GAS
#define AVM_TORADIXBE_DYN_L2_GAS
#define AVM_SUCCESSCOPY_BASE_L2_GAS
#define AVM_NOT_BASE_L2_GAS
#define AVM_GETENVVAR_BASE_L2_GAS
#define AVM_OR_BASE_L2_GAS
#define AVM_SLOAD_BASE_L2_GAS
#define AVM_DYN_GAS_ID_SSTORE
#define AVM_EMITUNENCRYPTEDLOG_DYN_DA_GAS
#define AVM_ADD_BASE_L2_GAS
#define AVM_STATICCALL_BASE_L2_GAS
#define AVM_BITWISE_DYN_L2_GAS
#define AVM_RETURNDATACOPY_DYN_L2_GAS
#define AVM_DYN_GAS_ID_TORADIX
#define AVM_INTERNALRETURN_BASE_L2_GAS
#define AVM_REVERT_BASE_L2_GAS
#define AVM_EMITUNENCRYPTEDLOG_BASE_L2_GAS
#define AVM_EMITNULLIFIER_BASE_DA_GAS
#define AVM_SENDL2TOL1MSG_BASE_L2_GAS
#define AVM_EMITNOTEHASH_BASE_L2_GAS
#define AVM_RETURNDATASIZE_BASE_L2_GAS
#define AVM_JUMP_BASE_L2_GAS
#define AVM_INTERNALCALL_BASE_L2_GAS
#define AVM_NOTEHASHEXISTS_BASE_L2_GAS
#define AVM_NULLIFIEREXISTS_BASE_L2_GAS
#define AVM_XOR_BASE_L2_GAS
#define AVM_AND_BASE_L2_GAS
#define AVM_DEBUGLOG_BASE_L2_GAS
#define AVM_EMITNULLIFIER_BASE_L2_GAS
#define AVM_DYN_GAS_ID_CALLDATACOPY
#define AVM_SET_BASE_L2_GAS
#define AVM_EQ_BASE_L2_GAS
#define AVM_DIV_BASE_L2_GAS
#define AVM_SENDL2TOL1MSG_BASE_DA_GAS
#define AVM_EMITNOTEHASH_BASE_DA_GAS
#define AVM_KECCAKF1600_BASE_L2_GAS
#define AVM_LT_BASE_L2_GAS
#define AVM_SSTORE_BASE_L2_GAS
#define AVM_DYN_GAS_ID_EMITUNENCRYPTEDLOG
#define AVM_DYN_GAS_ID_BITWISE
#define AVM_SUB_BASE_L2_GAS
#define AVM_CALLDATACOPY_BASE_L2_GAS
#define AVM_TORADIXBE_BASE_L2_GAS
#define AVM_FDIV_BASE_L2_GAS
#define AVM_CALL_BASE_L2_GAS
#define AVM_L1TOL2MSGEXISTS_BASE_L2_GAS
#define AVM_ECADD_BASE_L2_GAS
#define AVM_SSTORE_DYN_DA_GAS
#define AVM_SHA256COMPRESSION_BASE_L2_GAS
#define AVM_RETURNDATACOPY_BASE_L2_GAS
#define AVM_SHR_BASE_L2_GAS
#define AVM_LTE_BASE_L2_GAS
#define AVM_MOV_BASE_L2_GAS
#define AVM_GETCONTRACTINSTANCE_BASE_L2_GAS
RegisterInfo & add_inputs(const std::vector< std::optional< ValueTag > > &tags)
std::optional< ValueTag > expected_tag(size_t index) const
RegisterInfo & add_input(std::optional< ValueTag > tag=std::nullopt)
std::vector< std::optional< ValueTag > > inputs
const std::unordered_map< WireOpCode, WireInstructionSpec > WIRE_INSTRUCTION_SPEC
const std::unordered_map< ExecutionOpCode, ExecInstructionSpec > EXEC_INSTRUCTION_SPEC
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13