38 const size_t trace_size = events.size();
39 event_ptrs.reserve(trace_size);
41 for (
const auto&
event : events) {
42 event_ptrs.push_back(&
event);
45 std::ranges::sort(event_ptrs, [](
const auto* lhs,
const auto* rhs) {
return lhs->operator<(*rhs); });
55 constexpr size_t NUM_TAGS =
static_cast<size_t>(
MemoryTag::MAX) + 1;
57 std::array<FF, NUM_TAGS> tag_inverts;
58 for (
size_t i = 0; i < NUM_TAGS; i++) {
59 tag_inverts.at(i) =
FF(i);
66 for (uint32_t i = 0; i < trace_size; i++) {
67 const auto&
event = *event_ptrs[i];
68 const bool is_last = i + 1 == trace_size;
69 const bool sel_tag_is_ff =
event.value.get_tag() ==
MemoryTag::FF;
70 const uint64_t global_addr = (
static_cast<uint64_t
>(
event.space_id) << 32) +
event.addr;
71 const uint64_t timestamp =
72 (
static_cast<uint64_t
>(
event.execution_clk) << 1) +
static_cast<uint64_t
>(
event.mode);
75 bool last_access =
true;
76 uint64_t global_addr_diff = 0;
79 const auto& next_event = *event_ptrs[i + 1];
80 const uint64_t next_global_addr = (
static_cast<uint64_t
>(next_event.space_id) << 32) + next_event.addr;
81 const uint64_t next_timestamp =
82 (
static_cast<uint64_t
>(next_event.execution_clk) << 1) +
static_cast<uint64_t
>(next_event.mode);
83 const uint64_t two_consecutive_writes =
84 static_cast<uint64_t
>(
event.mode) *
static_cast<uint64_t
>(next_event.mode);
85 global_addr_diff = next_global_addr - global_addr;
86 last_access = global_addr != next_global_addr;
87 diff = last_access ? global_addr_diff : (next_timestamp - timestamp - two_consecutive_writes);
93 { C::memory_value,
event.value },
94 { C::memory_tag,
static_cast<uint8_t
>(
event.value.get_tag()) },
95 { C::memory_space_id,
event.space_id },
96 { C::memory_address,
event.addr },
97 { C::memory_clk,
event.execution_clk },
98 { C::memory_rw,
event.mode == MemoryMode::WRITE ? 1 : 0 },
99 { C::memory_sel_rng_chk, is_last ? 0 : 1 },
100 { C::memory_global_addr, global_addr },
101 { C::memory_timestamp, timestamp },
102 { C::memory_last_access, last_access },
103 { C::memory_glob_addr_diff_inv, global_addr_diff },
104 { C::memory_diff, diff },
105 { C::memory_limb_0_, diff & 0xFFFF },
106 { C::memory_limb_1_, (diff >> 16) & 0xFFFF },
107 { C::memory_limb_2_, (diff >> 32) },
108 { C::memory_sel_tag_is_ff, sel_tag_is_ff ? 1 : 0 },
109 { C::memory_tag_ff_diff_inv, tag_inverts.at(
static_cast<uint8_t
>(
event.value.get_tag())) },
110 { C::memory_sel_rng_write, (
event.mode == MemoryMode::WRITE && !sel_tag_is_ff) ? 1 : 0 },
117 trace.invert_columns({ { C::memory_glob_addr_diff_inv } });