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 };
34 for (
const auto&
event : events) {
35 auto tag =
event.a.get_tag();
45 bool is_tag_mismatch =
event.a.get_tag() !=
event.b.get_tag();
49 const uint8_t tag_a_u8 =
static_cast<uint8_t
>(
event.a.get_tag());
50 const uint8_t tag_b_u8 =
static_cast<uint8_t
>(
event.b.get_tag());
52 FF tag_a_inv = precomputed_inverses[tag_a_u8];
54 FF tag_ab_diff_inv = 0;
55 if (tag_a_u8 > tag_b_u8) {
56 tag_ab_diff_inv = precomputed_inverses[tag_a_u8 - tag_b_u8];
59 tag_ab_diff_inv = -precomputed_inverses[tag_b_u8 - tag_a_u8];
62 if (is_tag_ff || is_tag_mismatch) {
66 { C::bitwise_op_id,
static_cast<uint8_t
>(
event.operation) },
67 { C::bitwise_start, 1 },
68 { C::bitwise_sel_get_ctr, 0 },
69 { C::bitwise_last, 1 },
76 { C::bitwise_tag_a, tag_a_u8 },
77 { C::bitwise_tag_b, tag_b_u8 },
78 { C::bitwise_tag_c, tag_a_u8 },
80 { C::bitwise_sel_tag_ff_err, is_tag_ff ? 1 : 0 },
81 { C::bitwise_sel_tag_mismatch_err, is_tag_mismatch ? 1 : 0 },
82 { C::bitwise_err, 1 },
84 { C::bitwise_tag_a_inv, tag_a_inv },
85 { C::bitwise_tag_ab_diff_inv, tag_ab_diff_inv },
97 const uint128_t mask_low_byte = (1 << 8) - 1;
100 for (
int ctr = start_ctr; ctr > 0; ctr--) {
101 bool is_start = (ctr == start_ctr);
103 { { { C::bitwise_op_id,
static_cast<uint8_t
>(
event.operation) },
110 { C::bitwise_tag_a, is_start ? tag_a_u8 : 0 },
111 { C::bitwise_tag_b, is_start ? tag_b_u8 : 0 },
112 { C::bitwise_tag_c, is_start ? tag_a_u8 : 0 },
113 { C::bitwise_ctr, ctr },
114 { C::bitwise_ctr_inv, precomputed_inverses[
static_cast<uint8_t
>(ctr)] },
115 { C::bitwise_ctr_min_one_inv, precomputed_inverses[
static_cast<uint8_t
>(ctr - 1)] },
116 { C::bitwise_last, ctr == 1 ? 1 : 0 },
117 { C::bitwise_sel, ctr != 0 ? 1 : 0 },
118 { C::bitwise_start, is_start ? 1 : 0 },
119 { C::bitwise_sel_get_ctr, is_start ? 1 : 0 },
121 { C::bitwise_tag_a_inv, is_start ? tag_a_inv : 0 },
122 { C::bitwise_tag_ab_diff_inv, is_start ? tag_ab_diff_inv : 0 } } });