Skip to content

Commit

Permalink
Update kitty (lsils#313)
Browse files Browse the repository at this point in the history
* update kitty

* fix type of static_truth_table::NumVar

* bugfix: is_complete_truth_table.

Co-authored-by: Heinz Riener <[email protected]>
  • Loading branch information
lee30sonia and hriener authored Apr 7, 2020
1 parent 6fdf8f7 commit 8052fd3
Show file tree
Hide file tree
Showing 46 changed files with 930 additions and 198 deletions.
2 changes: 1 addition & 1 deletion include/mockturtle/algorithms/aig_resub.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -747,7 +747,7 @@ void aig_resubstitution( Ntk& ntk, resubstitution_params const& ps = {}, resubst
resubstitution_stats st;
if ( ps.max_pis == 8 )
{
using truthtable_t = kitty::static_truth_table<8>;
using truthtable_t = kitty::static_truth_table<8u>;
using truthtable_dc_t = kitty::dynamic_truth_table;
using simulator_t = detail::simulator<resub_view_t, truthtable_t>;
using node_mffc_t = detail::node_mffc_inside<Ntk>;
Expand Down
2 changes: 1 addition & 1 deletion include/mockturtle/algorithms/akers_synthesis.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -836,7 +836,7 @@ Ntk akers_synthesis( kitty::dynamic_truth_table const& func, kitty::dynamic_trut
Ntk ntk;
std::vector<signal<Ntk>> pis;

for ( auto i = 0; i < func.num_vars(); ++i )
for ( auto i = 0u; i < func.num_vars(); ++i )
{
pis.push_back( ntk.create_pi() );
}
Expand Down
2 changes: 1 addition & 1 deletion include/mockturtle/algorithms/bi_decomposition.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ class bi_decomposition_impl
}
else
{
for ( auto h = 0; h < remainder.num_vars(); h++ )
for ( auto h = 0u; h < remainder.num_vars(); h++ )
{
auto var = remainder.construct();
kitty::create_nth_var( var, h );
Expand Down
2 changes: 1 addition & 1 deletion include/mockturtle/algorithms/dsd_decomposition.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ class dsd_decomposition_impl
_on_prime( on_prime ),
_ps( ps )
{
for ( auto i = 0; i < func.num_vars(); ++i )
for ( auto i = 0u; i < func.num_vars(); ++i )
{
if ( kitty::has_var( func, i ) )
{
Expand Down
2 changes: 1 addition & 1 deletion include/mockturtle/algorithms/mig_resub.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ inline bool relevance( const dynamic_truth_table& tt0, const dynamic_truth_table
}

/*! \brief Relevance */
template<int NumVars>
template<uint32_t NumVars>
inline bool relevance( const static_truth_table<NumVars>& tt0, const static_truth_table<NumVars>& tt1, const static_truth_table<NumVars>& tt2, const static_truth_table<NumVars>& tt )
{
return is_const0( ( ( tt0 ^ tt ) & ( tt1 ^ tt2 ) ) );
Expand Down
12 changes: 6 additions & 6 deletions include/mockturtle/algorithms/node_resynthesis/xag_minmc.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -224,9 +224,9 @@ class xag_minmc_resynthesis
{
stopwatch t1( st.time_total );

const auto func_ext = kitty::extend_to<6>( function );
const auto func_ext = kitty::extend_to<6u>( function );
std::vector<kitty::detail::spectral_operation> trans;
kitty::static_truth_table<6> tt_ext;
kitty::static_truth_table<6u> tt_ext;

const auto cache_it = classify_cache->find( func_ext );

Expand Down Expand Up @@ -268,7 +268,7 @@ class xag_minmc_resynthesis

std::tie( original_f, mc, circuit ) = search->second;

kitty::static_truth_table<6> db_repr;
kitty::static_truth_table<6u> db_repr;
kitty::create_from_hex_string( db_repr, original_f );

call_with_stopwatch( st.time_classify, [&]() { return kitty::exact_spectral_canonization(
Expand Down Expand Up @@ -430,10 +430,10 @@ class xag_minmc_resynthesis
if (ps.verify_database)
{
cut_view<xag_network> view{*db, *db_pis, f};
kitty::static_truth_table<6> tt, tt_repr;
kitty::static_truth_table<6u> tt, tt_repr;
kitty::create_from_hex_string( tt, original );
kitty::create_from_hex_string( tt_repr, token_f );
auto result = simulate<kitty::static_truth_table<6>>( view )[0];
auto result = simulate<kitty::static_truth_table<6u>>( view )[0];
if ( tt != result )
{
std::cerr << "[w] invalid circuit for " << original << ", got " << kitty::to_hex( result ) << "\n";
Expand Down Expand Up @@ -463,7 +463,7 @@ class xag_minmc_resynthesis
std::shared_ptr<xag_network> db;
std::shared_ptr<std::vector<xag_network::signal>> db_pis;
std::shared_ptr<std::unordered_map<std::string, std::tuple<std::string, unsigned, xag_network::signal>>> func_mc;
std::shared_ptr<std::unordered_map<kitty::static_truth_table<6>, std::tuple<bool, kitty::static_truth_table<6>, std::vector<kitty::detail::spectral_operation>>, kitty::hash<kitty::static_truth_table<6>>>> classify_cache;
std::shared_ptr<std::unordered_map<kitty::static_truth_table<6u>, std::tuple<bool, kitty::static_truth_table<6u>, std::vector<kitty::detail::spectral_operation>>, kitty::hash<kitty::static_truth_table<6u>>>> classify_cache;
};

} // namespace mockturtle
10 changes: 5 additions & 5 deletions include/mockturtle/algorithms/node_resynthesis/xag_npn.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ class xag_npn_resynthesis
template<typename LeavesIterator, typename Fn>
void operator()( Ntk& ntk, kitty::dynamic_truth_table const& function, LeavesIterator begin, LeavesIterator end, Fn&& fn ) const
{
kitty::static_truth_table<4> tt = kitty::extend_to<4>( function );
kitty::static_truth_table<4u> tt = kitty::extend_to<4u>( function );

/* get representative of function */
const auto [repr, phase, perm] = _repr[*tt.cbegin()];
Expand Down Expand Up @@ -199,7 +199,7 @@ class xag_npn_resynthesis
{
stopwatch t( st.time_classes );

kitty::static_truth_table<4> tt;
kitty::static_truth_table<4u> tt;
do {
_repr[*tt.cbegin()] = kitty::exact_npn_canonization( tt );
kitty::next_inplace( tt );
Expand All @@ -211,7 +211,7 @@ class xag_npn_resynthesis
stopwatch t( st.time_db );

_db = create_from_binary_index_list<DatabaseNtk>( subgraphs );
const auto sim_res = simulate_nodes<kitty::static_truth_table<4>>( _db );
const auto sim_res = simulate_nodes<kitty::static_truth_table<4u>>( _db );

_db.foreach_node( [&]( auto n ) {
if ( std::get<0>( _repr[*sim_res[n].cbegin()] ) == sim_res[n] )
Expand Down Expand Up @@ -250,8 +250,8 @@ class xag_npn_resynthesis
xag_npn_resynthesis_stats st;
xag_npn_resynthesis_stats* pst{nullptr};

std::vector<std::tuple<kitty::static_truth_table<4>, uint32_t, std::vector<uint8_t>>> _repr;
std::unordered_map<kitty::static_truth_table<4>, std::vector<signal<DatabaseNtk>>, kitty::hash<kitty::static_truth_table<4>>> _repr_to_signal;
std::vector<std::tuple<kitty::static_truth_table<4u>, uint32_t, std::vector<uint8_t>>> _repr;
std::unordered_map<kitty::static_truth_table<4u>, std::vector<signal<DatabaseNtk>>, kitty::hash<kitty::static_truth_table<4u>>> _repr_to_signal;

DatabaseNtk _db;

Expand Down
10 changes: 5 additions & 5 deletions include/mockturtle/algorithms/node_resynthesis/xmg3_npn.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ class xmg3_npn_resynthesis
template<typename LeavesIterator, typename Fn>
void operator()( Ntk& ntk, kitty::dynamic_truth_table const& function, LeavesIterator begin, LeavesIterator end, Fn&& fn ) const
{
kitty::static_truth_table<4> tt = kitty::extend_to<4>( function );
kitty::static_truth_table<4u> tt = kitty::extend_to<4u>( function );

/* get representative of function */
const auto repr = _repr[_classes[*tt.cbegin()]];
Expand Down Expand Up @@ -234,7 +234,7 @@ class xmg3_npn_resynthesis
std::transform( map.cbegin(), map.cend(), map.begin(), []( auto word ) { return ~word; } );

int64_t index = 0;
kitty::static_truth_table<4> tt;
kitty::static_truth_table<4u> tt;
while ( index != -1 )
{
kitty::create_from_words( tt, &index, &index + 1 );
Expand Down Expand Up @@ -287,7 +287,7 @@ class xmg3_npn_resynthesis
}
}

const auto sim_res = simulate_nodes<kitty::static_truth_table<4>>( _db );
const auto sim_res = simulate_nodes<kitty::static_truth_table<4u>>( _db );

_db.foreach_node( [&]( auto n ) {
if ( _repr[_classes[*sim_res[n].cbegin()]] == sim_res[n] )
Expand Down Expand Up @@ -326,9 +326,9 @@ class xmg3_npn_resynthesis
xmg3_npn_resynthesis_stats st;
xmg3_npn_resynthesis_stats* pst{nullptr};

std::vector<kitty::static_truth_table<4>> _repr;
std::vector<kitty::static_truth_table<4u>> _repr;
std::vector<uint32_t> _classes;
std::unordered_map<kitty::static_truth_table<4>, std::vector<signal<DatabaseNtk>>, kitty::hash<kitty::static_truth_table<4>>> _repr_to_signal;
std::unordered_map<kitty::static_truth_table<4u>, std::vector<signal<DatabaseNtk>>, kitty::hash<kitty::static_truth_table<4u>>> _repr_to_signal;

DatabaseNtk _db;

Expand Down
2 changes: 1 addition & 1 deletion include/mockturtle/algorithms/resubstitution.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ class simulator
auto tt = kitty::create<truthtable_t>( max_pis );
tts[0] = tt;

for ( auto i = 0; i < tt.num_vars(); ++i )
for ( auto i = 0u; i < tt.num_vars(); ++i )
{
kitty::create_nth_var( tt, i );
tts[i + 1] = tt;
Expand Down
2 changes: 1 addition & 1 deletion include/mockturtle/algorithms/simulation.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ class default_simulator<kitty::dynamic_truth_table>
* projection function according to the index. The number of variables must be
* known at compile time.
*/
template<int NumVars>
template<uint32_t NumVars>
class default_simulator<kitty::static_truth_table<NumVars>>
{
public:
Expand Down
2 changes: 1 addition & 1 deletion include/mockturtle/algorithms/xmg_resub.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ struct xmg_resub_functor
(void)required;
auto const& tt = sim.get_tt( ntk.make_signal( root ) );

int32_t const root_rdb = absolute_disinguishing_power( tt );
int32_t const root_rdb = absolute_distinguishing_power( tt );

std::vector<divisor> sorted_divs;
for ( auto it = std::begin( divs ), ie = std::begin( divs ) + num_divs; it != ie; ++it )
Expand Down
23 changes: 18 additions & 5 deletions lib/kitty/kitty/affine.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
#include "operators.hpp"
#include "static_truth_table.hpp"
#include "spectral.hpp"
#include "traits.hpp"

/*! \cond PRIVATE */
#include "detail/linear_constants.hpp"
Expand All @@ -56,18 +57,18 @@ inline void delta_swap_inplace_opt( TT& tt, uint64_t delta, uint64_t omega )
tt._bits[0] = tt._bits[0] ^ y ^ ( y << delta );
}

template<int NumVars>
template<uint32_t NumVars>
inline void delta_swap_inplace_opt( static_truth_table<NumVars, true>& tt, uint64_t delta, uint64_t omega )
{
assert ( NumVars <= 6 );
assert( NumVars <= 6 );
const uint64_t y = ( tt._bits ^ ( tt._bits >> delta ) ) & omega;
tt._bits = tt._bits ^ y ^ ( y << delta );
}

template<typename TT>
void permute_with_masks_inplace_opt( TT& tt, uint64_t const* masks )
{
for ( auto k = 0; k < tt.num_vars(); ++k )
for ( auto k = 0u; k < tt.num_vars(); ++k )
{
delta_swap_inplace_opt( tt, uint64_t( 1 ) << k, masks[k] );
}
Expand Down Expand Up @@ -115,6 +116,8 @@ inline void for_each_permutation_mask( unsigned num_vars, Fn&& fn )
template<typename TT, typename Callback = decltype( detail::exact_spectral_canonization_null_callback )>
TT exact_linear_canonization( const TT& tt, Callback&& fn = detail::exact_spectral_canonization_null_callback )
{
static_assert( is_complete_truth_table<TT>::value, "Can only be applied on complete truth tables." );

detail::miller_spectral_canonization_impl<TT> impl( tt, false, false, false );
return impl.run( fn ).first;
}
Expand All @@ -123,11 +126,13 @@ TT exact_linear_canonization( const TT& tt, Callback&& fn = detail::exact_spectr
template<typename TT>
TT exact_linear_canonization_old( const TT& tt )
{
static_assert( is_complete_truth_table<TT>::value, "Can only be applied on complete truth tables." );

auto min = tt;

detail::for_each_permutation_mask( tt.num_vars(), [&min, &tt]( const auto* mask ) {
min = std::min( min, detail::permute_with_masks_opt( tt, mask ) );
});
} );

return min;
}
Expand All @@ -144,6 +149,8 @@ TT exact_linear_canonization_old( const TT& tt )
template<typename TT>
TT exact_linear_output_canonization( const TT& tt )
{
static_assert( is_complete_truth_table<TT>::value, "Can only be applied on complete truth tables." );

return std::min( exact_linear_canonization_old( tt ), exact_linear_canonization_old( ~tt ) );
}

Expand All @@ -158,6 +165,8 @@ TT exact_linear_output_canonization( const TT& tt )
template<typename TT, typename Callback = decltype( detail::exact_spectral_canonization_null_callback )>
TT exact_affine_canonization( const TT& tt, Callback&& fn = detail::exact_spectral_canonization_null_callback )
{
static_assert( is_complete_truth_table<TT>::value, "Can only be applied on complete truth tables." );

detail::miller_spectral_canonization_impl<TT> impl( tt, true, false, false );
return impl.run( fn ).first;
}
Expand All @@ -166,14 +175,16 @@ TT exact_affine_canonization( const TT& tt, Callback&& fn = detail::exact_spectr
template<typename TT>
TT exact_affine_canonization_old( const TT& tt )
{
static_assert( is_complete_truth_table<TT>::value, "Can only be applied on complete truth tables." );

const auto num_vars = tt.num_vars();

assert( num_vars >= 2 && num_vars <= 4 );

auto copy = tt;

const auto& flips = detail::flips[num_vars - 2u];

auto min = exact_linear_canonization_old( copy );

for ( int j = flips.size() - 1; j >= 0; --j )
Expand All @@ -199,6 +210,8 @@ TT exact_affine_canonization_old( const TT& tt )
template<typename TT>
TT exact_affine_output_canonization( const TT& tt )
{
static_assert( is_complete_truth_table<TT>::value, "Can only be applied on complete truth tables." );

return std::min( exact_affine_canonization_old( tt ), exact_affine_canonization_old( ~tt ) );
}

Expand Down
Loading

0 comments on commit 8052fd3

Please sign in to comment.