1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
25using tracegen::BytecodeTraceBuilder;
26using tracegen::PrecomputedTraceBuilder;
27using tracegen::TestTraceContainer;
33void init_trace(TestTraceContainer& trace)
36 trace.
set(C::precomputed_first_row, 0, 1);
39void set_perm_selectors(TestTraceContainer& trace)
49 constexpr std::array<C, 3> selectors = { C::bc_decomposition_sel_packed_read_0_,
50 C::bc_decomposition_sel_packed_read_1_,
51 C::bc_decomposition_sel_packed_read_2_ };
53 uint32_t bytes_remaining =
static_cast<uint32_t
>(
trace.
get(C::bc_decomposition_bytes_remaining, r));
54 for (uint32_t i = r; i < r + bytes_remaining; i += 31) {
56 trace.
set(i, { { { selectors[((i - r) % 31) % 3], 1 } } });
58 r += bytes_remaining > 0 ? bytes_remaining : 1;
62TEST(BytecodeDecompositionConstrainingTest, EmptyRow)
67TEST(BytecodeDecompositionConstrainingTest, SingleBytecode)
69 TestTraceContainer
trace;
81 set_perm_selectors(trace);
83 check_relation<bc_decomposition>(trace);
84 check_interaction<BytecodeTraceBuilder, lookup_bc_decomposition_bytes_are_bytes_settings>(trace);
87TEST(BytecodeDecompositionConstrainingTest, ShortSingleBytecode)
90 TestTraceContainer
trace;
102 set_perm_selectors(trace);
104 check_relation<bc_decomposition>(trace);
105 check_interaction<BytecodeTraceBuilder, lookup_bc_decomposition_bytes_are_bytes_settings>(trace);
108TEST(BytecodeDecompositionConstrainingTest, MultipleBytecodes)
110 TestTraceContainer
trace;
124 set_perm_selectors(trace);
126 check_relation<bc_decomposition>(trace);
127 check_interaction<BytecodeTraceBuilder, lookup_bc_decomposition_bytes_are_bytes_settings>(trace);
130TEST(BytecodeDecompositionConstrainingTest, MultipleBytecodesWithShortOnes)
132 TestTraceContainer
trace;
149 set_perm_selectors(trace);
151 check_relation<bc_decomposition>(trace);
152 check_interaction<BytecodeTraceBuilder, lookup_bc_decomposition_bytes_are_bytes_settings>(trace);
155TEST(BytecodeDecompositionConstrainingTest, NegativeDeactivatedSel)
157 TestTraceContainer
trace({
159 { C::bc_decomposition_bytes_rem_inv,
FF(33).invert() },
160 { C::bc_decomposition_bytes_remaining, 33 },
161 { C::bc_decomposition_sel, 1 },
164 { C::bc_decomposition_bytes_rem_inv,
FF(32).invert() },
165 { C::bc_decomposition_bytes_remaining, 32 },
166 { C::bc_decomposition_sel, 1 },
169 { C::bc_decomposition_bytes_rem_inv,
FF(31).invert() },
170 { C::bc_decomposition_bytes_remaining, 31 },
171 { C::bc_decomposition_sel, 1 },
176 trace.
set(C::bc_decomposition_sel, 2, 0);
181TEST(BytecodeDecompositionConstrainingTest, NegativeDeactivateLastContract)
183 TestTraceContainer
trace({
185 { C::bc_decomposition_bytes_rem_min_one_inv,
FF(2).invert() },
186 { C::bc_decomposition_bytes_remaining, 3 },
187 { C::bc_decomposition_sel, 1 },
190 { C::bc_decomposition_bytes_rem_min_one_inv, 1 },
191 { C::bc_decomposition_bytes_remaining, 2 },
192 { C::bc_decomposition_sel, 1 },
195 { C::bc_decomposition_bytes_rem_min_one_inv, 0 },
196 { C::bc_decomposition_last_of_contract, 1 },
197 { C::bc_decomposition_bytes_remaining, 1 },
198 { C::bc_decomposition_sel, 1 },
203 trace.
set(C::bc_decomposition_last_of_contract, 2, 0);
209TEST(BytecodeDecompositionConstrainingTest, NegativeDeactivateStart)
211 TestTraceContainer
trace({
212 { { C::precomputed_first_row, 1 } },
214 { C::bc_decomposition_pc, 0 },
215 { C::bc_decomposition_sel, 1 },
216 { C::bc_decomposition_start, 1 },
221 trace.
set(C::bc_decomposition_start, 1, 0);
226TEST(BytecodeDecompositionConstrainingTest, NegativeStartEndNotSel)
228 TestTraceContainer
trace({ { { C::precomputed_first_row, 1 } },
230 { C::bc_decomposition_sel, 1 },
231 { C::bc_decomposition_start, 1 },
234 { C::bc_decomposition_last_of_contract, 1 },
235 { C::bc_decomposition_sel, 1 },
239 trace.
set(C::bc_decomposition_sel, 1, 0);
242 trace.
set(C::bc_decomposition_sel, 1, 1);
243 trace.
set(C::bc_decomposition_sel, 2, 0);
248TEST(BytecodeDecompositionConstrainingTest, NegativePcWrongInitializationFirstRow)
250 TestTraceContainer
trace({
251 { { C::precomputed_first_row, 1 } },
252 { { C::bc_decomposition_pc, 0 }, { C::bc_decomposition_sel, 1 }, { C::bc_decomposition_start, 1 } },
256 trace.
set(C::bc_decomposition_pc, 1, 7);
261TEST(BytecodeDecompositionConstrainingTest, NegativePcWrongInitializationInside)
263 TestTraceContainer
trace({
264 { { C::bc_decomposition_last_of_contract, 1 } },
265 { { C::bc_decomposition_pc, 0 }, { C::bc_decomposition_sel, 1 }, { C::bc_decomposition_start, 1 } },
269 trace.
set(C::bc_decomposition_pc, 1, 32);
274TEST(BytecodeDecompositionConstrainingTest, NegativePcWrongIncrement)
276 TestTraceContainer
trace({
278 { C::bc_decomposition_pc, 5 },
279 { C::bc_decomposition_sel, 1 },
282 { C::bc_decomposition_pc, 6 },
283 { C::bc_decomposition_sel, 1 },
286 { C::bc_decomposition_last_of_contract, 1 },
287 { C::bc_decomposition_pc, 7 },
288 { C::bc_decomposition_sel, 1 },
293 trace.
set(C::bc_decomposition_pc, 2, 6);
298TEST(BytecodeDecompositionConstrainingTest, NegativeBytesRemWrongDecrement)
300 TestTraceContainer
trace({
302 { C::bc_decomposition_bytes_remaining, 5 },
303 { C::bc_decomposition_sel, 1 },
306 { C::bc_decomposition_bytes_remaining, 4 },
307 { C::bc_decomposition_sel, 1 },
310 { C::bc_decomposition_last_of_contract, 1 },
311 { C::bc_decomposition_bytes_remaining, 3 },
312 { C::bc_decomposition_sel, 1 },
317 trace.
set(C::bc_decomposition_bytes_remaining, 0, 4);
322TEST(BytecodeDecompositionConstrainingTest, NegativeMutateBytecodeId)
324 TestTraceContainer
trace({
326 { C::bc_decomposition_id, 147 },
327 { C::bc_decomposition_sel, 1 },
330 { C::bc_decomposition_id, 147 },
331 { C::bc_decomposition_sel, 1 },
334 { C::bc_decomposition_last_of_contract, 1 },
335 { C::bc_decomposition_id, 147 },
336 { C::bc_decomposition_sel, 1 },
341 trace.
set(C::bc_decomposition_id, 2, 77);
347TEST(BytecodeDecompositionConstrainingTest, SelWindowsGtRemainingInitialization)
349 TestTraceContainer
trace({
351 { C::bc_decomposition_last_of_contract, 1 },
352 { C::bc_decomposition_sel, 1 },
353 { C::bc_decomposition_sel_windows_gt_remaining, 1 },
359 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 0, 0);
366TEST(BytecodeDecompositionConstrainingTest, SelWindowsGtRemainingPropagation)
368 TestTraceContainer
trace({
370 { C::bc_decomposition_sel, 1 },
371 { C::bc_decomposition_sel_windows_gt_remaining, 1 },
374 { C::bc_decomposition_last_of_contract, 1 },
375 { C::bc_decomposition_sel, 1 },
376 { C::bc_decomposition_sel_windows_gt_remaining, 1 },
382 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 0, 0);
388 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 0, 1);
390 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 1, 0);
396 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 0, 0);
401TEST(BytecodeDecompositionConstrainingTest, SelWindowsGtRemainingPropagationWithMutation)
403 TestTraceContainer
trace({
405 { C::bc_decomposition_sel_windows_eq_remaining, 1 },
406 { C::bc_decomposition_sel, 1 },
407 { C::bc_decomposition_sel_windows_gt_remaining, 0 },
410 { C::bc_decomposition_sel, 1 },
411 { C::bc_decomposition_sel_windows_gt_remaining, 1 },
414 { C::bc_decomposition_last_of_contract, 1 },
415 { C::bc_decomposition_sel, 1 },
416 { C::bc_decomposition_sel_windows_gt_remaining, 1 },
422 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 0, 1);
428TEST(BytecodeDecompositionConstrainingTest, NegativeWrongBytesToReadNoCorrection)
430 TestTraceContainer
trace({
433 { C::bc_decomposition_bytes_remaining, 75 },
434 { C::bc_decomposition_sel, 1 },
439 trace.
set(C::bc_decomposition_bytes_to_read, 0, 75);
444TEST(BytecodeDecompositionConstrainingTest, NegativeWrongBytesToReadWithCorrection)
446 TestTraceContainer
trace({
448 { C::bc_decomposition_bytes_to_read, 13 },
449 { C::bc_decomposition_bytes_remaining, 13 },
450 { C::bc_decomposition_sel, 1 },
451 { C::bc_decomposition_sel_windows_gt_remaining, 1 },
461TEST(BytecodeDecompositionConstrainingTest, NegativeWrongPacking)
463 TestTraceContainer
trace;
466 { C::bc_decomposition_sel_packed, 1 },
467 { C::bc_decomposition_bytes, 0x12 },
468 { C::bc_decomposition_bytes_pc_plus_1, 0x34 },
469 { C::bc_decomposition_bytes_pc_plus_2, 0x56 },
470 { C::bc_decomposition_bytes_pc_plus_3, 0x78 },
471 { C::bc_decomposition_bytes_pc_plus_4, 0x9A },
472 { C::bc_decomposition_bytes_pc_plus_5, 0xBC },
473 { C::bc_decomposition_bytes_pc_plus_6, 0xDE },
474 { C::bc_decomposition_bytes_pc_plus_7, 0xF0 },
475 { C::bc_decomposition_bytes_pc_plus_8, 0x12 },
476 { C::bc_decomposition_bytes_pc_plus_9, 0x34 },
477 { C::bc_decomposition_bytes_pc_plus_10, 0x56 },
478 { C::bc_decomposition_bytes_pc_plus_11, 0x78 },
479 { C::bc_decomposition_bytes_pc_plus_12, 0x9A },
480 { C::bc_decomposition_bytes_pc_plus_13, 0xBC },
481 { C::bc_decomposition_bytes_pc_plus_14, 0xDE },
482 { C::bc_decomposition_bytes_pc_plus_15, 0xF0 },
483 { C::bc_decomposition_bytes_pc_plus_16, 0x12 },
484 { C::bc_decomposition_bytes_pc_plus_17, 0x34 },
485 { C::bc_decomposition_bytes_pc_plus_18, 0x56 },
486 { C::bc_decomposition_bytes_pc_plus_19, 0x78 },
487 { C::bc_decomposition_bytes_pc_plus_20, 0x9A },
488 { C::bc_decomposition_bytes_pc_plus_21, 0xBC },
489 { C::bc_decomposition_bytes_pc_plus_22, 0xDE },
490 { C::bc_decomposition_bytes_pc_plus_23, 0xF0 },
491 { C::bc_decomposition_bytes_pc_plus_24, 0x12 },
492 { C::bc_decomposition_bytes_pc_plus_25, 0x34 },
493 { C::bc_decomposition_bytes_pc_plus_26, 0x56 },
494 { C::bc_decomposition_bytes_pc_plus_27, 0x78 },
495 { C::bc_decomposition_bytes_pc_plus_28, 0x9A },
496 { C::bc_decomposition_bytes_pc_plus_29, 0xBC },
497 { C::bc_decomposition_bytes_pc_plus_30, 0xDE },
498 { C::bc_decomposition_packed_field,
501 FF(
"0x00123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE") },
505 trace.
set(C::bc_decomposition_bytes_pc_plus_20, 0, 0);
511TEST(BytecodeDecompositionConstrainingTest, NegativeSelPackedNotSel)
513 TestTraceContainer
trace;
516 { C::bc_decomposition_sel_packed, 1 },
517 { C::bc_decomposition_sel, 1 },
521 trace.
set(C::bc_decomposition_sel, 0, 0);
527TEST(BytecodeDecompositionConstrainingTest, NegativeSelPackedInit)
529 TestTraceContainer
trace;
535 set_perm_selectors(trace);
536 check_relation<bc_decomposition>(trace);
539 trace.
set(C::bc_decomposition_sel_packed, 1, 0);
540 trace.
set(C::bc_decomposition_sel_packed_read_0_, 1, 0);
546TEST(BytecodeDecompositionConstrainingTest, NegativeSelNotPacked)
548 TestTraceContainer
trace;
554 set_perm_selectors(trace);
555 check_relation<bc_decomposition>(trace);
558 ASSERT_EQ(
trace.
get(C::bc_decomposition_pc, 32), 31);
559 trace.
set(C::bc_decomposition_sel_packed, 32, 0);
560 trace.
set(C::bc_decomposition_sel_packed_read_1_, 32, 0);
566TEST(BytecodeDecompositionConstrainingTest, NegativeSelPacked)
568 TestTraceContainer
trace;
574 set_perm_selectors(trace);
575 check_relation<bc_decomposition>(trace);
578 trace.
set(C::bc_decomposition_sel_packed, 20, 1);
579 trace.
set(C::bc_decomposition_sel_packed_read_0_, 20, 1);
585TEST(BytecodeDecompositionConstrainingTest, NegativePackedPc)
587 TestTraceContainer
trace;
593 set_perm_selectors(trace);
594 check_relation<bc_decomposition>(trace);
597 ASSERT_EQ(
trace.
get(C::bc_decomposition_pc, 11), 10);
598 trace.
set(C::bc_decomposition_sel_packed, 11, 1);
599 trace.
set(C::bc_decomposition_sel_packed_read_0_, 11, 1);
600 trace.
set(C::bc_decomposition_next_packed_pc, 11, 10);
601 trace.
set(C::bc_decomposition_next_packed_pc_min_pc_inv, 11, 0);
607 " failed at row 10");
610 for (uint32_t i = 2; i < 11; i++) {
611 trace.
set(C::bc_decomposition_next_packed_pc, i, 10);
612 trace.
set(C::bc_decomposition_next_packed_pc_min_pc_inv, i,
FF(10 - i + 1).invert());
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
static constexpr size_t SR_NEXT_PACKED_PC_PROPAGATION
static constexpr size_t SR_PC_ZERO_INITIALIZATION
static constexpr size_t SR_START_AFTER_LATCH
static constexpr size_t SR_SEL_TOGGLED_AT_PACKED
static constexpr size_t SR_PC_IS_PACKED
static constexpr size_t SR_BC_DECOMPOSITION_REPACKING
static std::string get_subrelation_label(size_t index)
static constexpr size_t SR_BYTES_REMAINING_DECREMENTS
static constexpr size_t SR_SEL_PACKED_INIT
static constexpr size_t SR_SEL_WINDOWS_GT_REMAINING_PROPAGATION
static constexpr size_t SR_LAST_CONTRACT_BYTES_REM_ONE
static constexpr size_t SR_SEL_WINDOWS_GT_REMAINING_INIT
static constexpr size_t SR_PC_INCREMENTS
static constexpr size_t SR_BYTES_REM_NON_ZERO
static constexpr size_t SR_SEL_ON_START_OR_END
static constexpr size_t SR_ID_PROPAGATION
static constexpr size_t SR_SET_BYTES_TO_READ
void process_misc(TraceContainer &trace, const uint32_t num_rows=PRECOMPUTED_TRACE_SIZE)
Populate miscellaneous precomputed columns: first_row selector and idx (row index).
void process_sel_range_8(TraceContainer &trace)
Generate a selector column that activates the first 2^8 (256) rows.
const FF & get(Column col, uint32_t row) const
uint32_t get_num_rows() const
void set(Column col, uint32_t row, const FF &value, bool use_atomic_limbs=false)
PrecomputedTraceBuilder precomputed_builder
TEST(AvmFixedVKTests, FixedVKCommitments)
Test that the fixed VK commitments agree with the ones computed from precomputed columns.
std::vector< uint8_t > random_bytes(size_t n)
TestTraceContainer empty_trace()
constexpr uint32_t DECOMPOSE_WINDOW_SIZE
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept