From 8cd11c5214d2b71f478b3a8cfc90dec1e72feb41 Mon Sep 17 00:00:00 2001 From: ZhishengZeng Date: Fri, 6 Dec 2024 12:05:50 +0800 Subject: [PATCH] update --- src/operation/iRT/interface/RTInterface.cpp | 105 ++++++++++----- .../iRT/source/data_manager/DataManager.cpp | 75 +++++++---- .../iRT/source/data_manager/DataManager.hpp | 2 + .../source/data_manager/advance/CutLayer.hpp | 39 ++++-- .../data_manager/advance/RoutingLayer.hpp | 2 + .../module/detailed_router/DetailedRouter.cpp | 124 +++++++++++------- .../module/pin_accessor/PinAccessor.cpp | 104 +++++++++------ .../module/supply_analyzer/SupplyAnalyzer.cpp | 8 +- 8 files changed, 304 insertions(+), 155 deletions(-) diff --git a/src/operation/iRT/interface/RTInterface.cpp b/src/operation/iRT/interface/RTInterface.cpp index 32c11f40..d3d76427 100644 --- a/src/operation/iRT/interface/RTInterface.cpp +++ b/src/operation/iRT/interface/RTInterface.cpp @@ -254,7 +254,7 @@ void RTInterface::clearDef() std::vector remove_pin_list; for (idb::IdbPin* io_pin : idb_pin_list->get_pin_list()) { if (io_pin->get_port_box_list().empty()) { - RTLOG.info(Loc::current(), "del io_pin: ",io_pin->get_pin_name()); + RTLOG.info(Loc::current(), "del io_pin: ", io_pin->get_pin_name()); remove_pin_list.push_back(io_pin); } } @@ -428,49 +428,94 @@ void RTInterface::wrapRoutingDesignRule(RoutingLayer& routing_layer, idb::IdbLay // eol { idb::IdbLayerRouting* idb_routing_layer = dynamic_cast(idb_layer); - int32_t eol_spacing = 0; - int32_t eol_within = 0; if (!idb_routing_layer->get_lef58_spacing_eol_list().empty()) { - eol_spacing = idb_routing_layer->get_lef58_spacing_eol_list().front().get()->get_eol_space(); - eol_within = idb_routing_layer->get_lef58_spacing_eol_list().front().get()->get_eol_within().value(); + int32_t eol_spacing = idb_routing_layer->get_lef58_spacing_eol_list().front().get()->get_eol_space(); + int32_t eol_within = idb_routing_layer->get_lef58_spacing_eol_list().front().get()->get_eol_within().value(); for (std::shared_ptr& idb_rule_eol : idb_routing_layer->get_lef58_spacing_eol_list()) { if (idb_rule_eol.get()->get_eol_space() < eol_spacing) { eol_spacing = idb_rule_eol.get()->get_eol_space(); eol_within = idb_rule_eol.get()->get_eol_within().value(); } } - } - if (eol_spacing == 0 && eol_within == 0) { + routing_layer.set_eol_spacing(eol_spacing); + routing_layer.set_eol_within(eol_within); + } else { RTLOG.warn(Loc::current(), "The idb layer ", idb_layer->get_name(), " eol_spacing is empty!"); + routing_layer.set_eol_spacing(0); + routing_layer.set_eol_within(0); } - routing_layer.set_eol_spacing(eol_spacing); - routing_layer.set_eol_within(eol_within); } } void RTInterface::wrapCutDesignRule(CutLayer& cut_layer, idb::IdbLayerCut* idb_layer) { - if (!idb_layer->get_spacings().empty()) { - cut_layer.set_prl_spacing(0); - cut_layer.set_x_spacing(idb_layer->get_spacings().front()->get_spacing()); - cut_layer.set_y_spacing(idb_layer->get_spacings().front()->get_spacing()); - } else if (!idb_layer->get_lef58_spacing_table().empty()) { - idb::cutlayer::Lef58SpacingTable* spacing_table = idb_layer->get_lef58_spacing_table().front().get(); - int32_t prl_spacing = 0; - if (spacing_table->get_prl().value().get_prl() < 0) { - prl_spacing = -1 * spacing_table->get_prl().value().get_prl(); - } - idb::cutlayer::Lef58SpacingTable::CutSpacing cut_spacing = spacing_table->get_cutclass().get_cut_spacing(0, 0); - int32_t x_spacing = cut_spacing.get_cut_spacing1().value(); - int32_t y_spacing = cut_spacing.get_cut_spacing2().value(); - cut_layer.set_prl_spacing(prl_spacing); - cut_layer.set_x_spacing(x_spacing); - cut_layer.set_y_spacing(y_spacing); - } else { - cut_layer.set_prl_spacing(0); - cut_layer.set_x_spacing(0); - cut_layer.set_y_spacing(0); - RTLOG.warn(Loc::current(), "The idb layer ", idb_layer->get_name(), " spacing table is empty!"); + // curr layer + { + if (!idb_layer->get_spacings().empty()) { + cut_layer.set_curr_prl_spacing(0); + cut_layer.set_curr_x_spacing(idb_layer->get_spacings().front()->get_spacing()); + cut_layer.set_curr_y_spacing(idb_layer->get_spacings().front()->get_spacing()); + } else if (!idb_layer->get_lef58_spacing_table().empty()) { + idb::cutlayer::Lef58SpacingTable* spacing_table = nullptr; + for (std::shared_ptr& spacing_table_ptr : idb_layer->get_lef58_spacing_table()) { + if (spacing_table_ptr.get()->get_second_layer().has_value()) { + continue; + } + spacing_table = spacing_table_ptr.get(); + } + if (spacing_table != nullptr) { + idb::cutlayer::Lef58SpacingTable::CutSpacing cut_spacing = spacing_table->get_cutclass().get_cut_spacing(0, 0); + + int32_t curr_prl_spacing = -1 * spacing_table->get_prl().value().get_prl(); + int32_t curr_x_spacing = cut_spacing.get_cut_spacing1().value(); + int32_t curr_y_spacing = cut_spacing.get_cut_spacing2().value(); + cut_layer.set_curr_prl_spacing(curr_prl_spacing); + cut_layer.set_curr_x_spacing(curr_x_spacing); + cut_layer.set_curr_y_spacing(curr_y_spacing); + } else { + cut_layer.set_curr_prl_spacing(0); + cut_layer.set_curr_x_spacing(0); + cut_layer.set_curr_y_spacing(0); + RTLOG.warn(Loc::current(), "The idb layer ", idb_layer->get_name(), " curr layer spacing is empty!"); + } + } else { + cut_layer.set_curr_prl_spacing(0); + cut_layer.set_curr_x_spacing(0); + cut_layer.set_curr_y_spacing(0); + RTLOG.warn(Loc::current(), "The idb layer ", idb_layer->get_name(), " curr layer spacing is empty!"); + } + } + // below layer + { + if (!idb_layer->get_lef58_spacing_table().empty()) { + idb::cutlayer::Lef58SpacingTable* spacing_table = nullptr; + for (std::shared_ptr& spacing_table_ptr : idb_layer->get_lef58_spacing_table()) { + if (!spacing_table_ptr.get()->get_second_layer().has_value()) { + continue; + } + spacing_table = spacing_table_ptr.get(); + } + if (spacing_table != nullptr) { + idb::cutlayer::Lef58SpacingTable::CutSpacing cut_spacing = spacing_table->get_cutclass().get_cut_spacing(0, 0); + + int32_t below_prl_spacing = -1 * spacing_table->get_prl().value().get_prl(); + int32_t below_x_spacing = cut_spacing.get_cut_spacing1().value(); + int32_t below_y_spacing = cut_spacing.get_cut_spacing2().value(); + cut_layer.set_below_prl_spacing(below_prl_spacing); + cut_layer.set_below_x_spacing(below_x_spacing); + cut_layer.set_below_y_spacing(below_y_spacing); + } else { + cut_layer.set_below_prl_spacing(0); + cut_layer.set_below_x_spacing(0); + cut_layer.set_below_y_spacing(0); + RTLOG.warn(Loc::current(), "The idb layer ", idb_layer->get_name(), " below layer spacing is empty!"); + } + } else { + cut_layer.set_below_prl_spacing(0); + cut_layer.set_below_x_spacing(0); + cut_layer.set_below_y_spacing(0); + RTLOG.warn(Loc::current(), "The idb layer ", idb_layer->get_name(), " below layer spacing is empty!"); + } } } diff --git a/src/operation/iRT/source/data_manager/DataManager.cpp b/src/operation/iRT/source/data_manager/DataManager.cpp index 084734d2..3288e4fd 100644 --- a/src/operation/iRT/source/data_manager/DataManager.cpp +++ b/src/operation/iRT/source/data_manager/DataManager.cpp @@ -647,6 +647,12 @@ void DataManager::transLayerList() } void DataManager::makeLayerList() +{ + makeRoutingLayerList(); + makeCutLayerList(); +} + +void DataManager::makeRoutingLayerList() { Die& die = _database.get_die(); std::vector& routing_layer_list = _database.get_routing_layer_list(); @@ -706,6 +712,22 @@ void DataManager::makeLayerList() } } +void DataManager::makeCutLayerList() +{ + std::vector& cut_layer_list = _database.get_cut_layer_list(); + + for (size_t i = 1; i < cut_layer_list.size(); i++) { + CutLayer& pre_cut_layer = cut_layer_list[i - 1]; + CutLayer& curr_cut_layer = cut_layer_list[i]; + pre_cut_layer.set_above_prl_spacing(curr_cut_layer.get_below_prl_spacing()); + pre_cut_layer.set_above_x_spacing(curr_cut_layer.get_below_x_spacing()); + pre_cut_layer.set_above_y_spacing(curr_cut_layer.get_below_y_spacing()); + } + cut_layer_list.back().set_above_prl_spacing(0); + cut_layer_list.back().set_above_x_spacing(0); + cut_layer_list.back().set_above_y_spacing(0); +} + void DataManager::checkLayerList() { std::vector& routing_layer_list = _database.get_routing_layer_list(); @@ -736,37 +758,46 @@ void DataManager::checkLayerList() } SpacingTable& prl_spacing_table = routing_layer.get_prl_spacing_table(); if (prl_spacing_table.get_width_list().empty()) { - RTLOG.error(Loc::current(), "The layer '", layer_name, "' spacing width list is empty!"); + RTLOG.error(Loc::current(), "The layer '", layer_name, "' spacing width_list is empty!"); } - for (int32_t width : prl_spacing_table.get_width_list()) { - if (width < 0) { - RTLOG.error(Loc::current(), "The layer '", layer_name, "' width < 0!"); - } + if (prl_spacing_table.get_parallel_length_list().empty()) { + RTLOG.error(Loc::current(), "The layer '", layer_name, "' spacing parallel_length_list is empty!"); } - for (int32_t parallel_length : prl_spacing_table.get_parallel_length_list()) { - if (parallel_length < 0) { - RTLOG.error(Loc::current(), "The layer '", layer_name, "' parallel_length < 0!"); - } + if (routing_layer.get_eol_spacing() == -1) { + RTLOG.error(Loc::current(), "The layer '", layer_name, "' eol_spacing == -1!"); } - GridMap& width_parallel_length_map = prl_spacing_table.get_width_parallel_length_map(); - for (int32_t width_idx = 0; width_idx < width_parallel_length_map.get_x_size(); width_idx++) { - for (int32_t parallel_length_idx = 0; parallel_length_idx < width_parallel_length_map.get_y_size(); parallel_length_idx++) { - if (width_parallel_length_map[width_idx][parallel_length_idx] < 0) { - RTLOG.error(Loc::current(), "The layer '", layer_name, "' spacing < 0!"); - } - } + if (routing_layer.get_eol_within() == -1) { + RTLOG.error(Loc::current(), "The layer '", layer_name, "' eol_within == -1!"); } } for (CutLayer& cut_layer : cut_layer_list) { std::string& layer_name = cut_layer.get_layer_name(); - if (cut_layer.get_prl_spacing() < 0) { - RTLOG.error(Loc::current(), "The layer '", layer_name, "' prl_spacing < 0!"); + if (cut_layer.get_curr_prl_spacing() == -1) { + RTLOG.error(Loc::current(), "The layer '", layer_name, "' curr_prl_spacing == -1!"); + } + if (cut_layer.get_curr_x_spacing() == -1) { + RTLOG.error(Loc::current(), "The layer '", layer_name, "' curr_x_spacing == -1!"); + } + if (cut_layer.get_curr_y_spacing() == -1) { + RTLOG.error(Loc::current(), "The layer '", layer_name, "' curr_y_spacing == -1!"); + } + if (cut_layer.get_above_prl_spacing() == -1) { + RTLOG.error(Loc::current(), "The layer '", layer_name, "' above_prl_spacing == -1!"); + } + if (cut_layer.get_above_x_spacing() == -1) { + RTLOG.error(Loc::current(), "The layer '", layer_name, "' above_x_spacing == -1!"); + } + if (cut_layer.get_above_y_spacing() == -1) { + RTLOG.error(Loc::current(), "The layer '", layer_name, "' above_y_spacing == -1!"); + } + if (cut_layer.get_below_prl_spacing() == -1) { + RTLOG.error(Loc::current(), "The layer '", layer_name, "' below_prl_spacing == -1!"); } - if (cut_layer.get_x_spacing() < 0) { - RTLOG.error(Loc::current(), "The layer '", layer_name, "' x_spacing < 0!"); + if (cut_layer.get_below_x_spacing() == -1) { + RTLOG.error(Loc::current(), "The layer '", layer_name, "' below_x_spacing == -1!"); } - if (cut_layer.get_y_spacing() < 0) { - RTLOG.error(Loc::current(), "The layer '", layer_name, "' y_spacing < 0!"); + if (cut_layer.get_below_y_spacing() == -1) { + RTLOG.error(Loc::current(), "The layer '", layer_name, "' below_y_spacing == -1!"); } } } diff --git a/src/operation/iRT/source/data_manager/DataManager.hpp b/src/operation/iRT/source/data_manager/DataManager.hpp index 10295b26..757b5183 100644 --- a/src/operation/iRT/source/data_manager/DataManager.hpp +++ b/src/operation/iRT/source/data_manager/DataManager.hpp @@ -90,6 +90,8 @@ class DataManager void buildLayerList(); void transLayerList(); void makeLayerList(); + void makeRoutingLayerList(); + void makeCutLayerList(); void checkLayerList(); void buildLayerInfo(); void buildLayerViaMasterList(); diff --git a/src/operation/iRT/source/data_manager/advance/CutLayer.hpp b/src/operation/iRT/source/data_manager/advance/CutLayer.hpp index ea53bc88..6ff17d54 100644 --- a/src/operation/iRT/source/data_manager/advance/CutLayer.hpp +++ b/src/operation/iRT/source/data_manager/advance/CutLayer.hpp @@ -30,24 +30,45 @@ class CutLayer int32_t get_layer_idx() const { return _layer_idx; } int32_t get_layer_order() const { return _layer_order; } std::string& get_layer_name() { return _layer_name; } - int32_t get_prl_spacing() const { return _prl_spacing; } - int32_t get_x_spacing() const { return _x_spacing; } - int32_t get_y_spacing() const { return _y_spacing; } + int32_t get_curr_prl_spacing() const { return _curr_prl_spacing; } + int32_t get_curr_x_spacing() const { return _curr_x_spacing; } + int32_t get_curr_y_spacing() const { return _curr_y_spacing; } + int32_t get_above_prl_spacing() const { return _above_prl_spacing; } + int32_t get_above_x_spacing() const { return _above_x_spacing; } + int32_t get_above_y_spacing() const { return _above_y_spacing; } + int32_t get_below_prl_spacing() const { return _below_prl_spacing; } + int32_t get_below_x_spacing() const { return _below_x_spacing; } + int32_t get_below_y_spacing() const { return _below_y_spacing; } // setter void set_layer_idx(const int32_t layer_idx) { _layer_idx = layer_idx; } void set_layer_order(const int32_t layer_order) { _layer_order = layer_order; } void set_layer_name(const std::string& layer_name) { _layer_name = layer_name; } - void set_prl_spacing(const int32_t prl_spacing) { _prl_spacing = prl_spacing; } - void set_x_spacing(const int32_t x_spacing) { _x_spacing = x_spacing; } - void set_y_spacing(const int32_t y_spacing) { _y_spacing = y_spacing; } + void set_curr_prl_spacing(const int32_t curr_prl_spacing) { _curr_prl_spacing = curr_prl_spacing; } + void set_curr_x_spacing(const int32_t curr_x_spacing) { _curr_x_spacing = curr_x_spacing; } + void set_curr_y_spacing(const int32_t curr_y_spacing) { _curr_y_spacing = curr_y_spacing; } + void set_above_prl_spacing(const int32_t above_prl_spacing) { _above_prl_spacing = above_prl_spacing; } + void set_above_x_spacing(const int32_t above_x_spacing) { _above_x_spacing = above_x_spacing; } + void set_above_y_spacing(const int32_t above_y_spacing) { _above_y_spacing = above_y_spacing; } + void set_below_prl_spacing(const int32_t below_prl_spacing) { _below_prl_spacing = below_prl_spacing; } + void set_below_x_spacing(const int32_t below_x_spacing) { _below_x_spacing = below_x_spacing; } + void set_below_y_spacing(const int32_t below_y_spacing) { _below_y_spacing = below_y_spacing; } // function private: int32_t _layer_idx = -1; int32_t _layer_order = -1; std::string _layer_name; - int32_t _prl_spacing = -1; - int32_t _x_spacing = -1; - int32_t _y_spacing = -1; + // curr + int32_t _curr_prl_spacing = -1; + int32_t _curr_x_spacing = -1; + int32_t _curr_y_spacing = -1; + // above + int32_t _above_prl_spacing = -1; + int32_t _above_x_spacing = -1; + int32_t _above_y_spacing = -1; + // below + int32_t _below_prl_spacing = -1; + int32_t _below_x_spacing = -1; + int32_t _below_y_spacing = -1; }; } // namespace irt diff --git a/src/operation/iRT/source/data_manager/advance/RoutingLayer.hpp b/src/operation/iRT/source/data_manager/advance/RoutingLayer.hpp index a5506953..7a798027 100644 --- a/src/operation/iRT/source/data_manager/advance/RoutingLayer.hpp +++ b/src/operation/iRT/source/data_manager/advance/RoutingLayer.hpp @@ -79,7 +79,9 @@ class RoutingLayer int32_t _min_area = 0; Direction _prefer_direction = Direction::kNone; ScaleAxis _track_axis; + // prl SpacingTable _prl_spacing_table; + // eol int32_t _eol_spacing = -1; int32_t _eol_within = -1; }; diff --git a/src/operation/iRT/source/module/detailed_router/DetailedRouter.cpp b/src/operation/iRT/source/module/detailed_router/DetailedRouter.cpp index 8d868bf3..92de5e78 100644 --- a/src/operation/iRT/source/module/detailed_router/DetailedRouter.cpp +++ b/src/operation/iRT/source/module/detailed_router/DetailedRouter.cpp @@ -115,16 +115,16 @@ void DetailedRouter::iterativeDRModel(DRModel& dr_model) */ std::vector dr_parameter_list; // clang-format off - dr_parameter_list.emplace_back(prefer_wire_unit, non_prefer_wire_unit, via_unit, 5, 0, fixed_rect_unit, routed_rect_unit, violation_unit, true, 5); - dr_parameter_list.emplace_back(prefer_wire_unit, non_prefer_wire_unit, via_unit, 5, 1, fixed_rect_unit, routed_rect_unit, violation_unit, false, 5); - dr_parameter_list.emplace_back(prefer_wire_unit, non_prefer_wire_unit, via_unit, 5, 2, fixed_rect_unit, routed_rect_unit, violation_unit, false, 5); - dr_parameter_list.emplace_back(prefer_wire_unit, non_prefer_wire_unit, via_unit, 5, 3, fixed_rect_unit, routed_rect_unit, violation_unit, false, 5); - dr_parameter_list.emplace_back(prefer_wire_unit, non_prefer_wire_unit, via_unit, 5, 4, fixed_rect_unit, routed_rect_unit, violation_unit, false, 5); - dr_parameter_list.emplace_back(prefer_wire_unit, non_prefer_wire_unit, via_unit, 5, 0, fixed_rect_unit, routed_rect_unit, violation_unit, false, 5); - dr_parameter_list.emplace_back(prefer_wire_unit, non_prefer_wire_unit, via_unit, 5, 1, fixed_rect_unit, routed_rect_unit, violation_unit, false, 5); - dr_parameter_list.emplace_back(prefer_wire_unit, non_prefer_wire_unit, via_unit, 5, 2, fixed_rect_unit, routed_rect_unit, violation_unit, false, 5); - dr_parameter_list.emplace_back(prefer_wire_unit, non_prefer_wire_unit, via_unit, 5, 3, fixed_rect_unit, routed_rect_unit, violation_unit, false, 5); - dr_parameter_list.emplace_back(prefer_wire_unit, non_prefer_wire_unit, via_unit, 5, 4, fixed_rect_unit, routed_rect_unit, violation_unit, false, 5); + dr_parameter_list.emplace_back(prefer_wire_unit, non_prefer_wire_unit, via_unit, 5, 0, fixed_rect_unit, routed_rect_unit, violation_unit, true, 3); + dr_parameter_list.emplace_back(prefer_wire_unit, non_prefer_wire_unit, via_unit, 5, 1, fixed_rect_unit, routed_rect_unit, violation_unit, false, 3); + dr_parameter_list.emplace_back(prefer_wire_unit, non_prefer_wire_unit, via_unit, 5, 2, fixed_rect_unit, routed_rect_unit, violation_unit, false, 3); + dr_parameter_list.emplace_back(prefer_wire_unit, non_prefer_wire_unit, via_unit, 5, 3, fixed_rect_unit, routed_rect_unit, violation_unit, false, 3); + dr_parameter_list.emplace_back(prefer_wire_unit, non_prefer_wire_unit, via_unit, 5, 4, fixed_rect_unit, routed_rect_unit, violation_unit, false, 3); + dr_parameter_list.emplace_back(prefer_wire_unit, non_prefer_wire_unit, via_unit, 5, 0, fixed_rect_unit, routed_rect_unit, violation_unit, false, 3); + dr_parameter_list.emplace_back(prefer_wire_unit, non_prefer_wire_unit, via_unit, 5, 1, fixed_rect_unit, routed_rect_unit, violation_unit, false, 3); + dr_parameter_list.emplace_back(prefer_wire_unit, non_prefer_wire_unit, via_unit, 5, 2, fixed_rect_unit, routed_rect_unit, violation_unit, false, 3); + dr_parameter_list.emplace_back(prefer_wire_unit, non_prefer_wire_unit, via_unit, 5, 3, fixed_rect_unit, routed_rect_unit, violation_unit, false, 3); + dr_parameter_list.emplace_back(prefer_wire_unit, non_prefer_wire_unit, via_unit, 5, 4, fixed_rect_unit, routed_rect_unit, violation_unit, false, 3); // clang-format on for (size_t i = 0, iter = 1; i < dr_parameter_list.size(); i++, iter++) { Monitor iter_monitor; @@ -1818,51 +1818,75 @@ std::map> DetailedRouter::getCutNodeOrientationMa if (net_shape.get_is_routing()) { RTLOG.error(Loc::current(), "The type of net_shape is routing!"); } - std::vector adjacent_routing_layer_idx_list = cut_to_adjacent_routing_map[net_shape.get_layer_idx()]; - if (adjacent_routing_layer_idx_list.size() != 2) { - // 如果相邻层只有一个,将不会在那一层打via - return {}; - } - int32_t below_routing_layer_idx = adjacent_routing_layer_idx_list.front(); - int32_t above_routing_layer_idx = adjacent_routing_layer_idx_list.back(); - RTUTIL.swapByASC(below_routing_layer_idx, above_routing_layer_idx); CutLayer& cut_layer = cut_layer_list[net_shape.get_layer_idx()]; - // x_spacing y_spacing - std::vector> spacing_pair_list; + std::map>> cut_spacing_map; { - spacing_pair_list.emplace_back(cut_layer.get_x_spacing(), cut_layer.get_prl_spacing()); - spacing_pair_list.emplace_back(cut_layer.get_prl_spacing(), cut_layer.get_y_spacing()); - } - PlanarRect& cut_shape = layer_via_master_list[below_routing_layer_idx].front().get_cut_shape_list().front(); - int32_t cut_shape_half_x_span = cut_shape.getXSpan() / 2; - int32_t cut_shape_half_y_span = cut_shape.getYSpan() / 2; - - std::vector>& layer_node_map = dr_box.get_layer_node_map(); - std::map> node_orientation_map; - for (auto& [x_spacing, y_spacing] : spacing_pair_list) { - int32_t enlarged_x_size = cut_shape_half_x_span; - int32_t enlarged_y_size = cut_shape_half_y_span; - if (need_enlarged) { - // 膨胀size为 cut_shape_half_span + spacing - enlarged_x_size += x_spacing; - enlarged_y_size += y_spacing; + int32_t curr_cut_layer_idx = net_shape.get_layer_idx(); + if (0 <= curr_cut_layer_idx && curr_cut_layer_idx < static_cast(cut_layer_list.size())) { + std::vector adjacent_routing_layer_idx_list = cut_to_adjacent_routing_map[curr_cut_layer_idx]; + if (adjacent_routing_layer_idx_list.size() == 2) { + std::vector> spacing_pair_list; + spacing_pair_list.emplace_back(cut_layer.get_curr_x_spacing(), cut_layer.get_curr_prl_spacing()); + spacing_pair_list.emplace_back(cut_layer.get_curr_prl_spacing(), cut_layer.get_curr_y_spacing()); + cut_spacing_map[curr_cut_layer_idx] = spacing_pair_list; + } } - // 贴合的也不算违例 - enlarged_x_size -= 1; - enlarged_y_size -= 1; - PlanarRect space_enlarged_rect - = RTUTIL.getEnlargedRect(net_shape.get_rect(), enlarged_x_size, enlarged_y_size, enlarged_x_size, enlarged_y_size); - for (auto& [grid_coord, orientation_set] : RTUTIL.getTrackGridOrientationMap(space_enlarged_rect, dr_box.get_box_track_axis())) { - if (!RTUTIL.exist(orientation_set, Orientation::kAbove) && !RTUTIL.exist(orientation_set, Orientation::kBelow)) { - continue; + int32_t below_cut_layer_idx = net_shape.get_layer_idx() - 1; + if (0 <= below_cut_layer_idx && below_cut_layer_idx < static_cast(cut_layer_list.size())) { + std::vector adjacent_routing_layer_idx_list = cut_to_adjacent_routing_map[below_cut_layer_idx]; + if (adjacent_routing_layer_idx_list.size() == 2) { + std::vector> spacing_pair_list; + spacing_pair_list.emplace_back(cut_layer.get_below_x_spacing(), cut_layer.get_below_prl_spacing()); + spacing_pair_list.emplace_back(cut_layer.get_below_prl_spacing(), cut_layer.get_below_y_spacing()); + cut_spacing_map[below_cut_layer_idx] = spacing_pair_list; } - DRNode& below_node = layer_node_map[below_routing_layer_idx][grid_coord.get_x()][grid_coord.get_y()]; - if (RTUTIL.exist(below_node.get_neighbor_node_map(), Orientation::kAbove)) { - node_orientation_map[&below_node].insert(Orientation::kAbove); + } + int32_t above_cut_layer_idx = net_shape.get_layer_idx() + 1; + if (0 <= above_cut_layer_idx && above_cut_layer_idx < static_cast(cut_layer_list.size())) { + std::vector adjacent_routing_layer_idx_list = cut_to_adjacent_routing_map[above_cut_layer_idx]; + if (adjacent_routing_layer_idx_list.size() == 2) { + std::vector> spacing_pair_list; + spacing_pair_list.emplace_back(cut_layer.get_above_x_spacing(), cut_layer.get_above_prl_spacing()); + spacing_pair_list.emplace_back(cut_layer.get_above_prl_spacing(), cut_layer.get_above_y_spacing()); + cut_spacing_map[above_cut_layer_idx] = spacing_pair_list; } - DRNode& above_node = layer_node_map[above_routing_layer_idx][grid_coord.get_x()][grid_coord.get_y()]; - if (RTUTIL.exist(above_node.get_neighbor_node_map(), Orientation::kBelow)) { - node_orientation_map[&above_node].insert(Orientation::kBelow); + } + } + std::map> node_orientation_map; + for (auto& [cut_layer_idx, spacing_pair_list] : cut_spacing_map) { + std::vector adjacent_routing_layer_idx_list = cut_to_adjacent_routing_map[cut_layer_idx]; + int32_t below_routing_layer_idx = adjacent_routing_layer_idx_list.front(); + int32_t above_routing_layer_idx = adjacent_routing_layer_idx_list.back(); + RTUTIL.swapByASC(below_routing_layer_idx, above_routing_layer_idx); + PlanarRect& cut_shape = layer_via_master_list[below_routing_layer_idx].front().get_cut_shape_list().front(); + int32_t cut_shape_half_x_span = cut_shape.getXSpan() / 2; + int32_t cut_shape_half_y_span = cut_shape.getYSpan() / 2; + std::vector>& layer_node_map = dr_box.get_layer_node_map(); + for (auto& [x_spacing, y_spacing] : spacing_pair_list) { + int32_t enlarged_x_size = cut_shape_half_x_span; + int32_t enlarged_y_size = cut_shape_half_y_span; + if (need_enlarged) { + // 膨胀size为 cut_shape_half_span + spacing + enlarged_x_size += x_spacing; + enlarged_y_size += y_spacing; + } + // 贴合的也不算违例 + enlarged_x_size -= 1; + enlarged_y_size -= 1; + PlanarRect space_enlarged_rect + = RTUTIL.getEnlargedRect(net_shape.get_rect(), enlarged_x_size, enlarged_y_size, enlarged_x_size, enlarged_y_size); + for (auto& [grid_coord, orientation_set] : RTUTIL.getTrackGridOrientationMap(space_enlarged_rect, dr_box.get_box_track_axis())) { + if (!RTUTIL.exist(orientation_set, Orientation::kAbove) && !RTUTIL.exist(orientation_set, Orientation::kBelow)) { + continue; + } + DRNode& below_node = layer_node_map[below_routing_layer_idx][grid_coord.get_x()][grid_coord.get_y()]; + if (RTUTIL.exist(below_node.get_neighbor_node_map(), Orientation::kAbove)) { + node_orientation_map[&below_node].insert(Orientation::kAbove); + } + DRNode& above_node = layer_node_map[above_routing_layer_idx][grid_coord.get_x()][grid_coord.get_y()]; + if (RTUTIL.exist(above_node.get_neighbor_node_map(), Orientation::kBelow)) { + node_orientation_map[&above_node].insert(Orientation::kBelow); + } } } } diff --git a/src/operation/iRT/source/module/pin_accessor/PinAccessor.cpp b/src/operation/iRT/source/module/pin_accessor/PinAccessor.cpp index 00505c73..5018018e 100644 --- a/src/operation/iRT/source/module/pin_accessor/PinAccessor.cpp +++ b/src/operation/iRT/source/module/pin_accessor/PinAccessor.cpp @@ -1809,51 +1809,75 @@ std::map> PinAccessor::getCutNodeOrientationMap(P if (net_shape.get_is_routing()) { RTLOG.error(Loc::current(), "The type of net_shape is routing!"); } - std::vector adjacent_routing_layer_idx_list = cut_to_adjacent_routing_map[net_shape.get_layer_idx()]; - if (adjacent_routing_layer_idx_list.size() != 2) { - // 如果相邻层只有一个,将不会在那一层打via - return {}; - } - int32_t below_routing_layer_idx = adjacent_routing_layer_idx_list.front(); - int32_t above_routing_layer_idx = adjacent_routing_layer_idx_list.back(); - RTUTIL.swapByASC(below_routing_layer_idx, above_routing_layer_idx); CutLayer& cut_layer = cut_layer_list[net_shape.get_layer_idx()]; - // x_spacing y_spacing - std::vector> spacing_pair_list; + std::map>> cut_spacing_map; { - spacing_pair_list.emplace_back(cut_layer.get_x_spacing(), cut_layer.get_prl_spacing()); - spacing_pair_list.emplace_back(cut_layer.get_prl_spacing(), cut_layer.get_y_spacing()); - } - PlanarRect& cut_shape = layer_via_master_list[below_routing_layer_idx].front().get_cut_shape_list().front(); - int32_t cut_shape_half_x_span = cut_shape.getXSpan() / 2; - int32_t cut_shape_half_y_span = cut_shape.getYSpan() / 2; - - std::vector>& layer_node_map = pa_box.get_layer_node_map(); - std::map> node_orientation_map; - for (auto& [x_spacing, y_spacing] : spacing_pair_list) { - int32_t enlarged_x_size = cut_shape_half_x_span; - int32_t enlarged_y_size = cut_shape_half_y_span; - if (need_enlarged) { - // 膨胀size为 cut_shape_half_span + spacing - enlarged_x_size += x_spacing; - enlarged_y_size += y_spacing; + int32_t curr_cut_layer_idx = net_shape.get_layer_idx(); + if (0 <= curr_cut_layer_idx && curr_cut_layer_idx < static_cast(cut_layer_list.size())) { + std::vector adjacent_routing_layer_idx_list = cut_to_adjacent_routing_map[curr_cut_layer_idx]; + if (adjacent_routing_layer_idx_list.size() == 2) { + std::vector> spacing_pair_list; + spacing_pair_list.emplace_back(cut_layer.get_curr_x_spacing(), cut_layer.get_curr_prl_spacing()); + spacing_pair_list.emplace_back(cut_layer.get_curr_prl_spacing(), cut_layer.get_curr_y_spacing()); + cut_spacing_map[curr_cut_layer_idx] = spacing_pair_list; + } } - // 贴合的也不算违例 - enlarged_x_size -= 1; - enlarged_y_size -= 1; - PlanarRect space_enlarged_rect - = RTUTIL.getEnlargedRect(net_shape.get_rect(), enlarged_x_size, enlarged_y_size, enlarged_x_size, enlarged_y_size); - for (auto& [grid_coord, orientation_set] : RTUTIL.getTrackGridOrientationMap(space_enlarged_rect, pa_box.get_box_track_axis())) { - if (!RTUTIL.exist(orientation_set, Orientation::kAbove) && !RTUTIL.exist(orientation_set, Orientation::kBelow)) { - continue; + int32_t below_cut_layer_idx = net_shape.get_layer_idx() - 1; + if (0 <= below_cut_layer_idx && below_cut_layer_idx < static_cast(cut_layer_list.size())) { + std::vector adjacent_routing_layer_idx_list = cut_to_adjacent_routing_map[below_cut_layer_idx]; + if (adjacent_routing_layer_idx_list.size() == 2) { + std::vector> spacing_pair_list; + spacing_pair_list.emplace_back(cut_layer.get_below_x_spacing(), cut_layer.get_below_prl_spacing()); + spacing_pair_list.emplace_back(cut_layer.get_below_prl_spacing(), cut_layer.get_below_y_spacing()); + cut_spacing_map[below_cut_layer_idx] = spacing_pair_list; } - PANode& below_node = layer_node_map[below_routing_layer_idx][grid_coord.get_x()][grid_coord.get_y()]; - if (RTUTIL.exist(below_node.get_neighbor_node_map(), Orientation::kAbove)) { - node_orientation_map[&below_node].insert(Orientation::kAbove); + } + int32_t above_cut_layer_idx = net_shape.get_layer_idx() + 1; + if (0 <= above_cut_layer_idx && above_cut_layer_idx < static_cast(cut_layer_list.size())) { + std::vector adjacent_routing_layer_idx_list = cut_to_adjacent_routing_map[above_cut_layer_idx]; + if (adjacent_routing_layer_idx_list.size() == 2) { + std::vector> spacing_pair_list; + spacing_pair_list.emplace_back(cut_layer.get_above_x_spacing(), cut_layer.get_above_prl_spacing()); + spacing_pair_list.emplace_back(cut_layer.get_above_prl_spacing(), cut_layer.get_above_y_spacing()); + cut_spacing_map[above_cut_layer_idx] = spacing_pair_list; } - PANode& above_node = layer_node_map[above_routing_layer_idx][grid_coord.get_x()][grid_coord.get_y()]; - if (RTUTIL.exist(above_node.get_neighbor_node_map(), Orientation::kBelow)) { - node_orientation_map[&above_node].insert(Orientation::kBelow); + } + } + std::map> node_orientation_map; + for (auto& [cut_layer_idx, spacing_pair_list] : cut_spacing_map) { + std::vector adjacent_routing_layer_idx_list = cut_to_adjacent_routing_map[cut_layer_idx]; + int32_t below_routing_layer_idx = adjacent_routing_layer_idx_list.front(); + int32_t above_routing_layer_idx = adjacent_routing_layer_idx_list.back(); + RTUTIL.swapByASC(below_routing_layer_idx, above_routing_layer_idx); + PlanarRect& cut_shape = layer_via_master_list[below_routing_layer_idx].front().get_cut_shape_list().front(); + int32_t cut_shape_half_x_span = cut_shape.getXSpan() / 2; + int32_t cut_shape_half_y_span = cut_shape.getYSpan() / 2; + std::vector>& layer_node_map = pa_box.get_layer_node_map(); + for (auto& [x_spacing, y_spacing] : spacing_pair_list) { + int32_t enlarged_x_size = cut_shape_half_x_span; + int32_t enlarged_y_size = cut_shape_half_y_span; + if (need_enlarged) { + // 膨胀size为 cut_shape_half_span + spacing + enlarged_x_size += x_spacing; + enlarged_y_size += y_spacing; + } + // 贴合的也不算违例 + enlarged_x_size -= 1; + enlarged_y_size -= 1; + PlanarRect space_enlarged_rect + = RTUTIL.getEnlargedRect(net_shape.get_rect(), enlarged_x_size, enlarged_y_size, enlarged_x_size, enlarged_y_size); + for (auto& [grid_coord, orientation_set] : RTUTIL.getTrackGridOrientationMap(space_enlarged_rect, pa_box.get_box_track_axis())) { + if (!RTUTIL.exist(orientation_set, Orientation::kAbove) && !RTUTIL.exist(orientation_set, Orientation::kBelow)) { + continue; + } + PANode& below_node = layer_node_map[below_routing_layer_idx][grid_coord.get_x()][grid_coord.get_y()]; + if (RTUTIL.exist(below_node.get_neighbor_node_map(), Orientation::kAbove)) { + node_orientation_map[&below_node].insert(Orientation::kAbove); + } + PANode& above_node = layer_node_map[above_routing_layer_idx][grid_coord.get_x()][grid_coord.get_y()]; + if (RTUTIL.exist(above_node.get_neighbor_node_map(), Orientation::kBelow)) { + node_orientation_map[&above_node].insert(Orientation::kBelow); + } } } } diff --git a/src/operation/iRT/source/module/supply_analyzer/SupplyAnalyzer.cpp b/src/operation/iRT/source/module/supply_analyzer/SupplyAnalyzer.cpp index 2f63e8cf..59ab3b57 100644 --- a/src/operation/iRT/source/module/supply_analyzer/SupplyAnalyzer.cpp +++ b/src/operation/iRT/source/module/supply_analyzer/SupplyAnalyzer.cpp @@ -173,10 +173,10 @@ void SupplyAnalyzer::analyzeSupply(SAModel& sa_model) } for (auto& [net_idx, patch_set] : RTDM.getNetAccessPatchMap(search_rect)) { for (EXTLayerRect* patch : patch_set) { - if (search_rect.get_layer_idx() != patch->get_layer_idx()) { - continue; - } - obs_rect_list.push_back(patch->get_real_rect()); + if (search_rect.get_layer_idx() != patch->get_layer_idx()) { + continue; + } + obs_rect_list.push_back(patch->get_real_rect()); } } }