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 } },
171TEST(MemoryConstrainingTest, SelRngChk)
173 TestTraceContainer
trace({
174 { { C::memory_sel, 1 }, { C::memory_sel_rng_chk, 1 } },
175 { { C::memory_sel, 1 }, { C::memory_sel_rng_chk, 1 } },
176 { { C::memory_sel, 1 }, { C::memory_sel_rng_chk, 0 } },
177 { { C::memory_sel, 0 }, { C::memory_sel_rng_chk, 0 } },
183 trace.
set(C::memory_sel_rng_chk, 1, 0);
188 trace.
set(C::memory_sel_rng_chk, 1, 1);
191 trace.
set(C::memory_sel_rng_chk, 0, 0);
196 trace.
set(C::memory_sel_rng_chk, 0, 1);
199 trace.
set(C::memory_sel_rng_chk, 2, 1);
205TEST(MemoryConstrainingTest, LastAccess)
208 TestTraceContainer
trace({
209 { { C::memory_sel_rng_chk, 1 },
210 { C::memory_address, 12345 },
211 { C::memory_last_access, 1 },
212 { C::memory_glob_addr_diff_inv, 1 } },
213 { { C::memory_sel_rng_chk, 1 }, { C::memory_address, 12346 }, { C::memory_last_access, 0 } },
214 { { C::memory_sel_rng_chk, 1 }, { C::memory_address, 12346 }, { C::memory_last_access, 0 } },
215 { { C::memory_sel_rng_chk, 1 },
216 { C::memory_address, 12346 },
217 { C::memory_last_access, 1 },
218 { C::memory_glob_addr_diff_inv, 1 } },
219 { { C::memory_sel_rng_chk, 0 },
220 { C::memory_address, 12347 },
221 { C::memory_last_access, 1 },
222 { C::memory_glob_addr_diff_inv, 1 } },
228 trace.
set(C::memory_last_access, 0, 0);
233 trace.
set(C::memory_last_access, 0, 1);
237 trace.
set(C::memory_glob_addr_diff_inv, 0, 0);
242 trace.
set(C::memory_glob_addr_diff_inv, 0, 1);
246 trace.
set(C::memory_last_access, 2, 1);
252TEST(MemoryConstrainingTest, DiffWithLastAccess)
256 TestTraceContainer
trace({
257 { { C::memory_sel_rng_chk, 1 },
258 { C::memory_address, 12345 },
259 { C::memory_last_access, 1 },
260 { C::memory_diff, 10000 },
261 { C::memory_clk, 38 },
262 { C::memory_rw, 1 } },
263 { { C::memory_sel_rng_chk, 1 },
264 { C::memory_address, 22345 },
265 { C::memory_last_access, 1 },
266 { C::memory_diff, 12 },
267 { C::memory_clk, 127 },
268 { C::memory_rw, 1 } },
269 { { C::memory_sel_rng_chk, 1 },
270 { C::memory_address, 22357 },
271 { C::memory_last_access, 1 },
272 { C::memory_diff,
FF(-22357) },
273 { C::memory_clk, 130 },
274 { C::memory_rw, 1 } },
275 { { C::memory_sel_rng_chk, 0 }, { C::memory_last_access, 0 } },
288TEST(MemoryConstrainingTest, DiffWithoutLastAccess)
296 TestTraceContainer
trace({
297 { { C::memory_sel_rng_chk, 1 }, { C::memory_clk, 38 }, { C::memory_rw, 1 }, { C::memory_diff, 1 } },
298 { { C::memory_sel_rng_chk, 1 }, { C::memory_clk, 39 }, { C::memory_rw, 1 }, { C::memory_diff, 8701 } },
299 { { C::memory_sel_rng_chk, 1 }, { C::memory_clk, 4390 }, { C::memory_rw, 0 }, { C::memory_diff, 10000 } },
300 { { C::memory_sel_rng_chk, 1 }, { C::memory_clk, 9390 }, { C::memory_rw, 0 }, { C::memory_diff, 1 } },
301 { { C::memory_sel_rng_chk, 1 }, { C::memory_clk, 9390 }, { C::memory_rw, 1 }, { C::memory_diff,
FF(-18781) } },
302 { { C::memory_sel_rng_chk, 0 }, { C::memory_last_access, 0 } },
323TEST(MemoryConstrainingTest, DiffDecomp)
325 TestTraceContainer
trace({
326 { { C::memory_diff, 87 }, { C::memory_limb_0_, 87 }, { C::memory_limb_1_, 0 }, { C::memory_limb_2_, 0 } },
327 { { C::memory_diff, 1ULL << 16 },
328 { C::memory_limb_0_, 0 },
329 { C::memory_limb_1_, 1 },
330 { C::memory_limb_2_, 0 } },
331 { { C::memory_diff, 1ULL << 32 },
332 { C::memory_limb_0_, 0 },
333 { C::memory_limb_1_, 0 },
334 { C::memory_limb_2_, 1 } },
335 { { C::memory_diff, UINT64_MAX >> 16 },
336 { C::memory_limb_0_, UINT16_MAX },
337 { C::memory_limb_1_, UINT16_MAX },
338 { C::memory_limb_2_, UINT16_MAX } },
368TEST(MemoryConstrainingTest, MemoryInitValueFirstRow)
370 TestTraceContainer
trace({
371 { { C::precomputed_first_row, 1 } },
372 { { C::memory_sel, 1 }, { C::memory_value, 0 }, { C::memory_tag,
static_cast<uint8_t
>(
MemoryTag::FF) } },
393TEST(MemoryConstrainingTest, MemoryInitValueLastAccess)
395 TestTraceContainer
trace({
396 { { C::memory_sel, 1 }, { C::memory_last_access, 1 } },
397 { { C::memory_sel, 1 }, { C::memory_value, 0 }, { C::memory_tag,
static_cast<uint8_t
>(
MemoryTag::FF) } },
418TEST(MemoryConstrainingTest, ReadWriteConsistency)
420 TestTraceContainer
trace({
421 { { C::memory_sel, 1 },
423 { C::memory_value, 12 },
425 { { C::memory_sel, 1 },
427 { C::memory_value, 12 },
429 { { C::memory_sel, 1 },
431 { C::memory_value, 17 },
433 { { C::memory_sel, 1 },
435 { C::memory_value, 12345 },
437 { { C::memory_sel, 1 },
439 { C::memory_value, 12345 },
441 { { C::memory_sel, 1 },
442 { C::memory_last_access, 1 },
444 { C::memory_value, 12345 },
466TEST(MemoryConstrainingTest, TagIsFF)
468 TestTraceContainer
trace({
469 { { C::memory_sel, 1 },
471 { C::memory_sel_tag_is_ff, 1 } },
472 { { C::memory_sel, 1 },
474 { C::memory_sel_tag_is_ff, 0 },
475 { C::memory_tag_ff_diff_inv,
477 { { C::memory_sel, 1 },
479 { C::memory_sel_tag_is_ff, 0 },
480 { C::memory_tag_ff_diff_inv,
482 { { C::memory_sel, 1 },
484 { C::memory_sel_tag_is_ff, 0 },
485 { C::memory_tag_ff_diff_inv,
487 { { C::memory_sel, 1 },
489 { C::memory_sel_tag_is_ff, 0 },
490 { C::memory_tag_ff_diff_inv,
492 { { C::memory_sel, 1 },
494 { C::memory_sel_tag_is_ff, 0 },
495 { C::memory_tag_ff_diff_inv,
497 { { C::memory_sel, 1 },
499 { C::memory_sel_tag_is_ff, 0 },
500 { C::memory_tag_ff_diff_inv,
507 trace.
set(C::memory_sel_tag_is_ff, 0, 0);
512 trace.
set(C::memory_tag_ff_diff_inv, 0, 1);
517 trace.
set(C::memory_sel_tag_is_ff, 0, 1);
518 trace.
set(C::memory_tag_ff_diff_inv, 0, 0);
522 trace.
set(C::memory_sel_tag_is_ff, 1, 1);
527 trace.
set(C::memory_tag_ff_diff_inv, 1, 0);
533TEST(MemoryConstrainingTest, SelRngWrite)
535 TestTraceContainer
trace({
536 { { C::memory_sel, 1 }, { C::memory_rw, 1 }, { C::memory_sel_tag_is_ff, 1 }, { C::memory_sel_rng_write, 0 } },
537 { { C::memory_sel, 1 }, { C::memory_rw, 1 }, { C::memory_sel_tag_is_ff, 0 }, { C::memory_sel_rng_write, 1 } },
538 { { C::memory_sel, 1 }, { C::memory_rw, 0 }, { C::memory_sel_tag_is_ff, 1 }, { C::memory_sel_rng_write, 0 } },
539 { { C::memory_sel, 1 }, { C::memory_rw, 0 }, { C::memory_sel_tag_is_ff, 0 }, { C::memory_sel_rng_write, 0 } },
546TEST(MemoryConstrainingTest, NegativeWriteValueOutOfRange)
548 TestTraceContainer
trace({
549 { { C::memory_sel, 1 },
551 { C::memory_value, 12345 },
553 { C::memory_sel_rng_write, 1 },
554 { C::memory_max_bits, 128 },
555 { C::range_check_sel, 1 },
556 { C::range_check_value, 12345 },
557 { C::range_check_rng_chk_bits, 128 } },
560 check_interaction<MemoryTraceBuilder, lookup_memory_range_check_write_tagged_value_settings>(trace);
565 (check_interaction<MemoryTraceBuilder, lookup_memory_range_check_write_tagged_value_settings>(trace)),
566 "Failed.*RANGE_CHECK_WRITE_TAGGED_VALUE. Could not find tuple in destination.");
570TEST(MemoryConstrainingTest, NegativeMaxBitsOutOfRange)
572 TestTraceContainer
trace({
573 { { C::memory_sel, 1 },
574 { C::memory_sel_rng_write, 1 },
576 { C::memory_max_bits, 32 } },
579 PrecomputedTraceBuilder precomputed_trace_builder;
580 precomputed_trace_builder.process_tag_parameters(trace);
581 precomputed_trace_builder.process_misc(trace, 100);
583 check_interaction<MemoryTraceBuilder, lookup_memory_tag_max_bits_settings>(trace);
588 "Failed.*LOOKUP_MEMORY_TAG_MAX_BITS. Could not find tuple in destination.");
592TEST(MemoryConstrainingTest, NegativeDiffLimbOutOfRange)
594 TestTraceContainer
trace({
595 { { C::memory_sel, 1 },
596 { C::memory_sel_rng_chk, 1 },
597 { C::memory_limb_0_, UINT16_MAX },
598 { C::memory_limb_1_, UINT16_MAX },
599 { C::memory_limb_2_, UINT16_MAX } },
602 PrecomputedTraceBuilder precomputed_trace_builder;
603 precomputed_trace_builder.process_misc(trace, 1 << 16);
604 precomputed_trace_builder.process_sel_range_16(trace);
612 trace.
set(C::memory_limb_0_, 0, UINT16_MAX + 1);
614 "Failed.*RANGE_CHECK_LIMB_0. Could not find tuple in destination.");
616 check_interaction<MemoryTraceBuilder, lookup_memory_range_check_limb_1_settings>(trace);
619 trace.
set(C::memory_limb_1_, 0, UINT16_MAX + 1);
621 "Failed.*RANGE_CHECK_LIMB_1. Could not find tuple in destination.");
623 check_interaction<MemoryTraceBuilder, lookup_memory_range_check_limb_2_settings>(trace);
626 trace.
set(C::memory_limb_2_, 0, UINT16_MAX + 1);
628 "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 std::string get_subrelation_label(size_t index)
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 set(Column col, uint32_t row, const FF &value, bool use_atomic_limbs=false)
void visit_column(Column col, const std::function< void(uint32_t, const FF &)> &visitor) const
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