24 if (!events.empty()) {
26 trace.set(C::bitwise_last, 0, 1);
30 std::array<FF, 17> precomputed_inverses = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
37 return C::bitwise_sel_and;
39 return C::bitwise_sel_or;
41 return C::bitwise_sel_xor;
43 __builtin_unreachable();
48 for (
const auto&
event : events) {
49 auto tag =
event.a.get_tag();
59 bool is_tag_mismatch =
event.a.get_tag() !=
event.b.get_tag();
63 const uint8_t tag_a_u8 =
static_cast<uint8_t
>(
event.a.get_tag());
64 const uint8_t tag_b_u8 =
static_cast<uint8_t
>(
event.b.get_tag());
66 FF tag_a_inv = precomputed_inverses[tag_a_u8];
68 FF tag_ab_diff_inv = 0;
69 if (tag_a_u8 > tag_b_u8) {
70 tag_ab_diff_inv = precomputed_inverses[tag_a_u8 - tag_b_u8];
73 tag_ab_diff_inv = -precomputed_inverses[tag_b_u8 - tag_a_u8];
76 if (is_tag_ff || is_tag_mismatch) {
80 { C::bitwise_op_id,
static_cast<uint8_t
>(
event.operation) },
81 { C::bitwise_start, 1 },
82 { C::bitwise_sel_get_ctr, 0 },
83 { C::bitwise_last, 1 },
84 { C::bitwise_acc_ia,
event.a.as_ff() },
85 { C::bitwise_acc_ib,
event.b.as_ff() },
86 { C::bitwise_acc_ic, output_c },
87 { C::bitwise_ia_byte,
event.a.as_ff() },
88 { C::bitwise_ib_byte,
event.b.as_ff() },
89 { C::bitwise_ic_byte, output_c },
90 { C::bitwise_tag_a, tag_a_u8 },
91 { C::bitwise_tag_b, tag_b_u8 },
94 { C::bitwise_sel_tag_ff_err, is_tag_ff ? 1 : 0 },
95 { C::bitwise_sel_tag_mismatch_err, is_tag_mismatch ? 1 : 0 },
96 { C::bitwise_err, 1 },
98 { C::bitwise_tag_a_inv, tag_a_inv },
99 { C::bitwise_tag_ab_diff_inv, tag_ab_diff_inv },
111 const uint128_t mask_low_byte = (1 << 8) - 1;
114 for (
int ctr = start_ctr; ctr > 0; ctr--) {
115 bool is_start = (ctr == start_ctr);
116 uint8_t ia_byte = input_a & mask_low_byte;
117 uint8_t ib_byte = input_b & mask_low_byte;
119 { { { C::bitwise_sel, 1 },
120 { get_op_id_column_selector(
event.operation), 1 },
121 { C::bitwise_op_id,
static_cast<uint8_t
>(
event.operation) },
124 { C::bitwise_acc_ia, input_a },
125 { C::bitwise_acc_ib, input_b },
126 { C::bitwise_acc_ic, output_c },
127 { C::bitwise_ia_byte, ia_byte },
128 { C::bitwise_ib_byte, ib_byte },
129 { C::bitwise_ic_byte, output_c & mask_low_byte },
130 { C::bitwise_output_and, ia_byte & ib_byte },
131 { C::bitwise_output_or, ia_byte | ib_byte },
132 { C::bitwise_output_xor, ia_byte ^ ib_byte },
133 { C::bitwise_tag_a, is_start ? tag_a_u8 : 0 },
134 { C::bitwise_tag_b, is_start ? tag_b_u8 : 0 },
135 { C::bitwise_tag_c, is_start ? tag_a_u8 : 0 },
136 { C::bitwise_ctr, ctr },
137 { C::bitwise_ctr_inv, precomputed_inverses[
static_cast<uint8_t
>(ctr)] },
138 { C::bitwise_ctr_min_one_inv, precomputed_inverses[
static_cast<uint8_t
>(ctr - 1)] },
139 { C::bitwise_last, ctr == 1 ? 1 : 0 },
140 { C::bitwise_start, is_start ? 1 : 0 },
141 { C::bitwise_sel_get_ctr, is_start ? 1 : 0 },
143 { C::bitwise_tag_a_inv, is_start ? tag_a_inv : 0 },
144 { C::bitwise_tag_ab_diff_inv, is_start ? tag_ab_diff_inv : 0 } } });