-
Notifications
You must be signed in to change notification settings - Fork 562
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
DRT: Stubborn Tiles flow #6213
base: master
Are you sure you want to change the base?
DRT: Stubborn Tiles flow #6213
Conversation
Signed-off-by: osamahammad21 <[email protected]>
Signed-off-by: osamahammad21 <[email protected]>
Signed-off-by: osamahammad21 <[email protected]>
Signed-off-by: osamahammad21 <[email protected]>
Signed-off-by: osamahammad21 <[email protected]>
Signed-off-by: osamahammad21 <[email protected]>
Signed-off-by: osamahammad21 <[email protected]>
Signed-off-by: osamahammad21 <[email protected]>
Signed-off-by: osamahammad21 <[email protected]>
Signed-off-by: Osama <[email protected]>
clang-tidy review says "All clean, LGTM! 👍" |
IterationProgress iter_prog; | ||
auto block = getDesign()->getTopBlock(); | ||
const auto num_drvs = block->getNumMarkers(); | ||
const bool stubborn_flow = num_drvs <= 11 && ripupMode != RipUpMode::ALL |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why 11? would this be better as a function of DRCs per unit area (it seems like 11 would be a large number for small design and potentially a small number for a large design)?
std::unique_ptr<FlexDRWorker> createWorker(int x_offset, | ||
int y_offset, | ||
const SearchRepairArgs& args, | ||
Rect routeBox = Rect(0, 0, 0, 0)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Take by reference? Rect() is 0,0,0,0 so no need to specify.
bool isEqualIgnoringSizeAndOffset(const SearchRepairArgs& other) const | ||
{ | ||
return (mazeEndIter == other.mazeEndIter | ||
&& workerDRCCost == other.workerDRCCost | ||
&& workerMarkerCost == other.workerMarkerCost | ||
&& workerFixedShapeCost == other.workerFixedShapeCost | ||
&& std::fabs(workerMarkerDecay - other.workerMarkerDecay) < 1e-6 | ||
&& ripupMode == other.ripupMode | ||
&& followGuide == other.followGuide); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Overly long for an inline in a header. Not performance critical so out-of-line.
if (iter_ > router_cfg_->END_ITERATION) { | ||
break; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Previously this was after searchRepair so it seems one more iteration would have been done.
ProfileTask profile(fmt::format("DR:searchRepair{}", iter_).c_str()); | ||
|
||
if (dist_on_) { | ||
if ((iter_ % 10 == 0 && iter_ != 60) || iter_ == 3 || iter_ == 15) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What does this mean? Please give some motivating logic.
std::vector<Rect> merge_boxes; | ||
for (auto& box : drv_boxes) { | ||
merge_boxes.emplace_back(box); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
std::vector<Rect> merge_boxes{drv_boxes};
compact and more efficient.
for (auto it2 = it1 + 1; it2 != merge_boxes.end(); ++it2) { | ||
Rect merge_box = (*it1); | ||
merge_box.merge((*it2)); | ||
if (merge_box.dx() > 4 || merge_box.dy() > 4) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
smaller than or equal to 5x5 GCells
seems to conflict
continue; | ||
} | ||
(*it1).merge((*it2)); | ||
merge_boxes.erase(it2); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This invalidates both your iterators.
const int rect_id) | ||
{ | ||
return std::any_of(grid.begin() + rect.xMin(), | ||
grid.begin() + rect.xMax() + 1, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Are you certain that this will never be beyond the end of the vector? Likewise in the inner any_of
case frDirEnum::E: | ||
max_idx.addX(1); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If you expand W you check for 0 but when expanding E you don't check for the right edge?
Where does this prevent abutting workers from running simultaneously? |
When the number of DRVs is less than or equal to 11 DRVs, we start this new flow where we do the following:
Improvement in ISPD designs:
Improvement in public ORFS designs (designs with no change are hidden):