Skip to content

Commit

Permalink
drt: PA unique insts refactor
Browse files Browse the repository at this point in the history
Signed-off-by: bernardo <bernardoborgessandoval@gmail.com>
  • Loading branch information
bnmfw committed Feb 16, 2025
1 parent d2d00e3 commit 6d618b4
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 55 deletions.
102 changes: 47 additions & 55 deletions src/drt/src/pa/FlexPA_unique.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,70 +125,62 @@ bool UniqueInsts::isNDRInst(frInst& inst)
return false;
}

// must init all unique, including filler, macro, etc. to ensure frInst
// pin_access_idx is active
void UniqueInsts::computeUnique()
void UniqueInsts::addUniqueInst(frInst* inst)
{
computePrefTrackPatterns();
initMasterToPinLayerRange();

std::vector<frInst*> ndr_insts;
for (auto& inst : design_->getTopBlock()->getInsts()) {
if (!router_cfg_->AUTO_TAPER_NDR_NETS && isNDRInst(*inst)) {
ndr_insts.push_back(inst.get());
continue;
}
const Point origin = inst->getOrigin();
const Rect boundary_bbox = inst->getBoundaryBBox();
const dbOrientType orient = inst->getOrient();
auto it = master_to_pin_layer_range_.find(inst->getMaster());
if (it == master_to_pin_layer_range_.end()) {
logger_->error(DRT,
146,
"Master {} not found in master_to_pin_layer_range",
inst->getMaster()->getName());
}
const auto [min_layer_num, max_layer_num] = it->second;
std::vector<frCoord> offset;
for (auto& tp : pref_track_patterns_) {
if (tp->getLayerNum() >= min_layer_num
&& tp->getLayerNum() <= max_layer_num
&& hasTrackPattern(tp, boundary_bbox)) {
// vertical track
if (tp->isHorizontal()) {
offset.push_back(origin.x() % tp->getTrackSpacing());
} else {
offset.push_back(origin.y() % tp->getTrackSpacing());
}
if (!router_cfg_->AUTO_TAPER_NDR_NETS && isNDRInst(*inst)) {
unique_.push_back(inst);
inst_to_unique_[inst] = inst;
inst_to_class_[inst] = nullptr;
}
const Point origin = inst->getOrigin();
const Rect boundary_bbox = inst->getBoundaryBBox();
const dbOrientType orient = inst->getOrient();
auto it = master_to_pin_layer_range_.find(inst->getMaster());
if (it == master_to_pin_layer_range_.end()) {
logger_->error(DRT,
146,
"Master {} not found in master_to_pin_layer_range",
inst->getMaster()->getName());
}
const auto [min_layer_num, max_layer_num] = it->second;
std::vector<frCoord> offset;
for (auto& tp : pref_track_patterns_) {
if (tp->getLayerNum() >= min_layer_num && tp->getLayerNum() <= max_layer_num
&& hasTrackPattern(tp, boundary_bbox)) {
// vertical track
if (tp->isHorizontal()) {
offset.push_back(origin.x() % tp->getTrackSpacing());
} else {
offset.push_back(tp->getTrackSpacing());
offset.push_back(origin.y() % tp->getTrackSpacing());
}
} else {
offset.push_back(tp->getTrackSpacing());
}
master_orient_trackoffset_to_insts_[inst->getMaster()][orient][offset]
.insert(inst.get());
}

for (auto& [master, orientMap] : master_orient_trackoffset_to_insts_) {
for (auto& [orient, offsetMap] : orientMap) {
for (auto& [vec, insts] : offsetMap) {
auto unique_inst = *(insts.begin());
unique_.push_back(unique_inst);
for (auto i : insts) {
inst_to_unique_[i] = unique_inst;
inst_to_class_[i] = &insts;
}
}
}
}
for (frInst* inst : ndr_insts) {
// Fills data structure that relate a instance to its unique instance
UniqueInsts::InstSet& unique_family
= master_orient_trackoffset_to_insts_[inst->getMaster()][orient][offset];
if (unique_family.empty()) {
int i = unique_.size();
unique_.push_back(inst);
inst_to_unique_[inst] = inst;
inst_to_class_[inst] = nullptr;
unique_to_idx_[inst] = i;
}
unique_family.insert(inst);
frInst* unique_inst = *(unique_family.begin());
inst_to_unique_[inst] = unique_inst;
inst_to_class_[inst] = &unique_family;
}

// init unique2Idx
for (int i = 0; i < (int) unique_.size(); i++) {
unique_to_idx_[unique_[i]] = i;
// must init all unique, including filler, macro, etc. to ensure frInst
// pin_access_idx is active
void UniqueInsts::computeUnique()
{
computePrefTrackPatterns();
initMasterToPinLayerRange();

for (auto& inst : design_->getTopBlock()->getInsts()) {
addUniqueInst(inst.get());
}
}

Expand Down
6 changes: 6 additions & 0 deletions src/drt/src/pa/FlexPA_unique.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,12 @@ class UniqueInsts
*/
void initMasterToPinLayerRange();

/**
* @brief Adds the instance to the unique instances structures,
* inserting new data if it is actually a new unique instance.
*/
void addUniqueInst(frInst* inst);

/**
* @brief Computes all unique instances data structures.
*
Expand Down

0 comments on commit 6d618b4

Please sign in to comment.