@@ -40,41 +40,35 @@ template <IsUltraOrMegaHonk Flavor> void ProverInstance_<Flavor>::allocate_wires
4040{
4141 BB_BENCH_NAME (" allocate_wires" );
4242
43- // TODO(https://github.com/AztecProtocol/barretenberg/issues/1555):Wires can be allocated based on final active row
44- // rather than dyadic size.
43+ // Allocate only enough memory for the active range; wires are zero outside this range
4544 for (auto & wire : polynomials.get_wires ()) {
46- wire = Polynomial::shiftable (dyadic_size ());
45+ wire = Polynomial::shiftable (final_active_wire_idx + 1 , dyadic_size ());
4746 }
4847}
4948
5049template <IsUltraOrMegaHonk Flavor> void ProverInstance_<Flavor>::allocate_permutation_argument_polynomials()
5150{
5251 BB_BENCH_NAME (" allocate_permutation_argument_polynomials" );
5352
54- // TODO(https://github.com/AztecProtocol/barretenberg/issues/1555): Sigma and id polynomials can be allocated based
55- // on final active row rather than dyadic size.
53+ // Allocate only enough memory for the active range; permutation polynomials are zero outside this range
5654 for (auto & sigma : polynomials.get_sigmas ()) {
57- sigma = Polynomial ( dyadic_size ());
55+ sigma = Polynomial::shiftable (final_active_wire_idx + 1 , dyadic_size ());
5856 }
5957 for (auto & id : polynomials.get_ids ()) {
60- id = Polynomial ( dyadic_size ());
58+ id = Polynomial::shiftable (final_active_wire_idx + 1 , dyadic_size ());
6159 }
62- polynomials.z_perm = Polynomial::shiftable (dyadic_size ());
60+ polynomials.z_perm = Polynomial::shiftable (final_active_wire_idx + 1 , dyadic_size ());
6361}
6462
6563template <IsUltraOrMegaHonk Flavor> void ProverInstance_<Flavor>::allocate_lagrange_polynomials()
6664{
6765 BB_BENCH_NAME (" allocate_lagrange_polynomials" );
6866
69- // First and last lagrange polynomials (in the full circuit size)
7067 polynomials.lagrange_first = Polynomial (
7168 /* size=*/ 1 , /* virtual size=*/ dyadic_size (), /* start_index=*/ 0 );
7269
73- // Even though lagrange_last has a single non-zero element, we cannot set its size to 0 as different
74- // instances being folded might have lagrange_last set at different indexes and folding does not work
75- // correctly unless the polynomial is allocated in the correct range to accomodate this
7670 polynomials.lagrange_last = Polynomial (
77- /* size=*/ dyadic_size () , /* virtual size=*/ dyadic_size (), /* start_index=*/ 0 );
71+ /* size=*/ 1 , /* virtual size=*/ dyadic_size (), /* start_index=*/ final_active_wire_idx );
7872}
7973
8074template <IsUltraOrMegaHonk Flavor> void ProverInstance_<Flavor>::allocate_selectors(const Circuit& circuit)
@@ -98,28 +92,25 @@ void ProverInstance_<Flavor>::allocate_table_lookup_polynomials(const Circuit& c
9892 BB_BENCH_NAME (" allocate_table_lookup_and_lookup_read_polynomials" );
9993
10094 size_t table_offset = circuit.blocks .lookup .trace_offset ();
101- // TODO(https://github.com/AztecProtocol/barretenberg/issues/1555): Can allocate table polynomials based on genuine
102- // lookup table sizes in all cases. Same applies to read_counts/tags, except for ZK case.
103- const size_t max_tables_size = dyadic_size () - table_offset;
104- BB_ASSERT_GT (dyadic_size (), max_tables_size);
95+ const size_t tables_size = circuit.get_tables_size (); // cumulative size of all lookup tables used in the circuit
96+ BB_ASSERT_GT (dyadic_size (), tables_size);
10597
10698 // Allocate the polynomials containing the actual table data
107- if constexpr (IsUltraOrMegaHonk<Flavor>) {
108- for (auto & poly : polynomials.get_tables ()) {
109- poly = Polynomial (max_tables_size, dyadic_size (), table_offset);
110- }
99+ for (auto & poly : polynomials.get_tables ()) {
100+ poly = Polynomial (tables_size, dyadic_size (), table_offset);
111101 }
112102
113103 // Allocate the read counts and tags polynomials
114- polynomials.lookup_read_counts = Polynomial (max_tables_size , dyadic_size (), table_offset);
115- polynomials.lookup_read_tags = Polynomial (max_tables_size , dyadic_size (), table_offset);
104+ polynomials.lookup_read_counts = Polynomial (tables_size , dyadic_size (), table_offset);
105+ polynomials.lookup_read_tags = Polynomial (tables_size , dyadic_size (), table_offset);
116106
107+ // Determine end index for the lookup block and the tables themselves
108+ // Note that the start of the tables is aligned with the start of the lookup block in the trace
117109 const size_t lookup_block_end =
118110 static_cast <size_t >(circuit.blocks .lookup .trace_offset ()) + circuit.blocks .lookup .size ();
119- const auto tables_end = circuit.blocks .lookup .trace_offset () + max_tables_size ;
111+ const auto tables_end = circuit.blocks .lookup .trace_offset () + tables_size ;
120112
121113 // Allocate the lookup_inverses polynomial
122-
123114 const size_t lookup_inverses_start = table_offset;
124115 const size_t lookup_inverses_end = std::max (lookup_block_end, tables_end);
125116
@@ -146,25 +137,26 @@ void ProverInstance_<Flavor>::allocate_databus_polynomials(const Circuit& circui
146137 requires HasDataBus<Flavor>
147138{
148139 BB_BENCH_NAME (" allocate_databus_and_lookup_inverse_polynomials" );
149- // TODO(https://github.com/AztecProtocol/barretenberg/issues/1555): Each triple of databus polynomials can be
150- // allocated based on the size of the corresponding column (except for ZK case).
151- const size_t poly_size = std::min (static_cast <size_t >(MAX_DATABUS_SIZE), dyadic_size ());
152- polynomials.calldata = Polynomial (poly_size, dyadic_size ());
153- polynomials.calldata_read_counts = Polynomial (poly_size, dyadic_size ());
154- polynomials.calldata_read_tags = Polynomial (poly_size, dyadic_size ());
155- polynomials.secondary_calldata = Polynomial (poly_size, dyadic_size ());
156- polynomials.secondary_calldata_read_counts = Polynomial (poly_size, dyadic_size ());
157- polynomials.secondary_calldata_read_tags = Polynomial (poly_size, dyadic_size ());
158- polynomials.return_data = Polynomial (poly_size, dyadic_size ());
159- polynomials.return_data_read_counts = Polynomial (poly_size, dyadic_size ());
160- polynomials.return_data_read_tags = Polynomial (poly_size, dyadic_size ());
161140
162- // Allocate log derivative lookup argument inverse polynomials
163- const size_t q_busread_end = circuit.blocks .busread .trace_offset () + circuit.blocks .busread .size ();
164141 const size_t calldata_size = circuit.get_calldata ().size ();
165142 const size_t secondary_calldata_size = circuit.get_secondary_calldata ().size ();
166143 const size_t return_data_size = circuit.get_return_data ().size ();
167144
145+ polynomials.calldata = Polynomial (calldata_size, dyadic_size ());
146+ polynomials.calldata_read_counts = Polynomial (calldata_size, dyadic_size ());
147+ polynomials.calldata_read_tags = Polynomial (calldata_size, dyadic_size ());
148+
149+ polynomials.secondary_calldata = Polynomial (secondary_calldata_size, dyadic_size ());
150+ polynomials.secondary_calldata_read_counts = Polynomial (secondary_calldata_size, dyadic_size ());
151+ polynomials.secondary_calldata_read_tags = Polynomial (secondary_calldata_size, dyadic_size ());
152+
153+ polynomials.return_data = Polynomial (return_data_size, dyadic_size ());
154+ polynomials.return_data_read_counts = Polynomial (return_data_size, dyadic_size ());
155+ polynomials.return_data_read_tags = Polynomial (return_data_size, dyadic_size ());
156+
157+ // Allocate log derivative lookup argument inverse polynomials
158+ const size_t q_busread_end = circuit.blocks .busread .trace_offset () + circuit.blocks .busread .size ();
159+
168160 // TODO(https://github.com/AztecProtocol/barretenberg/issues/1555): Size of databus_id can always be set to max size
169161 // between the three databus columns. It currently uses dyadic_size because its values are later set based on its
170162 // size(). This means when we naively construct all ProverPolynomials with dyadic size (e.g. for ZK), we get a
0 commit comments