From 3f80b202cd91b1966378333d6fccf07a7c94fd07 Mon Sep 17 00:00:00 2001 From: aletempiac Date: Thu, 8 Feb 2024 14:57:42 +0100 Subject: [PATCH] C++11 compatible code --- src/map/if/acd/ac_decomposition.hpp | 35 ++++++++++--------- src/map/if/acd/acd66.hpp | 13 ++++---- src/map/if/acd/kitty_algorithm.hpp | 8 ++--- src/map/if/acd/kitty_dynamic_tt.hpp | 26 +++++++-------- src/map/if/acd/kitty_operations.hpp | 10 +++--- src/map/if/acd/kitty_operators.hpp | 23 ++++++++----- src/map/if/acd/kitty_static_tt.hpp | 52 ++++++++++++++--------------- 7 files changed, 88 insertions(+), 79 deletions(-) diff --git a/src/map/if/acd/ac_decomposition.hpp b/src/map/if/acd/ac_decomposition.hpp index 8aee0266d..d55941995 100644 --- a/src/map/if/acd/ac_decomposition.hpp +++ b/src/map/if/acd/ac_decomposition.hpp @@ -205,7 +205,8 @@ private: /* find a feasible AC decomposition */ for ( uint32_t i = start; i <= ps.lut_size - 1 && i <= ps.max_free_set_vars; ++i ) { - auto [tt_p, perm, multiplicity] = enumerate_iset_combinations_offset( i, offset, column_multiplicity_fn[i - 1] ); + auto ret_tuple = enumerate_iset_combinations_offset( i, offset, column_multiplicity_fn[i - 1] ); + uint32_t multiplicity = std::get<2>( ret_tuple ); /* additional cost if not support reducing */ uint32_t additional_cost = ( num_vars - i > ps.lut_size ) ? 128 : 0; @@ -213,8 +214,8 @@ private: /* check for feasible solution that improves the cost */ if ( multiplicity <= ( 1 << ( ps.lut_size - i ) ) && multiplicity + additional_cost < best_cost && multiplicity <= 16 ) { - best_tt = tt_p; - permutations = perm; + best_tt = std::get<0>( ret_tuple ); + permutations = std::get<1>( ret_tuple ); best_multiplicity = multiplicity; best_cost = multiplicity + additional_cost; best_free_set = i; @@ -240,7 +241,8 @@ private: for ( uint32_t i = start; i <= ps.lut_size - 1 && i <= ps.max_free_set_vars; ++i ) { - auto [tt_p, perm, multiplicity] = enumerate_iset_combinations_offset( i, 0, column_multiplicity_fn[i - 1] ); + auto ret_tuple = enumerate_iset_combinations_offset( i, 0, column_multiplicity_fn[i - 1] ); + uint32_t multiplicity = std::get<2>( ret_tuple ); /* additional cost if not support reducing */ uint32_t additional_cost = ( num_vars - i > ps.lut_size ) ? 128 : 0; @@ -248,8 +250,8 @@ private: /* check for feasible solution that improves the cost */ if ( multiplicity <= ( 1 << ( ps.lut_size - i ) ) && multiplicity + additional_cost < best_cost && multiplicity <= 16 ) { - best_tt = tt_p; - permutations = perm; + best_tt = std::get<0>( ret_tuple ); + permutations = std::get<1>( ret_tuple ); best_multiplicity = multiplicity; best_cost = multiplicity + additional_cost; best_free_set = i; @@ -298,7 +300,7 @@ private: uint64_t constexpr masks_idx[] = { 0x0, 0x0, 0x0, 0x3 }; /* supports up to 64 values of free set (256 for |FS| == 3)*/ - static_assert( free_set_size <= 3 ); + static_assert( free_set_size <= 3, "Wrong free set size for method used, expected le 3" ); /* extract iset functions */ auto it = std::begin( tt ); @@ -314,7 +316,7 @@ private: multiplicity = __builtin_popcountl( multiplicity_set[0] ); - if constexpr ( free_set_size == 3 ) + if ( free_set_size == 3 ) { multiplicity += __builtin_popcountl( multiplicity_set[1] ); multiplicity += __builtin_popcountl( multiplicity_set[2] ); @@ -330,7 +332,7 @@ private: uint32_t const num_blocks = ( num_vars > 6 ) ? ( 1u << ( num_vars - 6 ) ) : 1; uint64_t constexpr masks[] = { 0x0, 0x3, 0xF, 0xFF, 0xFFFF, 0xFFFFFFFF }; - static_assert( free_set_size == 5 || free_set_size == 4 ); + static_assert( free_set_size == 5 || free_set_size == 4, "Wrong free set size for method used, expected of 4 or 5" ); uint32_t size = 0; uint64_t prev = -1; @@ -466,7 +468,8 @@ private: { uint64_t val = *it & masks[best_free_set]; - if ( auto el = column_to_iset.find( val ); el != column_to_iset.end() ) + auto el = column_to_iset.find( val ); + if ( el != column_to_iset.end() ) { isets[el->second]._bits[i / ( 1u << best_free_set )] |= UINT64_C( 1 ) << ( j + offset ); } @@ -709,7 +712,7 @@ private: { if ( var == best_multiplicity ) { - if constexpr ( !enable_dcset ) + if ( !enable_dcset ) { /* sets must be equally populated */ if ( __builtin_popcount( onset ) != __builtin_popcount( offset ) ) @@ -725,7 +728,7 @@ private: } /* var in DCSET */ - if constexpr ( enable_dcset ) + if ( enable_dcset ) { generate_support_minimization_encodings_rec( onset, offset, var + 1, count ); } @@ -953,7 +956,7 @@ private: cost = 0; float sort_cost = 0; - if constexpr ( UseHeuristic ) + if ( UseHeuristic ) { sort_cost = 1.0f / ( __builtin_popcountl( column[0] ) + __builtin_popcountl( column[1] ) ); } @@ -971,15 +974,15 @@ private: return true; } - if constexpr ( UseHeuristic ) + if ( UseHeuristic ) { - std::sort( matrix.begin(), matrix.end(), [&]( auto const& a, auto const& b ) { + std::sort( matrix.begin(), matrix.end(), [&]( encoding_column const& a, encoding_column const& b ) { return a.cost < b.cost; } ); } else { - std::sort( matrix.begin(), matrix.end(), [&]( auto const& a, auto const& b ) { + std::sort( matrix.begin(), matrix.end(), [&]( encoding_column const& a, encoding_column const& b ) { return a.sort_cost < b.sort_cost; } ); } diff --git a/src/map/if/acd/acd66.hpp b/src/map/if/acd/acd66.hpp index 166402ca0..67d460157 100644 --- a/src/map/if/acd/acd66.hpp +++ b/src/map/if/acd/acd66.hpp @@ -156,13 +156,14 @@ private: /* find AC decompositions with minimal multiplicity */ for ( uint32_t i = num_vars - 6; i <= 5 && i <= ps.max_free_set_vars; ++i ) { - auto [tt_p, perm, multiplicity] = enumerate_iset_combinations( i, column_multiplicity_fn[i - 1] ); + auto ret_tuple = enumerate_iset_combinations( i, column_multiplicity_fn[i - 1] ); + uint32_t multiplicity = std::get<2>( ret_tuple ); /* check for feasible solution into "66" with one possible shared variable */ if ( multiplicity <= 2 || ( multiplicity <= 4 && i < 5 ) ) { - best_tt = tt_p; - permutations = perm; + best_tt = std::get<0>( ret_tuple ); + permutations = std::get<1>( ret_tuple ); best_multiplicity = multiplicity; best_free_set = i; @@ -197,7 +198,7 @@ private: uint64_t constexpr masks_idx[] = { 0x0, 0x0, 0x0, 0x3 }; /* supports up to 64 values of free set (256 for |FS| == 3)*/ - static_assert( free_set_size <= 3 ); + static_assert( free_set_size <= 3, "Wrong free set size for method used, expected le 3" ); /* extract iset functions */ auto it = std::begin( tt ); @@ -213,7 +214,7 @@ private: multiplicity = __builtin_popcountl( multiplicity_set[0] ); - if constexpr ( free_set_size == 3 ) + if ( free_set_size == 3 ) { multiplicity += __builtin_popcountl( multiplicity_set[1] ); multiplicity += __builtin_popcountl( multiplicity_set[2] ); @@ -229,7 +230,7 @@ private: uint32_t const num_blocks = ( num_vars > 6 ) ? ( 1u << ( num_vars - 6 ) ) : 1; uint64_t constexpr masks[] = { 0x0, 0x3, 0xF, 0xFF, 0xFFFF, 0xFFFFFFFF }; - static_assert( free_set_size == 5 || free_set_size == 4 ); + static_assert( free_set_size == 5 || free_set_size == 4, "Wrong free set size for method used, expected of 4 or 5" ); uint32_t size = 0; uint64_t prev = -1; diff --git a/src/map/if/acd/kitty_algorithm.hpp b/src/map/if/acd/kitty_algorithm.hpp index 78eead08a..a8c71dc07 100644 --- a/src/map/if/acd/kitty_algorithm.hpp +++ b/src/map/if/acd/kitty_algorithm.hpp @@ -22,9 +22,9 @@ namespace kitty \return new constructed truth table of same type and dimensions */ template -auto unary_operation( const TT& tt, Fn&& op ) +TT unary_operation( const TT& tt, Fn&& op ) { - auto result = tt.construct(); + TT result = tt.construct(); std::transform( tt.cbegin(), tt.cend(), result.begin(), op ); result.mask_bits(); return result; @@ -43,11 +43,11 @@ auto unary_operation( const TT& tt, Fn&& op ) \return new constructed truth table of same type and dimensions */ template -auto binary_operation( const TT& first, const TT& second, Fn&& op ) +TT binary_operation( const TT& first, const TT& second, Fn&& op ) { assert( first.num_vars() == second.num_vars() ); - auto result = first.construct(); + TT result = first.construct(); std::transform( first.cbegin(), first.cend(), second.cbegin(), result.begin(), op ); result.mask_bits(); return result; diff --git a/src/map/if/acd/kitty_dynamic_tt.hpp b/src/map/if/acd/kitty_dynamic_tt.hpp index 880943dfa..2913b6674 100644 --- a/src/map/if/acd/kitty_dynamic_tt.hpp +++ b/src/map/if/acd/kitty_dynamic_tt.hpp @@ -51,55 +51,55 @@ struct dynamic_truth_table /*! Returns number of variables. */ - inline auto num_vars() const noexcept { return _num_vars; } + inline uint32_t num_vars() const noexcept { return _num_vars; } /*! Returns number of blocks. */ - inline auto num_blocks() const noexcept { return _bits.size(); } + inline uint32_t num_blocks() const noexcept { return _bits.size(); } /*! Returns number of bits. */ - inline auto num_bits() const noexcept { return uint64_t( 1 ) << _num_vars; } + inline uint32_t num_bits() const noexcept { return uint64_t( 1 ) << _num_vars; } /*! \brief Begin iterator to bits. */ - inline auto begin() noexcept { return _bits.begin(); } + inline std::vector::iterator begin() noexcept { return _bits.begin(); } /*! \brief End iterator to bits. */ - inline auto end() noexcept { return _bits.end(); } + inline std::vector::iterator end() noexcept { return _bits.end(); } /*! \brief Begin iterator to bits. */ - inline auto begin() const noexcept { return _bits.begin(); } + inline std::vector::const_iterator begin() const noexcept { return _bits.begin(); } /*! \brief End iterator to bits. */ - inline auto end() const noexcept { return _bits.end(); } + inline std::vector::const_iterator end() const noexcept { return _bits.end(); } /*! \brief Reverse begin iterator to bits. */ - inline auto rbegin() noexcept { return _bits.rbegin(); } + inline std::vector::reverse_iterator rbegin() noexcept { return _bits.rbegin(); } /*! \brief Reverse end iterator to bits. */ - inline auto rend() noexcept { return _bits.rend(); } + inline std::vector::reverse_iterator rend() noexcept { return _bits.rend(); } /*! \brief Constant begin iterator to bits. */ - inline auto cbegin() const noexcept { return _bits.cbegin(); } + inline std::vector::const_iterator cbegin() const noexcept { return _bits.cbegin(); } /*! \brief Constant end iterator to bits. */ - inline auto cend() const noexcept { return _bits.cend(); } + inline std::vector::const_iterator cend() const noexcept { return _bits.cend(); } /*! \brief Constant reverse begin iterator to bits. */ - inline auto crbegin() const noexcept { return _bits.crbegin(); } + inline std::vector::const_reverse_iterator crbegin() const noexcept { return _bits.crbegin(); } /*! \brief Constant teverse end iterator to bits. */ - inline auto crend() const noexcept { return _bits.crend(); } + inline std::vector::const_reverse_iterator crend() const noexcept { return _bits.crend(); } /*! \brief Assign other truth table. diff --git a/src/map/if/acd/kitty_operations.hpp b/src/map/if/acd/kitty_operations.hpp index 48a4b7c67..e0292bc05 100644 --- a/src/map/if/acd/kitty_operations.hpp +++ b/src/map/if/acd/kitty_operations.hpp @@ -31,7 +31,7 @@ inline TT unary_not_if( const TT& tt, bool cond ) #ifdef _MSC_VER #pragma warning( pop ) #endif - return unary_operation( tt, [mask]( auto a ) + return unary_operation( tt, [mask]( uint64_t a ) { return a ^ mask; } ); } @@ -39,7 +39,7 @@ inline TT unary_not_if( const TT& tt, bool cond ) template inline TT unary_not( const TT& tt ) { - return unary_operation( tt, []( auto a ) + return unary_operation( tt, []( uint64_t a ) { return ~a; } ); } @@ -48,14 +48,14 @@ template inline TT binary_and( const TT& first, const TT& second ) { - return binary_operation( first, second, std::bit_and<>() ); + return binary_operation( first, second, std::bit_and() ); } /*! \brief Bitwise OR of two truth tables */ template inline TT binary_or( const TT& first, const TT& second ) { - return binary_operation( first, second, std::bit_or<>() ); + return binary_operation( first, second, std::bit_or() ); } /*! \brief Swaps two variables in a truth table @@ -330,7 +330,7 @@ void print_hex( const TT& tt, std::ostream& os = std::cout ) auto const chunk_size = std::min( tt.num_vars() <= 1 ? 1 : ( tt.num_bits() >> 2 ), 16 ); - for_each_block_reversed( tt, [&os, chunk_size]( auto word ) + for_each_block_reversed( tt, [&os, chunk_size]( uint64_t word ) { std::string chunk( chunk_size, '0' ); diff --git a/src/map/if/acd/kitty_operators.hpp b/src/map/if/acd/kitty_operators.hpp index b5f4688c2..7ccab7ca1 100644 --- a/src/map/if/acd/kitty_operators.hpp +++ b/src/map/if/acd/kitty_operators.hpp @@ -78,28 +78,33 @@ inline void operator|=( dynamic_truth_table& first, const dynamic_truth_table& s /*! \brief Operator for binary_or and assign */ template -inline void operator|=( static_truth_table& first, const static_truth_table& second ) +inline void operator|=( static_truth_table& first, const static_truth_table& second ) { // first = binary_or( first, second ); /* runtime improved version */ - if constexpr ( NumVars <= 6 ) - { - first._bits |= second._bits; - first.mask_bits(); - } - else if constexpr ( NumVars == 7 ) + first._bits |= second._bits; + first.mask_bits(); +} + +/*! \brief Operator for binary_or and assign */ +template +inline void operator|=( static_truth_table& first, const static_truth_table& second ) +{ + // first = binary_or( first, second ); + /* runtime improved version */ + if ( NumVars == 7 ) { first._bits[0] |= second._bits[0]; first._bits[1] |= second._bits[1]; } - else if constexpr ( NumVars == 8 ) + else if ( NumVars == 8 ) { first._bits[0] |= second._bits[0]; first._bits[1] |= second._bits[1]; first._bits[2] |= second._bits[2]; first._bits[3] |= second._bits[3]; } - else if constexpr ( NumVars == 9 ) + else if ( NumVars == 9 ) { first._bits[0] |= second._bits[0]; first._bits[1] |= second._bits[1]; diff --git a/src/map/if/acd/kitty_static_tt.hpp b/src/map/if/acd/kitty_static_tt.hpp index 2b1613a6a..5bb4bdac1 100644 --- a/src/map/if/acd/kitty_static_tt.hpp +++ b/src/map/if/acd/kitty_static_tt.hpp @@ -35,55 +35,55 @@ struct static_truth_table /*! Returns number of variables. */ - inline auto num_vars() const noexcept { return NumVars; } + inline uint32_t num_vars() const noexcept { return NumVars; } /*! Returns number of blocks. */ - inline auto num_blocks() const noexcept { return 1u; } + inline uint32_t num_blocks() const noexcept { return 1u; } /*! Returns number of bits. */ - inline auto num_bits() const noexcept { return NumBits; } + inline uint32_t num_bits() const noexcept { return NumBits; } /*! \brief Begin iterator to bits. */ - inline auto begin() noexcept { return &_bits; } + inline uint64_t * begin() noexcept { return &_bits; } /*! \brief End iterator to bits. */ - inline auto end() noexcept { return ( &_bits ) + 1; } + inline uint64_t * end() noexcept { return ( &_bits ) + 1; } /*! \brief Begin iterator to bits. */ - inline auto begin() const noexcept { return &_bits; } + inline const uint64_t * begin() const noexcept { return &_bits; } /*! \brief End iterator to bits. */ - inline auto end() const noexcept { return ( &_bits ) + 1; } + inline const uint64_t * end() const noexcept { return ( &_bits ) + 1; } /*! \brief Reverse begin iterator to bits. */ - inline auto rbegin() noexcept { return &_bits; } + inline uint64_t * rbegin() noexcept { return &_bits; } /*! \brief Reverse end iterator to bits. */ - inline auto rend() noexcept { return ( &_bits ) + 1; } + inline uint64_t * rend() noexcept { return ( &_bits ) + 1; } /*! \brief Constant begin iterator to bits. */ - inline auto cbegin() const noexcept { return &_bits; } + inline const uint64_t * cbegin() const noexcept { return &_bits; } /*! \brief Constant end iterator to bits. */ - inline auto cend() const noexcept { return ( &_bits ) + 1; } + inline const uint64_t * cend() const noexcept { return ( &_bits ) + 1; } /*! \brief Constant reverse begin iterator to bits. */ - inline auto crbegin() const noexcept { return &_bits; } + inline const uint64_t * crbegin() const noexcept { return &_bits; } /*! \brief Constant everse end iterator to bits. */ - inline auto crend() const noexcept { return ( &_bits ) + 1; } + inline const uint64_t * crend() const noexcept { return ( &_bits ) + 1; } /*! \brief Assign other truth table if number of variables match. @@ -154,55 +154,55 @@ struct static_truth_table /*! Returns number of variables. */ - inline auto num_vars() const noexcept { return NumVars; } + inline uint32_t num_vars() const noexcept { return NumVars; } /*! Returns number of blocks. */ - inline auto num_blocks() const noexcept { return NumBlocks; } + inline uint32_t num_blocks() const noexcept { return NumBlocks; } /*! Returns number of bits. */ - inline auto num_bits() const noexcept { return NumBits; } + inline uint32_t num_bits() const noexcept { return NumBits; } /*! \brief Begin iterator to bits. */ - inline auto begin() noexcept { return _bits.begin(); } + inline typename std::array::iterator begin() noexcept { return _bits.begin(); } /*! \brief End iterator to bits. */ - inline auto end() noexcept { return _bits.end(); } + inline typename std::array::iterator end() noexcept { return _bits.end(); } /*! \brief Begin iterator to bits. */ - inline auto begin() const noexcept { return _bits.begin(); } + inline typename std::array::const_iterator begin() const noexcept { return _bits.begin(); } /*! \brief End iterator to bits. */ - inline auto end() const noexcept { return _bits.end(); } + inline typename std::array::const_iterator end() const noexcept { return _bits.end(); } /*! \brief Reverse begin iterator to bits. */ - inline auto rbegin() noexcept { return _bits.rbegin(); } + inline typename std::array::reverse_iterator rbegin() noexcept { return _bits.rbegin(); } /*! \brief Reverse end iterator to bits. */ - inline auto rend() noexcept { return _bits.rend(); } + inline typename std::array::reverse_iterator rend() noexcept { return _bits.rend(); } /*! \brief Constant begin iterator to bits. */ - inline auto cbegin() const noexcept { return _bits.cbegin(); } + inline typename std::array::const_iterator cbegin() const noexcept { return _bits.cbegin(); } /*! \brief Constant end iterator to bits. */ - inline auto cend() const noexcept { return _bits.cend(); } + inline typename std::array::const_iterator cend() const noexcept { return _bits.cend(); } /*! \brief Constant reverse begin iterator to bits. */ - inline auto crbegin() const noexcept { return _bits.crbegin(); } + inline typename std::array::const_reverse_iterator crbegin() const noexcept { return _bits.crbegin(); } /*! \brief Constant teverse end iterator to bits. */ - inline auto crend() const noexcept { return _bits.crend(); } + inline typename std::array::const_reverse_iterator crend() const noexcept { return _bits.crend(); } /*! \brief Assign other truth table if number of variables match.