mirror of https://github.com/YosysHQ/abc.git
C++11 compatible code
This commit is contained in:
parent
2afaeac823
commit
3f80b202cd
|
|
@ -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;
|
||||
} );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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' );
|
||||
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue