Clock Modeling: Removing seg index from rr_nodes
diff --git a/vpr/src/route/check_rr_graph.cpp b/vpr/src/route/check_rr_graph.cpp
index 70b73d1..7d491c7 100755
--- a/vpr/src/route/check_rr_graph.cpp
+++ b/vpr/src/route/check_rr_graph.cpp
@@ -235,7 +235,7 @@
     int xlow, ylow, xhigh, yhigh, ptc_num, capacity;
     t_rr_type rr_type;
     t_type_ptr type;
-    int nodes_per_chan, tracks_per_node, num_edges;
+    int nodes_per_chan, tracks_per_node, num_edges, cost_index;
     float C, R;
 
 
@@ -246,7 +246,7 @@
     yhigh = device_ctx.rr_nodes[inode].yhigh();
     ptc_num = device_ctx.rr_nodes[inode].ptc_num();
     capacity = device_ctx.rr_nodes[inode].capacity();
-    auto cost_index = device_ctx.rr_nodes[inode].cost_index();
+    cost_index = device_ctx.rr_nodes[inode].cost_index();
     type = nullptr;
 
     const auto& grid = device_ctx.grid;
@@ -265,7 +265,7 @@
                 "in check_rr_node: inode %d (type %d) had a ptc_num of %d.\n", inode, rr_type, ptc_num);
     }
 
-    if (cost_index >= device_ctx.rr_indexed_data.size()) {
+    if (cost_index < 0 || cost_index >= (int) device_ctx.rr_indexed_data.size()) {
         vpr_throw(VPR_ERROR_ROUTE, __FILE__, __LINE__,
                 "in check_rr_node: node %d cost index (%d) is out of range.\n", inode, cost_index);
     }
diff --git a/vpr/src/route/clock_network_builders.cpp b/vpr/src/route/clock_network_builders.cpp
index ded97ed..79ad7e9 100644
--- a/vpr/src/route/clock_network_builders.cpp
+++ b/vpr/src/route/clock_network_builders.cpp
@@ -63,10 +63,12 @@
  * ClockNetwork (Member functions)
  */
 
-void ClockNetwork::create_rr_nodes_for_clock_network_wires(ClockRRGraphBuilder& clock_graph) {
-
+void ClockNetwork::create_rr_nodes_for_clock_network_wires(
+        ClockRRGraphBuilder& clock_graph,
+        int num_segments)
+{
     for(int inst_num = 0; inst_num < get_num_inst(); inst_num++){
-        create_rr_nodes_and_internal_edges_for_one_instance(clock_graph);
+        create_rr_nodes_and_internal_edges_for_one_instance(clock_graph, num_segments);
     }
 }
 
@@ -181,9 +183,14 @@
 }
 
 void ClockRib::create_rr_nodes_and_internal_edges_for_one_instance(
-        ClockRRGraphBuilder& clock_graph)
+        ClockRRGraphBuilder& clock_graph,
+        int num_segments)
 {
- 
+
+    // Only chany wires need to know the number of segments inorder
+    // to calculate the cost_index
+    (void) num_segments;
+
     auto& device_ctx = g_vpr_ctx.mutable_device();
     auto& rr_nodes = device_ctx.rr_nodes;
     auto& grid = device_ctx.grid;
@@ -283,25 +290,26 @@
     rr_nodes[node_index].set_type(CHANX);
     rr_nodes[node_index].set_capacity(1);
     rr_nodes[node_index].set_track_num(ptc_num);
-    rr_nodes[node_index].set_cost_index(CHANX_COST_INDEX_START); // Actual value set later
     auto rc_index = find_create_rr_rc_data(x_chan_wire.layer.r_metal, x_chan_wire.layer.c_metal);
     rr_nodes[node_index].set_rc_index(rc_index);
     rr_nodes[node_index].set_direction(direction);
 
+    short seg_index = 0;
     switch(direction) {
         case BI_DIRECTION:
-            rr_nodes[node_index].set_seg_index(drive_seg_idx);
+            seg_index = drive_seg_idx;
             break;
         case DEC_DIRECTION:
-            rr_nodes[node_index].set_seg_index(left_seg_idx);
+            seg_index = left_seg_idx;
             break;
         case INC_DIRECTION:
-            rr_nodes[node_index].set_seg_index(right_seg_idx);
+            seg_index = right_seg_idx;
             break;
         default:
             VTR_ASSERT_MSG(false, "Unidentified direction type for clock rib");
             break;
     }
+    rr_nodes[node_index].set_cost_index(CHANX_COST_INDEX_START+seg_index); // Actual value set later
 
     return node_index;
 }
@@ -434,7 +442,8 @@
 }
 
 void ClockSpine::create_rr_nodes_and_internal_edges_for_one_instance(
-        ClockRRGraphBuilder& clock_graph)
+        ClockRRGraphBuilder& clock_graph,
+        int num_segments)
 {
 
     auto& device_ctx = g_vpr_ctx.mutable_device();
@@ -488,7 +497,8 @@
                                     x,
                                     ptc_num,
                                     BI_DIRECTION,
-                                    rr_nodes);
+                                    rr_nodes,
+                                    num_segments);
             clock_graph.add_switch_location(get_name(), drive.name, x, drive_y, drive_node_idx);
 
             // create spine wire above and below the drive point
@@ -498,14 +508,16 @@
                                     x,
                                     ptc_num,
                                     DEC_DIRECTION,
-                                    rr_nodes);
+                                    rr_nodes,
+                                    num_segments);
             auto right_node_idx = create_chany_wire(
                                     drive_y+1,
                                     y_end,
                                     x,
                                     ptc_num,
                                     INC_DIRECTION,
-                                    rr_nodes);
+                                    rr_nodes,
+                                    num_segments);
 
             // Keep a record of the rr_node idx that we will use to connects switches to at
             // the tap point
@@ -531,7 +543,8 @@
     int x,
     int ptc_num,
     e_direction direction,
-    std::vector<t_rr_node>& rr_nodes)
+    std::vector<t_rr_node>& rr_nodes,
+    int num_segments)
 {
     rr_nodes.emplace_back();
     auto node_index = rr_nodes.size() - 1;
@@ -542,23 +555,24 @@
     rr_nodes[node_index].set_track_num(ptc_num);
     auto rc_index = find_create_rr_rc_data(y_chan_wire.layer.r_metal, y_chan_wire.layer.c_metal);
     rr_nodes[node_index].set_rc_index(rc_index);
-    rr_nodes[node_index].set_cost_index(CHANX_COST_INDEX_START); // Actual value set later
     rr_nodes[node_index].set_direction(direction);
 
+    short seg_index = 0;
     switch(direction) {
         case BI_DIRECTION:
-            rr_nodes[node_index].set_seg_index(drive_seg_idx);
+            seg_index = drive_seg_idx;
             break;
         case DEC_DIRECTION:
-            rr_nodes[node_index].set_seg_index(left_seg_idx);
+            seg_index = left_seg_idx;
             break;
         case INC_DIRECTION:
-            rr_nodes[node_index].set_seg_index(right_seg_idx);
+            seg_index = right_seg_idx;
             break;
         default:
             VTR_ASSERT_MSG(false, "Unidentified direction type for clock rib");
             break;
     }
+    rr_nodes[node_index].set_cost_index(CHANX_COST_INDEX_START + num_segments + seg_index);
 
     return node_index;
 }
@@ -596,11 +610,13 @@
     vpr_throw(VPR_ERROR_ROUTE, __FILE__, __LINE__, "HTrees are not yet supported.\n");
 }
 void ClockHTree::create_rr_nodes_and_internal_edges_for_one_instance(
-        ClockRRGraphBuilder& clock_graph)
+        ClockRRGraphBuilder& clock_graph,
+        int num_segments)
 {
 
     //Remove unused parameter warning
-    (void)clock_graph; 
+    (void)clock_graph;
+    (void)num_segments;
 
     vpr_throw(VPR_ERROR_ROUTE, __FILE__, __LINE__, "HTrees are not yet supported.\n");
 }
diff --git a/vpr/src/route/clock_network_builders.h b/vpr/src/route/clock_network_builders.h
index a7dfb50..f02a6aa 100644
--- a/vpr/src/route/clock_network_builders.h
+++ b/vpr/src/route/clock_network_builders.h
@@ -99,10 +99,13 @@
          */
         /* Creates the RR nodes for the clock network wires and adds them to the reverse lookup
            in ClockRRGraphBuilder. The reverse lookup maps the nodes to their switch point locations */
-        void create_rr_nodes_for_clock_network_wires(ClockRRGraphBuilder& clock_graph);
+        void create_rr_nodes_for_clock_network_wires(
+            ClockRRGraphBuilder& clock_graph,
+            int num_segments);
         virtual void create_segments(std::vector<t_segment_inf>& segment_inf) = 0;
         virtual void create_rr_nodes_and_internal_edges_for_one_instance(
-                        ClockRRGraphBuilder& clock_graph) = 0;
+                        ClockRRGraphBuilder& clock_graph,
+                        int num_segments) = 0;
 };
 
 class ClockRib : public ClockNetwork {
@@ -151,7 +154,8 @@
          */
         void create_segments(std::vector<t_segment_inf>& segment_inf);
         void create_rr_nodes_and_internal_edges_for_one_instance(
-                ClockRRGraphBuilder& clock_graph);
+                ClockRRGraphBuilder& clock_graph,
+                int num_segments);
         int create_chanx_wire(
                 int x_start,
                 int x_end,
@@ -210,14 +214,16 @@
          */
         void create_segments(std::vector<t_segment_inf>& segment_inf);
         void create_rr_nodes_and_internal_edges_for_one_instance(
-                ClockRRGraphBuilder& clock_graph);
+                ClockRRGraphBuilder& clock_graph,
+                int num_segments);
         int create_chany_wire(
             int y_start,
             int y_end,
             int x,
             int ptc_num,
             e_direction direction,
-            std::vector<t_rr_node>& rr_nodes);
+            std::vector<t_rr_node>& rr_nodes,
+            int num_segments);
         void record_tap_locations(
                 unsigned y_start,
                 unsigned y_end,
@@ -245,7 +251,8 @@
         // TODO: Unimplemented member function
         void create_segments(std::vector<t_segment_inf>& segment_inf);
         void create_rr_nodes_and_internal_edges_for_one_instance(
-                ClockRRGraphBuilder& clock_graph);
+                ClockRRGraphBuilder& clock_graph,
+                int num_segments);
 };
 
 #endif
diff --git a/vpr/src/route/rr_graph.cpp b/vpr/src/route/rr_graph.cpp
index 66f6d02..4b9adfc 100644
--- a/vpr/src/route/rr_graph.cpp
+++ b/vpr/src/route/rr_graph.cpp
@@ -1658,7 +1658,6 @@
 
         /* Edge arrays have now been built up.  Do everything else.  */
         L_rr_node[node].set_cost_index(cost_index_offset + seg_details[track].index());
-        L_rr_node[node].set_seg_index(seg_details[track].index());
         L_rr_node[node].set_capacity(1); /* GLOBAL routing handled elsewhere */
 
         if (chan_type == CHANX) {
@@ -2370,7 +2369,7 @@
 
     fprintf(fp, "Capacity: %d\n", L_rr_node[inode].capacity());
     fprintf(fp, "R: %g  C: %g\n", L_rr_node[inode].R(), L_rr_node[inode].C());
-    fprintf(fp, "Cost_index: %zd\n", L_rr_node[inode].cost_index());
+    fprintf(fp, "Cost_index: %d\n", L_rr_node[inode].cost_index());
 }
 
 /* Prints all the device_ctx.rr_indexed_data of index to file fp.   */
diff --git a/vpr/src/route/rr_graph_clock.cpp b/vpr/src/route/rr_graph_clock.cpp
index 1b39f9e..f29496c 100644
--- a/vpr/src/route/rr_graph_clock.cpp
+++ b/vpr/src/route/rr_graph_clock.cpp
@@ -29,7 +29,7 @@
     size_t clock_nodes_start_idx = device_ctx.rr_nodes.size();
 
     ClockRRGraphBuilder clock_graph = ClockRRGraphBuilder();
-    clock_graph.create_clock_networks_wires(clock_networks);
+    clock_graph.create_clock_networks_wires(clock_networks, segment_inf.size());
     clock_graph.create_clock_networks_switches(clock_routing);
 
     // Reset fanin to account for newly added clock rr_nodes
@@ -43,7 +43,6 @@
 
     alloc_and_load_rr_indexed_data(segment_inf, device_ctx.rr_node_indices,
             chan_width->max, wire_to_rr_ipin_switch, base_cost_type);
-    set_rr_node_cost_idx_based_on_seg_idx(segment_inf.size());
 
     float elapsed_time = (float) (clock() - begin) / CLOCKS_PER_SEC;
     vtr::printf_info("Building clock network resource graph took %g seconds\n", elapsed_time);
@@ -51,11 +50,12 @@
 
 // Clock network information comes from the arch file
 void ClockRRGraphBuilder::create_clock_networks_wires(
-        std::vector<std::unique_ptr<ClockNetwork>>& clock_networks)
+        std::vector<std::unique_ptr<ClockNetwork>>& clock_networks,
+        int num_segments)
 {
     // Add rr_nodes for each clock network wire
     for (auto& clock_network : clock_networks) {
-        clock_network->create_rr_nodes_for_clock_network_wires(*this);
+        clock_network->create_rr_nodes_for_clock_network_wires(*this, num_segments);
     }
 
     // Reduce the capacity of rr_nodes for performance
diff --git a/vpr/src/route/rr_graph_clock.h b/vpr/src/route/rr_graph_clock.h
index 061c2c2..7cd7be3 100644
--- a/vpr/src/route/rr_graph_clock.h
+++ b/vpr/src/route/rr_graph_clock.h
@@ -107,7 +107,9 @@
 
     private:
         /* loop over all of the clock networks and create their wires */
-        void create_clock_networks_wires(std::vector<std::unique_ptr<ClockNetwork>>& clock_networks);
+        void create_clock_networks_wires(
+            std::vector<std::unique_ptr<ClockNetwork>>& clock_networks,
+            int num_segments);
 
         /* loop over all clock routing connections and create the switches and connections */
         void create_clock_networks_switches(
diff --git a/vpr/src/route/rr_graph_util.cpp b/vpr/src/route/rr_graph_util.cpp
index 52e5ee2..edc5893 100755
--- a/vpr/src/route/rr_graph_util.cpp
+++ b/vpr/src/route/rr_graph_util.cpp
@@ -78,23 +78,3 @@
 	}
 }
 
-void set_rr_node_cost_idx_based_on_seg_idx(int num_segments) {
-
-    auto& device_ctx = g_vpr_ctx.mutable_device();
-    auto& rr_nodes = device_ctx.rr_nodes;
-
-    for(size_t node_idx = 0; node_idx < rr_nodes.size(); node_idx++) {
-        t_rr_type rr_type = rr_nodes[node_idx].type();
-        size_t seg_idx = rr_nodes[node_idx].seg_index();
-        // TODO: Add check to make sure that seg_idx was set. Can be done by chaning
-        //       seg_index to be a short and then Asserting that its value is not -1
-        //       since that is the value that rr_node initializes it with. However,
-        //       seg_index() function currently returns a size_t type value
-        if(rr_type == CHANX) {
-            rr_nodes[node_idx].set_cost_index(CHANX_COST_INDEX_START + seg_idx);
-        } else if (rr_type == CHANY) {
-            rr_nodes[node_idx].set_cost_index(CHANX_COST_INDEX_START + num_segments + seg_idx);
-        }
-    }
-
-}
diff --git a/vpr/src/route/rr_graph_util.h b/vpr/src/route/rr_graph_util.h
index 574ebe9..c065500 100755
--- a/vpr/src/route/rr_graph_util.h
+++ b/vpr/src/route/rr_graph_util.h
@@ -5,6 +5,4 @@
 
 int seg_index_of_sblock(int from_node, int to_node);
 
-void set_rr_node_cost_idx_based_on_seg_idx(int num_segments);
-
 #endif
diff --git a/vpr/src/route/rr_node.cpp b/vpr/src/route/rr_node.cpp
index 57399d5..5b0a1b3 100644
--- a/vpr/src/route/rr_node.cpp
+++ b/vpr/src/route/rr_node.cpp
@@ -51,14 +51,10 @@
     return ptc_.class_num;
 }
 
-size_t t_rr_node::cost_index() const {
+short t_rr_node::cost_index() const {
 	return cost_index_;
 }
 
-size_t t_rr_node::seg_index() const {
-	return seg_index_;
-}
-
 short t_rr_node::rc_index() const {
 	return rc_index_;
 }
@@ -209,10 +205,6 @@
 	cost_index_ = new_cost_index;
 }
 
-void t_rr_node::set_seg_index(size_t new_seg_index) {
-    seg_index_ = new_seg_index;
-}
-
 void t_rr_node::set_rc_index(short new_rc_index) {
 	rc_index_ = new_rc_index;
 }
diff --git a/vpr/src/route/rr_node.h b/vpr/src/route/rr_node.h
index 4c08d96..fb30784 100644
--- a/vpr/src/route/rr_node.h
+++ b/vpr/src/route/rr_node.h
@@ -94,8 +94,7 @@
         short track_num() const; //Same as ptc_num() but checks that type() is consistent
         short class_num() const; //Same as ptc_num() but checks that type() is consistent
 
-        size_t cost_index() const;
-        size_t seg_index() const;
+        short cost_index() const;
         short rc_index() const;
         e_direction direction() const;
         const char *direction_string() const;
@@ -140,7 +139,6 @@
 
 
         void set_cost_index(size_t);
-        void set_seg_index(size_t);
         void set_rc_index(short);
 
         void set_direction(e_direction);
@@ -164,7 +162,6 @@
 
         int8_t cost_index_ = -1;
         int16_t rc_index_ = -1;
-        short seg_index_ = -1;
 
         int16_t xlow_ = -1;
         int16_t ylow_ = -1;