20 for (
size_t i = 0; i < 16; ++i) {
21 for (
size_t j = 0; j < 16; ++j) {
22 uint64_t left =
static_cast<uint64_t
>(j);
23 uint64_t right =
static_cast<uint64_t
>(i);
24 uint32_t left_idx =
builder.add_variable(
fr(left));
25 uint32_t right_idx =
builder.add_variable(
fr(right));
26 uint32_t result_idx =
builder.add_variable(
fr(left ^ right));
28 uint32_t add_idx =
builder.add_variable(
fr(left) +
fr(right) +
builder.get_variable(result_idx));
30 { left_idx, right_idx, result_idx, add_idx,
fr(1),
fr(1),
fr(1),
fr(-1),
fr(0) });
35 auto P1 = g1::affine_element::random_element();
36 auto P2 = g1::affine_element::random_element();
40 builder.queue_ecc_add_accum(P1);
41 builder.queue_ecc_mul_accum(P2, z);
45 EXPECT_EQ(result,
true);
49 EXPECT_EQ(duplicate_builder,
builder);
71 const size_t CHUNK_SIZE = stdlib::NUM_LIMB_BITS_IN_FIELD_SIMULATION * 2;
76 auto P1 = g1::affine_element::random_element();
77 auto P2 = g1::affine_element::random_element();
79 auto P_expected = P1 + P2 * z;
82 builder.queue_ecc_add_accum(P1);
83 builder.queue_ecc_mul_accum(P2, z);
86 auto eq_op_tuple =
builder.queue_ecc_eq();
91 auto P_result_x = P_result_x_lo + (P_result_x_hi << CHUNK_SIZE);
94 auto P_result_y = P_result_y_lo + (P_result_y_hi << CHUNK_SIZE);
95 EXPECT_EQ(P_result_x,
uint256_t(P_expected.x));
96 EXPECT_EQ(P_result_y,
uint256_t(P_expected.y));
99 auto accumulator =
builder.op_queue->get_accumulator();
103 EXPECT_EQ(
builder.blocks.ecc_op.size(), 6);
106 auto opcode_wire_indexes =
builder.blocks.ecc_op.w_l();
107 EXPECT_EQ(
builder.get_variable(opcode_wire_indexes[0]), (
EccOpCode{ .add = true }).value());
108 EXPECT_EQ(
builder.get_variable(opcode_wire_indexes[2]), (
EccOpCode{ .mul = true }).value());
109 EXPECT_EQ(
builder.get_variable(opcode_wire_indexes[4]), (
EccOpCode{ .eq = true, .reset = true }).value());
114 auto P1_x = P1_x_lo + (P1_x_hi << CHUNK_SIZE);
118 auto P1_y = P1_y_lo + (P1_y_hi << CHUNK_SIZE);
124 auto P2_x = P2_x_lo + (P2_x_hi << CHUNK_SIZE);
128 auto P2_y = P2_y_lo + (P2_y_hi << CHUNK_SIZE);
142 auto P1 = g1::affine_element::random_element();
143 auto P2 = g1::affine_element::random_element();
147 builder.queue_ecc_add_accum(P1);
148 builder.queue_ecc_mul_accum(P2, z);
155 auto ultra_ops =
builder.op_queue->construct_current_ultra_ops_subtable_columns();
156 for (
size_t i = 1; i < 4; ++i) {
157 for (
size_t j = 0; j <
builder.blocks.ecc_op.size(); ++j) {
158 auto op_wire_val =
builder.get_variable(
builder.blocks.ecc_op.wires[i][j]);
159 auto ultra_op_val = ultra_ops[i][j];
160 ASSERT_EQ(op_wire_val, ultra_op_val);
175 EXPECT_EQ(result,
true);
179 for (
auto& block :
builder.blocks.get()) {
180 for (
size_t i = 0; i < block.size(); ++i) {
181 if (&block != &
builder.blocks.arithmetic) {
182 EXPECT_EQ(block.q_arith()[i], 0);
184 if (&block != &
builder.blocks.delta_range) {
185 EXPECT_EQ(block.q_delta_range()[i], 0);
187 if (&block != &
builder.blocks.elliptic) {
188 EXPECT_EQ(block.q_elliptic()[i], 0);
190 if (&block != &
builder.blocks.memory) {
191 EXPECT_EQ(block.q_memory()[i], 0);
193 if (&block != &
builder.blocks.nnf) {
194 EXPECT_EQ(block.q_nnf()[i], 0);
196 if (&block != &
builder.blocks.lookup) {
197 EXPECT_EQ(block.q_lookup_type()[i], 0);
199 if (&block != &
builder.blocks.busread) {
200 EXPECT_EQ(block.q_busread()[i], 0);
202 if (&block != &
builder.blocks.poseidon2_external) {
203 EXPECT_EQ(block.q_poseidon2_external()[i], 0);
205 if (&block != &
builder.blocks.poseidon2_internal) {
206 EXPECT_EQ(block.q_poseidon2_internal()[i], 0);