bool embed_command::execute() { const auto settings = make_settings(); const auto statistics = std::make_shared<properties>(); if ( opts.is_set( "only_lines" ) ) { auto lines = calculate_additional_lines( bdds.current(), settings, statistics ); std::cout << boost::format( "[i] required lines: %d" ) % lines << std::endl; } else { if ( rcbdds.empty() || opts.is_set( "new" ) ) { rcbdds.extend(); } embed_bdd( rcbdds.current(), bdds.current(), settings, statistics ); } std::cout << boost::format( "[i] run-time: %.2f secs" ) % statistics->get<double>( "runtime" ) << std::endl; return true; }
bool nct_command::execute() { auto& circuits = env->store<circuit>(); auto settings = make_settings(); auto mapped = nct_mapping( circuits.current(), settings, statistics ); print_runtime(); extend_if_new( circuits ); circuits.current() = mapped; return true; }
bool required_lines_command::execute() { const auto& bdds = env->store<bdd_function_t>(); const auto settings = make_settings(); additional = calculate_additional_lines( bdds.current(), settings, statistics ); std::cout << "[i] inputs: " << statistics->get<unsigned>( "num_inputs" ) << std::endl << "[i] outputs: " << statistics->get<unsigned>( "num_outputs" ) << std::endl << "[i] additional: " << additional << std::endl << boost::format( "[i] run-time: %.2f secs" ) % statistics->get<double>( "runtime" ) << std::endl; return true; }
bool simgraph_command::execute() { std::vector<unsigned> types; foreach_string( vectors, ",", [&]( const std::string& s ) { if ( s == "ah" ) types += 0u; else if ( s == "1h" ) types += 3u; else if ( s == "2h" ) types += 5u; else if ( s == "ac" ) types += 1u; else if ( s == "1c" ) types += 2u; else if ( s == "2c" ) types += 4u; } ); auto settings = make_settings(); settings->set( "simulation_signatures", signatures ? boost::optional<unsigned>( signatures ) : boost::optional<unsigned>() ); if ( opts.is_set( "dotname" ) ) { settings->set( "dotname", dotname ); } statistics = std::make_shared<properties>(); const auto graph = create_simulation_graph( aig(), types, settings, statistics ); std::cout << format( "[i] create_simulation_graph: %.2f secs" ) % statistics->get<double>( "runtime" ) << std::endl << format( "[i] - labeling time: %.2f secs" ) % statistics->get<double>( "labeling_runtime" ) << std::endl << format( "[i] - vertices: %d" ) % boost::num_vertices( graph ) << std::endl << format( "[i] - edges: %d" ) % boost::num_edges( graph ) << std::endl; if ( opts.is_set( "signatures" ) && signatures ) { const auto& _info = info(); const auto& meta = boost::get_property( graph, boost::graph_meta ); const auto offset = meta.num_inputs + meta.num_vectors; const auto& sigs = boost::get( boost::vertex_simulation_signature, graph ); std::cout << "[i] simulation signatures:" << std::endl; for ( auto i = 0u; i < _info.outputs.size(); ++i ) { std::cout << format( "[i] %s : %s" ) % _info.outputs.at( i ).second % any_join( *sigs[offset + i], " " ) << std::endl; } } if ( opts.is_set( "patternname" ) ) { write_pattern_file(); } return true; }
bool rec_command::execute() { const auto& circuits = env->store<circuit>(); auto settings = make_settings(); settings->set( "name_mapping", is_set( "name_mapping" ) ); result = xorsat_equivalence_check( circuits[id1], circuits[id2], settings, statistics ); print_runtime(); if ( result ) { std::cout << "[i] circuits are \033[1;32mequivalent\033[0m" << std::endl; } else { std::cout << "[i] circuits are \033[1;31mnot equivalent\033[0m" << std::endl; } return true; }
bool tbs_command::execute() { auto& circuits = env->store<circuit>(); auto& rcbdds = env->store<rcbdd>(); auto& specs = env->store<binary_truth_table>(); auto settings = make_settings(); auto statistics = std::make_shared<properties>(); if ( circuits.empty() || opts.is_set( "new" ) ) { circuits.extend(); } circuit circ; if ( opts.is_set( "bdd" ) ) { symbolic_transformation_based_synthesis( circ, rcbdds.current(), settings, statistics ); std::cout << boost::format( "[i] adjusted assignments: %d" ) % statistics->get<unsigned>( "assignment_count" ) << std::endl; } else if ( opts.is_set( "sat" ) ) { settings->set( "cnf_from_aig", opts.is_set( "cnf_from_aig" ) ); settings->set( "all_assumptions", opts.is_set( "all_assumptions" ) ); symbolic_transformation_based_synthesis_sat( circ, rcbdds.current(), settings, statistics ); std::cout << boost::format( "[i] adjusted assignments: %d" ) % statistics->get<unsigned>( "assignment_count" ) << std::endl; } else { transformation_based_synthesis( circ, specs.current(), settings, statistics ); } circuits.current() = circ; std::cout << boost::format( "[i] run-time: %.2f secs" ) % statistics->get<double>( "runtime" ) << std::endl; return true; }
bool qbs_command::execute() { const auto& rcbdds = env->store<rcbdd>(); auto& circuits = env->store<circuit>(); if ( circuits.empty() || is_set( "new" ) ) { circuits.extend(); } const auto settings = make_settings(); auto esopmin_settings = std::make_shared<properties>(); esopmin_settings->set( "verbose", is_verbose() ); settings->set( "esopmin", esop_minimizer ? dd_based_exorcism_minimization_func( esopmin_settings ) : dd_based_esop_minimization_func( esopmin_settings ) ); qmdd_synthesis( circuits.current(), rcbdds.current(), settings, statistics ); std::cout << boost::format( "[i] run-time: %.2f secs" ) % statistics->get<double>( "runtime" ) << std::endl; return true; }