blob: 1ef8c89e49d60679300554a593655fd0a3bba6b8 [file] [log] [blame]
#ifndef RR_GRAPH_OBJ_H
#define RR_GRAPH_OBJ_H
#include "rr_graph_fwd.h"
#include "vtr_vector.h"
#include "vtr_range.h"
#include "vtr_geometry.h"
#include "vpr_types.h"
class RRGraph {
public: //Types
typedef vtr::vector<RRNodeId,RRNodeId>::const_iterator node_iterator;
typedef vtr::vector<RREdgeId,RREdgeId>::const_iterator edge_iterator;
typedef vtr::vector<RRSwitchId,RRSwitchId>::const_iterator switch_iterator;
typedef vtr::Range<node_iterator> node_range;
typedef vtr::Range<edge_iterator> edge_range;
typedef vtr::Range<switch_iterator> switch_range;
public: //Accessors
//Aggregates
node_range nodes() const;
edge_range edges() const;
switch_range switches() const;
//Node attributes
t_rr_type node_type(RRNodeId node) const;
short node_xlow(RRNodeId node) const;
short node_ylow(RRNodeId node) const;
short node_xhigh(RRNodeId node) const;
short node_yhigh(RRNodeId node) const;
short node_length(RRNodeId node) const;
vtr::Rect<short> node_bounding_box(RRNodeId node) const;
short node_capacity(RRNodeId node) const;
short node_fan_in(RRNodeId node) const;
short node_fan_out(RRNodeId node) const;
short node_ptc_num(RRNodeId node) const;
short node_pin_num(RRNodeId node) const;
short node_track_num(RRNodeId node) const;
short node_class_num(RRNodeId node) const;
short node_cost_index(RRNodeId node) const;
e_direction node_direction(RRNodeId node) const;
e_side node_side(RRNodeId node) const;
float node_R(RRNodeId node) const;
float node_C(RRNodeId node) const;
edge_range node_out_edges(RRNodeId node) const;
edge_range node_in_edges(RRNodeId node) const;
//Edge attributes
RRNodeId edge_src_node(RREdgeId edge) const;
RRNodeId edge_sink_node(RREdgeId edge) const;
RRSwitchId edge_switch(RREdgeId edge) const;
//Switch Info
t_rr_switch_inf swich(RRSwitchId switch_id) const;
//Utilities
RREdgeId find_edge(RRNodeId src_node, RRNodeId sink_node) const;
public: //Mutators
RRNodeId create_node(t_rr_type type);
RREdgeId create_edge(RRNodeId source, RRNodeId sink, RRSwitchId switch_id);
RRSwitchId create_switch(t_rr_switch_inf switch_info);
void remove_node(RRNodeId node);
void remove_edge(RREdgeId edge);
void set_node_xlow(RRNodeId node, short xlow);
void set_node_ylow(RRNodeId node, short ylow);
void set_node_xhigh(RRNodeId node, short xhigh);
void set_node_yhigh(RRNodeId node, short yhigh);
void set_node_bounding_box(RRNodeId node, vtr::Rect<short> bb);
void set_node_capacity(RRNodeId node, short capacity);
void set_node_ptc_num(RRNodeId node, short ptc);
void set_node_pin_num(RRNodeId node, short pin_id);
void set_node_track_num(RRNodeId node, short track_id);
void set_node_class_num(RRNodeId node, short class_id);
void set_node_cost_index(RRNodeId node, short cost_index);
void set_node_direction(RRNodeId node, e_direction direction);
void set_node_side(RRNodeId node, e_side side);
void set_node_R(RRNodeId node, float R);
void set_node_C(RRNodeId node, float C);
void compress();
bool validate();
private: //Internal
//Validation
bool valid_node_id(RRNodeId node) const;
bool valid_edge_id(RREdgeId edge) const;
bool validate_sizes() const;
bool validate_node_sizes() const;
bool validate_edge_sizes() const;
bool validate_invariants() const;
bool validate_unique_edges_invariant() const;
bool validate_crossrefs() const;
bool validate_node_edge_crossrefs() const;
//Compression related
void build_id_maps(vtr::vector<RRNodeId,RRNodeId>& node_id_map,
vtr::vector<RREdgeId,RREdgeId>& edge_id_map);
void clean_nodes(const vtr::vector<RRNodeId,RRNodeId>& node_id_map);
void clean_edges(const vtr::vector<RREdgeId,RREdgeId>& edge_id_map);
void rebuild_node_refs(const vtr::vector<RREdgeId,RREdgeId>& edge_id_map);
private: //Data
//Node related data
vtr::vector<RRNodeId,RRNodeId> node_ids_;
vtr::vector<RRNodeId,t_rr_type> node_types_;
vtr::vector<RRNodeId,vtr::Rect<short>> node_bounding_boxes_;
vtr::vector<RRNodeId,short> node_capacities_;
vtr::vector<RRNodeId,short> node_ptc_nums_;
vtr::vector<RRNodeId,short> node_cost_indices_;
vtr::vector<RRNodeId,e_direction> node_directions_;
vtr::vector<RRNodeId,e_side> node_sides_;
vtr::vector<RRNodeId,float> node_Rs_;
vtr::vector<RRNodeId,float> node_Cs_;
vtr::vector<RRNodeId,std::vector<RREdgeId>> node_in_edges_;
vtr::vector<RRNodeId,std::vector<RREdgeId>> node_out_edges_;
//Edge related data
vtr::vector<RREdgeId,RREdgeId> edge_ids_;
vtr::vector<RREdgeId,RRNodeId> edge_src_nodes_;
vtr::vector<RREdgeId,RRNodeId> edge_sink_nodes_;
vtr::vector<RREdgeId,RRSwitchId> edge_switches_;
//Switch related data
// Note that so far there has been no need to remove
// switches, so no such facility exists
vtr::vector<RRSwitchId,RRSwitchId> switch_ids_;
vtr::vector<RRSwitchId,t_rr_switch_inf> switches_;
//Misc.
bool dirty_ = false;
};
#endif