18constexpr std::array<C, 16> IA_BYTE = { C::bitwise_ia_byte_0_, C::bitwise_ia_byte_1_, C::bitwise_ia_byte_2_,
19 C::bitwise_ia_byte_3_, C::bitwise_ia_byte_4_, C::bitwise_ia_byte_5_,
20 C::bitwise_ia_byte_6_, C::bitwise_ia_byte_7_, C::bitwise_ia_byte_8_,
21 C::bitwise_ia_byte_9_, C::bitwise_ia_byte_10_, C::bitwise_ia_byte_11_,
22 C::bitwise_ia_byte_12_, C::bitwise_ia_byte_13_, C::bitwise_ia_byte_14_,
23 C::bitwise_ia_byte_15_ };
24constexpr std::array<C, 16> IB_BYTE = { C::bitwise_ib_byte_0_, C::bitwise_ib_byte_1_, C::bitwise_ib_byte_2_,
25 C::bitwise_ib_byte_3_, C::bitwise_ib_byte_4_, C::bitwise_ib_byte_5_,
26 C::bitwise_ib_byte_6_, C::bitwise_ib_byte_7_, C::bitwise_ib_byte_8_,
27 C::bitwise_ib_byte_9_, C::bitwise_ib_byte_10_, C::bitwise_ib_byte_11_,
28 C::bitwise_ib_byte_12_, C::bitwise_ib_byte_13_, C::bitwise_ib_byte_14_,
29 C::bitwise_ib_byte_15_ };
31 C::bitwise_output_and_0_, C::bitwise_output_and_1_, C::bitwise_output_and_2_, C::bitwise_output_and_3_,
32 C::bitwise_output_and_4_, C::bitwise_output_and_5_, C::bitwise_output_and_6_, C::bitwise_output_and_7_,
33 C::bitwise_output_and_8_, C::bitwise_output_and_9_, C::bitwise_output_and_10_, C::bitwise_output_and_11_,
34 C::bitwise_output_and_12_, C::bitwise_output_and_13_, C::bitwise_output_and_14_, C::bitwise_output_and_15_
36constexpr std::array<C, 16> OUTPUT_OR = { C::bitwise_output_or_0_, C::bitwise_output_or_1_, C::bitwise_output_or_2_,
37 C::bitwise_output_or_3_, C::bitwise_output_or_4_, C::bitwise_output_or_5_,
38 C::bitwise_output_or_6_, C::bitwise_output_or_7_, C::bitwise_output_or_8_,
39 C::bitwise_output_or_9_, C::bitwise_output_or_10_, C::bitwise_output_or_11_,
40 C::bitwise_output_or_12_, C::bitwise_output_or_13_, C::bitwise_output_or_14_,
41 C::bitwise_output_or_15_ };
43 C::bitwise_output_xor_0_, C::bitwise_output_xor_1_, C::bitwise_output_xor_2_, C::bitwise_output_xor_3_,
44 C::bitwise_output_xor_4_, C::bitwise_output_xor_5_, C::bitwise_output_xor_6_, C::bitwise_output_xor_7_,
45 C::bitwise_output_xor_8_, C::bitwise_output_xor_9_, C::bitwise_output_xor_10_, C::bitwise_output_xor_11_,
46 C::bitwise_output_xor_12_, C::bitwise_output_xor_13_, C::bitwise_output_xor_14_, C::bitwise_output_xor_15_
58 for (
size_t i = 2; i < 7; i++) {
59 inverses[i] =
FF(i).invert();
68 return C::bitwise_sel_and;
70 return C::bitwise_sel_or;
72 return C::bitwise_sel_xor;
74 __builtin_unreachable();
81 for (
const auto&
event : events) {
82 const auto tag =
event.a.get_tag();
90 const bool is_tag_mismatch =
event.a.get_tag() !=
event.b.get_tag();
93 const uint8_t tag_a_u8 =
static_cast<uint8_t
>(
event.a.get_tag());
94 const uint8_t tag_b_u8 =
static_cast<uint8_t
>(
event.b.get_tag());
96 const FF tag_a_inv = precomputed_inverses[tag_a_u8];
98 const FF tag_ab_diff_inv = tag_a_u8 > tag_b_u8 ? precomputed_inverses[tag_a_u8 - tag_b_u8]
99 : -precomputed_inverses[tag_b_u8 - tag_a_u8];
101 if (is_tag_ff || is_tag_mismatch) {
105 { C::bitwise_sel, 1 },
106 { C::bitwise_op_id,
static_cast<uint8_t
>(
event.operation) },
107 { C::bitwise_ia,
event.a.as_ff() },
108 { C::bitwise_ib,
event.b.as_ff() },
109 { C::bitwise_ic, output_c },
110 { C::bitwise_tag_a, tag_a_u8 },
111 { C::bitwise_tag_b, tag_b_u8 },
113 { C::bitwise_sel_tag_ff_err, is_tag_ff ? 1 : 0 },
114 { C::bitwise_sel_tag_mismatch_err, is_tag_mismatch ? 1 : 0 },
115 { C::bitwise_err, 1 },
116 { C::bitwise_tag_a_inv, tag_a_inv },
117 { C::bitwise_tag_ab_diff_inv, tag_ab_diff_inv },
131 const bool simd =
event.simd_64;
133 const auto lane0 = [&](
uint128_t v) {
return simd ? (v & mask_low_64) : v; };
138 { C::bitwise_sel, 1 },
139 { C::bitwise_sel_compute, 1 },
140 { C::bitwise_sel_simd_64, simd ? 1 : 0 },
141 { C::bitwise_sel_u16,
len >= 2 ? 1 : 0 },
142 { C::bitwise_sel_u32,
len >= 4 ? 1 : 0 },
143 { C::bitwise_sel_u64,
len >= 8 ? 1 : 0 },
144 { C::bitwise_sel_u128,
len >= 16 ? 1 : 0 },
145 { C::bitwise_tag_byte_len,
len },
146 { get_op_id_column_selector(op), 1 },
147 { C::bitwise_op_id,
static_cast<uint8_t
>(op) },
148 { C::bitwise_ia, lane0(input_a) },
149 { C::bitwise_ib, lane0(input_b) },
150 { C::bitwise_ic, lane0(output_c) },
151 { C::bitwise_ia_simd, lane1(input_a) },
152 { C::bitwise_ib_simd, lane1(input_b) },
153 { C::bitwise_ic_simd, lane1(output_c) },
154 { C::bitwise_tag_a, tag_a_u8 },
155 { C::bitwise_tag_b, tag_b_u8 },
156 { C::bitwise_tag_c, tag_a_u8 },
157 { C::bitwise_tag_a_inv, tag_a_inv },
158 { C::bitwise_tag_ab_diff_inv, tag_ab_diff_inv },
162 for (uint8_t i = 0; i <
len; i++) {
163 const uint8_t ia_byte =
static_cast<uint8_t
>(input_a >> (8 * i));
164 const uint8_t ib_byte =
static_cast<uint8_t
>(input_b >> (8 * i));
167 { IA_BYTE[i], ia_byte },
168 { IB_BYTE[i], ib_byte },
169 { OUTPUT_AND[i], ia_byte & ib_byte },
170 { OUTPUT_OR[i], ia_byte | ib_byte },
171 { OUTPUT_XOR[i], ia_byte ^ ib_byte },
181 .add<InteractionType::LookupIntoBitwise, lookup_bitwise_byte_operations_1_settings>(C::precomputed_sel_range_16)
183 .add<InteractionType::LookupIntoBitwise, lookup_bitwise_byte_operations_3_settings>(C::precomputed_sel_range_16)
185 .add<InteractionType::LookupIntoBitwise, lookup_bitwise_byte_operations_5_settings>(C::precomputed_sel_range_16)
187 .add<InteractionType::LookupIntoBitwise, lookup_bitwise_byte_operations_7_settings>(C::precomputed_sel_range_16)
189 .add<InteractionType::LookupIntoBitwise, lookup_bitwise_byte_operations_9_settings>(C::precomputed_sel_range_16)
191 C::precomputed_sel_range_16)
192 .add<InteractionType::LookupIntoBitwise, lookup_bitwise_byte_operations_11_settings>(
193 C::precomputed_sel_range_16)
195 C::precomputed_sel_range_16)
196 .add<InteractionType::LookupIntoBitwise, lookup_bitwise_byte_operations_13_settings>(
197 C::precomputed_sel_range_16)
199 C::precomputed_sel_range_16)
200 .add<InteractionType::LookupIntoBitwise, lookup_bitwise_byte_operations_15_settings>(
201 C::precomputed_sel_range_16)
std::vector< Event > Container
void process(const simulation::EventEmitterInterface< simulation::BitwiseEvent >::Container &events, TraceContainer &trace)
Populate the bitwise trace columns from simulation events.
static const InteractionDefinition interactions
Interaction definitions for outbound lookups (BYTE_OPERATIONS, INTEGRAL_TAG_LENGTH).
InteractionDefinition & add(auto &&... args)
uint8_t get_tag_bytes(ValueTag tag)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
simulation::PublicDataTreeReadWriteEvent event
unsigned __int128 uint128_t
Settings to be passed ot GenericLookupRelationImpl.