#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
