| #ifndef VPR_UTILS_H | |
| #define VPR_UTILS_H | |
| #include <vector> | |
| #include "vpr_types.h" | |
| #include "atom_netlist.h" | |
| #include "clustered_netlist.h" | |
| #include "netlist.h" | |
| class DeviceGrid; | |
| const t_model* find_model(const t_model* models, const std::string& name, bool required=true); | |
| const t_model_ports* find_model_port(const t_model* model, const std::string& name, bool required=true); | |
| void print_tabs(FILE * fpout, int num_tab); | |
| bool is_clb_external_pin(ClusterBlockId blk_id, int pb_pin_id); | |
| bool is_opin(int ipin, t_type_ptr type); | |
| bool is_input_type(t_type_ptr type); | |
| bool is_output_type(t_type_ptr type); | |
| bool is_io_type(t_type_ptr type); | |
| bool is_empty_type(t_type_ptr type); | |
| int get_unique_pb_graph_node_id(const t_pb_graph_node *pb_graph_node); | |
| void get_class_range_for_block(const ClusterBlockId blk_id, int *class_low, | |
| int *class_high); | |
| void get_pin_range_for_block(const ClusterBlockId blk_id, | |
| int *pin_low, | |
| int *pin_high); | |
| void sync_grid_to_blocks(); | |
| //Returns the name (format: 'type_name.port_name[i]') of the specified pin_index on the given type | |
| std::string block_type_pin_index_to_name(t_type_ptr type, int pin_index); | |
| //Returns the port name and pin index associated with pb_graph_pin | |
| // Example: 'cout[0]' | |
| std::string describe_pb_graph_pin_port(const t_pb_graph_pin* pb_graph_pin); | |
| //Returns a short description of the specified primitive pin associated with pb_graph_pin | |
| // Example: 'BLE.cout[0]' | |
| std::string describe_primitive_pb_graph_pin_type(const t_pb_graph_pin* pb_graph_pin); | |
| //Returns a short description of the specified pb_graph_pin | |
| // Unlike describe_primitive_pb_graph_pin_type(), this includes the cluster placement index | |
| // of the type | |
| // Example: 'BLE[4].cout[0]' | |
| std::string describe_pb_graph_pin(const t_pb_graph_pin* pb_graph_pin); | |
| //Returns the hierarchical name of the specified pb_graph_pin | |
| // Example: '/CLB[0]/BLE[4]/adder[0].cout[0]' | |
| // Which indicates the pin cout[0] is located on the 1st adder, in the 4th BLE of a CLB | |
| std::string describe_pb_graph_pin_hierarchy(const t_pb_graph_pin* pb_graph_pin); | |
| //Returns the hierarchical name of the specified pb_graph_node | |
| // Example: '/CLB[0]/BLE[4]/adder[0]' | |
| // Which indicates the node is located on the 1st adder, in the 4th BLE of a CLB | |
| std::string describe_pb_graph_node_hierarchy(const t_pb_graph_node* pb_graph_node); | |
| //Returns the hierarchical name of the specified pb_graph_edge | |
| // Example: '/CLB[0]/BLE[4]/interconnect:carry_out' | |
| // Which indicates the edge represents the interconnect named 'carry_out' in the 4th BLE of a CLB | |
| std::string describe_pb_graph_edge_hierarchy(const t_pb_graph_edge* pb_graph_edge); | |
| //Returns the hierarchical name of the specified pb_type | |
| // Example: '/clb[default]/BLE[arithmetic]/adder | |
| // Which indicates the type represents an adder in the arithmetic mode of a BLE, within the default mode of a CLB | |
| std::string describe_pb_type_hierarchy(const t_pb_type* pb_type); | |
| //Returns the first common parent node of first and second | |
| const t_pb_graph_node* find_common_parent(const t_pb_graph_node* first, const t_pb_graph_node* second); | |
| /************************************************************** | |
| * Intra-Logic Block Utility Functions | |
| **************************************************************/ | |
| //Class for looking up pb graph pins from block pin indicies | |
| class IntraLbPbPinLookup { | |
| public: | |
| IntraLbPbPinLookup(t_type_descriptor* block_types, int num_block_types); | |
| IntraLbPbPinLookup(const IntraLbPbPinLookup& rhs); | |
| IntraLbPbPinLookup& operator=(IntraLbPbPinLookup rhs); | |
| ~IntraLbPbPinLookup(); | |
| //Returns the pb graph pin associated with the specified type (index into block types array) and | |
| // pb pin index (index into block_pb().pb_route) | |
| const t_pb_graph_pin* pb_gpin(int itype, int ipin) const; | |
| friend void swap(IntraLbPbPinLookup& lhs, IntraLbPbPinLookup& rhs); | |
| private: | |
| t_type_descriptor* block_types_; | |
| int num_types_; | |
| t_pb_graph_pin*** intra_lb_pb_pin_lookup_; | |
| }; | |
| //Find the atom pins (driver or sinks) connected to the specified top-level CLB pin | |
| std::vector<AtomPinId> find_clb_pin_connected_atom_pins(ClusterBlockId clb, int clb_pin, const IntraLbPbPinLookup& pb_gpin_lookup); | |
| //Find the atom pin driving to the specified top-level CLB pin | |
| AtomPinId find_clb_pin_driver_atom_pin(ClusterBlockId clb, int clb_pin, const IntraLbPbPinLookup& pb_gpin_lookup); | |
| //Find the atom pins driven by the specified top-level CLB pin | |
| std::vector<AtomPinId> find_clb_pin_sink_atom_pins(ClusterBlockId clb, int clb_pin, const IntraLbPbPinLookup& pb_gpin_lookup); | |
| std::tuple<ClusterNetId,int,int> find_pb_route_clb_input_net_pin(ClusterBlockId clb, int sink_pb_route_id); | |
| //Return the pb pin index corresponding to the pin clb_pin on block clb, | |
| //acounting for the effect of 'z' position > 0. | |
| // | |
| // Note that a CLB pin index does not (neccessarily) map directly to the pb_route index representing the first stage | |
| // of internal routing in the block, since a block may have capacity > 1 (e.g. IOs) | |
| // | |
| // In the clustered netlist blocks with capacity > 1 may have their 'z' position > 0, and their clb pin indicies offset | |
| // by the number of pins on the type (c.f. post_place_sync()). | |
| // | |
| // This offset is not mirrored in the t_pb or pb graph, so we need to recover the basic pin index before processing | |
| // further -- which is what this function does. | |
| int find_clb_pb_pin(ClusterBlockId clb, int clb_pin); | |
| //Return the clb_pin corresponding to the pb_pin on the specified block | |
| int find_pb_pin_clb_pin(ClusterBlockId clb, int pb_pin); | |
| //Returns the port matching name within pb_gnode | |
| const t_port* find_pb_graph_port(const t_pb_graph_node* pb_gnode, std::string port_name); | |
| //Returns the pb graph pin matching port_name at pin index in pb_gnode | |
| const t_pb_graph_pin* find_pb_graph_pin(const t_pb_graph_node* pb_gnode, std::string port_name, int index); | |
| //Returns the pb graph pin associated with the specified atom pin [only valid after clustring] | |
| const t_pb_graph_pin* find_pb_graph_pin(const AtomNetlist& netlist, const AtomLookup& netlist_lookup, const AtomPinId pin_id); | |
| //Returns the pb graph pin on pb_gnode corresponding to the type/pin index of specified atom pin | |
| const t_pb_graph_pin* find_corresponding_pb_graph_pin(const t_pb_graph_node* pb_gnode, AtomPinId atom_pin); | |
| //Returns the pb graph pin on pb_node which corresponds to atom_pin (or nullptr if none) | |
| t_pb_graph_pin* find_pb_pin(t_pb_graph_node* pb_node, AtomPinId atom_pin); | |
| //Returns the block type matching name, or nullptr (if not found) | |
| t_type_descriptor* find_block_type_by_name(std::string name, t_type_descriptor* types, int num_types); | |
| t_type_ptr find_most_common_block_type(const DeviceGrid& grid); | |
| //Returns true if the specified block type contains the specified blif model name | |
| bool block_type_contains_blif_model(t_type_ptr type, std::string blif_model_name); | |
| //Returns true of a pb_type (or it's children) contain the specified blif model name | |
| bool pb_type_contains_blif_model(const t_pb_type* pb_type, const std::string& blif_model_name); | |
| int get_max_primitives_in_pb_type(t_pb_type *pb_type); | |
| int get_max_depth_of_pb_type(t_pb_type *pb_type); | |
| int get_max_nets_in_pb_type(const t_pb_type *pb_type); | |
| bool primitive_type_feasible(AtomBlockId blk_id, const t_pb_type *cur_pb_type); | |
| t_pb_graph_pin* get_pb_graph_node_pin_from_model_port_pin(const t_model_ports *model_port, const int model_pin, const t_pb_graph_node *pb_graph_node); | |
| AtomPinId find_atom_pin(ClusterBlockId blk_id, const t_pb_graph_pin* pb_gpin); | |
| t_pb_graph_pin* get_pb_graph_node_pin_from_block_pin(ClusterBlockId iblock, int ipin); | |
| t_pb_graph_pin** alloc_and_load_pb_graph_pin_lookup_from_index(t_type_ptr type); | |
| void free_pb_graph_pin_lookup_from_index(t_pb_graph_pin** pb_graph_pin_lookup_from_type); | |
| vtr::vector_map<ClusterBlockId, t_pb **> alloc_and_load_pin_id_to_pb_mapping(); | |
| void free_pin_id_to_pb_mapping(vtr::vector_map<ClusterBlockId, t_pb **> &pin_id_to_pb_mapping); | |
| float compute_primitive_base_cost(const t_pb_graph_node *primitive); | |
| int num_ext_inputs_atom_block(AtomBlockId blk_id); | |
| void get_port_pin_from_blk_pin(int blk_type_index, int blk_pin, int * port, | |
| int * port_pin); | |
| void free_port_pin_from_blk_pin(); | |
| void get_blk_pin_from_port_pin(int blk_type_index, int port,int port_pin, | |
| int * blk_pin); | |
| void free_blk_pin_from_port_pin(); | |
| void alloc_and_load_idirect_from_blk_pin(t_direct_inf* directs, int num_directs, | |
| std::vector<std::vector<int>>& idirect_from_blk_pin, | |
| std::vector<std::vector<int>>& direct_type_from_blk_pin); | |
| void parse_direct_pin_name(char * src_string, int line, int * start_pin_index, | |
| int * end_pin_index, char * pb_type_name, char * port_name); | |
| void free_pb_stats(t_pb *pb); | |
| void free_pb(t_pb *pb); | |
| void print_switch_usage(); | |
| void print_usage_by_wire_length(); | |
| AtomBlockId find_tnode_atom_block(int inode); | |
| AtomBlockId find_memory_sibling(const t_pb* pb); | |
| void place_sync_external_block_connections(ClusterBlockId iblk); | |
| int max_pins_per_grid_tile(); | |
| #endif |