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);
179 "BC_DEC_SEL_BYTES_REM_NON_ZERO");
182TEST(BytecodeDecompositionConstrainingTest, NegativeDeactivateLastContract)
184 TestTraceContainer
trace({
186 { C::bc_decomposition_bytes_rem_min_one_inv,
FF(2).invert() },
187 { C::bc_decomposition_bytes_remaining, 3 },
188 { C::bc_decomposition_sel, 1 },
191 { C::bc_decomposition_bytes_rem_min_one_inv, 1 },
192 { C::bc_decomposition_bytes_remaining, 2 },
193 { C::bc_decomposition_sel, 1 },
196 { C::bc_decomposition_bytes_rem_min_one_inv, 0 },
197 { C::bc_decomposition_last_of_contract, 1 },
198 { C::bc_decomposition_bytes_remaining, 1 },
199 { C::bc_decomposition_sel, 1 },
204 trace.
set(C::bc_decomposition_last_of_contract, 2, 0);
207 "BC_DEC_LAST_CONTRACT_BYTES_REM_ONE");
210TEST(BytecodeDecompositionConstrainingTest, NegativePcWrongInitializationFirstRow)
212 TestTraceContainer
trace({
213 { { C::precomputed_first_row, 1 } },
215 { C::bc_decomposition_pc, 0 },
216 { C::bc_decomposition_sel, 1 },
221 trace.
set(C::bc_decomposition_pc, 1, 7);
224 "BC_DEC_PC_ZERO_INITIALIZATION");
227TEST(BytecodeDecompositionConstrainingTest, NegativePcWrongInitializationInside)
229 TestTraceContainer
trace({
230 { { C::bc_decomposition_last_of_contract, 1 } },
232 { C::bc_decomposition_pc, 0 },
233 { C::bc_decomposition_sel, 1 },
238 trace.
set(C::bc_decomposition_pc, 1, 32);
241 "BC_DEC_PC_ZERO_INITIALIZATION");
244TEST(BytecodeDecompositionConstrainingTest, NegativePcWrongIncrement)
246 TestTraceContainer
trace({
248 { C::bc_decomposition_pc, 5 },
249 { C::bc_decomposition_sel, 1 },
252 { C::bc_decomposition_pc, 6 },
253 { C::bc_decomposition_sel, 1 },
256 { C::bc_decomposition_last_of_contract, 1 },
257 { C::bc_decomposition_pc, 7 },
258 { C::bc_decomposition_sel, 1 },
263 trace.
set(C::bc_decomposition_pc, 2, 6);
265 "BC_DEC_PC_INCREMENT");
268TEST(BytecodeDecompositionConstrainingTest, NegativeBytesRemWrongDecrement)
270 TestTraceContainer
trace({
272 { C::bc_decomposition_bytes_remaining, 5 },
273 { C::bc_decomposition_sel, 1 },
276 { C::bc_decomposition_bytes_remaining, 4 },
277 { C::bc_decomposition_sel, 1 },
280 { C::bc_decomposition_last_of_contract, 1 },
281 { C::bc_decomposition_bytes_remaining, 3 },
282 { C::bc_decomposition_sel, 1 },
287 trace.
set(C::bc_decomposition_bytes_remaining, 0, 4);
290 "BC_DEC_BYTES_REMAINING_DECREMENT");
293TEST(BytecodeDecompositionConstrainingTest, NegativeMutateBytecodeId)
295 TestTraceContainer
trace({
297 { C::bc_decomposition_id, 147 },
298 { C::bc_decomposition_sel, 1 },
301 { C::bc_decomposition_id, 147 },
302 { C::bc_decomposition_sel, 1 },
305 { C::bc_decomposition_last_of_contract, 1 },
306 { C::bc_decomposition_id, 147 },
307 { C::bc_decomposition_sel, 1 },
312 trace.
set(C::bc_decomposition_id, 2, 77);
314 "BC_DEC_ID_CONSTANT");
318TEST(BytecodeDecompositionConstrainingTest, SelWindowsGtRemainingInitialization)
320 TestTraceContainer
trace({
322 { C::bc_decomposition_last_of_contract, 1 },
323 { C::bc_decomposition_sel, 1 },
324 { C::bc_decomposition_sel_windows_gt_remaining, 1 },
330 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 0, 0);
333 "SEL_WINDOWS_GT_REMAINING_INIT");
337TEST(BytecodeDecompositionConstrainingTest, SelWindowsGtRemainingPropagation)
339 TestTraceContainer
trace({
341 { C::bc_decomposition_sel, 1 },
342 { C::bc_decomposition_sel_windows_gt_remaining, 1 },
345 { C::bc_decomposition_last_of_contract, 1 },
346 { C::bc_decomposition_sel, 1 },
347 { C::bc_decomposition_sel_windows_gt_remaining, 1 },
353 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 0, 0);
356 "SEL_WINDOWS_GT_REMAINING_PROPAGATION");
359 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 0, 1);
361 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 1, 0);
364 "SEL_WINDOWS_GT_REMAINING_PROPAGATION");
367 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 0, 0);
372TEST(BytecodeDecompositionConstrainingTest, SelWindowsGtRemainingPropagationWithMutation)
374 TestTraceContainer
trace({
376 { C::bc_decomposition_is_windows_eq_remaining, 1 },
377 { C::bc_decomposition_sel, 1 },
378 { C::bc_decomposition_sel_windows_gt_remaining, 0 },
381 { C::bc_decomposition_sel, 1 },
382 { C::bc_decomposition_sel_windows_gt_remaining, 1 },
385 { C::bc_decomposition_last_of_contract, 1 },
386 { C::bc_decomposition_sel, 1 },
387 { C::bc_decomposition_sel_windows_gt_remaining, 1 },
393 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 0, 1);
396 "SEL_WINDOWS_GT_REMAINING_PROPAGATION");
399TEST(BytecodeDecompositionConstrainingTest, NegativeWrongBytesToReadNoCorrection)
401 TestTraceContainer
trace({
404 { C::bc_decomposition_bytes_remaining, 75 },
405 { C::bc_decomposition_sel, 1 },
410 trace.
set(C::bc_decomposition_bytes_to_read, 0, 75);
412 "SET_BYTES_TO_READ");
415TEST(BytecodeDecompositionConstrainingTest, NegativeWrongBytesToReadWithCorrection)
417 TestTraceContainer
trace({
419 { C::bc_decomposition_bytes_to_read, 13 },
420 { C::bc_decomposition_bytes_remaining, 13 },
421 { C::bc_decomposition_sel, 1 },
422 { C::bc_decomposition_sel_windows_gt_remaining, 1 },
429 "SET_BYTES_TO_READ");
432TEST(BytecodeDecompositionConstrainingTest, NegativeWrongPacking)
434 TestTraceContainer
trace;
437 { C::bc_decomposition_sel_packed, 1 },
438 { C::bc_decomposition_bytes, 0x12 },
439 { C::bc_decomposition_bytes_pc_plus_1, 0x34 },
440 { C::bc_decomposition_bytes_pc_plus_2, 0x56 },
441 { C::bc_decomposition_bytes_pc_plus_3, 0x78 },
442 { C::bc_decomposition_bytes_pc_plus_4, 0x9A },
443 { C::bc_decomposition_bytes_pc_plus_5, 0xBC },
444 { C::bc_decomposition_bytes_pc_plus_6, 0xDE },
445 { C::bc_decomposition_bytes_pc_plus_7, 0xF0 },
446 { C::bc_decomposition_bytes_pc_plus_8, 0x12 },
447 { C::bc_decomposition_bytes_pc_plus_9, 0x34 },
448 { C::bc_decomposition_bytes_pc_plus_10, 0x56 },
449 { C::bc_decomposition_bytes_pc_plus_11, 0x78 },
450 { C::bc_decomposition_bytes_pc_plus_12, 0x9A },
451 { C::bc_decomposition_bytes_pc_plus_13, 0xBC },
452 { C::bc_decomposition_bytes_pc_plus_14, 0xDE },
453 { C::bc_decomposition_bytes_pc_plus_15, 0xF0 },
454 { C::bc_decomposition_bytes_pc_plus_16, 0x12 },
455 { C::bc_decomposition_bytes_pc_plus_17, 0x34 },
456 { C::bc_decomposition_bytes_pc_plus_18, 0x56 },
457 { C::bc_decomposition_bytes_pc_plus_19, 0x78 },
458 { C::bc_decomposition_bytes_pc_plus_20, 0x9A },
459 { C::bc_decomposition_bytes_pc_plus_21, 0xBC },
460 { C::bc_decomposition_bytes_pc_plus_22, 0xDE },
461 { C::bc_decomposition_bytes_pc_plus_23, 0xF0 },
462 { C::bc_decomposition_bytes_pc_plus_24, 0x12 },
463 { C::bc_decomposition_bytes_pc_plus_25, 0x34 },
464 { C::bc_decomposition_bytes_pc_plus_26, 0x56 },
465 { C::bc_decomposition_bytes_pc_plus_27, 0x78 },
466 { C::bc_decomposition_bytes_pc_plus_28, 0x9A },
467 { C::bc_decomposition_bytes_pc_plus_29, 0xBC },
468 { C::bc_decomposition_bytes_pc_plus_30, 0xDE },
469 { C::bc_decomposition_packed_field,
472 FF(
"0x00123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE") },
476 trace.
set(C::bc_decomposition_bytes_pc_plus_20, 0, 0);
478 "BC_DECOMPOSITION_REPACKING");
482TEST(BytecodeDecompositionConstrainingTest, NegativeSelPackedNotSel)
484 TestTraceContainer
trace;
487 { C::bc_decomposition_sel_packed, 1 },
488 { C::bc_decomposition_sel, 1 },
492 trace.
set(C::bc_decomposition_sel, 0, 0);
494 "SEL_TOGGLED_AT_PACKED");
498TEST(BytecodeDecompositionConstrainingTest, NegativeSelPackedInit)
500 TestTraceContainer
trace;
506 set_perm_selectors(
trace);
507 check_relation<bc_decomposition>(
trace);
510 trace.
set(C::bc_decomposition_sel_packed, 1, 0);
511 trace.
set(C::bc_decomposition_sel_packed_read_0_, 1, 0);
517TEST(BytecodeDecompositionConstrainingTest, NegativeSelNotPacked)
519 TestTraceContainer
trace;
525 set_perm_selectors(
trace);
526 check_relation<bc_decomposition>(
trace);
529 ASSERT_EQ(
trace.
get(C::bc_decomposition_pc, 32), 31);
530 trace.
set(C::bc_decomposition_sel_packed, 32, 0);
531 trace.
set(C::bc_decomposition_sel_packed_read_1_, 32, 0);
537TEST(BytecodeDecompositionConstrainingTest, NegativeSelPacked)
539 TestTraceContainer
trace;
545 set_perm_selectors(
trace);
546 check_relation<bc_decomposition>(
trace);
549 trace.
set(C::bc_decomposition_sel_packed, 20, 1);
550 trace.
set(C::bc_decomposition_sel_packed_read_0_, 20, 1);
556TEST(BytecodeDecompositionConstrainingTest, NegativePackedPc)
558 TestTraceContainer
trace;
564 set_perm_selectors(
trace);
565 check_relation<bc_decomposition>(
trace);
568 ASSERT_EQ(
trace.
get(C::bc_decomposition_pc, 11), 10);
569 trace.
set(C::bc_decomposition_sel_packed, 11, 1);
570 trace.
set(C::bc_decomposition_sel_packed_read_0_, 11, 1);
571 trace.
set(C::bc_decomposition_next_packed_pc, 11, 10);
572 trace.
set(C::bc_decomposition_next_packed_pc_min_pc_inv, 11, 0);
577 "NEXT_PACKED_PC_PROPAGATION failed at row 10");
580 for (uint32_t i = 2; i < 11; i++) {
581 trace.
set(C::bc_decomposition_next_packed_pc, i, 10);
582 trace.
set(C::bc_decomposition_next_packed_pc_min_pc_inv, i,
FF(10 - i + 1).invert());
585 "NEXT_PACKED_PC_PROPAGATION failed at row 1");
static constexpr size_t SR_NEXT_PACKED_PC_PROPAGATION
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_BC_DEC_LAST_CONTRACT_BYTES_REM_ONE
static constexpr size_t SR_SEL_PACKED_INIT
static constexpr size_t SR_SEL_WINDOWS_GT_REMAINING_PROPAGATION
static constexpr size_t SR_BC_DEC_PC_INCREMENT
static constexpr size_t SR_BC_DEC_SEL_BYTES_REM_NON_ZERO
static constexpr size_t SR_BC_DEC_PC_ZERO_INITIALIZATION
static constexpr size_t SR_SEL_WINDOWS_GT_REMAINING_INIT
static constexpr size_t SR_BC_DEC_ID_CONSTANT
static constexpr size_t SR_BC_DEC_BYTES_REMAINING_DECREMENT
static constexpr size_t SR_SET_BYTES_TO_READ
void process_misc(TraceContainer &trace, const uint32_t num_rows=MAX_AVM_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
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
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