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, GlobalAddr)
203 TestTraceContainer
trace({
204 { { C::memory_sel, 1 },
205 { C::memory_space_id, 12345 },
206 { C::memory_address, 6789 },
207 { C::memory_global_addr, (12345LLU << 32) + 6789 } },
208 { { C::memory_sel, 1 },
209 { C::memory_space_id, UINT16_MAX },
210 { C::memory_address, UINT32_MAX },
211 { C::memory_global_addr, UINT64_MAX >> 16 } },
212 { { C::memory_sel, 1 },
213 { C::memory_space_id, 0 },
214 { C::memory_address, 987654321 },
215 { C::memory_global_addr, 987654321 } },
216 { { C::memory_sel, 1 },
217 { C::memory_space_id, 1LLU << 12 },
218 { C::memory_address, 0 },
219 { C::memory_global_addr, 1LLU << 44 } },
225 trace.
set(C::memory_global_addr, 1,
trace.
get(C::memory_global_addr, 1) + 1);
229 trace.
set(C::memory_global_addr, 1,
trace.
get(C::memory_global_addr, 1) - 1);
233 trace.
set(C::memory_global_addr, 2, UINT32_MAX);
238TEST(MemoryConstrainingTest, Timestamp)
240 TestTraceContainer
trace({
241 { { C::memory_sel, 1 }, { C::memory_clk, 1 }, { C::memory_rw, 0 }, { C::memory_timestamp, 2 } },
242 { { C::memory_sel, 1 }, { C::memory_clk, 2 }, { C::memory_rw, 1 }, { C::memory_timestamp, 5 } },
243 { { C::memory_sel, 1 }, { C::memory_clk, 3 }, { C::memory_rw, 0 }, { C::memory_timestamp, 6 } },
244 { { C::memory_sel, 1 },
245 { C::memory_clk, UINT32_MAX },
247 { C::memory_timestamp, (1LLU << 33) - 1 } },
261 trace.
set(C::memory_timestamp, 3, UINT32_MAX);
266TEST(MemoryConstrainingTest, LastAccess)
268 TestTraceContainer
trace({
269 { { C::memory_sel_rng_chk, 1 },
270 { C::memory_global_addr, 12345 },
271 { C::memory_last_access, 1 },
272 { C::memory_glob_addr_diff_inv, 1 } },
273 { { C::memory_sel_rng_chk, 1 }, { C::memory_global_addr, 12346 }, { C::memory_last_access, 0 } },
274 { { C::memory_sel_rng_chk, 1 }, { C::memory_global_addr, 12346 }, { C::memory_last_access, 0 } },
275 { { C::memory_sel_rng_chk, 1 },
276 { C::memory_global_addr, 12346 },
277 { C::memory_last_access, 1 },
278 { C::memory_glob_addr_diff_inv, 1 } },
279 { { C::memory_sel_rng_chk, 0 },
280 { C::memory_global_addr, 12347 },
281 { C::memory_last_access, 1 },
282 { C::memory_glob_addr_diff_inv, 1 } },
288 trace.
set(C::memory_last_access, 0, 0);
292 trace.
set(C::memory_last_access, 0, 1);
296 trace.
set(C::memory_glob_addr_diff_inv, 0, 0);
300 trace.
set(C::memory_glob_addr_diff_inv, 0, 1);
304 trace.
set(C::memory_last_access, 2, 1);
309TEST(MemoryConstrainingTest, DiffWithLastAccess)
312 TestTraceContainer
trace({
313 { { C::memory_sel_rng_chk, 1 },
314 { C::memory_global_addr, 12345 },
315 { C::memory_last_access, 1 },
316 { C::memory_diff, 10000 },
317 { C::memory_timestamp, 76 },
318 { C::memory_rw, 1 } },
319 { { C::memory_sel_rng_chk, 1 },
320 { C::memory_global_addr, 22345 },
321 { C::memory_last_access, 1 },
322 { C::memory_diff, 12 },
323 { C::memory_timestamp, 254 },
324 { C::memory_rw, 1 } },
325 { { C::memory_sel_rng_chk, 1 },
326 { C::memory_global_addr, 22357 },
327 { C::memory_last_access, 1 },
328 { C::memory_diff,
FF(-22357) },
329 { C::memory_timestamp, 259 },
330 { C::memory_rw, 1 } },
331 { { C::memory_sel_rng_chk, 0 }, { C::memory_last_access, 0 } },
342TEST(MemoryConstrainingTest, DiffWithoutLastAccess)
344 TestTraceContainer
trace({
345 { { C::memory_sel_rng_chk, 1 }, { C::memory_timestamp, 77 }, { C::memory_rw, 1 }, { C::memory_diff, 1 } },
346 { { C::memory_sel_rng_chk, 1 }, { C::memory_timestamp, 79 }, { C::memory_rw, 1 }, { C::memory_diff, 8700 } },
347 { { C::memory_sel_rng_chk, 1 }, { C::memory_timestamp, 8779 }, { C::memory_rw, 0 }, { C::memory_diff, 10000 } },
348 { { C::memory_sel_rng_chk, 1 }, { C::memory_timestamp, 18779 }, { C::memory_rw, 0 }, { C::memory_diff, 2 } },
349 { { C::memory_sel_rng_chk, 1 },
350 { C::memory_timestamp, 18781 },
352 { C::memory_diff,
FF(-18781) } },
353 { { C::memory_sel_rng_chk, 0 }, { C::memory_last_access, 0 } },
372TEST(MemoryConstrainingTest, DiffDecomp)
374 TestTraceContainer
trace({
375 { { C::memory_diff, 87 }, { C::memory_limb_0_, 87 }, { C::memory_limb_1_, 0 }, { C::memory_limb_2_, 0 } },
376 { { C::memory_diff, 1ULL << 16 },
377 { C::memory_limb_0_, 0 },
378 { C::memory_limb_1_, 1 },
379 { C::memory_limb_2_, 0 } },
380 { { C::memory_diff, 1ULL << 32 },
381 { C::memory_limb_0_, 0 },
382 { C::memory_limb_1_, 0 },
383 { C::memory_limb_2_, 1 } },
384 { { C::memory_diff, UINT64_MAX >> 16 },
385 { C::memory_limb_0_, UINT16_MAX },
386 { C::memory_limb_1_, UINT16_MAX },
387 { C::memory_limb_2_, UINT16_MAX } },
414TEST(MemoryConstrainingTest, MemoryInitValueFirstRow)
416 TestTraceContainer
trace({
417 { { C::precomputed_first_row, 1 } },
418 { { C::memory_sel, 1 }, { C::memory_value, 0 }, { C::memory_tag,
static_cast<uint8_t
>(
MemoryTag::FF) } },
437TEST(MemoryConstrainingTest, MemoryInitValueLastAccess)
439 TestTraceContainer
trace({
440 { { C::memory_sel, 1 }, { C::memory_last_access, 1 } },
441 { { C::memory_sel, 1 }, { C::memory_value, 0 }, { C::memory_tag,
static_cast<uint8_t
>(
MemoryTag::FF) } },
460TEST(MemoryConstrainingTest, ReadWriteConsistency)
462 TestTraceContainer
trace({
463 { { C::memory_sel, 1 },
465 { C::memory_value, 12 },
467 { { C::memory_sel, 1 },
469 { C::memory_value, 12 },
471 { { C::memory_sel, 1 },
473 { C::memory_value, 17 },
475 { { C::memory_sel, 1 },
477 { C::memory_value, 12345 },
479 { { C::memory_sel, 1 },
481 { C::memory_value, 12345 },
483 { { C::memory_sel, 1 },
484 { C::memory_last_access, 1 },
486 { C::memory_value, 12345 },
495 "READ_WRITE_CONSISTENCY_VALUE");
504 "READ_WRITE_CONSISTENCY_TAG");
508TEST(MemoryConstrainingTest, TagIsFF)
510 TestTraceContainer
trace({
511 { { C::memory_sel, 1 },
513 { C::memory_sel_tag_is_ff, 1 } },
514 { { C::memory_sel, 1 },
516 { C::memory_sel_tag_is_ff, 0 },
517 { C::memory_tag_ff_diff_inv,
519 { { C::memory_sel, 1 },
521 { C::memory_sel_tag_is_ff, 0 },
522 { C::memory_tag_ff_diff_inv,
524 { { C::memory_sel, 1 },
526 { C::memory_sel_tag_is_ff, 0 },
527 { C::memory_tag_ff_diff_inv,
529 { { C::memory_sel, 1 },
531 { C::memory_sel_tag_is_ff, 0 },
532 { C::memory_tag_ff_diff_inv,
534 { { C::memory_sel, 1 },
536 { C::memory_sel_tag_is_ff, 0 },
537 { C::memory_tag_ff_diff_inv,
539 { { C::memory_sel, 1 },
541 { C::memory_sel_tag_is_ff, 0 },
542 { C::memory_tag_ff_diff_inv,
549 trace.
set(C::memory_sel_tag_is_ff, 0, 0);
553 trace.
set(C::memory_tag_ff_diff_inv, 0, 1);
557 trace.
set(C::memory_sel_tag_is_ff, 0, 1);
558 trace.
set(C::memory_tag_ff_diff_inv, 0, 0);
562 trace.
set(C::memory_sel_tag_is_ff, 1, 1);
566 trace.
set(C::memory_tag_ff_diff_inv, 1, 0);
571TEST(MemoryConstrainingTest, SelRngWrite)
573 TestTraceContainer
trace({
574 { { C::memory_sel, 1 }, { C::memory_rw, 1 }, { C::memory_sel_tag_is_ff, 1 }, { C::memory_sel_rng_write, 0 } },
575 { { C::memory_sel, 1 }, { C::memory_rw, 1 }, { C::memory_sel_tag_is_ff, 0 }, { C::memory_sel_rng_write, 1 } },
576 { { C::memory_sel, 1 }, { C::memory_rw, 0 }, { C::memory_sel_tag_is_ff, 1 }, { C::memory_sel_rng_write, 0 } },
577 { { C::memory_sel, 1 }, { C::memory_rw, 0 }, { C::memory_sel_tag_is_ff, 0 }, { C::memory_sel_rng_write, 0 } },
584TEST(MemoryConstrainingTest, NegativeWriteValueOutOfRange)
586 TestTraceContainer
trace({
587 { { C::memory_sel, 1 },
589 { C::memory_value, 12345 },
591 { C::memory_sel_rng_write, 1 },
592 { C::memory_max_bits, 128 },
593 { C::range_check_sel, 1 },
594 { C::range_check_value, 12345 },
595 { C::range_check_rng_chk_bits, 128 } },
598 check_interaction<MemoryTraceBuilder, lookup_memory_range_check_write_tagged_value_settings>(
trace);
603 (check_interaction<MemoryTraceBuilder, lookup_memory_range_check_write_tagged_value_settings>(
trace)),
604 "Failed.*RANGE_CHECK_WRITE_TAGGED_VALUE. Could not find tuple in destination.");
608TEST(MemoryConstrainingTest, NegativeMaxBitsOutOfRange)
610 TestTraceContainer
trace({
611 { { C::memory_sel, 1 },
612 { C::memory_sel_rng_write, 1 },
614 { C::memory_max_bits, 32 } },
617 PrecomputedTraceBuilder precomputed_trace_builder;
618 precomputed_trace_builder.process_tag_parameters(
trace);
619 precomputed_trace_builder.process_misc(
trace, 100);
621 check_interaction<MemoryTraceBuilder, lookup_memory_tag_max_bits_settings>(
trace);
626 "Failed.*LOOKUP_MEMORY_TAG_MAX_BITS. Could not find tuple in destination.");
630TEST(MemoryConstrainingTest, NegativeDiffLimbOutOfRange)
632 TestTraceContainer
trace({
633 { { C::memory_sel, 1 },
634 { C::memory_sel_rng_chk, 1 },
635 { C::memory_limb_0_, UINT16_MAX },
636 { C::memory_limb_1_, UINT16_MAX },
637 { C::memory_limb_2_, UINT16_MAX } },
640 PrecomputedTraceBuilder precomputed_trace_builder;
641 precomputed_trace_builder.process_misc(
trace, 1 << 16);
642 precomputed_trace_builder.process_sel_range_16(
trace);
650 trace.
set(C::memory_limb_0_, 0, UINT16_MAX + 1);
652 "Failed.*RANGE_CHECK_LIMB_0. Could not find tuple in destination.");
654 check_interaction<MemoryTraceBuilder, lookup_memory_range_check_limb_1_settings>(
trace);
657 trace.
set(C::memory_limb_1_, 0, UINT16_MAX + 1);
659 "Failed.*RANGE_CHECK_LIMB_1. Could not find tuple in destination.");
661 check_interaction<MemoryTraceBuilder, lookup_memory_range_check_limb_2_settings>(
trace);
664 trace.
set(C::memory_limb_2_, 0, UINT16_MAX + 1);
666 "Failed.*RANGE_CHECK_LIMB_2. Could not find tuple in destination.");
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_MEM_CONTIGUOUS
static constexpr size_t SR_TIMESTAMP
static constexpr size_t SR_GLOBAL_ADDR
static constexpr size_t SR_SEL_RNG_WRITE
static constexpr size_t SR_DIFF_DECOMP
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)
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
void check_interaction(tracegen::TestTraceContainer &trace)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
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