C++11 compatible code

This commit is contained in:
aletempiac 2024-02-08 14:57:42 +01:00
parent 2afaeac823
commit 3f80b202cd
7 changed files with 88 additions and 79 deletions

View File

@ -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<enable_dcset>( 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;
} );
}

View File

@ -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;

View File

@ -22,9 +22,9 @@ namespace kitty
\return new constructed truth table of same type and dimensions
*/
template<typename TT, typename Fn>
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<typename TT, typename Fn>
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;

View File

@ -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<uint64_t>::iterator begin() noexcept { return _bits.begin(); }
/*! \brief End iterator to bits.
*/
inline auto end() noexcept { return _bits.end(); }
inline std::vector<uint64_t>::iterator end() noexcept { return _bits.end(); }
/*! \brief Begin iterator to bits.
*/
inline auto begin() const noexcept { return _bits.begin(); }
inline std::vector<uint64_t>::const_iterator begin() const noexcept { return _bits.begin(); }
/*! \brief End iterator to bits.
*/
inline auto end() const noexcept { return _bits.end(); }
inline std::vector<uint64_t>::const_iterator end() const noexcept { return _bits.end(); }
/*! \brief Reverse begin iterator to bits.
*/
inline auto rbegin() noexcept { return _bits.rbegin(); }
inline std::vector<uint64_t>::reverse_iterator rbegin() noexcept { return _bits.rbegin(); }
/*! \brief Reverse end iterator to bits.
*/
inline auto rend() noexcept { return _bits.rend(); }
inline std::vector<uint64_t>::reverse_iterator rend() noexcept { return _bits.rend(); }
/*! \brief Constant begin iterator to bits.
*/
inline auto cbegin() const noexcept { return _bits.cbegin(); }
inline std::vector<uint64_t>::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<uint64_t>::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<uint64_t>::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<uint64_t>::const_reverse_iterator crend() const noexcept { return _bits.crend(); }
/*! \brief Assign other truth table.

View File

@ -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<typename TT>
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<typename TT>
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<uint64_t>() );
}
/*! \brief Bitwise OR of two truth tables */
template<typename TT>
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<uint64_t>() );
}
/*! \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<uint64_t>( 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' );

View File

@ -78,28 +78,33 @@ inline void operator|=( dynamic_truth_table& first, const dynamic_truth_table& s
/*! \brief Operator for binary_or and assign */
template<uint32_t NumVars>
inline void operator|=( static_truth_table<NumVars>& first, const static_truth_table<NumVars>& second )
inline void operator|=( static_truth_table<NumVars, true>& first, const static_truth_table<NumVars, true>& 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<uint32_t NumVars>
inline void operator|=( static_truth_table<NumVars, false>& first, const static_truth_table<NumVars, false>& 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];

View File

@ -35,55 +35,55 @@ struct static_truth_table<NumVars, true>
/*! 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<NumVars, false>
/*! 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<uint64_t, NumBlocks>::iterator begin() noexcept { return _bits.begin(); }
/*! \brief End iterator to bits.
*/
inline auto end() noexcept { return _bits.end(); }
inline typename std::array<uint64_t, NumBlocks>::iterator end() noexcept { return _bits.end(); }
/*! \brief Begin iterator to bits.
*/
inline auto begin() const noexcept { return _bits.begin(); }
inline typename std::array<uint64_t, NumBlocks>::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<uint64_t, NumBlocks>::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<uint64_t, NumBlocks>::reverse_iterator rbegin() noexcept { return _bits.rbegin(); }
/*! \brief Reverse end iterator to bits.
*/
inline auto rend() noexcept { return _bits.rend(); }
inline typename std::array<uint64_t, NumBlocks>::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<uint64_t, NumBlocks>::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<uint64_t, NumBlocks>::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<uint64_t, NumBlocks>::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<uint64_t, NumBlocks>::const_reverse_iterator crend() const noexcept { return _bits.crend(); }
/*! \brief Assign other truth table if number of variables match.