21 for (
size_t i = 0; i < 16; ++i) {
22 for (
size_t j = 0; j < 16; ++j) {
23 uint64_t left =
static_cast<uint64_t
>(j);
24 uint64_t right =
static_cast<uint64_t
>(i);
25 uint32_t left_idx =
builder.add_variable(
fr(left));
26 uint32_t right_idx =
builder.add_variable(
fr(right));
27 uint32_t result_idx =
builder.add_variable(
fr(left ^ right));
29 uint32_t add_idx =
builder.add_variable(
fr(left) +
fr(right) +
builder.get_variable(result_idx));
31 { left_idx, right_idx, result_idx, add_idx,
fr(1),
fr(1),
fr(1),
fr(-1),
fr(0) });
36 auto P1 = g1::affine_element::random_element();
37 auto P2 = g1::affine_element::random_element();
41 builder.queue_ecc_add_accum(P1);
42 builder.queue_ecc_mul_accum(P2, z);
46 EXPECT_EQ(result,
true);
50 EXPECT_EQ(duplicate_builder,
builder);
72 const size_t CHUNK_SIZE = stdlib::NUM_LIMB_BITS_IN_FIELD_SIMULATION * 2;
77 auto P1 = g1::affine_element::random_element();
78 auto P2 = g1::affine_element::random_element();
80 auto P_expected = P1 + P2 * z;
83 builder.queue_ecc_add_accum(P1);
84 builder.queue_ecc_mul_accum(P2, z);
87 auto eq_op_tuple =
builder.queue_ecc_eq();
92 auto P_result_x = P_result_x_lo + (P_result_x_hi << CHUNK_SIZE);
95 auto P_result_y = P_result_y_lo + (P_result_y_hi << CHUNK_SIZE);
96 EXPECT_EQ(P_result_x,
uint256_t(P_expected.x));
97 EXPECT_EQ(P_result_y,
uint256_t(P_expected.y));
100 auto accumulator =
builder.op_queue->get_accumulator();
104 EXPECT_EQ(
builder.blocks.ecc_op.size(), 6);
107 auto opcode_wire_indexes =
builder.blocks.ecc_op.w_l();
108 EXPECT_EQ(
builder.get_variable(opcode_wire_indexes[0]), (
EccOpCode{ .add = true }).value());
109 EXPECT_EQ(
builder.get_variable(opcode_wire_indexes[2]), (
EccOpCode{ .mul = true }).value());
110 EXPECT_EQ(
builder.get_variable(opcode_wire_indexes[4]), (
EccOpCode{ .eq = true, .reset = true }).value());
115 auto P1_x = P1_x_lo + (P1_x_hi << CHUNK_SIZE);
119 auto P1_y = P1_y_lo + (P1_y_hi << CHUNK_SIZE);
125 auto P2_x = P2_x_lo + (P2_x_hi << CHUNK_SIZE);
129 auto P2_y = P2_y_lo + (P2_y_hi << CHUNK_SIZE);
143 auto P1 = g1::affine_element::random_element();
144 auto P2 = g1::affine_element::random_element();
148 builder.queue_ecc_add_accum(P1);
149 builder.queue_ecc_mul_accum(P2, z);
156 auto ultra_ops =
builder.op_queue->construct_current_ultra_ops_subtable_columns();
157 for (
size_t i = 1; i < 4; ++i) {
158 for (
size_t j = 0; j <
builder.blocks.ecc_op.size(); ++j) {
159 auto op_wire_val =
builder.get_variable(
builder.blocks.ecc_op.wires[i][j]);
160 auto ultra_op_val = ultra_ops[i][j];
161 ASSERT_EQ(op_wire_val, ultra_op_val);
174 auto P1 = g1::affine_element::random_element();
175 builder.queue_ecc_add_accum(P1);
182 builder.create_add_gate({
a,
b, c, 1, 1, -1, 0 });
191 size_t ecc_op_end =
builder.blocks.ecc_op.trace_end();
192 for (
auto& block :
builder.blocks.get()) {
193 if (&block != &
builder.blocks.ecc_op && block.size() > 0) {
194 EXPECT_GE(block.trace_offset(), ecc_op_end) <<
"Block starts before ecc_op ends";
209 EXPECT_EQ(
builder.blocks.ecc_op.size(), 0);
210 EXPECT_FALSE(
builder.circuit_finalized);
214 EXPECT_TRUE(
builder.circuit_finalized);
218 EXPECT_EQ(
builder.blocks.arithmetic.size(), 4);
219 EXPECT_EQ(
builder.blocks.pub_inputs.size(), 0);
220 EXPECT_EQ(
builder.blocks.ecc_op.size(), 0);
221 EXPECT_EQ(
builder.blocks.busread.size(), 0);
222 EXPECT_EQ(
builder.blocks.lookup.size(), 0);
223 EXPECT_EQ(
builder.blocks.delta_range.size(), 0);
224 EXPECT_EQ(
builder.blocks.elliptic.size(), 0);
225 EXPECT_EQ(
builder.blocks.memory.size(), 0);
226 EXPECT_EQ(
builder.blocks.nnf.size(), 0);
227 EXPECT_EQ(
builder.blocks.poseidon2_external.size(), 0);
230 EXPECT_EQ(
builder.get_return_data().size(), 0);