blob: 01c243a873afc0cb86e31c97dc5fb701a0d564b4 [file] [log] [blame]
#ifndef ATOM_NETLIST_UTILS_H
#define ATOM_NETLIST_UTILS_H
#include <cstdio>
#include <set>
#include "atom_netlist.h"
/*
*
* Useful utilities for working with the AtomNetlist class
*
*/
//Walk through the netlist detecting constant generators
//
//Note that initial constant generators (e.g. vcc/gnd) should have already been marked on
//the netlist.
int mark_constant_generators(AtomNetlist& netlist, e_const_gen_inference const_gen_inference_method, int verbosity);
/*
* Modifies the netlist by absorbing buffer LUTs
*/
void absorb_buffer_luts(AtomNetlist& netlist, int verbosity);
/*
* Modify the netlist by sweeping away unused nets/blocks/inputs
*/
//Repeatedly sweeps the netlist removing blocks and nets
//until nothing more can be swept.
//If sweep_ios is true also sweeps primary-inputs and primary-outputs
size_t sweep_iterative(AtomNetlist& netlist,
bool should_sweep_dangling_ios,
bool should_sweep_dangling_blocks,
bool should_sweep_dangling_nets,
bool should_sweep_constant_primary_outputs,
e_const_gen_inference const_gen_inference_method,
int verbosity);
//Sweeps blocks that have no fanout
size_t sweep_blocks(AtomNetlist& netlist, int verbosity);
//Sweeps nets with no drivers and/or no sinks
size_t sweep_nets(AtomNetlist& netlist, int verbosity);
//Sweeps primary-inputs with no fanout
size_t sweep_inputs(AtomNetlist& netlist, int verbosity);
//Sweeps primary-outputs with no fanin
size_t sweep_outputs(AtomNetlist& netlist, int verbosity);
size_t sweep_constant_primary_outputs(AtomNetlist& netlist, int verbosity);
/*
* Truth-table operations
*/
//Returns true if the specified block is a logical buffer
bool is_buffer(const AtomNetlist& netlist, const AtomBlockId blk);
//Deterimine whether a truth table encodes the logic functions 'On' set (returns true)
//or 'Off' set (returns false)
bool truth_table_encodes_on_set(const AtomNetlist::TruthTable& truth_table);
//Returns the truth table expanded to use num_inputs inputs.
//Typical usage is to expand the truth table of a LUT which is logically smaller than
//the one provided by the architecture (e.g. implement a 2-LUT in a 6-LUT)
// truth_table: The truth table to expand
// num_inputs : The number of inputs to use
AtomNetlist::TruthTable expand_truth_table(const AtomNetlist::TruthTable& truth_table, const size_t num_inputs);
//Permutes the inputs of a truth table
// truth_table: The truth table to expand
// num_inputs : The number of inputs to use
// permutation: A vector indicies to permute, permutation[i] is the input pin where
// the signal currently connected to input i should be placed
AtomNetlist::TruthTable permute_truth_table(const AtomNetlist::TruthTable& truth_table, const size_t num_inputs, const std::vector<int>& permutation);
//Convers a truth table to a lut mask (sequence of binary values representing minterms)
std::vector<vtr::LogicValue> truth_table_to_lut_mask(const AtomNetlist::TruthTable& truth_table, const size_t num_inputs);
//Convers a logic cube (potnetially including don't cares) into
//a sequence of minterm numbers
std::vector<size_t> cube_to_minterms(std::vector<vtr::LogicValue> cube);
/*
* Print the netlist for debugging
*/
void print_netlist_as_blif(std::string filename, const AtomNetlist& netlist);
void print_netlist_as_blif(FILE* f, const AtomNetlist& netlist);
//Returns a user-friendly architectural identifier for the specified atom pin
std::string atom_pin_arch_name(const AtomNetlist& netlist, const AtomPinId pin);
/*
* Identify all clock nets
*/
//Returns the set of nets which drive clock pins in the netlist
// Note the returned nets may be logically equivalent (e.g. driven by buffers
// connected to a common net)
std::set<AtomNetId> find_netlist_physical_clock_nets(const AtomNetlist& netlist);
//Returns the set of pins which logically drive unique clocks in the netlist
// Note that VPR currently has limited understanding of logic operating on clocks,
// so logically unique should be viewed as true only to the extent of VPR's
// understanding
std::set<AtomPinId> find_netlist_logical_clock_drivers(const AtomNetlist& netlist);
//Prints out information about netlist clocks
void print_netlist_clock_info(const AtomNetlist& netlist);
#endif