@@ -89,15 +89,15 @@ void print_circuit(const circuit_proxy<ArithmetizationType> &circuit_proxy,
8989 using variable_type = crypto3::zk::snark::plonk_variable<typename AssignmentTableType::field_type::value_type>;
9090
9191 const auto gates = circuit_proxy.gates ();
92- const std::set<std:: uint32_t >& used_gates_idx = circuit_proxy.get_used_gates ();
92+ const auto used_gates_idx = circuit_proxy.get_used_gates ();
9393 typename ConstraintSystemType::gates_container_type used_gates;
9494 for (const auto &it : used_gates_idx) {
9595 used_gates.push_back (gates[it]);
9696 }
9797
9898 const auto copy_constraints = circuit_proxy.copy_constraints ();
9999 typename ConstraintSystemType::copy_constraints_container_type used_copy_constraints;
100- const std::set<std:: uint32_t >& used_copy_constraints_idx = circuit_proxy.get_used_copy_constraints ();
100+ const auto used_copy_constraints_idx = circuit_proxy.get_used_copy_constraints ();
101101 for (const auto &it : used_copy_constraints_idx) {
102102 used_copy_constraints.push_back (copy_constraints[it]);
103103 }
@@ -127,14 +127,14 @@ void print_circuit(const circuit_proxy<ArithmetizationType> &circuit_proxy,
127127
128128 const auto lookup_gates = circuit_proxy.lookup_gates ();
129129 typename ConstraintSystemType::lookup_gates_container_type used_lookup_gates;
130- const std::set<std:: uint32_t >& used_lookup_gates_idx = circuit_proxy.get_used_lookup_gates ();
130+ const auto used_lookup_gates_idx = circuit_proxy.get_used_lookup_gates ();
131131 for (const auto &it : used_lookup_gates_idx) {
132132 used_lookup_gates.push_back (lookup_gates[it]);
133133 }
134134
135135 const auto lookup_tables = circuit_proxy.lookup_tables ();
136136 typename ConstraintSystemType::lookup_tables_type used_lookup_tables;
137- const std::set<std:: uint32_t >& used_lookup_tables_idx = circuit_proxy.get_used_lookup_tables ();
137+ const auto used_lookup_tables_idx = circuit_proxy.get_used_lookup_tables ();
138138 for (const auto &it : used_lookup_tables_idx) {
139139 used_lookup_tables.push_back (lookup_tables[it]);
140140 }
@@ -170,8 +170,8 @@ enum class print_column_kind {
170170
171171template <typename ValueType, typename ArithmetizationType>
172172void fill_vector_value (std::vector<ValueType> &table_values, const assignment_proxy<ArithmetizationType> &table_proxy,
173- print_column_kind column_kind, std::uint32_t num_cols , std::uint32_t num_rows, std::uint32_t padding) {
174- for (std::size_t i = 0 ; i < num_cols ; i++) {
173+ print_column_kind column_kind, std::uint32_t start_col, std:: uint32_t end_col , std::uint32_t num_rows, std::uint32_t padding) {
174+ for (std::size_t i = start_col ; i < end_col ; i++) {
175175 for (std::size_t j = 0 ; j < num_rows; j++){
176176 ValueType val;
177177 switch (column_kind) {
@@ -227,7 +227,9 @@ void fill_vector_value(std::vector<ValueType> &table_values, const assignment_pr
227227}
228228
229229template <typename Endianness, typename ArithmetizationType>
230- void print_assignment_table (const assignment_proxy<ArithmetizationType> &table_proxy, print_table_kind print_kind, std::ostream &out = std::cout) {
230+ void print_assignment_table (const assignment_proxy<ArithmetizationType> &table_proxy,
231+ print_table_kind print_kind,
232+ std::ostream &out = std::cout) {
231233 using AssignmentTableType = assignment_proxy<ArithmetizationType>;
232234 std::uint32_t usable_rows_amount;
233235 std::uint32_t total_columns;
@@ -236,20 +238,31 @@ void print_assignment_table(const assignment_proxy<ArithmetizationType> &table_p
236238 std::uint32_t witness_size = table_proxy.witnesses_amount ();
237239 std::uint32_t constant_size = table_proxy.constants_amount ();
238240 std::uint32_t selector_size = table_proxy.selectors_amount ();
241+ const auto lookup_constant_cols = table_proxy.get_lookup_constant_cols ();
242+ const auto lookup_selector_cols = table_proxy.get_lookup_selector_cols ();
239243 if (print_kind == print_table_kind::PRIVATE) {
240- total_columns = witness_size + constant_size + selector_size;
244+ total_columns = witness_size + (constant_size - table_proxy.get_lookup_constant_amount ())
245+ + (selector_size - table_proxy.get_lookup_selector_amount ());
241246 usable_rows_amount = table_proxy.get_used_rows ().size ();
242247 } else if (print_kind == print_table_kind::SHARED) {
243- total_columns = shared_size + public_input_size;
248+ total_columns = shared_size + public_input_size + table_proxy. get_lookup_constant_amount () + table_proxy. get_lookup_selector_amount () ;
244249 std::uint32_t max_shared_size = 0 ;
245250 std::uint32_t max_public_inputs_size = 0 ;
251+ std::uint32_t max_constant_size = 0 ;
252+ std::uint32_t max_selector_size = 0 ;
246253 for (std::uint32_t i = 0 ; i < shared_size; i++) {
247254 max_shared_size = std::max (max_shared_size, table_proxy.shared_column_size (i));
248255 }
249256 for (std::uint32_t i = 0 ; i < public_input_size; i++) {
250257 max_public_inputs_size = std::max (max_public_inputs_size, table_proxy.public_input_column_size (i));
251258 }
252- usable_rows_amount = std::max (max_shared_size, max_public_inputs_size);
259+ for (const auto &i : lookup_constant_cols) {
260+ max_constant_size = std::max (max_constant_size, table_proxy.constant_column_size (i));
261+ }
262+ for (const auto &i : lookup_selector_cols) {
263+ max_selector_size = std::max (max_selector_size, table_proxy.selector_column_size (i));
264+ }
265+ usable_rows_amount = std::max ({max_shared_size, max_public_inputs_size, max_constant_size, max_selector_size});
253266 } else { // FULL
254267 total_columns = AssignmentTableType::arithmetization_params::total_columns;
255268 std::uint32_t max_witness_size = 0 ;
@@ -298,18 +311,22 @@ void print_assignment_table(const assignment_proxy<ArithmetizationType> &table_p
298311 std::vector<typename AssignmentTableType::field_type::value_type> table_values;
299312 if (print_kind == print_table_kind::FULL) {
300313 fill_vector_value<typename AssignmentTableType::field_type::value_type, ArithmetizationType>
301- (table_values, table_proxy, print_column_kind::WITNESS, witness_size, usable_rows_amount, padding);
314+ (table_values, table_proxy, print_column_kind::WITNESS, 0 , witness_size, usable_rows_amount, padding);
302315 fill_vector_value<typename AssignmentTableType::field_type::value_type, ArithmetizationType>
303- (table_values, table_proxy, print_column_kind::PUBLIC_INPUT, public_input_size, usable_rows_amount, padding);
316+ (table_values, table_proxy, print_column_kind::PUBLIC_INPUT, 0 , public_input_size, usable_rows_amount, padding);
304317 fill_vector_value<typename AssignmentTableType::field_type::value_type, ArithmetizationType>
305- (table_values, table_proxy, print_column_kind::CONSTANT, constant_size, usable_rows_amount, padding);
318+ (table_values, table_proxy, print_column_kind::CONSTANT, 0 , constant_size, usable_rows_amount, padding);
306319 fill_vector_value<typename AssignmentTableType::field_type::value_type, ArithmetizationType>
307- (table_values, table_proxy, print_column_kind::SELECTOR, selector_size, usable_rows_amount, padding);
320+ (table_values, table_proxy, print_column_kind::SELECTOR, 0 , selector_size, usable_rows_amount, padding);
308321 } else if (print_kind == print_table_kind::SHARED) {
309322 fill_vector_value<typename AssignmentTableType::field_type::value_type, ArithmetizationType>
310- (table_values, table_proxy, print_column_kind::PUBLIC_INPUT, public_input_size , usable_rows_amount, padding);
323+ (table_values, table_proxy, print_column_kind::SHARED, 0 , shared_size , usable_rows_amount, padding);
311324 fill_vector_value<typename AssignmentTableType::field_type::value_type, ArithmetizationType>
312- (table_values, table_proxy, print_column_kind::SHARED, shared_size, usable_rows_amount, padding);
325+ (table_values, table_proxy, print_column_kind::PUBLIC_INPUT, 0 , public_input_size, usable_rows_amount, padding);
326+ fill_vector_value<typename AssignmentTableType::field_type::value_type, ArithmetizationType>
327+ (table_values, table_proxy, print_column_kind::CONSTANT, table_proxy.get_lookup_constant_amount (), constant_size, usable_rows_amount, padding);
328+ fill_vector_value<typename AssignmentTableType::field_type::value_type, ArithmetizationType>
329+ (table_values, table_proxy, print_column_kind::SELECTOR, table_proxy.get_lookup_selector_amount (), selector_size, usable_rows_amount, padding);
313330 } else {
314331 const auto rows = table_proxy.get_used_rows ();
315332 for ( std::size_t i = 0 ; i < AssignmentTableType::arithmetization_params::witness_columns; i++ ){
@@ -324,7 +341,7 @@ void print_assignment_table(const assignment_proxy<ArithmetizationType> &table_p
324341 table_values.push_back (0 );
325342 }
326343 }
327- for ( std::size_t i = 0 ; i < AssignmentTableType::arithmetization_params::constant_columns ; i++ ){
344+ for ( std::size_t i = 0 ; i < (constant_size - table_proxy. get_lookup_constant_amount ()) ; i++ ){
328345 for (const auto & j : rows){
329346 if (j < table_proxy.constant_column_size (i)) {
330347 table_values.push_back (table_proxy.constant (i, j));
@@ -336,7 +353,7 @@ void print_assignment_table(const assignment_proxy<ArithmetizationType> &table_p
336353 table_values.push_back (0 );
337354 }
338355 }
339- for ( std::size_t i = 0 ; i < AssignmentTableType::arithmetization_params::selector_columns ; i++ ){
356+ for ( std::size_t i = 0 ; i < (selector_size - table_proxy. get_lookup_selector_amount ()) ; i++ ){
340357 for (const auto & j : rows){
341358 if (j < table_proxy.selector_column_size (i)) {
342359 table_values.push_back (table_proxy.selector (i, j));
@@ -374,10 +391,13 @@ int curve_dependent_main(std::string bytecode_file_name,
374391 const std::string &policy,
375392 std::uint32_t max_num_provers) {
376393 using BlueprintFieldType = typename CurveType::base_field_type;
394+ constexpr std::size_t ComponentConstantColumns = 5 ;
395+ constexpr std::size_t LookupConstantColumns = 100 ;
396+
377397 constexpr std::size_t WitnessColumns = 15 ;
378398 constexpr std::size_t PublicInputColumns = 1 ;
379- constexpr std::size_t ConstantColumns = 5 ;
380- constexpr std::size_t SelectorColumns = 35 ;
399+ constexpr std::size_t ConstantColumns = ComponentConstantColumns + LookupConstantColumns ;
400+ constexpr std::size_t SelectorColumns = 50 ;
381401
382402 using ArithmetizationParams =
383403 zk::snark::plonk_arithmetization_params<WitnessColumns, PublicInputColumns, ConstantColumns, SelectorColumns>;
@@ -431,6 +451,23 @@ int curve_dependent_main(std::string bytecode_file_name,
431451
432452 ASSERT_MSG (!parser_instance.assignments .empty () && !parser_instance.circuits .empty (), " Not found any proxy for prover" );
433453
454+ // pack lookup tables
455+ if (parser_instance.circuits [0 ].get_reserved_tables ().size () > 0 ) {
456+ std::vector <std::size_t > lookup_columns_indices;
457+ for (std::size_t i = ComponentConstantColumns;
458+ i < ConstantColumns; i++)
459+ lookup_columns_indices.push_back (i);
460+ auto usable_rows_amount = zk::snark::pack_lookup_tables_horizontal (
461+ parser_instance.circuits [0 ].get_reserved_indices (),
462+ parser_instance.circuits [0 ].get_reserved_tables (),
463+ parser_instance.circuits [0 ].get (),
464+ parser_instance.assignments [0 ].get (),
465+ lookup_columns_indices,
466+ parser_instance.assignments [0 ].allocated_rows (),
467+ 500000
468+ );
469+ }
470+
434471 // print shared table
435472 std::ofstream shared_otable;
436473 const auto print_kind = parser_instance.assignments .size () > 1 ? print_table_kind::SHARED : print_table_kind::FULL;
@@ -468,10 +505,9 @@ int curve_dependent_main(std::string bytecode_file_name,
468505 otable.close ();
469506 }
470507 }
471-
472508 auto assignment_it = parser_instance.assignments .begin ();
473509 for (auto & it : parser_instance.circuits ) {
474- std::ofstream ocircuit;
510+ std::ofstream ocircuit;
475511 std::string file_name = parser_instance.circuits .size () > 1 ?
476512 circuit_file_name + std::to_string (it.get_id ()) : circuit_file_name;
477513 ocircuit.open (file_name);
0 commit comments