1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
21using simulation::MemoryEvent;
22using simulation::RangeCheckEvent;
24using tracegen::MemoryTraceBuilder;
25using tracegen::PrecomputedTraceBuilder;
26using tracegen::RangeCheckTraceBuilder;
27using tracegen::TestTraceContainer;
32TEST(MemoryConstrainingTest, EmptyRow)
38TEST(MemoryConstrainingTest, MultipleEventsWithTraceGen)
40 TestTraceContainer
trace;
41 MemoryTraceBuilder memory_trace_builder;
42 PrecomputedTraceBuilder precomputed_trace_builder;
43 RangeCheckTraceBuilder range_check_trace_builder;
48 .execution_clk = 13787,
56 .execution_clk = 13787,
64 .execution_clk = 13788,
72 .execution_clk = 25000,
104 .execution_clk = 765,
136 precomputed_trace_builder.process_sel_range_8(trace);
137 precomputed_trace_builder.process_sel_range_16(trace);
138 precomputed_trace_builder.process_misc(trace, 1 << 16);
139 precomputed_trace_builder.process_tag_parameters(trace);
140 range_check_trace_builder.process(range_check_events, trace);
141 memory_trace_builder.process(mem_events, trace);
145 [&](uint32_t row,
const FF&) {
trace.
set(Column::memory_sel_register_op_0_, row, 1); });
147 check_relation<memory>(trace);
148 check_all_interactions<MemoryTraceBuilder>(trace);
152TEST(MemoryConstrainingTest, ContiguousTrace)
154 TestTraceContainer
trace({
155 { { C::precomputed_first_row, 1 }, { C::memory_sel, 0 } },
156 { { C::memory_sel, 1 } },
157 { { C::memory_sel, 1 } },
158 { { C::memory_sel, 1 } },
159 { { C::memory_sel, 0 } },
170TEST(MemoryConstrainingTest, SelRngChk)
172 TestTraceContainer
trace({
173 { { C::memory_sel, 1 }, { C::memory_sel_rng_chk, 1 } },
174 { { C::memory_sel, 1 }, { C::memory_sel_rng_chk, 1 } },
175 { { C::memory_sel, 1 }, { C::memory_sel_rng_chk, 0 } },
176 { { C::memory_sel, 0 }, { C::memory_sel_rng_chk, 0 } },
182 trace.
set(C::memory_sel_rng_chk, 1, 0);
186 trace.
set(C::memory_sel_rng_chk, 1, 1);
189 trace.
set(C::memory_sel_rng_chk, 0, 0);
193 trace.
set(C::memory_sel_rng_chk, 0, 1);
196 trace.
set(C::memory_sel_rng_chk, 2, 1);
201TEST(MemoryConstrainingTest, LastAccess)
204 TestTraceContainer
trace({
205 { { C::memory_sel_rng_chk, 1 },
206 { C::memory_address, 12345 },
207 { C::memory_last_access, 1 },
208 { C::memory_glob_addr_diff_inv, 1 } },
209 { { C::memory_sel_rng_chk, 1 }, { C::memory_address, 12346 }, { C::memory_last_access, 0 } },
210 { { C::memory_sel_rng_chk, 1 }, { C::memory_address, 12346 }, { C::memory_last_access, 0 } },
211 { { C::memory_sel_rng_chk, 1 },
212 { C::memory_address, 12346 },
213 { C::memory_last_access, 1 },
214 { C::memory_glob_addr_diff_inv, 1 } },
215 { { C::memory_sel_rng_chk, 0 },
216 { C::memory_address, 12347 },
217 { C::memory_last_access, 1 },
218 { C::memory_glob_addr_diff_inv, 1 } },
224 trace.
set(C::memory_last_access, 0, 0);
228 trace.
set(C::memory_last_access, 0, 1);
232 trace.
set(C::memory_glob_addr_diff_inv, 0, 0);
236 trace.
set(C::memory_glob_addr_diff_inv, 0, 1);
240 trace.
set(C::memory_last_access, 2, 1);
245TEST(MemoryConstrainingTest, DiffWithLastAccess)
249 TestTraceContainer
trace({
250 { { C::memory_sel_rng_chk, 1 },
251 { C::memory_address, 12345 },
252 { C::memory_last_access, 1 },
253 { C::memory_diff, 10000 },
254 { C::memory_clk, 38 },
255 { C::memory_rw, 1 } },
256 { { C::memory_sel_rng_chk, 1 },
257 { C::memory_address, 22345 },
258 { C::memory_last_access, 1 },
259 { C::memory_diff, 12 },
260 { C::memory_clk, 127 },
261 { C::memory_rw, 1 } },
262 { { C::memory_sel_rng_chk, 1 },
263 { C::memory_address, 22357 },
264 { C::memory_last_access, 1 },
265 { C::memory_diff,
FF(-22357) },
266 { C::memory_clk, 130 },
267 { C::memory_rw, 1 } },
268 { { C::memory_sel_rng_chk, 0 }, { C::memory_last_access, 0 } },
280TEST(MemoryConstrainingTest, DiffWithoutLastAccess)
288 TestTraceContainer
trace({
289 { { C::memory_sel_rng_chk, 1 }, { C::memory_clk, 38 }, { C::memory_rw, 1 }, { C::memory_diff, 1 } },
290 { { C::memory_sel_rng_chk, 1 }, { C::memory_clk, 39 }, { C::memory_rw, 1 }, { C::memory_diff, 8701 } },
291 { { C::memory_sel_rng_chk, 1 }, { C::memory_clk, 4390 }, { C::memory_rw, 0 }, { C::memory_diff, 10000 } },
292 { { C::memory_sel_rng_chk, 1 }, { C::memory_clk, 9390 }, { C::memory_rw, 0 }, { C::memory_diff, 1 } },
293 { { C::memory_sel_rng_chk, 1 }, { C::memory_clk, 9390 }, { C::memory_rw, 1 }, { C::memory_diff,
FF(-18781) } },
294 { { C::memory_sel_rng_chk, 0 }, { C::memory_last_access, 0 } },
313TEST(MemoryConstrainingTest, DiffDecomp)
315 TestTraceContainer
trace({
316 { { C::memory_diff, 87 }, { C::memory_limb_0_, 87 }, { C::memory_limb_1_, 0 }, { C::memory_limb_2_, 0 } },
317 { { C::memory_diff, 1ULL << 16 },
318 { C::memory_limb_0_, 0 },
319 { C::memory_limb_1_, 1 },
320 { C::memory_limb_2_, 0 } },
321 { { C::memory_diff, 1ULL << 32 },
322 { C::memory_limb_0_, 0 },
323 { C::memory_limb_1_, 0 },
324 { C::memory_limb_2_, 1 } },
325 { { C::memory_diff, UINT64_MAX >> 16 },
326 { C::memory_limb_0_, UINT16_MAX },
327 { C::memory_limb_1_, UINT16_MAX },
328 { C::memory_limb_2_, UINT16_MAX } },
355TEST(MemoryConstrainingTest, MemoryInitValueFirstRow)
357 TestTraceContainer
trace({
358 { { C::precomputed_first_row, 1 } },
359 { { C::memory_sel, 1 }, { C::memory_value, 0 }, { C::memory_tag,
static_cast<uint8_t
>(
MemoryTag::FF) } },
378TEST(MemoryConstrainingTest, MemoryInitValueLastAccess)
380 TestTraceContainer
trace({
381 { { C::memory_sel, 1 }, { C::memory_last_access, 1 } },
382 { { C::memory_sel, 1 }, { C::memory_value, 0 }, { C::memory_tag,
static_cast<uint8_t
>(
MemoryTag::FF) } },
401TEST(MemoryConstrainingTest, ReadWriteConsistency)
403 TestTraceContainer
trace({
404 { { C::memory_sel, 1 },
406 { C::memory_value, 12 },
408 { { C::memory_sel, 1 },
410 { C::memory_value, 12 },
412 { { C::memory_sel, 1 },
414 { C::memory_value, 17 },
416 { { C::memory_sel, 1 },
418 { C::memory_value, 12345 },
420 { { C::memory_sel, 1 },
422 { C::memory_value, 12345 },
424 { { C::memory_sel, 1 },
425 { C::memory_last_access, 1 },
427 { C::memory_value, 12345 },
436 "READ_WRITE_CONSISTENCY_VALUE");
445 "READ_WRITE_CONSISTENCY_TAG");
449TEST(MemoryConstrainingTest, TagIsFF)
451 TestTraceContainer
trace({
452 { { C::memory_sel, 1 },
454 { C::memory_sel_tag_is_ff, 1 } },
455 { { C::memory_sel, 1 },
457 { C::memory_sel_tag_is_ff, 0 },
458 { C::memory_tag_ff_diff_inv,
460 { { C::memory_sel, 1 },
462 { C::memory_sel_tag_is_ff, 0 },
463 { C::memory_tag_ff_diff_inv,
465 { { C::memory_sel, 1 },
467 { C::memory_sel_tag_is_ff, 0 },
468 { C::memory_tag_ff_diff_inv,
470 { { C::memory_sel, 1 },
472 { C::memory_sel_tag_is_ff, 0 },
473 { C::memory_tag_ff_diff_inv,
475 { { C::memory_sel, 1 },
477 { C::memory_sel_tag_is_ff, 0 },
478 { C::memory_tag_ff_diff_inv,
480 { { C::memory_sel, 1 },
482 { C::memory_sel_tag_is_ff, 0 },
483 { C::memory_tag_ff_diff_inv,
490 trace.
set(C::memory_sel_tag_is_ff, 0, 0);
494 trace.
set(C::memory_tag_ff_diff_inv, 0, 1);
498 trace.
set(C::memory_sel_tag_is_ff, 0, 1);
499 trace.
set(C::memory_tag_ff_diff_inv, 0, 0);
503 trace.
set(C::memory_sel_tag_is_ff, 1, 1);
507 trace.
set(C::memory_tag_ff_diff_inv, 1, 0);
512TEST(MemoryConstrainingTest, SelRngWrite)
514 TestTraceContainer
trace({
515 { { C::memory_sel, 1 }, { C::memory_rw, 1 }, { C::memory_sel_tag_is_ff, 1 }, { C::memory_sel_rng_write, 0 } },
516 { { C::memory_sel, 1 }, { C::memory_rw, 1 }, { C::memory_sel_tag_is_ff, 0 }, { C::memory_sel_rng_write, 1 } },
517 { { C::memory_sel, 1 }, { C::memory_rw, 0 }, { C::memory_sel_tag_is_ff, 1 }, { C::memory_sel_rng_write, 0 } },
518 { { C::memory_sel, 1 }, { C::memory_rw, 0 }, { C::memory_sel_tag_is_ff, 0 }, { C::memory_sel_rng_write, 0 } },
525TEST(MemoryConstrainingTest, NegativeWriteValueOutOfRange)
527 TestTraceContainer
trace({
528 { { C::memory_sel, 1 },
530 { C::memory_value, 12345 },
532 { C::memory_sel_rng_write, 1 },
533 { C::memory_max_bits, 128 },
534 { C::range_check_sel, 1 },
535 { C::range_check_value, 12345 },
536 { C::range_check_rng_chk_bits, 128 } },
539 check_interaction<MemoryTraceBuilder, lookup_memory_range_check_write_tagged_value_settings>(trace);
544 (check_interaction<MemoryTraceBuilder, lookup_memory_range_check_write_tagged_value_settings>(trace)),
545 "Failed.*RANGE_CHECK_WRITE_TAGGED_VALUE. Could not find tuple in destination.");
549TEST(MemoryConstrainingTest, NegativeMaxBitsOutOfRange)
551 TestTraceContainer
trace({
552 { { C::memory_sel, 1 },
553 { C::memory_sel_rng_write, 1 },
555 { C::memory_max_bits, 32 } },
558 PrecomputedTraceBuilder precomputed_trace_builder;
559 precomputed_trace_builder.process_tag_parameters(trace);
560 precomputed_trace_builder.process_misc(trace, 100);
562 check_interaction<MemoryTraceBuilder, lookup_memory_tag_max_bits_settings>(trace);
567 "Failed.*LOOKUP_MEMORY_TAG_MAX_BITS. Could not find tuple in destination.");
571TEST(MemoryConstrainingTest, NegativeDiffLimbOutOfRange)
573 TestTraceContainer
trace({
574 { { C::memory_sel, 1 },
575 { C::memory_sel_rng_chk, 1 },
576 { C::memory_limb_0_, UINT16_MAX },
577 { C::memory_limb_1_, UINT16_MAX },
578 { C::memory_limb_2_, UINT16_MAX } },
581 PrecomputedTraceBuilder precomputed_trace_builder;
582 precomputed_trace_builder.process_misc(trace, 1 << 16);
583 precomputed_trace_builder.process_sel_range_16(trace);
591 trace.
set(C::memory_limb_0_, 0, UINT16_MAX + 1);
593 "Failed.*RANGE_CHECK_LIMB_0. Could not find tuple in destination.");
595 check_interaction<MemoryTraceBuilder, lookup_memory_range_check_limb_1_settings>(trace);
598 trace.
set(C::memory_limb_1_, 0, UINT16_MAX + 1);
600 "Failed.*RANGE_CHECK_LIMB_1. Could not find tuple in destination.");
602 check_interaction<MemoryTraceBuilder, lookup_memory_range_check_limb_2_settings>(trace);
605 trace.
set(C::memory_limb_2_, 0, UINT16_MAX + 1);
607 "Failed.*RANGE_CHECK_LIMB_2. Could not find tuple in destination.");
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
static TaggedValue from_tag(ValueTag tag, FF value)
static constexpr size_t SR_TAG_IS_FF
static constexpr size_t SR_READ_WRITE_CONSISTENCY_TAG
static constexpr size_t SR_DIFF
static constexpr size_t SR_LAST_ACCESS
static constexpr size_t SR_READ_WRITE_CONSISTENCY_VALUE
static constexpr size_t SR_MEMORY_INIT_TAG
static constexpr size_t SR_MEMORY_INIT_VALUE
static constexpr size_t SR_SEL_RNG_WRITE
static constexpr size_t SR_DIFF_DECOMP
static constexpr size_t SR_MEM_CONTINUITY
static constexpr size_t SR_SEL_RNG_CHK
const FF & get(Column col, uint32_t row) const
void visit_column(Column col, const std::function< void(uint32_t, const FF &)> &visitor) const
void set(Column col, uint32_t row, const FF &value)
void check_interaction(tracegen::TestTraceContainer &trace)
TEST(AvmFixedVKTests, FixedVKCommitments)
Test that the fixed VK commitments agree with the ones computed from precomputed columns.
TestTraceContainer empty_trace()
lookup_settings< lookup_memory_range_check_limb_0_settings_ > lookup_memory_range_check_limb_0_settings
lookup_settings< lookup_memory_range_check_limb_1_settings_ > lookup_memory_range_check_limb_1_settings
lookup_settings< lookup_memory_range_check_limb_2_settings_ > lookup_memory_range_check_limb_2_settings
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
static constexpr uint256_t modulus