Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
mega_app_flavor_generated.hpp
Go to the documentation of this file.
1// AUTOGENERATED FILE — do not edit. Regenerate via:
2// node barretenberg/cpp/scripts/flavor-codegen/dist/main.js
3//
4// Source: barretenberg/cpp/scripts/flavor-codegen/src/flavors/mega_app.ts
5#pragma once
6
7#include <array>
8#include <cstddef>
9#include <cstdint>
10#include <span>
11#include <string>
12#include <tuple>
13#include <vector>
14
34
35namespace bb {
36
38 public:
39 // Dense flavor-local entity index. Layout: [masking | precomputed | witness | shifted].
40 enum class EntityId : uint16_t {
41 sigma_1 = 0,
42 sigma_2 = 1,
43 sigma_3 = 2,
44 sigma_4 = 3,
45 id_1 = 4,
46 id_2 = 5,
47 id_3 = 6,
48 id_4 = 7,
50 lagrange_last = 9,
51 q_lookup = 10,
52 table_1 = 11,
53 table_2 = 12,
54 table_3 = 13,
55 table_4 = 14,
56 q_m = 15,
57 q_r = 16,
58 q_o = 17,
59 q_c = 18,
60 q_l = 19,
61 q_4 = 20,
62 q_arith = 21,
64 q_delta_range = 23,
65 q_elliptic = 24,
66 q_memory = 25,
67 q_nnf = 26,
68 lagrange_ecc_op = 27,
69 q_busread = 28,
71 databus_id = 30,
75 q_5 = 34,
78 w_l = 37,
79 w_r = 38,
80 w_o = 39,
81 w_4 = 40,
82 z_perm = 41,
83 lookup_inverses = 42,
86 ecc_op_wire_1 = 45,
87 ecc_op_wire_2 = 46,
88 ecc_op_wire_3 = 47,
89 ecc_op_wire_4 = 48,
90 return_data = 49,
93 w_l_shift = 52,
94 w_r_shift = 53,
95 w_o_shift = 54,
96 w_4_shift = 55,
97 z_perm_shift = 56,
98 };
99
100 // Sumcheck relation tuple. Source of truth is
101 // flavor-codegen/src/flavors/mega_app.ts; structural relations are omitted.
102 template <typename FF>
113 EntityId::return_data,
114 EntityId::return_data_read_counts,
115 EntityId::return_data_inverses,
116 EntityId::return_data_indicator,
117 EntityId::q_m>,
123
124 static constexpr size_t NUM_PRECOMPUTED_ENTITIES = 37;
125 static constexpr size_t NUM_WITNESS_ENTITIES = 15;
126 static constexpr size_t NUM_MASKING_ENTITIES = 0;
127 static constexpr size_t NUM_SHIFTED_ENTITIES = 5;
128 static constexpr bool HasDataBus = true;
129 static constexpr size_t NUM_BUS_COLUMNS = 1;
130 static constexpr std::array<size_t, NUM_BUS_COLUMNS> BUILDER_BUS_INDICES = { 6 };
131 static constexpr bool HasLogDerivLookup = true;
132 static constexpr bool HasElliptic = true;
133 static constexpr bool HasMemory = true;
134 static constexpr bool HasNonNativeField = true;
135 static constexpr bool HasEccOpQueue = true;
139
140 // Per-shifted-entity (original, duplicate) index pairs in AllEntities, one per shifted
141 // entity. Collapsed into `RepeatedCommitmentsData` below for Shplemini compatibility.
143 DuplicatePair{ 37, 52 }, DuplicatePair{ 38, 53 }, DuplicatePair{ 39, 54 },
144 DuplicatePair{ 40, 55 }, DuplicatePair{ 41, 56 },
145 };
148
149 // Gate-selector blocks, parallel to `get_gate_selectors()`.
150 template <typename TraceBlocks> static auto get_gate_blocks(TraceBlocks& blocks)
151 {
152 using BlockBase = typename TraceBlocks::BlockBase;
154 &blocks.lookup,
155 &blocks.arithmetic,
156 &blocks.arithmetic,
157 &blocks.delta_range,
158 &blocks.elliptic,
159 &blocks.memory,
160 &blocks.nnf,
161 &blocks.busread,
162 &blocks.poseidon2,
163 &blocks.poseidon2,
164 &blocks.poseidon2,
165 &blocks.poseidon2,
166 &blocks.poseidon2,
167 });
168 }
169
170 template <typename TraceBlocks> static auto get_gate_blocks(TraceBlocks const& blocks)
171 {
172 using BlockBase = typename TraceBlocks::BlockBase;
174 &blocks.lookup,
175 &blocks.arithmetic,
176 &blocks.arithmetic,
177 &blocks.delta_range,
178 &blocks.elliptic,
179 &blocks.memory,
180 &blocks.nnf,
181 &blocks.busread,
182 &blocks.poseidon2,
183 &blocks.poseidon2,
184 &blocks.poseidon2,
185 &blocks.poseidon2,
186 &blocks.poseidon2,
187 });
188 }
189
190 // GateKind for each gate selector, parallel to `get_gate_blocks()`.
206
207 // Non-gate selectors in `get_non_gate_selectors()` order, as references into a single block.
208 template <typename TraceBlock> static auto get_block_non_gate_selectors(TraceBlock& block)
209 {
210 using SelT = std::remove_reference_t<decltype(block.q_m())>;
211 return RefArray<SelT, 7>{
212 block.q_m(), block.q_1(), block.q_2(), block.q_3(), block.q_4(), block.q_c(), block.q_5(),
213 };
214 }
215
216 // AllEntities: flat `std::array` storage with EntityId-keyed access and named accessors.
217 template <typename DataType> class AllEntities {
218 public:
220 std::array<DataType, NUM_ALL_ENTITIES> data{};
221
222 DataType& operator[](EntityId id) { return data[static_cast<size_t>(id)]; }
223 const DataType& operator[](EntityId id) const { return data[static_cast<size_t>(id)]; }
224
227
228 // Named accessors (unshifted + shifted): mutable + const overloads.
229 DataType& sigma_1() { return data[static_cast<size_t>(EntityId::sigma_1)]; }
230 const DataType& sigma_1() const { return data[static_cast<size_t>(EntityId::sigma_1)]; }
231 DataType& sigma_2() { return data[static_cast<size_t>(EntityId::sigma_2)]; }
232 const DataType& sigma_2() const { return data[static_cast<size_t>(EntityId::sigma_2)]; }
233 DataType& sigma_3() { return data[static_cast<size_t>(EntityId::sigma_3)]; }
234 const DataType& sigma_3() const { return data[static_cast<size_t>(EntityId::sigma_3)]; }
235 DataType& sigma_4() { return data[static_cast<size_t>(EntityId::sigma_4)]; }
236 const DataType& sigma_4() const { return data[static_cast<size_t>(EntityId::sigma_4)]; }
237 DataType& id_1() { return data[static_cast<size_t>(EntityId::id_1)]; }
238 const DataType& id_1() const { return data[static_cast<size_t>(EntityId::id_1)]; }
239 DataType& id_2() { return data[static_cast<size_t>(EntityId::id_2)]; }
240 const DataType& id_2() const { return data[static_cast<size_t>(EntityId::id_2)]; }
241 DataType& id_3() { return data[static_cast<size_t>(EntityId::id_3)]; }
242 const DataType& id_3() const { return data[static_cast<size_t>(EntityId::id_3)]; }
243 DataType& id_4() { return data[static_cast<size_t>(EntityId::id_4)]; }
244 const DataType& id_4() const { return data[static_cast<size_t>(EntityId::id_4)]; }
245 DataType& lagrange_first() { return data[static_cast<size_t>(EntityId::lagrange_first)]; }
246 const DataType& lagrange_first() const { return data[static_cast<size_t>(EntityId::lagrange_first)]; }
247 DataType& lagrange_last() { return data[static_cast<size_t>(EntityId::lagrange_last)]; }
248 const DataType& lagrange_last() const { return data[static_cast<size_t>(EntityId::lagrange_last)]; }
249 DataType& q_lookup() { return data[static_cast<size_t>(EntityId::q_lookup)]; }
250 const DataType& q_lookup() const { return data[static_cast<size_t>(EntityId::q_lookup)]; }
251 DataType& table_1() { return data[static_cast<size_t>(EntityId::table_1)]; }
252 const DataType& table_1() const { return data[static_cast<size_t>(EntityId::table_1)]; }
253 DataType& table_2() { return data[static_cast<size_t>(EntityId::table_2)]; }
254 const DataType& table_2() const { return data[static_cast<size_t>(EntityId::table_2)]; }
255 DataType& table_3() { return data[static_cast<size_t>(EntityId::table_3)]; }
256 const DataType& table_3() const { return data[static_cast<size_t>(EntityId::table_3)]; }
257 DataType& table_4() { return data[static_cast<size_t>(EntityId::table_4)]; }
258 const DataType& table_4() const { return data[static_cast<size_t>(EntityId::table_4)]; }
259 DataType& q_m() { return data[static_cast<size_t>(EntityId::q_m)]; }
260 const DataType& q_m() const { return data[static_cast<size_t>(EntityId::q_m)]; }
261 DataType& q_r() { return data[static_cast<size_t>(EntityId::q_r)]; }
262 const DataType& q_r() const { return data[static_cast<size_t>(EntityId::q_r)]; }
263 DataType& q_o() { return data[static_cast<size_t>(EntityId::q_o)]; }
264 const DataType& q_o() const { return data[static_cast<size_t>(EntityId::q_o)]; }
265 DataType& q_c() { return data[static_cast<size_t>(EntityId::q_c)]; }
266 const DataType& q_c() const { return data[static_cast<size_t>(EntityId::q_c)]; }
267 DataType& q_l() { return data[static_cast<size_t>(EntityId::q_l)]; }
268 const DataType& q_l() const { return data[static_cast<size_t>(EntityId::q_l)]; }
269 DataType& q_4() { return data[static_cast<size_t>(EntityId::q_4)]; }
270 const DataType& q_4() const { return data[static_cast<size_t>(EntityId::q_4)]; }
271 DataType& q_arith() { return data[static_cast<size_t>(EntityId::q_arith)]; }
272 const DataType& q_arith() const { return data[static_cast<size_t>(EntityId::q_arith)]; }
273 DataType& q_bilinear_batched_eq() { return data[static_cast<size_t>(EntityId::q_bilinear_batched_eq)]; }
274 const DataType& q_bilinear_batched_eq() const
275 {
276 return data[static_cast<size_t>(EntityId::q_bilinear_batched_eq)];
277 }
278 DataType& q_delta_range() { return data[static_cast<size_t>(EntityId::q_delta_range)]; }
279 const DataType& q_delta_range() const { return data[static_cast<size_t>(EntityId::q_delta_range)]; }
280 DataType& q_elliptic() { return data[static_cast<size_t>(EntityId::q_elliptic)]; }
281 const DataType& q_elliptic() const { return data[static_cast<size_t>(EntityId::q_elliptic)]; }
282 DataType& q_memory() { return data[static_cast<size_t>(EntityId::q_memory)]; }
283 const DataType& q_memory() const { return data[static_cast<size_t>(EntityId::q_memory)]; }
284 DataType& q_nnf() { return data[static_cast<size_t>(EntityId::q_nnf)]; }
285 const DataType& q_nnf() const { return data[static_cast<size_t>(EntityId::q_nnf)]; }
286 DataType& lagrange_ecc_op() { return data[static_cast<size_t>(EntityId::lagrange_ecc_op)]; }
287 const DataType& lagrange_ecc_op() const { return data[static_cast<size_t>(EntityId::lagrange_ecc_op)]; }
288 DataType& q_busread() { return data[static_cast<size_t>(EntityId::q_busread)]; }
289 const DataType& q_busread() const { return data[static_cast<size_t>(EntityId::q_busread)]; }
290 DataType& return_data_indicator() { return data[static_cast<size_t>(EntityId::return_data_indicator)]; }
291 const DataType& return_data_indicator() const
292 {
293 return data[static_cast<size_t>(EntityId::return_data_indicator)];
294 }
295 DataType& databus_id() { return data[static_cast<size_t>(EntityId::databus_id)]; }
296 const DataType& databus_id() const { return data[static_cast<size_t>(EntityId::databus_id)]; }
297 DataType& q_poseidon2_external() { return data[static_cast<size_t>(EntityId::q_poseidon2_external)]; }
298 const DataType& q_poseidon2_external() const
299 {
300 return data[static_cast<size_t>(EntityId::q_poseidon2_external)];
301 }
303 {
304 return data[static_cast<size_t>(EntityId::q_poseidon2_external_initial)];
305 }
306 const DataType& q_poseidon2_external_initial() const
307 {
308 return data[static_cast<size_t>(EntityId::q_poseidon2_external_initial)];
309 }
310 DataType& q_poseidon2_quad_internal() { return data[static_cast<size_t>(EntityId::q_poseidon2_quad_internal)]; }
311 const DataType& q_poseidon2_quad_internal() const
312 {
313 return data[static_cast<size_t>(EntityId::q_poseidon2_quad_internal)];
314 }
315 DataType& q_5() { return data[static_cast<size_t>(EntityId::q_5)]; }
316 const DataType& q_5() const { return data[static_cast<size_t>(EntityId::q_5)]; }
318 {
319 return data[static_cast<size_t>(EntityId::q_poseidon2_quad_internal_terminal)];
320 }
322 {
323 return data[static_cast<size_t>(EntityId::q_poseidon2_quad_internal_terminal)];
324 }
326 {
327 return data[static_cast<size_t>(EntityId::q_poseidon2_transition_entry)];
328 }
329 const DataType& q_poseidon2_transition_entry() const
330 {
331 return data[static_cast<size_t>(EntityId::q_poseidon2_transition_entry)];
332 }
333 DataType& w_l() { return data[static_cast<size_t>(EntityId::w_l)]; }
334 const DataType& w_l() const { return data[static_cast<size_t>(EntityId::w_l)]; }
335 DataType& w_r() { return data[static_cast<size_t>(EntityId::w_r)]; }
336 const DataType& w_r() const { return data[static_cast<size_t>(EntityId::w_r)]; }
337 DataType& w_o() { return data[static_cast<size_t>(EntityId::w_o)]; }
338 const DataType& w_o() const { return data[static_cast<size_t>(EntityId::w_o)]; }
339 DataType& w_4() { return data[static_cast<size_t>(EntityId::w_4)]; }
340 const DataType& w_4() const { return data[static_cast<size_t>(EntityId::w_4)]; }
341 DataType& z_perm() { return data[static_cast<size_t>(EntityId::z_perm)]; }
342 const DataType& z_perm() const { return data[static_cast<size_t>(EntityId::z_perm)]; }
343 DataType& lookup_inverses() { return data[static_cast<size_t>(EntityId::lookup_inverses)]; }
344 const DataType& lookup_inverses() const { return data[static_cast<size_t>(EntityId::lookup_inverses)]; }
345 DataType& lookup_read_counts() { return data[static_cast<size_t>(EntityId::lookup_read_counts)]; }
346 const DataType& lookup_read_counts() const { return data[static_cast<size_t>(EntityId::lookup_read_counts)]; }
347 DataType& lookup_read_tags() { return data[static_cast<size_t>(EntityId::lookup_read_tags)]; }
348 const DataType& lookup_read_tags() const { return data[static_cast<size_t>(EntityId::lookup_read_tags)]; }
349 DataType& ecc_op_wire_1() { return data[static_cast<size_t>(EntityId::ecc_op_wire_1)]; }
350 const DataType& ecc_op_wire_1() const { return data[static_cast<size_t>(EntityId::ecc_op_wire_1)]; }
351 DataType& ecc_op_wire_2() { return data[static_cast<size_t>(EntityId::ecc_op_wire_2)]; }
352 const DataType& ecc_op_wire_2() const { return data[static_cast<size_t>(EntityId::ecc_op_wire_2)]; }
353 DataType& ecc_op_wire_3() { return data[static_cast<size_t>(EntityId::ecc_op_wire_3)]; }
354 const DataType& ecc_op_wire_3() const { return data[static_cast<size_t>(EntityId::ecc_op_wire_3)]; }
355 DataType& ecc_op_wire_4() { return data[static_cast<size_t>(EntityId::ecc_op_wire_4)]; }
356 const DataType& ecc_op_wire_4() const { return data[static_cast<size_t>(EntityId::ecc_op_wire_4)]; }
357 DataType& return_data() { return data[static_cast<size_t>(EntityId::return_data)]; }
358 const DataType& return_data() const { return data[static_cast<size_t>(EntityId::return_data)]; }
359 DataType& return_data_read_counts() { return data[static_cast<size_t>(EntityId::return_data_read_counts)]; }
360 const DataType& return_data_read_counts() const
361 {
362 return data[static_cast<size_t>(EntityId::return_data_read_counts)];
363 }
364 DataType& return_data_inverses() { return data[static_cast<size_t>(EntityId::return_data_inverses)]; }
365 const DataType& return_data_inverses() const
366 {
367 return data[static_cast<size_t>(EntityId::return_data_inverses)];
368 }
369 DataType& w_l_shift() { return data[static_cast<size_t>(EntityId::w_l_shift)]; }
370 const DataType& w_l_shift() const { return data[static_cast<size_t>(EntityId::w_l_shift)]; }
371 DataType& w_r_shift() { return data[static_cast<size_t>(EntityId::w_r_shift)]; }
372 const DataType& w_r_shift() const { return data[static_cast<size_t>(EntityId::w_r_shift)]; }
373 DataType& w_o_shift() { return data[static_cast<size_t>(EntityId::w_o_shift)]; }
374 const DataType& w_o_shift() const { return data[static_cast<size_t>(EntityId::w_o_shift)]; }
375 DataType& w_4_shift() { return data[static_cast<size_t>(EntityId::w_4_shift)]; }
376 const DataType& w_4_shift() const { return data[static_cast<size_t>(EntityId::w_4_shift)]; }
377 DataType& z_perm_shift() { return data[static_cast<size_t>(EntityId::z_perm_shift)]; }
378 const DataType& z_perm_shift() const { return data[static_cast<size_t>(EntityId::z_perm_shift)]; }
379
380 // Kind/shift partitions: contiguous slices of `data`.
429
430 // Subset views (relation-declared groupings in layout order).
432 {
433 return { (*this)[EntityId::sigma_1],
434 (*this)[EntityId::sigma_2],
435 (*this)[EntityId::sigma_3],
436 (*this)[EntityId::sigma_4] };
437 }
439 {
440 return { (*this)[EntityId::sigma_1],
441 (*this)[EntityId::sigma_2],
442 (*this)[EntityId::sigma_3],
443 (*this)[EntityId::sigma_4] };
444 }
446 {
447 return {
448 (*this)[EntityId::id_1], (*this)[EntityId::id_2], (*this)[EntityId::id_3], (*this)[EntityId::id_4]
449 };
450 }
452 {
453 return {
454 (*this)[EntityId::id_1], (*this)[EntityId::id_2], (*this)[EntityId::id_3], (*this)[EntityId::id_4]
455 };
456 }
458 {
459 return { (*this)[EntityId::q_lookup],
460 (*this)[EntityId::q_arith],
461 (*this)[EntityId::q_bilinear_batched_eq],
462 (*this)[EntityId::q_delta_range],
463 (*this)[EntityId::q_elliptic],
464 (*this)[EntityId::q_memory],
465 (*this)[EntityId::q_nnf],
466 (*this)[EntityId::q_busread],
467 (*this)[EntityId::q_poseidon2_external],
468 (*this)[EntityId::q_poseidon2_external_initial],
469 (*this)[EntityId::q_poseidon2_quad_internal],
470 (*this)[EntityId::q_poseidon2_quad_internal_terminal],
471 (*this)[EntityId::q_poseidon2_transition_entry] };
472 }
474 {
475 return { (*this)[EntityId::q_lookup],
476 (*this)[EntityId::q_arith],
477 (*this)[EntityId::q_bilinear_batched_eq],
478 (*this)[EntityId::q_delta_range],
479 (*this)[EntityId::q_elliptic],
480 (*this)[EntityId::q_memory],
481 (*this)[EntityId::q_nnf],
482 (*this)[EntityId::q_busread],
483 (*this)[EntityId::q_poseidon2_external],
484 (*this)[EntityId::q_poseidon2_external_initial],
485 (*this)[EntityId::q_poseidon2_quad_internal],
486 (*this)[EntityId::q_poseidon2_quad_internal_terminal],
487 (*this)[EntityId::q_poseidon2_transition_entry] };
488 }
490 {
491 return { (*this)[EntityId::table_1],
492 (*this)[EntityId::table_2],
493 (*this)[EntityId::table_3],
494 (*this)[EntityId::table_4] };
495 }
497 {
498 return { (*this)[EntityId::table_1],
499 (*this)[EntityId::table_2],
500 (*this)[EntityId::table_3],
501 (*this)[EntityId::table_4] };
502 }
504 {
505 return { (*this)[EntityId::w_l], (*this)[EntityId::w_r], (*this)[EntityId::w_o], (*this)[EntityId::w_4] };
506 }
508 {
509 return { (*this)[EntityId::w_l], (*this)[EntityId::w_r], (*this)[EntityId::w_o], (*this)[EntityId::w_4] };
510 }
512 {
513 return { (*this)[EntityId::q_m], (*this)[EntityId::q_l], (*this)[EntityId::q_r], (*this)[EntityId::q_o],
514 (*this)[EntityId::q_4], (*this)[EntityId::q_c], (*this)[EntityId::q_5] };
515 }
517 {
518 return { (*this)[EntityId::q_m], (*this)[EntityId::q_l], (*this)[EntityId::q_r], (*this)[EntityId::q_o],
519 (*this)[EntityId::q_4], (*this)[EntityId::q_c], (*this)[EntityId::q_5] };
520 }
522 {
523 return { (*this)[EntityId::ecc_op_wire_1],
524 (*this)[EntityId::ecc_op_wire_2],
525 (*this)[EntityId::ecc_op_wire_3],
526 (*this)[EntityId::ecc_op_wire_4] };
527 }
529 {
530 return { (*this)[EntityId::ecc_op_wire_1],
531 (*this)[EntityId::ecc_op_wire_2],
532 (*this)[EntityId::ecc_op_wire_3],
533 (*this)[EntityId::ecc_op_wire_4] };
534 }
536 {
537 return { (*this)[EntityId::return_data], (*this)[EntityId::return_data_read_counts] };
538 }
540 {
541 return { (*this)[EntityId::return_data], (*this)[EntityId::return_data_read_counts] };
542 }
543 RefArray<DataType, 1> get_databus_inverses() { return { (*this)[EntityId::return_data_inverses] }; }
544 RefArray<const DataType, 1> get_databus_inverses() const { return { (*this)[EntityId::return_data_inverses] }; }
545 RefArray<DataType, 1> get_databus_indicators() { return { (*this)[EntityId::return_data_indicator] }; }
547 {
548 return { (*this)[EntityId::return_data_indicator] };
549 }
550 RefArray<DataType, 1> get_databus_selectors() { return { (*this)[EntityId::q_m] }; }
551 RefArray<const DataType, 1> get_databus_selectors() const { return { (*this)[EntityId::q_m] }; }
552
553 // Composite views: concatenations of subset views.
556
557 // Labels — uppercase, layout order.
558 static const std::vector<std::string>& get_labels()
559 {
560 static const std::vector<std::string> labels = {
561 "SIGMA_1",
562 "SIGMA_2",
563 "SIGMA_3",
564 "SIGMA_4",
565 "ID_1",
566 "ID_2",
567 "ID_3",
568 "ID_4",
569 "LAGRANGE_FIRST",
570 "LAGRANGE_LAST",
571 "Q_LOOKUP",
572 "TABLE_1",
573 "TABLE_2",
574 "TABLE_3",
575 "TABLE_4",
576 "Q_M",
577 "Q_R",
578 "Q_O",
579 "Q_C",
580 "Q_L",
581 "Q_4",
582 "Q_ARITH",
583 "Q_BILINEAR_BATCHED_EQ",
584 "Q_DELTA_RANGE",
585 "Q_ELLIPTIC",
586 "Q_MEMORY",
587 "Q_NNF",
588 "LAGRANGE_ECC_OP",
589 "Q_BUSREAD",
590 "RETURN_DATA_INDICATOR",
591 "DATABUS_ID",
592 "Q_POSEIDON2_EXTERNAL",
593 "Q_POSEIDON2_EXTERNAL_INITIAL",
594 "Q_POSEIDON2_QUAD_INTERNAL",
595 "Q_5",
596 "Q_POSEIDON2_QUAD_INTERNAL_TERMINAL",
597 "Q_POSEIDON2_TRANSITION_ENTRY",
598 "W_L",
599 "W_R",
600 "W_O",
601 "W_4",
602 "Z_PERM",
603 "LOOKUP_INVERSES",
604 "LOOKUP_READ_COUNTS",
605 "LOOKUP_READ_TAGS",
606 "ECC_OP_WIRE_1",
607 "ECC_OP_WIRE_2",
608 "ECC_OP_WIRE_3",
609 "ECC_OP_WIRE_4",
610 "RETURN_DATA",
611 "RETURN_DATA_READ_COUNTS",
612 "RETURN_DATA_INVERSES",
613 "W_L_SHIFT",
614 "W_R_SHIFT",
615 "W_O_SHIFT",
616 "W_4_SHIFT",
617 "Z_PERM_SHIFT",
618 };
619 return labels;
620 }
621 };
622
623 // Verification-key transport class. Owns its own storage; not a slice of AllEntities.
624 template <typename DataType_> class PrecomputedEntities {
625 public:
626 using DataType = DataType_;
627 std::array<DataType, NUM_PRECOMPUTED_ENTITIES> data{};
628
629 bool operator==(const PrecomputedEntities&) const = default;
630
633
634 static constexpr size_t size() { return NUM_PRECOMPUTED_ENTITIES; }
635
636 // Named accessor methods — index into local `data` (NOT the AllEntities layout).
637 DataType& sigma_1() { return data[0]; }
638 const DataType& sigma_1() const { return data[0]; }
639 DataType& sigma_2() { return data[1]; }
640 const DataType& sigma_2() const { return data[1]; }
641 DataType& sigma_3() { return data[2]; }
642 const DataType& sigma_3() const { return data[2]; }
643 DataType& sigma_4() { return data[3]; }
644 const DataType& sigma_4() const { return data[3]; }
645 DataType& id_1() { return data[4]; }
646 const DataType& id_1() const { return data[4]; }
647 DataType& id_2() { return data[5]; }
648 const DataType& id_2() const { return data[5]; }
649 DataType& id_3() { return data[6]; }
650 const DataType& id_3() const { return data[6]; }
651 DataType& id_4() { return data[7]; }
652 const DataType& id_4() const { return data[7]; }
653 DataType& lagrange_first() { return data[8]; }
654 const DataType& lagrange_first() const { return data[8]; }
655 DataType& lagrange_last() { return data[9]; }
656 const DataType& lagrange_last() const { return data[9]; }
657 DataType& q_lookup() { return data[10]; }
658 const DataType& q_lookup() const { return data[10]; }
659 DataType& table_1() { return data[11]; }
660 const DataType& table_1() const { return data[11]; }
661 DataType& table_2() { return data[12]; }
662 const DataType& table_2() const { return data[12]; }
663 DataType& table_3() { return data[13]; }
664 const DataType& table_3() const { return data[13]; }
665 DataType& table_4() { return data[14]; }
666 const DataType& table_4() const { return data[14]; }
667 DataType& q_m() { return data[15]; }
668 const DataType& q_m() const { return data[15]; }
669 DataType& q_r() { return data[16]; }
670 const DataType& q_r() const { return data[16]; }
671 DataType& q_o() { return data[17]; }
672 const DataType& q_o() const { return data[17]; }
673 DataType& q_c() { return data[18]; }
674 const DataType& q_c() const { return data[18]; }
675 DataType& q_l() { return data[19]; }
676 const DataType& q_l() const { return data[19]; }
677 DataType& q_4() { return data[20]; }
678 const DataType& q_4() const { return data[20]; }
679 DataType& q_arith() { return data[21]; }
680 const DataType& q_arith() const { return data[21]; }
682 const DataType& q_bilinear_batched_eq() const { return data[22]; }
683 DataType& q_delta_range() { return data[23]; }
684 const DataType& q_delta_range() const { return data[23]; }
685 DataType& q_elliptic() { return data[24]; }
686 const DataType& q_elliptic() const { return data[24]; }
687 DataType& q_memory() { return data[25]; }
688 const DataType& q_memory() const { return data[25]; }
689 DataType& q_nnf() { return data[26]; }
690 const DataType& q_nnf() const { return data[26]; }
691 DataType& lagrange_ecc_op() { return data[27]; }
692 const DataType& lagrange_ecc_op() const { return data[27]; }
693 DataType& q_busread() { return data[28]; }
694 const DataType& q_busread() const { return data[28]; }
696 const DataType& return_data_indicator() const { return data[29]; }
697 DataType& databus_id() { return data[30]; }
698 const DataType& databus_id() const { return data[30]; }
700 const DataType& q_poseidon2_external() const { return data[31]; }
702 const DataType& q_poseidon2_external_initial() const { return data[32]; }
704 const DataType& q_poseidon2_quad_internal() const { return data[33]; }
705 DataType& q_5() { return data[34]; }
706 const DataType& q_5() const { return data[34]; }
708 const DataType& q_poseidon2_quad_internal_terminal() const { return data[35]; }
710 const DataType& q_poseidon2_transition_entry() const { return data[36]; }
711
712 // Subset views.
714 {
715 return { this->sigma_1(), this->sigma_2(), this->sigma_3(), this->sigma_4() };
716 }
718 {
719 return { this->sigma_1(), this->sigma_2(), this->sigma_3(), this->sigma_4() };
720 }
721 RefArray<DataType, 4> get_ids() { return { this->id_1(), this->id_2(), this->id_3(), this->id_4() }; }
723 {
724 return { this->id_1(), this->id_2(), this->id_3(), this->id_4() };
725 }
727 {
728 return { this->q_lookup(),
729 this->q_arith(),
730 this->q_bilinear_batched_eq(),
731 this->q_delta_range(),
732 this->q_elliptic(),
733 this->q_memory(),
734 this->q_nnf(),
735 this->q_busread(),
736 this->q_poseidon2_external(),
741 }
743 {
744 return { this->q_lookup(),
745 this->q_arith(),
746 this->q_bilinear_batched_eq(),
747 this->q_delta_range(),
748 this->q_elliptic(),
749 this->q_memory(),
750 this->q_nnf(),
751 this->q_busread(),
752 this->q_poseidon2_external(),
757 }
759 {
760 return { this->table_1(), this->table_2(), this->table_3(), this->table_4() };
761 }
763 {
764 return { this->table_1(), this->table_2(), this->table_3(), this->table_4() };
765 }
767 {
768 return { this->q_m(), this->q_l(), this->q_r(), this->q_o(), this->q_4(), this->q_c(), this->q_5() };
769 }
771 {
772 return { this->q_m(), this->q_l(), this->q_r(), this->q_o(), this->q_4(), this->q_c(), this->q_5() };
773 }
778
779 // Composite views.
782
783 static const std::vector<std::string>& get_labels()
784 {
785 static const std::vector<std::string> labels = {
786 "SIGMA_1",
787 "SIGMA_2",
788 "SIGMA_3",
789 "SIGMA_4",
790 "ID_1",
791 "ID_2",
792 "ID_3",
793 "ID_4",
794 "LAGRANGE_FIRST",
795 "LAGRANGE_LAST",
796 "Q_LOOKUP",
797 "TABLE_1",
798 "TABLE_2",
799 "TABLE_3",
800 "TABLE_4",
801 "Q_M",
802 "Q_R",
803 "Q_O",
804 "Q_C",
805 "Q_L",
806 "Q_4",
807 "Q_ARITH",
808 "Q_BILINEAR_BATCHED_EQ",
809 "Q_DELTA_RANGE",
810 "Q_ELLIPTIC",
811 "Q_MEMORY",
812 "Q_NNF",
813 "LAGRANGE_ECC_OP",
814 "Q_BUSREAD",
815 "RETURN_DATA_INDICATOR",
816 "DATABUS_ID",
817 "Q_POSEIDON2_EXTERNAL",
818 "Q_POSEIDON2_EXTERNAL_INITIAL",
819 "Q_POSEIDON2_QUAD_INTERNAL",
820 "Q_5",
821 "Q_POSEIDON2_QUAD_INTERNAL_TERMINAL",
822 "Q_POSEIDON2_TRANSITION_ENTRY",
823 };
824 return labels;
825 }
826 };
827
828 // Prover-commitment transport class (witness only). Owns its own storage.
829 template <typename DataType_> class WitnessEntities {
830 public:
831 using DataType = DataType_;
832 std::array<DataType, NUM_WITNESS_ENTITIES> data{};
833
834 bool operator==(const WitnessEntities&) const = default;
835
838
839 static constexpr size_t size() { return NUM_WITNESS_ENTITIES; }
840
841 // Named accessor methods — index into local `data` (NOT the AllEntities layout).
842 DataType& w_l() { return data[0]; }
843 const DataType& w_l() const { return data[0]; }
844 DataType& w_r() { return data[1]; }
845 const DataType& w_r() const { return data[1]; }
846 DataType& w_o() { return data[2]; }
847 const DataType& w_o() const { return data[2]; }
848 DataType& w_4() { return data[3]; }
849 const DataType& w_4() const { return data[3]; }
850 DataType& z_perm() { return data[4]; }
851 const DataType& z_perm() const { return data[4]; }
852 DataType& lookup_inverses() { return data[5]; }
853 const DataType& lookup_inverses() const { return data[5]; }
855 const DataType& lookup_read_counts() const { return data[6]; }
857 const DataType& lookup_read_tags() const { return data[7]; }
858 DataType& ecc_op_wire_1() { return data[8]; }
859 const DataType& ecc_op_wire_1() const { return data[8]; }
860 DataType& ecc_op_wire_2() { return data[9]; }
861 const DataType& ecc_op_wire_2() const { return data[9]; }
862 DataType& ecc_op_wire_3() { return data[10]; }
863 const DataType& ecc_op_wire_3() const { return data[10]; }
864 DataType& ecc_op_wire_4() { return data[11]; }
865 const DataType& ecc_op_wire_4() const { return data[11]; }
866 DataType& return_data() { return data[12]; }
867 const DataType& return_data() const { return data[12]; }
869 const DataType& return_data_read_counts() const { return data[13]; }
871 const DataType& return_data_inverses() const { return data[14]; }
872
873 // Subset views.
874 RefArray<DataType, 4> get_wires() { return { this->w_l(), this->w_r(), this->w_o(), this->w_4() }; }
875 RefArray<const DataType, 4> get_wires() const { return { this->w_l(), this->w_r(), this->w_o(), this->w_4() }; }
877 {
878 return { this->ecc_op_wire_1(), this->ecc_op_wire_2(), this->ecc_op_wire_3(), this->ecc_op_wire_4() };
879 }
881 {
882 return { this->ecc_op_wire_1(), this->ecc_op_wire_2(), this->ecc_op_wire_3(), this->ecc_op_wire_4() };
883 }
889 {
890 return { this->return_data(), this->return_data_read_counts() };
891 }
894
896 {
897 return { this->w_l(), this->w_r(), this->w_o(), this->w_4(), this->z_perm() };
898 }
900 {
901 return { this->w_l(), this->w_r(), this->w_o(), this->w_4(), this->z_perm() };
902 }
903
904 static const std::vector<std::string>& get_labels()
905 {
906 static const std::vector<std::string> labels = {
907 "W_L",
908 "W_R",
909 "W_O",
910 "W_4",
911 "Z_PERM",
912 "LOOKUP_INVERSES",
913 "LOOKUP_READ_COUNTS",
914 "LOOKUP_READ_TAGS",
915 "ECC_OP_WIRE_1",
916 "ECC_OP_WIRE_2",
917 "ECC_OP_WIRE_3",
918 "ECC_OP_WIRE_4",
919 "RETURN_DATA",
920 "RETURN_DATA_READ_COUNTS",
921 "RETURN_DATA_INVERSES",
922 };
923 return labels;
924 }
925 };
926};
927
928} // namespace bb
bb::field< bb::Bn254FrParams > FF
Definition field.cpp:24
RefArray< const DataType, 4 > get_tables() const
std::span< DataType, NUM_WITNESS_ENTITIES > get_witness()
std::array< DataType, NUM_ALL_ENTITIES > data
std::span< DataType, NUM_PRECOMPUTED_ENTITIES > get_precomputed()
static const std::vector< std::string > & get_labels()
std::span< const DataType, NUM_PRECOMPUTED_ENTITIES > get_precomputed() const
std::span< DataType, NUM_SHIFTED_ENTITIES > get_to_be_shifted()
std::span< const DataType, NUM_UNSHIFTED_ENTITIES > get_unshifted() const
RefArray< const DataType, 13 > get_gate_selectors() const
RefArray< const DataType, 7 > get_non_gate_selectors() const
RefArray< const DataType, 4 > get_sigmas() const
std::span< const DataType, NUM_SHIFTED_ENTITIES > get_shifted() const
std::span< DataType, NUM_UNSHIFTED_ENTITIES > get_unshifted()
std::span< const DataType, NUM_SHIFTED_ENTITIES > get_to_be_shifted() const
RefArray< const DataType, 4 > get_wires() const
RefArray< const DataType, 1 > get_databus_selectors() const
RefArray< const DataType, 1 > get_databus_inverses() const
RefArray< const DataType, 1 > get_databus_indicators() const
const DataType & operator[](EntityId id) const
std::span< DataType, NUM_ALL_ENTITIES > get_all()
RefArray< const DataType, 4 > get_ecc_op_wires() const
std::span< DataType, NUM_SHIFTED_ENTITIES > get_shifted()
RefArray< const DataType, 2 > get_databus_entities() const
RefArray< const DataType, 4 > get_ids() const
std::span< const DataType, NUM_ALL_ENTITIES > get_all() const
std::span< const DataType, NUM_WITNESS_ENTITIES > get_witness() const
static const std::vector< std::string > & get_labels()
std::span< const DataType, NUM_PRECOMPUTED_ENTITIES > get_all() const
std::array< DataType, NUM_PRECOMPUTED_ENTITIES > data
RefArray< const DataType, 1 > get_databus_selectors() const
RefArray< const DataType, 1 > get_databus_indicators() const
RefArray< const DataType, 13 > get_gate_selectors() const
RefArray< const DataType, 7 > get_non_gate_selectors() const
bool operator==(const PrecomputedEntities &) const =default
std::span< DataType, NUM_PRECOMPUTED_ENTITIES > get_all()
RefArray< const DataType, 1 > get_databus_inverses() const
std::span< const DataType, NUM_WITNESS_ENTITIES > get_all() const
RefArray< const DataType, 5 > get_to_be_shifted() const
bool operator==(const WitnessEntities &) const =default
static const std::vector< std::string > & get_labels()
RefArray< const DataType, 4 > get_ecc_op_wires() const
std::array< DataType, NUM_WITNESS_ENTITIES > data
RefArray< const DataType, 2 > get_databus_entities() const
std::span< DataType, NUM_WITNESS_ENTITIES > get_all()
static constexpr size_t NUM_MASKING_ENTITIES
std::tuple< bb::UltraPermutationRelation< FF >, bb::LogDerivLookupRelation< FF >, bb::ArithmeticRelation< FF >, bb::BilinearOrBatchedEqCheckRelation< FF >, bb::DeltaRangeConstraintRelation< FF >, bb::EllipticRelation< FF >, bb::MemoryRelation< FF >, bb::NonNativeFieldRelation< FF >, bb::EccOpQueueRelation< FF >, bb::SingleBusLookupRelation< FF, EntityId::return_data, EntityId::return_data_read_counts, EntityId::return_data_inverses, EntityId::return_data_indicator, EntityId::q_m >, bb::Poseidon2ExternalRelation< FF >, bb::Poseidon2InitialExternalRelation< FF >, bb::Poseidon2QuadInternalRelation< FF >, bb::Poseidon2QuadInternalTerminalRelation< FF >, bb::Poseidon2TransitionEntryRelation< FF > > Relations_
static auto get_block_non_gate_selectors(TraceBlock &block)
static constexpr std::array< GateKind, 13 > GATE_KINDS
static constexpr size_t NUM_WITNESS_ENTITIES
static auto get_gate_blocks(TraceBlocks &blocks)
static constexpr RepeatedCommitmentsData REPEATED_COMMITMENTS
static constexpr size_t NUM_COMMITTED_WITNESS_ENTITIES
static constexpr size_t NUM_PRECOMPUTED_ENTITIES
static constexpr size_t NUM_SHIFTED_ENTITIES
static constexpr std::array< DuplicatePair, NUM_SHIFTED_ENTITIES > REPEATED_COMMITMENT_PAIRS
static constexpr std::array< size_t, NUM_BUS_COLUMNS > BUILDER_BUS_INDICES
static constexpr size_t NUM_UNSHIFTED_ENTITIES
static auto get_gate_blocks(TraceBlocks const &blocks)
A template class for a reference array. Behaves as if std::array<T&, N> was possible.
Definition ref_array.hpp:23
A wrapper for Relations to expose methods used by the Sumcheck prover or verifier to add the contribu...
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
constexpr RepeatedCommitmentsData repeated_commitments_from_pairs(std::span< const DuplicatePair > pairs)
Collapse a span of (original, duplicate) pairs into a RepeatedCommitmentsData of up to two contiguous...
RefArray< T,(Ns+...)> constexpr concatenate(const RefArray< T, Ns > &... ref_arrays)
Concatenates multiple RefArray objects into a single RefArray.
@ Poseidon2QuadIntTerminal
@ Poseidon2TransitionEntry
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
One commitment shared by an unshifted polynomial and its shifted copy.