From 615bd5a688c23a368d60c33bf63e14b7f23859e9 Mon Sep 17 00:00:00 2001 From: Amin Mohaghegh Date: Mon, 17 Nov 2025 11:08:35 -0800 Subject: [PATCH 01/14] [lib][rr_graph] initial impl for remove node --- libs/librrgraph/src/base/rr_graph_storage.cpp | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/libs/librrgraph/src/base/rr_graph_storage.cpp b/libs/librrgraph/src/base/rr_graph_storage.cpp index 1e15f127b8..59b11dbfcd 100644 --- a/libs/librrgraph/src/base/rr_graph_storage.cpp +++ b/libs/librrgraph/src/base/rr_graph_storage.cpp @@ -601,6 +601,65 @@ void t_rr_graph_storage::set_virtual_clock_network_root_idx(RRNodeId virtual_clo } } +void t_rr_graph_storage::remove_nodes(const std::vector& nodes) { + std::vector sorted_nodes = nodes; + std::sort(sorted_nodes.begin(), sorted_nodes.end()); + + std::unordered_map removed_nodes_map(); + for (size_t i = 0; i < sorted_nodes.size(); ++i) { + removed_nodes_map[sorted_nodes[i]] = i+1; + } + + for (size_t i = 0; i < sorted_nodes.size(); ++i) { + size_t start_index = sorted_nodes[i]+1; + size_t end_index = (i == sorted_nodes.size() - 1) ? sorted_nodes.size() : sorted_nodes[i + 1]; + for (size_t j = start_index; j < end_index; ++j) { + RRNodeId old_node = RRNodeId(j); + RRNodeId new_node = RRNodeId(j-(i+1)); + node_storage_[new_node] = node_storage_[old_node]; + node_ptc_[new_node] = node_ptc_[old_node]; + node_first_edge_[new_node] = node_first_edge_[old_node]; + node_fan_in_[new_node] = node_fan_in_[old_node]; + node_layer_[new_node] = node_layer_[old_node]; + node_name_[new_node] = node_name_[old_node]; + if (is_tileable_) { + node_bend_start_[new_node] = node_bend_start_[old_node]; + node_bend_end_[new_node] = node_bend_end_[old_node]; + } + } + } + + std::vector removed_edges; + auto adjust_edges = [&](std::vector& edge_nodes) { + for (size_t edge_index = 0; edge_index < edge_nodes.size(); ++edge_index) { + RREdgeId edge_id = RREdgeId(edge_index); + RRNodeId node = edge_nodes[edge_id]; + + // Find insertion point in the sorted vector + auto node_it = std::lower_bound(sorted_nodes.begin(), sorted_nodes.end(), node); + + if (node_it != sorted_nodes.end() && *node_it == node) { + // Node exists in sorted_nodes, mark edge for removal + removed_edges.push_back(edge_id); + } else { + size_t node_offset; + if (node_it == sorted_nodes.end()) { + node_offset = sorted_nodes.size(); + } else { + node_offset = std::distance(sorted_nodes.begin(), node_it) + 1; + } + size_t new_node_index = size_t(node) - node_offset; + edge_nodes[edge_id] = RRNodeId(new_node_index); + } + } + }; + + adjust_edges(edge_src_node_); + adjust_edges(edge_dest_node_); + + remove_edges(removed_edges); +} + int t_rr_graph_view::node_ptc_num(RRNodeId id) const { return node_ptc_[id].ptc_.pin_num; } From 511f89dec26ade0c8de2e986c80564bc7dd8b554 Mon Sep 17 00:00:00 2001 From: Amin Mohaghegh Date: Mon, 17 Nov 2025 12:06:27 -0800 Subject: [PATCH 02/14] [libs][rr_graph] uniquify remove edges --- libs/librrgraph/src/base/rr_graph_storage.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/librrgraph/src/base/rr_graph_storage.cpp b/libs/librrgraph/src/base/rr_graph_storage.cpp index 59b11dbfcd..fac904fcfe 100644 --- a/libs/librrgraph/src/base/rr_graph_storage.cpp +++ b/libs/librrgraph/src/base/rr_graph_storage.cpp @@ -654,6 +654,10 @@ void t_rr_graph_storage::remove_nodes(const std::vector& nodes) { } }; + //uniquify removed_edges + std::sort(removed_edges.begin(), removed_edges.end()); + removed_edges.erase(std::unique(removed_edges.begin(), removed_edges.end()), removed_edges.end()); + adjust_edges(edge_src_node_); adjust_edges(edge_dest_node_); From 5bbf3d75febd7d8b12ab6c943dd726dae5cd1b8f Mon Sep 17 00:00:00 2001 From: Amin Mohaghegh Date: Mon, 17 Nov 2025 12:27:48 -0800 Subject: [PATCH 03/14] [lib][rr_graph] add comments + shrink rr graph node data structures --- libs/librrgraph/src/base/rr_graph_storage.cpp | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/libs/librrgraph/src/base/rr_graph_storage.cpp b/libs/librrgraph/src/base/rr_graph_storage.cpp index c2aefe30ae..b6b776624f 100644 --- a/libs/librrgraph/src/base/rr_graph_storage.cpp +++ b/libs/librrgraph/src/base/rr_graph_storage.cpp @@ -647,19 +647,23 @@ void t_rr_graph_storage::set_virtual_clock_network_root_idx(RRNodeId virtual_clo } void t_rr_graph_storage::remove_nodes(const std::vector& nodes) { + // To remove the nodes, we first sort them in ascending order. This makes it easy + // to calculate the offset by which other node IDs need to be adjusted. + // For example, after sorting the nodes to be removed, if a node ID falls between + // the first and second element, its ID should be reduced by 1. + // If a node ID is larger than the last element, its ID should be reduced by + // the total number of nodes being removed. std::vector sorted_nodes = nodes; std::sort(sorted_nodes.begin(), sorted_nodes.end()); - - std::unordered_map removed_nodes_map(); - for (size_t i = 0; i < sorted_nodes.size(); ++i) { - removed_nodes_map[sorted_nodes[i]] = i+1; - } + // Iterate over the nodes to be removed and adjust the IDs of nodes + // that fall between them. for (size_t i = 0; i < sorted_nodes.size(); ++i) { - size_t start_index = sorted_nodes[i]+1; - size_t end_index = (i == sorted_nodes.size() - 1) ? sorted_nodes.size() : sorted_nodes[i + 1]; - for (size_t j = start_index; j < end_index; ++j) { + size_t start_rr_node_index = sorted_nodes[i]+1; + size_t end_rr_node_index = (i == sorted_nodes.size() - 1) ? sorted_nodes.size() : sorted_nodes[i + 1]; + for (size_t j = start_rr_node_index; j < end_rr_node_index; ++j) { RRNodeId old_node = RRNodeId(j); + // New node index is equal to the old nodex index minus the number of nodes being removed before it. RRNodeId new_node = RRNodeId(j-(i+1)); node_storage_[new_node] = node_storage_[old_node]; node_ptc_[new_node] = node_ptc_[old_node]; @@ -674,6 +678,20 @@ void t_rr_graph_storage::remove_nodes(const std::vector& nodes) { } } + // Now that the data structures are adjusted, we can shrink the size of them + size_t num_nodes_to_remove = sorted_nodes.size(); + VTR_ASSERT(num_nodes_to_remove <= node_storage_.size()); + node_storage_.erase(node_storage_.end()-num_nodes_to_remove, node_storage_.end()); + node_ptc_.erase(node_ptc_.end()-num_nodes_to_remove, node_ptc_.end()); + node_first_edge_.erase(node_first_edge_.end()-num_nodes_to_remove, node_first_edge_.end()); + node_fan_in_.erase(node_fan_in_.end()-num_nodes_to_remove, node_fan_in_.end()); + node_layer_.erase(node_layer_.end()-num_nodes_to_remove, node_layer_.end()); + node_name_.erase(node_name_.end()-num_nodes_to_remove, node_name_.end()); + if (is_tileable_) { + node_bend_start_.erase(node_bend_start_.end()-num_nodes_to_remove, node_bend_start_.end()); + node_bend_end_.erase(node_bend_end_.end()-num_nodes_to_remove, node_bend_end_.end()); + } + std::vector removed_edges; auto adjust_edges = [&](std::vector& edge_nodes) { for (size_t edge_index = 0; edge_index < edge_nodes.size(); ++edge_index) { From dfc2a33ada3925132dc5679ffdf6bee7ce836975 Mon Sep 17 00:00:00 2001 From: Amin Mohaghegh Date: Mon, 17 Nov 2025 12:28:37 -0800 Subject: [PATCH 04/14] fix a typo --- libs/librrgraph/src/base/rr_graph_storage.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libs/librrgraph/src/base/rr_graph_storage.cpp b/libs/librrgraph/src/base/rr_graph_storage.cpp index b6b776624f..7b679d7389 100644 --- a/libs/librrgraph/src/base/rr_graph_storage.cpp +++ b/libs/librrgraph/src/base/rr_graph_storage.cpp @@ -717,10 +717,6 @@ void t_rr_graph_storage::remove_nodes(const std::vector& nodes) { } }; - //uniquify removed_edges - std::sort(removed_edges.begin(), removed_edges.end()); - removed_edges.erase(std::unique(removed_edges.begin(), removed_edges.end()), removed_edges.end()); - adjust_edges(edge_src_node_); adjust_edges(edge_dest_node_); From ec0a8e59f992b349e4d891eb93d4783b09abcd73 Mon Sep 17 00:00:00 2001 From: Amin Mohaghegh Date: Mon, 17 Nov 2025 12:35:56 -0800 Subject: [PATCH 05/14] [lib][rr_graph] remove node_tilable_track_nums_ from rr graph builder --- libs/librrgraph/src/base/rr_graph_builder.cpp | 59 +++---------------- libs/librrgraph/src/base/rr_graph_builder.h | 30 ---------- 2 files changed, 8 insertions(+), 81 deletions(-) diff --git a/libs/librrgraph/src/base/rr_graph_builder.cpp b/libs/librrgraph/src/base/rr_graph_builder.cpp index a09c4a727a..a9fc82322c 100644 --- a/libs/librrgraph/src/base/rr_graph_builder.cpp +++ b/libs/librrgraph/src/base/rr_graph_builder.cpp @@ -31,10 +31,6 @@ vtr::vector>& RRGraphBuilder::node_in_edge_stora return node_in_edges_; } -vtr::vector>& RRGraphBuilder::node_ptc_storage() { - return node_tilable_track_nums_; -} - void RRGraphBuilder::add_node_to_all_locs(RRNodeId node) { e_rr_type node_type = node_storage_.node_type(node); short node_ptc_num = node_storage_.node_ptc_num(node); @@ -76,7 +72,6 @@ RRNodeId RRGraphBuilder::create_node(int layer, int x, int y, e_rr_type type, in node_side = side; } node_storage_.emplace_back(); - node_tilable_track_nums_.emplace_back(); RRNodeId new_node = RRNodeId(node_storage_.size() - 1); node_storage_.set_node_layer(new_node, layer, layer); node_storage_.set_node_type(new_node, type); @@ -102,7 +97,6 @@ void RRGraphBuilder::clear() { node_lookup_.clear(); node_storage_.clear(); node_in_edges_.clear(); - node_tilable_track_nums_.clear(); rr_node_metadata_.clear(); rr_edge_metadata_.clear(); rr_segments_.clear(); @@ -232,58 +226,20 @@ std::vector RRGraphBuilder::node_in_edges(RRNodeId node) const { } void RRGraphBuilder::set_node_ptc_nums(RRNodeId node, const std::string& ptc_str) { - VTR_ASSERT(size_t(node) < node_storage_.size()); - std::vector ptc_tokens = vtr::StringToken(ptc_str).split(","); - VTR_ASSERT(ptc_tokens.size() >= 1); - set_node_ptc_num(node, std::stoi(ptc_tokens[0])); - if (ptc_tokens.size() > 1) { - VTR_ASSERT(size_t(node) < node_tilable_track_nums_.size()); - node_tilable_track_nums_[node].resize(ptc_tokens.size()); - for (size_t iptc = 0; iptc < ptc_tokens.size(); iptc++) { - node_tilable_track_nums_[node][iptc] = std::stoi(ptc_tokens[iptc]); - } - } + node_storage_.set_node_ptc_nums(node, ptc_str); } std::string RRGraphBuilder::node_ptc_nums_to_string(RRNodeId node) const { - if (node_tilable_track_nums_.empty()) { - return std::to_string(size_t(node_storage_.node_ptc_num(node))); - } - VTR_ASSERT(size_t(node) < node_tilable_track_nums_.size()); - if (node_tilable_track_nums_[node].empty()) { - return std::to_string(size_t(node_storage_.node_ptc_num(node))); - } - std::string ret; - for (size_t iptc = 0; iptc < node_tilable_track_nums_[node].size(); iptc++) { - ret += std::to_string(size_t(node_tilable_track_nums_[node][iptc])) + ","; - } - // Remove the last comma - ret.pop_back(); - return ret; + return node_storage_.node_ptc_nums_to_string(node); } bool RRGraphBuilder::node_contain_multiple_ptc(RRNodeId node) const { - if (node_tilable_track_nums_.empty()) { - return false; - } - return node_tilable_track_nums_[node].size() > 1; + return node_storage_.node_contain_multiple_ptc(node); } void RRGraphBuilder::add_node_track_num(RRNodeId node, vtr::Point node_offset, short track_id) { - VTR_ASSERT(size_t(node) < node_storage_.size()); - VTR_ASSERT(size_t(node) < node_tilable_track_nums_.size()); - VTR_ASSERT_MSG(node_storage_.node_type(node) == e_rr_type::CHANX || node_storage_.node_type(node) == e_rr_type::CHANY, "Track number valid only for CHANX/CHANY RR nodes"); - - size_t node_length = std::abs(node_storage_.node_xhigh(node) - node_storage_.node_xlow(node)) - + std::abs(node_storage_.node_yhigh(node) - node_storage_.node_ylow(node)); - if (node_length + 1 != node_tilable_track_nums_[node].size()) { - node_tilable_track_nums_[node].resize(node_length + 1); - } - - size_t offset = node_offset.x() - node_storage_.node_xlow(node) + node_offset.y() - node_storage_.node_ylow(node); - VTR_ASSERT(offset < node_tilable_track_nums_[node].size()); - - node_tilable_track_nums_[node][offset] = track_id; + size_t node_offset_value = node_offset.x() - node_storage_.node_xlow(node) + node_offset.y() - node_storage_.node_ylow(node); + node_storage_.add_node_tilable_track_num(node, node_offset_value, track_id); } void RRGraphBuilder::add_track_node_to_lookup(RRNodeId node) { @@ -309,8 +265,9 @@ void RRGraphBuilder::add_track_node_to_lookup(RRNodeId node) { // Routing channel nodes may have different ptc num // Find the track ids using the x/y offset if (e_rr_type::CHANX == node_type || e_rr_type::CHANY == node_type) { - ptc = (node_type == e_rr_type::CHANX) ? node_tilable_track_nums_[node][x - node_storage_.node_xlow(node)] : - node_tilable_track_nums_[node][y - node_storage_.node_ylow(node)]; + const std::vector& track_nums = node_storage_.node_tilable_track_nums(node); + ptc = (node_type == e_rr_type::CHANX) ? track_nums[x - node_storage_.node_xlow(node)] : + track_nums[y - node_storage_.node_ylow(node)]; node_lookup_.add_node(node, node_storage_.node_layer_low(node), x, y, node_type, ptc); } } diff --git a/libs/librrgraph/src/base/rr_graph_builder.h b/libs/librrgraph/src/base/rr_graph_builder.h index 3ba04b3dc0..b82b29893b 100644 --- a/libs/librrgraph/src/base/rr_graph_builder.h +++ b/libs/librrgraph/src/base/rr_graph_builder.h @@ -50,9 +50,6 @@ class RRGraphBuilder { /** @brief Return a writable object fo the incoming edge storage */ vtr::vector>& node_in_edge_storage(); - - /** @brief Return a writable object of the node ptc storage (for tileable routing resource graph) */ - vtr::vector>& node_ptc_storage(); /** @brief Return the size for rr_node_metadata */ inline size_t rr_node_metadata_size() const { @@ -431,10 +428,6 @@ class RRGraphBuilder { inline void resize_nodes(size_t size) { node_storage_.resize(size); } - /** @brief This function resize node ptc nums. Only used by RR graph I/O reader and writers. */ - inline void resize_node_ptc_nums(size_t size) { - node_tilable_track_nums_.resize(size); - } /** @brief This function resize rr_switch to accomidate size RR Switch. */ @@ -538,29 +531,6 @@ class RRGraphBuilder { */ vtr::vector> node_in_edges_; - /** - * @brief Extra ptc number for each routing resource node. - * @note This is required by tileable routing resource graphs. The first index is the node id, and - * the second index is is the relative distance from the starting point of the node. - * @details - * In a tileable routing architecture, routing tracks, e.g., CHANX and CHANY, follow a staggered organization. - * Hence, a routing track may appear in different routing channels, representing different ptc/track id. - * Here is an illustrative example of a X-direction routing track (CHANX) in INC direction, which is organized in staggered way. - * - * Coord(x,y) (1,0) (2,0) (3,0) (4,0) Another track (node) - * ptc=0 ------> ------> - * \ / - * ptc=1 ------> / - * \ / - * ptc=2 ------> / - * \ / - * ptc=3 -------> - * ^ ^ - * | | - * starting point ending point - */ - vtr::vector> node_tilable_track_nums_; - /** @warning The Metadata should stay as an independent data structure from the rest of the internal data, * e.g., node_lookup! */ /* Metadata is an extra data on rr-nodes and edges, respectively, that is not used by vpr From 7817922334ee19101f4b91fbc2c077c2e66da253 Mon Sep 17 00:00:00 2001 From: Amin Mohaghegh Date: Mon, 17 Nov 2025 12:41:21 -0800 Subject: [PATCH 06/14] [lib][rr_graph] add node_tilable_track_nums_ to rr graph storage --- libs/librrgraph/src/base/rr_graph_storage.cpp | 48 +++++++++++++++++ libs/librrgraph/src/base/rr_graph_storage.h | 52 ++++++++++++++++++- 2 files changed, 98 insertions(+), 2 deletions(-) diff --git a/libs/librrgraph/src/base/rr_graph_storage.cpp b/libs/librrgraph/src/base/rr_graph_storage.cpp index 7b679d7389..5be9257596 100644 --- a/libs/librrgraph/src/base/rr_graph_storage.cpp +++ b/libs/librrgraph/src/base/rr_graph_storage.cpp @@ -620,6 +620,54 @@ void t_rr_graph_storage::set_node_direction(RRNodeId id, Direction new_direction node_storage_[id].dir_side_.direction = new_direction; } +void t_rr_graph_storage::set_node_ptc_nums(RRNodeId node, const std::string& ptc_str) { + VTR_ASSERT(size_t(node) < node_storage_.size()); + std::vector ptc_tokens = vtr::StringToken(ptc_str).split(","); + VTR_ASSERT(ptc_tokens.size() >= 1); + set_node_ptc_num(node, std::stoi(ptc_tokens[0])); + if (ptc_tokens.size() > 1) { + VTR_ASSERT(size_t(node) < node_tilable_track_nums_.size()); + node_tilable_track_nums_[node].resize(ptc_tokens.size()); + for (size_t iptc = 0; iptc < ptc_tokens.size(); iptc++) { + node_tilable_track_nums_[node][iptc] = std::stoi(ptc_tokens[iptc]); + } + } +} + +void t_rr_graph_storage::add_node_tilable_track_num(RRNodeId node, size_t node_offset, short track_id) { + VTR_ASSERT(size_t(node) < node_storage_.size()); + VTR_ASSERT(size_t(node) < node_tilable_track_nums_.size()); + VTR_ASSERT_MSG(node_type(node) == e_rr_type::CHANX || node_type(node) == e_rr_type::CHANY, + "Track number valid only for CHANX/CHANY RR nodes"); + + size_t node_length = std::abs(node_xhigh(node) - node_xlow(node)) + + std::abs(node_yhigh(node) - node_ylow(node)); + if (node_length + 1 != node_tilable_track_nums_[node].size()) { + node_tilable_track_nums_[node].resize(node_length + 1); + } + + VTR_ASSERT(node_offset < node_tilable_track_nums_[node].size()); + + node_tilable_track_nums_[node][node_offset] = track_id; +} + +std::string t_rr_graph_storage::node_ptc_nums_to_string(RRNodeId node) const { + if (node_tilable_track_nums_.empty()) { + return std::to_string(size_t(node_ptc_num(node))); + } + VTR_ASSERT(size_t(node) < node_tilable_track_nums_.size()); + if (node_tilable_track_nums_[node].empty()) { + return std::to_string(size_t(node_ptc_num(node))); + } + std::string ret; + for (size_t iptc = 0; iptc < node_tilable_track_nums_[node].size(); iptc++) { + ret += std::to_string(size_t(node_tilable_track_nums_[node][iptc])) + ","; + } + // Remove the last comma + ret.pop_back(); + return ret; +} + void t_rr_graph_storage::add_node_side(RRNodeId id, e_side new_side) { if (node_type(id) != e_rr_type::IPIN && node_type(id) != e_rr_type::OPIN) { VTR_LOG_ERROR("Attempted to set RR node 'side' for non-pin type '%s'", node_type_string(id)); diff --git a/libs/librrgraph/src/base/rr_graph_storage.h b/libs/librrgraph/src/base/rr_graph_storage.h index 7d06795f49..ce7b0c9b95 100644 --- a/libs/librrgraph/src/base/rr_graph_storage.h +++ b/libs/librrgraph/src/base/rr_graph_storage.h @@ -564,6 +564,9 @@ class t_rr_graph_storage { node_bend_end_.reserve(node_storage_.capacity()); node_bend_end_.resize(node_storage_.size()); + + node_tilable_track_nums_.reserve(node_storage_.capacity()); + node_tilable_track_nums_.resize(node_storage_.size()); } } @@ -577,6 +580,7 @@ class t_rr_graph_storage { if (is_tileable_) { node_bend_start_.reserve(size); node_bend_end_.reserve(size); + node_tilable_track_nums_.reserve(size); } } @@ -590,6 +594,7 @@ class t_rr_graph_storage { if (is_tileable_) { node_bend_start_.resize(size); node_bend_end_.resize(size); + node_tilable_track_nums_.resize(size); } } @@ -614,6 +619,7 @@ class t_rr_graph_storage { node_layer_.clear(); node_bend_start_.clear(); node_bend_end_.clear(); + node_tilable_track_nums_.clear(); node_name_.clear(); virtual_clock_network_root_idx_.clear(); edge_src_node_.clear(); @@ -623,7 +629,6 @@ class t_rr_graph_storage { edges_read_ = false; partitioned_ = false; remapped_edges_ = false; - is_tileable_ = false; } /** @brief @@ -652,7 +657,7 @@ class t_rr_graph_storage { node_layer_.shrink_to_fit(); node_bend_start_.shrink_to_fit(); node_bend_end_.shrink_to_fit(); - + node_tilable_track_nums_.shrink_to_fit(); edge_src_node_.shrink_to_fit(); edge_dest_node_.shrink_to_fit(); edge_switch_.shrink_to_fit(); @@ -669,6 +674,7 @@ class t_rr_graph_storage { if (is_tileable_) { node_bend_start_.emplace_back(); node_bend_end_.emplace_back(); + node_tilable_track_nums_.emplace_back(); } } @@ -699,6 +705,25 @@ class t_rr_graph_storage { void set_node_capacity(RRNodeId, short new_capacity); void set_node_direction(RRNodeId, Direction new_direction); + void set_node_ptc_nums(RRNodeId node, const std::string& ptc_str); + void add_node_tilable_track_num(RRNodeId node, size_t node_offset, short track_id); + + void emplace_back_node_tilable_track_num(); + + bool node_contain_multiple_ptc(RRNodeId node) const { + if (node_tilable_track_nums_.empty()) { + return false; + } else { + return node_tilable_track_nums_[node].size() > 1; + } + } + + std::string node_ptc_nums_to_string(RRNodeId node) const; + + const std::vector& node_tilable_track_nums(RRNodeId node) const { + return node_tilable_track_nums_[node]; + } + /** @brief * Add a side to the node attributes * This is the function to use when you just add a new side WITHOUT resetting side attributes @@ -961,6 +986,29 @@ class t_rr_graph_storage { */ vtr::vector node_ptc_; + /** + * @brief Extra ptc number for each routing resource node. + * @note This is required by tileable routing resource graphs. The first index is the node id, and + * the second index is is the relative distance from the starting point of the node. + * @details + * In a tileable routing architecture, routing tracks, e.g., CHANX and CHANY, follow a staggered organization. + * Hence, a routing track may appear in different routing channels, representing different ptc/track id. + * Here is an illustrative example of a X-direction routing track (CHANX) in INC direction, which is organized in staggered way. + * + * Coord(x,y) (1,0) (2,0) (3,0) (4,0) Another track (node) + * ptc=0 ------> ------> + * \ / + * ptc=1 ------> / + * \ / + * ptc=2 ------> / + * \ / + * ptc=3 -------> + * ^ ^ + * | | + * starting point ending point + */ + vtr::vector> node_tilable_track_nums_; + /** @brief * This array stores the first edge of each RRNodeId. Not that the length * of this vector is always storage_.size() + 1, where the last value is From 54ff74382ea706c4f82c6e957fcdf4d72e86fafd Mon Sep 17 00:00:00 2001 From: Amin Mohaghegh Date: Mon, 17 Nov 2025 12:43:38 -0800 Subject: [PATCH 07/14] [lib][rr_grpah] remove node_tileable_track_nums_ from rr_graph_view --- libs/librrgraph/src/base/rr_graph_view.cpp | 7 ++----- libs/librrgraph/src/base/rr_graph_view.h | 7 +------ 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/libs/librrgraph/src/base/rr_graph_view.cpp b/libs/librrgraph/src/base/rr_graph_view.cpp index 0b8b04b13e..4f5cbb7773 100644 --- a/libs/librrgraph/src/base/rr_graph_view.cpp +++ b/libs/librrgraph/src/base/rr_graph_view.cpp @@ -10,8 +10,7 @@ RRGraphView::RRGraphView(const t_rr_graph_storage& node_storage, const std::vector& rr_rc_data, const vtr::vector& rr_segments, const vtr::vector& rr_switch_inf, - const vtr::vector>& node_in_edges, - const vtr::vector>& node_tileable_track_nums) + const vtr::vector>& node_in_edges) : node_storage_(node_storage) , node_lookup_(node_lookup) , rr_node_metadata_(rr_node_metadata) @@ -20,9 +19,7 @@ RRGraphView::RRGraphView(const t_rr_graph_storage& node_storage, , rr_rc_data_(rr_rc_data) , rr_segments_(rr_segments) , rr_switch_inf_(rr_switch_inf) - , node_in_edges_(node_in_edges) - , node_tileable_track_nums_(node_tileable_track_nums) { -} + , node_in_edges_(node_in_edges) {} std::vector RRGraphView::node_in_edges(RRNodeId node) const { VTR_ASSERT(size_t(node) < node_storage_.size()); diff --git a/libs/librrgraph/src/base/rr_graph_view.h b/libs/librrgraph/src/base/rr_graph_view.h index b3e9a7cae1..7022b1dcf4 100644 --- a/libs/librrgraph/src/base/rr_graph_view.h +++ b/libs/librrgraph/src/base/rr_graph_view.h @@ -83,8 +83,7 @@ class RRGraphView { const std::vector& rr_rc_data, const vtr::vector& rr_segments, const vtr::vector& rr_switch_inf, - const vtr::vector>& node_in_edges, - const vtr::vector>& node_ptc_nums); + const vtr::vector>& node_in_edges); /* Disable copy constructors and copy assignment operator * This is to avoid accidental copy because it could be an expensive operation considering that the @@ -825,8 +824,4 @@ class RRGraphView { /// A list of incoming edges for each routing resource node. This can be built optionally, as required by applications. /// By default, it is empty. Call build_in_edges() to construct it. const vtr::vector>& node_in_edges_; - - /// A list of extra ptc numbers for each routing resource node. This is only used for tileable architecture. - /// See details in RRGraphBuilder class - const vtr::vector>& node_tileable_track_nums_; }; From 3da38b057fcfb0f71e3b638cf39619a1639dbc1b Mon Sep 17 00:00:00 2001 From: Amin Mohaghegh Date: Mon, 17 Nov 2025 12:45:10 -0800 Subject: [PATCH 08/14] [lib][librrgraph] set tileable to true when reading rr graph from a file if graph type is tileable --- libs/librrgraph/src/io/rr_graph_reader.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/librrgraph/src/io/rr_graph_reader.cpp b/libs/librrgraph/src/io/rr_graph_reader.cpp index ff0f8b9e4a..41d3d76211 100644 --- a/libs/librrgraph/src/io/rr_graph_reader.cpp +++ b/libs/librrgraph/src/io/rr_graph_reader.cpp @@ -83,6 +83,10 @@ void load_rr_file(RRGraphBuilder* rr_graph_builder, rr_graph_builder->add_rr_segment(segment_inf[(iseg)]); } + if (graph_type == e_graph_type::UNIDIR_TILEABLE) { + rr_graph_builder->set_tileable(true); + } + RrGraphSerializer reader( graph_type, base_cost_type, From dda1dd52c2b6933b74af22b3d4f71ddca1dfb62b Mon Sep 17 00:00:00 2001 From: Amin Mohaghegh Date: Mon, 17 Nov 2025 12:46:58 -0800 Subject: [PATCH 09/14] [libs][rrgraph] remove redundant function call --- libs/librrgraph/src/io/rr_graph_uxsdcxx_serializer.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libs/librrgraph/src/io/rr_graph_uxsdcxx_serializer.h b/libs/librrgraph/src/io/rr_graph_uxsdcxx_serializer.h index 3f76fa47f2..0482f338bd 100644 --- a/libs/librrgraph/src/io/rr_graph_uxsdcxx_serializer.h +++ b/libs/librrgraph/src/io/rr_graph_uxsdcxx_serializer.h @@ -896,7 +896,6 @@ class RrGraphSerializer final : public uxsd::RrGraphBase { */ inline void preallocate_rr_nodes_node(void*& /*ctx*/, size_t size) final { rr_graph_builder_->reserve_nodes(size); - rr_graph_builder_->resize_node_ptc_nums(size); } inline int add_rr_nodes_node(void*& /*ctx*/, unsigned int capacity, unsigned int id, uxsd::enum_node_type type) final { // make_room_in_vector will not allocate if preallocate_rr_nodes_node @@ -1195,7 +1194,7 @@ class RrGraphSerializer final : public uxsd::RrGraphBase { most_frequent_switch.first = switch_id; most_frequent_switch.second = count_for_wire_to_ipin_switches[switch_id]; } - } else{ + } else { VTR_ASSERT(rr_graph.node_layer_low(RRNodeId(sink_node)) != rr_graph.node_layer_low(RRNodeId(source_node))); count_for_wire_to_ipin_switches_between_dice[switch_id]++; if(count_for_wire_to_ipin_switches_between_dice[switch_id] > most_frequent_switch_between_dice.second){ From de52b915f7f903f579f56b7ccbb8dbd01291d550 Mon Sep 17 00:00:00 2001 From: Amin Mohaghegh Date: Mon, 17 Nov 2025 12:52:51 -0800 Subject: [PATCH 10/14] [vpr] fix instances of rr graph view --- vpr/src/base/vpr_context.h | 3 +-- vpr/src/route/router_lookahead/router_lookahead_map.cpp | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/vpr/src/base/vpr_context.h b/vpr/src/base/vpr_context.h index 051e109b4b..0ce96ac3aa 100644 --- a/vpr/src/base/vpr_context.h +++ b/vpr/src/base/vpr_context.h @@ -237,8 +237,7 @@ struct DeviceContext : public Context { rr_rc_data, rr_graph_builder.rr_segments(), rr_graph_builder.rr_switch(), - rr_graph_builder.node_in_edge_storage(), - rr_graph_builder.node_ptc_storage()}; + rr_graph_builder.node_in_edge_storage()}; ///@brief Track ids for each rr_node in the rr_graph. This is used by drawer for tileable routing resource graph std::map> rr_node_track_ids; diff --git a/vpr/src/route/router_lookahead/router_lookahead_map.cpp b/vpr/src/route/router_lookahead/router_lookahead_map.cpp index c7ea331f45..2cacbe1424 100644 --- a/vpr/src/route/router_lookahead/router_lookahead_map.cpp +++ b/vpr/src/route/router_lookahead/router_lookahead_map.cpp @@ -760,8 +760,7 @@ static void compute_tile_lookahead(std::unordered_map Date: Mon, 17 Nov 2025 15:03:31 -0800 Subject: [PATCH 11/14] [lib][rr_graph] add remove_node header --- libs/librrgraph/src/base/rr_graph_storage.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libs/librrgraph/src/base/rr_graph_storage.h b/libs/librrgraph/src/base/rr_graph_storage.h index ce7b0c9b95..d34df9e0fa 100644 --- a/libs/librrgraph/src/base/rr_graph_storage.h +++ b/libs/librrgraph/src/base/rr_graph_storage.h @@ -737,6 +737,16 @@ class t_rr_graph_storage { */ void set_virtual_clock_network_root_idx(RRNodeId virtual_clock_network_root_idx); + /** + * @brief Removes a given list of RRNodes from the RR Graph + * This method should be called after partition_edges has been called. + * @note This a very expensive method, so should be called only when necessary. It is better + * to not add nodes in the first place, instead of relying on this method to remove nodes. + * + * @param nodes list of RRNodes to be removed + */ + void remove_nodes(const std::vector& nodes); + /**************** * Edge methods * ****************/ From 3b9f5526e6ecfe4cf370548812205ffcd2f31db2 Mon Sep 17 00:00:00 2001 From: Amin Mohaghegh Date: Mon, 17 Nov 2025 15:17:02 -0800 Subject: [PATCH 12/14] [lib][rr_graph] erase node_tilable_track_nums_ when removing a node --- libs/librrgraph/src/base/rr_graph_storage.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/libs/librrgraph/src/base/rr_graph_storage.cpp b/libs/librrgraph/src/base/rr_graph_storage.cpp index 5be9257596..063e479ca8 100644 --- a/libs/librrgraph/src/base/rr_graph_storage.cpp +++ b/libs/librrgraph/src/base/rr_graph_storage.cpp @@ -707,8 +707,8 @@ void t_rr_graph_storage::remove_nodes(const std::vector& nodes) { // Iterate over the nodes to be removed and adjust the IDs of nodes // that fall between them. for (size_t i = 0; i < sorted_nodes.size(); ++i) { - size_t start_rr_node_index = sorted_nodes[i]+1; - size_t end_rr_node_index = (i == sorted_nodes.size() - 1) ? sorted_nodes.size() : sorted_nodes[i + 1]; + size_t start_rr_node_index = size_t(sorted_nodes[i]) + 1; + size_t end_rr_node_index = (i == sorted_nodes.size() - 1) ? sorted_nodes.size() : size_t(sorted_nodes[i + 1]); for (size_t j = start_rr_node_index; j < end_rr_node_index; ++j) { RRNodeId old_node = RRNodeId(j); // New node index is equal to the old nodex index minus the number of nodes being removed before it. @@ -722,6 +722,7 @@ void t_rr_graph_storage::remove_nodes(const std::vector& nodes) { if (is_tileable_) { node_bend_start_[new_node] = node_bend_start_[old_node]; node_bend_end_[new_node] = node_bend_end_[old_node]; + node_tilable_track_nums_[new_node] = node_tilable_track_nums_[old_node]; } } } @@ -734,14 +735,18 @@ void t_rr_graph_storage::remove_nodes(const std::vector& nodes) { node_first_edge_.erase(node_first_edge_.end()-num_nodes_to_remove, node_first_edge_.end()); node_fan_in_.erase(node_fan_in_.end()-num_nodes_to_remove, node_fan_in_.end()); node_layer_.erase(node_layer_.end()-num_nodes_to_remove, node_layer_.end()); - node_name_.erase(node_name_.end()-num_nodes_to_remove, node_name_.end()); + for (size_t node_index = node_name_.size()-num_nodes_to_remove; node_index < node_name_.size(); ++node_index) { + RRNodeId node = RRNodeId(node_index); + node_name_.erase(node); + } if (is_tileable_) { node_bend_start_.erase(node_bend_start_.end()-num_nodes_to_remove, node_bend_start_.end()); node_bend_end_.erase(node_bend_end_.end()-num_nodes_to_remove, node_bend_end_.end()); + node_tilable_track_nums_.erase(node_tilable_track_nums_.end()-num_nodes_to_remove, node_tilable_track_nums_.end()); } std::vector removed_edges; - auto adjust_edges = [&](std::vector& edge_nodes) { + auto adjust_edges = [&](vtr::vector& edge_nodes) { for (size_t edge_index = 0; edge_index < edge_nodes.size(); ++edge_index) { RREdgeId edge_id = RREdgeId(edge_index); RRNodeId node = edge_nodes[edge_id]; From e5a0f13b554dff10bda4d104023f51e6963ad1ff Mon Sep 17 00:00:00 2001 From: Amin Mohaghegh Date: Thu, 20 Nov 2025 09:33:46 -0800 Subject: [PATCH 13/14] [lib][rr_graph][storage] fix bugs with remove_nodes --- libs/librrgraph/src/base/rr_graph_storage.cpp | 20 ++++++++----------- libs/librrgraph/src/base/rr_graph_storage.h | 5 +++-- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/libs/librrgraph/src/base/rr_graph_storage.cpp b/libs/librrgraph/src/base/rr_graph_storage.cpp index 8356ba2988..6ad7b54bc4 100644 --- a/libs/librrgraph/src/base/rr_graph_storage.cpp +++ b/libs/librrgraph/src/base/rr_graph_storage.cpp @@ -63,6 +63,10 @@ void t_rr_graph_storage::alloc_and_load_edges(const t_rr_edge_info_set* rr_edges void t_rr_graph_storage::remove_edges(std::vector& rr_edges_to_remove) { VTR_ASSERT(!edges_read_); + if (rr_edges_to_remove.empty()) { + return; + } + size_t starting_edge_count = edge_dest_node_.size(); // Sort and make sure all edge indices are unique @@ -178,7 +182,7 @@ bool t_rr_graph_storage::verify_first_edges() const { void t_rr_graph_storage::init_fan_in() { //Reset all fan-ins to zero - edges_read_ = true; + node_fan_in_.clear(); node_fan_in_.resize(node_storage_.size(), 0); node_fan_in_.shrink_to_fit(); //Walk the graph and increment fanin on all downstream nodes @@ -700,6 +704,7 @@ void t_rr_graph_storage::set_virtual_clock_network_root_idx(RRNodeId virtual_clo } void t_rr_graph_storage::remove_nodes(const std::vector& nodes) { + VTR_ASSERT(!edges_read_); // To remove the nodes, we first sort them in ascending order. This makes it easy // to calculate the offset by which other node IDs need to be adjusted. // For example, after sorting the nodes to be removed, if a node ID falls between @@ -713,15 +718,13 @@ void t_rr_graph_storage::remove_nodes(const std::vector& nodes) { // that fall between them. for (size_t i = 0; i < sorted_nodes.size(); ++i) { size_t start_rr_node_index = size_t(sorted_nodes[i]) + 1; - size_t end_rr_node_index = (i == sorted_nodes.size() - 1) ? sorted_nodes.size() : size_t(sorted_nodes[i + 1]); + size_t end_rr_node_index = (i == sorted_nodes.size() - 1) ? node_storage_.size() : size_t(sorted_nodes[i + 1]); for (size_t j = start_rr_node_index; j < end_rr_node_index; ++j) { RRNodeId old_node = RRNodeId(j); // New node index is equal to the old nodex index minus the number of nodes being removed before it. RRNodeId new_node = RRNodeId(j-(i+1)); node_storage_[new_node] = node_storage_[old_node]; node_ptc_[new_node] = node_ptc_[old_node]; - node_first_edge_[new_node] = node_first_edge_[old_node]; - node_fan_in_[new_node] = node_fan_in_[old_node]; node_layer_[new_node] = node_layer_[old_node]; node_name_[new_node] = node_name_[old_node]; if (is_tileable_) { @@ -737,8 +740,6 @@ void t_rr_graph_storage::remove_nodes(const std::vector& nodes) { VTR_ASSERT(num_nodes_to_remove <= node_storage_.size()); node_storage_.erase(node_storage_.end()-num_nodes_to_remove, node_storage_.end()); node_ptc_.erase(node_ptc_.end()-num_nodes_to_remove, node_ptc_.end()); - node_first_edge_.erase(node_first_edge_.end()-num_nodes_to_remove, node_first_edge_.end()); - node_fan_in_.erase(node_fan_in_.end()-num_nodes_to_remove, node_fan_in_.end()); node_layer_.erase(node_layer_.end()-num_nodes_to_remove, node_layer_.end()); for (size_t node_index = node_name_.size()-num_nodes_to_remove; node_index < node_name_.size(); ++node_index) { RRNodeId node = RRNodeId(node_index); @@ -763,12 +764,7 @@ void t_rr_graph_storage::remove_nodes(const std::vector& nodes) { // Node exists in sorted_nodes, mark edge for removal removed_edges.push_back(edge_id); } else { - size_t node_offset; - if (node_it == sorted_nodes.end()) { - node_offset = sorted_nodes.size(); - } else { - node_offset = std::distance(sorted_nodes.begin(), node_it) + 1; - } + size_t node_offset = std::distance(sorted_nodes.begin(), node_it); size_t new_node_index = size_t(node) - node_offset; edge_nodes[edge_id] = RRNodeId(new_node_index); } diff --git a/libs/librrgraph/src/base/rr_graph_storage.h b/libs/librrgraph/src/base/rr_graph_storage.h index ff1bbee225..233b50f116 100644 --- a/libs/librrgraph/src/base/rr_graph_storage.h +++ b/libs/librrgraph/src/base/rr_graph_storage.h @@ -739,7 +739,8 @@ class t_rr_graph_storage { /** * @brief Removes a given list of RRNodes from the RR Graph - * This method should be called after partition_edges has been called. + * This method should be called before partition_edges has been called. + * If init_fan_in has been called, you need to call it again after removing the nodes. * @note This a very expensive method, so should be called only when necessary. It is better * to not add nodes in the first place, instead of relying on this method to remove nodes. * @@ -1018,7 +1019,7 @@ class t_rr_graph_storage { * | | * starting point ending point */ - vtr::vector> node_tilable_track_nums_; + vtr::vector> node_tilable_track_nums_; /** @brief * This array stores the first edge of each RRNodeId. Not that the length From 684c864e26cc08de2e3d1a9123a42fda4e2cbd68 Mon Sep 17 00:00:00 2001 From: Amin Mohaghegh Date: Fri, 21 Nov 2025 12:56:49 -0800 Subject: [PATCH 14/14] [ci] update flat router results based on extracted results from ci --- .../strong_flat_router/config/golden_results.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/vtr_flow/tasks/regression_tests/vtr_reg_strong/strong_flat_router/config/golden_results.txt b/vtr_flow/tasks/regression_tests/vtr_reg_strong/strong_flat_router/config/golden_results.txt index 5254889535..460042951f 100644 --- a/vtr_flow/tasks/regression_tests/vtr_reg_strong/strong_flat_router/config/golden_results.txt +++ b/vtr_flow/tasks/regression_tests/vtr_reg_strong/strong_flat_router/config/golden_results.txt @@ -1,6 +1,6 @@ arch circuit script_params vtr_flow_elapsed_time vtr_max_mem_stage vtr_max_mem error odin_synth_time max_odin_mem parmys_synth_time max_parmys_mem abc_depth abc_synth_time abc_cec_time abc_sec_time max_abc_mem ace_time max_ace_mem num_clb num_io num_memories num_mult vpr_status vpr_revision vpr_build_info vpr_compiler vpr_compiled hostname rundir max_vpr_mem num_primary_inputs num_primary_outputs num_pre_packed_nets num_pre_packed_blocks num_netlist_clocks num_post_packed_nets num_post_packed_blocks device_width device_height device_grid_tiles device_limiting_resources device_name pack_mem pack_time initial_placed_wirelength_est placed_wirelength_est total_swap accepted_swap rejected_swap aborted_swap place_mem place_time place_quench_time initial_placed_CPD_est placed_CPD_est placed_setup_TNS_est placed_setup_WNS_est placed_geomean_nonvirtual_intradomain_critical_path_delay_est place_delay_matrix_lookup_time place_quench_timing_analysis_time place_quench_sta_time place_total_timing_analysis_time place_total_sta_time ap_mem ap_time ap_full_legalizer_mem ap_full_legalizer_time routed_wirelength avg_routed_wirelength routed_wiresegment avg_routed_wiresegment total_nets_routed total_connections_routed total_heap_pushes total_heap_pops logic_block_area_total logic_block_area_used routing_area_total routing_area_per_tile crit_path_route_success_iteration num_rr_graph_nodes num_rr_graph_edges collapsed_nodes critical_path_delay geomean_nonvirtual_intradomain_critical_path_delay setup_TNS setup_WNS hold_TNS hold_WNS create_rr_graph_time create_intra_cluster_rr_graph_time adding_internal_edges route_mem crit_path_route_time crit_path_total_timing_analysis_time crit_path_total_sta_time router_lookahead_mem tile_lookahead_computation_time router_lookahead_computation_time -k6_frac_N10_frac_chain_mem32K_40nm.xml spree.v common 6.66 vpr 79.59 MiB -1 -1 1.82 32820 16 0.42 -1 -1 34360 -1 -1 63 45 3 1 success v8.0.0-13084-g071ad3865 release IPO VTR_ASSERT_LEVEL=2 GNU 13.3.0 on Linux-6.8.0-60-generic x86_64 2025-06-17T09:37:40 betzgrp-wintermute /home/pooladam/vtr-verilog-to-routing 81504 45 32 1201 1160 1 783 144 14 14 196 memory auto 41.5 MiB 1.69 9983.95 6837 19748 5148 14340 260 79.6 MiB 0.28 0.01 13.1759 11.4387 -7248.38 -11.4387 11.4387 0.00 0.00210698 0.0018731 0.13099 0.115486 -1 -1 -1 -1 10382 8.66611 2740 2.28715 3140 14798 1339040 147684 9.20055e+06 5.43532e+06 1.47691e+06 7535.23 16 45716 406619 17417 11.6791 11.6791 -7715.01 -11.6791 0 0 0.13 0.64 0.52 79.6 MiB 1.17 0.200391 0.176279 79.6 MiB 0.12 0.03 -k6_frac_N10_frac_chain_mem32K_40nm.xml spree.v common_--router_algorithm_parallel_--num_workers_4 6.64 vpr 79.19 MiB -1 -1 1.51 33588 16 0.43 -1 -1 34372 -1 -1 63 45 3 1 success v8.0.0-13084-g071ad3865 release IPO VTR_ASSERT_LEVEL=2 GNU 13.3.0 on Linux-6.8.0-60-generic x86_64 2025-06-17T09:37:40 betzgrp-wintermute /home/pooladam/vtr-verilog-to-routing 81088 45 32 1201 1160 1 783 144 14 14 196 memory auto 41.0 MiB 1.84 9983.95 6837 19748 5148 14340 260 79.2 MiB 0.29 0.01 13.1759 11.4387 -7248.38 -11.4387 11.4387 0.00 0.00222732 0.00189111 0.1317 0.109721 -1 -1 -1 -1 10443 8.71703 2750 2.29549 3161 15375 1392011 152666 9.20055e+06 5.43532e+06 1.47691e+06 7535.23 12 45716 406619 17417 11.6791 11.6791 -7722.48 -11.6791 0 0 0.13 0.69 0.56 79.2 MiB 1.23 0.18425 0.153208 79.2 MiB 0.13 0.03 -k6_frac_N10_frac_chain_mem32K_40nm.xml spree.v common_--enable_parallel_connection_router_on_--astar_fac_0.0_--post_target_prune_fac_0.0_--post_target_prune_offset_0.0 10.88 vpr 79.58 MiB -1 -1 1.72 32828 16 0.43 -1 -1 34368 -1 -1 63 45 3 1 success v8.0.0-13084-g071ad3865 release IPO VTR_ASSERT_LEVEL=2 GNU 13.3.0 on Linux-6.8.0-60-generic x86_64 2025-06-17T09:37:40 betzgrp-wintermute /home/pooladam/vtr-verilog-to-routing 81488 45 32 1201 1160 1 783 144 14 14 196 memory auto 41.4 MiB 1.68 9983.95 6837 19748 5148 14340 260 79.6 MiB 0.28 0.01 13.1759 11.4387 -7248.38 -11.4387 11.4387 0.00 0.00212171 0.00188597 0.133325 0.11809 -1 -1 -1 -1 10486 8.75292 2770 2.31219 2730 12935 12360712 12360712 9.20055e+06 5.43532e+06 1.47691e+06 7535.23 12 45716 406619 17417 11.6724 11.6724 -7741.54 -11.6724 0 0 0.13 0.64 0.52 79.6 MiB 5.50 0.194193 0.171088 79.6 MiB 0.12 0.03 -k6_frac_N10_frac_chain_mem32K_40nm.xml spree.v common_--enable_parallel_connection_router_on_--multi_queue_num_threads_2_--multi_queue_num_queues_4_--astar_fac_0.0_--post_target_prune_fac_0.0_--post_target_prune_offset_0.0 11.28 vpr 79.58 MiB -1 -1 1.64 32828 16 0.45 -1 -1 34376 -1 -1 63 45 3 1 success v8.0.0-13084-g071ad3865 release IPO VTR_ASSERT_LEVEL=2 GNU 13.3.0 on Linux-6.8.0-60-generic x86_64 2025-06-17T09:37:40 betzgrp-wintermute /home/pooladam/vtr-verilog-to-routing 81492 45 32 1201 1160 1 783 144 14 14 196 memory auto 41.3 MiB 1.77 9983.95 6837 19748 5148 14340 260 79.6 MiB 0.29 0.01 13.1759 11.4387 -7248.38 -11.4387 11.4387 0.00 0.00244582 0.00220781 0.137178 0.121982 -1 -1 -1 -1 10486 8.75292 2770 2.31219 2730 12935 12521019 12521019 9.20055e+06 5.43532e+06 1.47691e+06 7535.23 12 45716 406619 17417 11.6724 11.6724 -7741.54 -11.6724 0 0 0.12 0.82 0.69 79.6 MiB 5.81 0.200647 0.177977 79.6 MiB 0.13 0.03 -k6_frac_N10_frac_chain_mem32K_40nm.xml spree.v common_--enable_parallel_connection_router_on_--multi_queue_num_threads_2_--multi_queue_num_queues_8_--multi_queue_direct_draining_on_--astar_fac_0.0_--post_target_prune_fac_0.0_--post_target_prune_offset_0.0 9.17 vpr 78.88 MiB -1 -1 1.49 33600 16 0.43 -1 -1 34372 -1 -1 63 45 3 1 success v8.0.0-13084-g071ad3865 release IPO VTR_ASSERT_LEVEL=2 GNU 13.3.0 on Linux-6.8.0-60-generic x86_64 2025-06-17T09:37:40 betzgrp-wintermute /home/pooladam/vtr-verilog-to-routing 80772 45 32 1201 1160 1 783 144 14 14 196 memory auto 40.7 MiB 1.72 9983.95 6837 19748 5148 14340 260 78.9 MiB 0.27 0.00 13.1759 11.4387 -7248.38 -11.4387 11.4387 0.00 0.00192149 0.00169201 0.122653 0.108032 -1 -1 -1 -1 10486 8.75292 2770 2.31219 2730 12935 12702465 5662306 9.20055e+06 5.43532e+06 1.47691e+06 7535.23 12 45716 406619 17417 11.6724 11.6724 -7741.54 -11.6724 0 0 0.12 0.64 0.52 78.9 MiB 3.96 0.180729 0.15881 78.9 MiB 0.12 0.03 +k6_frac_N10_frac_chain_mem32K_40nm.xml spree.v common -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 unknown unknown unknown unknown -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +k6_frac_N10_frac_chain_mem32K_40nm.xml spree.v common_--router_algorithm_parallel_--num_workers_4 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 unknown unknown unknown unknown -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +k6_frac_N10_frac_chain_mem32K_40nm.xml spree.v common_--enable_parallel_connection_router_on_--astar_fac_0.0_--post_target_prune_fac_0.0_--post_target_prune_offset_0.0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 unknown unknown unknown unknown -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +k6_frac_N10_frac_chain_mem32K_40nm.xml spree.v common_--enable_parallel_connection_router_on_--multi_queue_num_threads_2_--multi_queue_num_queues_4_--astar_fac_0.0_--post_target_prune_fac_0.0_--post_target_prune_offset_0.0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 unknown unknown unknown unknown -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +k6_frac_N10_frac_chain_mem32K_40nm.xml spree.v common_--enable_parallel_connection_router_on_--multi_queue_num_threads_2_--multi_queue_num_queues_8_--multi_queue_direct_draining_on_--astar_fac_0.0_--post_target_prune_fac_0.0_--post_target_prune_offset_0.0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 unknown unknown unknown unknown -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1