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);
178 "BYTES_REM_NON_ZERO");
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);
205 "LAST_CONTRACT_BYTES_REM_ONE");
208TEST(BytecodeDecompositionConstrainingTest, NegativeDeactivateStart)
210 TestTraceContainer
trace({
211 { { C::precomputed_first_row, 1 } },
213 { C::bc_decomposition_pc, 0 },
214 { C::bc_decomposition_sel, 1 },
215 { C::bc_decomposition_start, 1 },
220 trace.
set(C::bc_decomposition_start, 1, 0);
222 "START_AFTER_LATCH");
225TEST(BytecodeDecompositionConstrainingTest, NegativeStartEndNotSel)
227 TestTraceContainer
trace({ { { C::precomputed_first_row, 1 } },
229 { C::bc_decomposition_sel, 1 },
230 { C::bc_decomposition_start, 1 },
233 { C::bc_decomposition_last_of_contract, 1 },
234 { C::bc_decomposition_sel, 1 },
238 trace.
set(C::bc_decomposition_sel, 1, 0);
240 "SEL_ON_START_OR_END");
241 trace.
set(C::bc_decomposition_sel, 1, 1);
242 trace.
set(C::bc_decomposition_sel, 2, 0);
244 "SEL_ON_START_OR_END");
247TEST(BytecodeDecompositionConstrainingTest, NegativePcWrongInitializationFirstRow)
249 TestTraceContainer
trace({
250 { { C::precomputed_first_row, 1 } },
251 { { C::bc_decomposition_pc, 0 }, { C::bc_decomposition_sel, 1 }, { C::bc_decomposition_start, 1 } },
255 trace.
set(C::bc_decomposition_pc, 1, 7);
257 "PC_ZERO_INITIALIZATION");
260TEST(BytecodeDecompositionConstrainingTest, NegativePcWrongInitializationInside)
262 TestTraceContainer
trace({
263 { { C::bc_decomposition_last_of_contract, 1 } },
264 { { C::bc_decomposition_pc, 0 }, { C::bc_decomposition_sel, 1 }, { C::bc_decomposition_start, 1 } },
268 trace.
set(C::bc_decomposition_pc, 1, 32);
270 "PC_ZERO_INITIALIZATION");
273TEST(BytecodeDecompositionConstrainingTest, NegativePcWrongIncrement)
275 TestTraceContainer
trace({
277 { C::bc_decomposition_pc, 5 },
278 { C::bc_decomposition_sel, 1 },
281 { C::bc_decomposition_pc, 6 },
282 { C::bc_decomposition_sel, 1 },
285 { C::bc_decomposition_last_of_contract, 1 },
286 { C::bc_decomposition_pc, 7 },
287 { C::bc_decomposition_sel, 1 },
292 trace.
set(C::bc_decomposition_pc, 2, 6);
297TEST(BytecodeDecompositionConstrainingTest, NegativeBytesRemWrongDecrement)
299 TestTraceContainer
trace({
301 { C::bc_decomposition_bytes_remaining, 5 },
302 { C::bc_decomposition_sel, 1 },
305 { C::bc_decomposition_bytes_remaining, 4 },
306 { C::bc_decomposition_sel, 1 },
309 { C::bc_decomposition_last_of_contract, 1 },
310 { C::bc_decomposition_bytes_remaining, 3 },
311 { C::bc_decomposition_sel, 1 },
316 trace.
set(C::bc_decomposition_bytes_remaining, 0, 4);
318 "BYTES_REMAINING_DECREMENTS");
321TEST(BytecodeDecompositionConstrainingTest, NegativeMutateBytecodeId)
323 TestTraceContainer
trace({
325 { C::bc_decomposition_id, 147 },
326 { C::bc_decomposition_sel, 1 },
329 { C::bc_decomposition_id, 147 },
330 { C::bc_decomposition_sel, 1 },
333 { C::bc_decomposition_last_of_contract, 1 },
334 { C::bc_decomposition_id, 147 },
335 { C::bc_decomposition_sel, 1 },
340 trace.
set(C::bc_decomposition_id, 2, 77);
346TEST(BytecodeDecompositionConstrainingTest, SelWindowsGtRemainingInitialization)
348 TestTraceContainer
trace({
350 { C::bc_decomposition_last_of_contract, 1 },
351 { C::bc_decomposition_sel, 1 },
352 { C::bc_decomposition_sel_windows_gt_remaining, 1 },
358 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 0, 0);
361 "SEL_WINDOWS_GT_REMAINING_INIT");
365TEST(BytecodeDecompositionConstrainingTest, SelWindowsGtRemainingPropagation)
367 TestTraceContainer
trace({
369 { C::bc_decomposition_sel, 1 },
370 { C::bc_decomposition_sel_windows_gt_remaining, 1 },
373 { C::bc_decomposition_last_of_contract, 1 },
374 { C::bc_decomposition_sel, 1 },
375 { C::bc_decomposition_sel_windows_gt_remaining, 1 },
381 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 0, 0);
384 "SEL_WINDOWS_GT_REMAINING_PROPAGATION");
387 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 0, 1);
389 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 1, 0);
392 "SEL_WINDOWS_GT_REMAINING_PROPAGATION");
395 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 0, 0);
400TEST(BytecodeDecompositionConstrainingTest, SelWindowsGtRemainingPropagationWithMutation)
402 TestTraceContainer
trace({
404 { C::bc_decomposition_sel_windows_eq_remaining, 1 },
405 { C::bc_decomposition_sel, 1 },
406 { C::bc_decomposition_sel_windows_gt_remaining, 0 },
409 { C::bc_decomposition_sel, 1 },
410 { C::bc_decomposition_sel_windows_gt_remaining, 1 },
413 { C::bc_decomposition_last_of_contract, 1 },
414 { C::bc_decomposition_sel, 1 },
415 { C::bc_decomposition_sel_windows_gt_remaining, 1 },
421 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 0, 1);
424 "SEL_WINDOWS_GT_REMAINING_PROPAGATION");
427TEST(BytecodeDecompositionConstrainingTest, NegativeWrongBytesToReadNoCorrection)
429 TestTraceContainer
trace({
432 { C::bc_decomposition_bytes_remaining, 75 },
433 { C::bc_decomposition_sel, 1 },
438 trace.
set(C::bc_decomposition_bytes_to_read, 0, 75);
440 "SET_BYTES_TO_READ");
443TEST(BytecodeDecompositionConstrainingTest, NegativeWrongBytesToReadWithCorrection)
445 TestTraceContainer
trace({
447 { C::bc_decomposition_bytes_to_read, 13 },
448 { C::bc_decomposition_bytes_remaining, 13 },
449 { C::bc_decomposition_sel, 1 },
450 { C::bc_decomposition_sel_windows_gt_remaining, 1 },
457 "SET_BYTES_TO_READ");
460TEST(BytecodeDecompositionConstrainingTest, NegativeWrongPacking)
462 TestTraceContainer
trace;
465 { C::bc_decomposition_sel_packed, 1 },
466 { C::bc_decomposition_bytes, 0x12 },
467 { C::bc_decomposition_bytes_pc_plus_1, 0x34 },
468 { C::bc_decomposition_bytes_pc_plus_2, 0x56 },
469 { C::bc_decomposition_bytes_pc_plus_3, 0x78 },
470 { C::bc_decomposition_bytes_pc_plus_4, 0x9A },
471 { C::bc_decomposition_bytes_pc_plus_5, 0xBC },
472 { C::bc_decomposition_bytes_pc_plus_6, 0xDE },
473 { C::bc_decomposition_bytes_pc_plus_7, 0xF0 },
474 { C::bc_decomposition_bytes_pc_plus_8, 0x12 },
475 { C::bc_decomposition_bytes_pc_plus_9, 0x34 },
476 { C::bc_decomposition_bytes_pc_plus_10, 0x56 },
477 { C::bc_decomposition_bytes_pc_plus_11, 0x78 },
478 { C::bc_decomposition_bytes_pc_plus_12, 0x9A },
479 { C::bc_decomposition_bytes_pc_plus_13, 0xBC },
480 { C::bc_decomposition_bytes_pc_plus_14, 0xDE },
481 { C::bc_decomposition_bytes_pc_plus_15, 0xF0 },
482 { C::bc_decomposition_bytes_pc_plus_16, 0x12 },
483 { C::bc_decomposition_bytes_pc_plus_17, 0x34 },
484 { C::bc_decomposition_bytes_pc_plus_18, 0x56 },
485 { C::bc_decomposition_bytes_pc_plus_19, 0x78 },
486 { C::bc_decomposition_bytes_pc_plus_20, 0x9A },
487 { C::bc_decomposition_bytes_pc_plus_21, 0xBC },
488 { C::bc_decomposition_bytes_pc_plus_22, 0xDE },
489 { C::bc_decomposition_bytes_pc_plus_23, 0xF0 },
490 { C::bc_decomposition_bytes_pc_plus_24, 0x12 },
491 { C::bc_decomposition_bytes_pc_plus_25, 0x34 },
492 { C::bc_decomposition_bytes_pc_plus_26, 0x56 },
493 { C::bc_decomposition_bytes_pc_plus_27, 0x78 },
494 { C::bc_decomposition_bytes_pc_plus_28, 0x9A },
495 { C::bc_decomposition_bytes_pc_plus_29, 0xBC },
496 { C::bc_decomposition_bytes_pc_plus_30, 0xDE },
497 { C::bc_decomposition_packed_field,
500 FF(
"0x00123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE") },
504 trace.
set(C::bc_decomposition_bytes_pc_plus_20, 0, 0);
506 "BC_DECOMPOSITION_REPACKING");
510TEST(BytecodeDecompositionConstrainingTest, NegativeSelPackedNotSel)
512 TestTraceContainer
trace;
515 { C::bc_decomposition_sel_packed, 1 },
516 { C::bc_decomposition_sel, 1 },
520 trace.
set(C::bc_decomposition_sel, 0, 0);
522 "SEL_TOGGLED_AT_PACKED");
526TEST(BytecodeDecompositionConstrainingTest, NegativeSelPackedInit)
528 TestTraceContainer
trace;
534 set_perm_selectors(trace);
535 check_relation<bc_decomposition>(trace);
538 trace.
set(C::bc_decomposition_sel_packed, 1, 0);
539 trace.
set(C::bc_decomposition_sel_packed_read_0_, 1, 0);
545TEST(BytecodeDecompositionConstrainingTest, NegativeSelNotPacked)
547 TestTraceContainer
trace;
553 set_perm_selectors(trace);
554 check_relation<bc_decomposition>(trace);
557 ASSERT_EQ(
trace.
get(C::bc_decomposition_pc, 32), 31);
558 trace.
set(C::bc_decomposition_sel_packed, 32, 0);
559 trace.
set(C::bc_decomposition_sel_packed_read_1_, 32, 0);
565TEST(BytecodeDecompositionConstrainingTest, NegativeSelPacked)
567 TestTraceContainer
trace;
573 set_perm_selectors(trace);
574 check_relation<bc_decomposition>(trace);
577 trace.
set(C::bc_decomposition_sel_packed, 20, 1);
578 trace.
set(C::bc_decomposition_sel_packed_read_0_, 20, 1);
584TEST(BytecodeDecompositionConstrainingTest, NegativePackedPc)
586 TestTraceContainer
trace;
592 set_perm_selectors(trace);
593 check_relation<bc_decomposition>(trace);
596 ASSERT_EQ(
trace.
get(C::bc_decomposition_pc, 11), 10);
597 trace.
set(C::bc_decomposition_sel_packed, 11, 1);
598 trace.
set(C::bc_decomposition_sel_packed_read_0_, 11, 1);
599 trace.
set(C::bc_decomposition_next_packed_pc, 11, 10);
600 trace.
set(C::bc_decomposition_next_packed_pc_min_pc_inv, 11, 0);
605 "NEXT_PACKED_PC_PROPAGATION failed at row 10");
608 for (uint32_t i = 2; i < 11; i++) {
609 trace.
set(C::bc_decomposition_next_packed_pc, i, 10);
610 trace.
set(C::bc_decomposition_next_packed_pc_min_pc_inv, i,
FF(10 - i + 1).invert());
613 "NEXT_PACKED_PC_PROPAGATION failed at row 1");
#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 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)
void process_sel_range_8(TraceContainer &trace)
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)
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