-
Notifications
You must be signed in to change notification settings - Fork 551
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
CTS-Avoid level balance buffers overlap. #5819
base: master
Are you sure you want to change the base?
CTS-Avoid level balance buffers overlap. #5819
Conversation
Signed-off-by: arthur <[email protected]>
Signed-off-by: arthur <[email protected]>
Signed-off-by: arthur <[email protected]>
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.
clang-tidy made some suggestions
clang-tidy review says "All clean, LGTM! 👍" |
clang-tidy review says "All clean, LGTM! 👍" |
clang-tidy review says "All clean, LGTM! 👍" |
secure ci? |
src/cts/src/LevelBalancer.cpp
Outdated
/ wireSegmentUnit_; | ||
Point<double> bufferLoc(x, y); | ||
if (level % buffPerStep) { | ||
x = (x + width); |
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.
x += width;
is more idiomatic. (likewise y)
src/cts/src/LevelBalancer.cpp
Outdated
int dir = (centroidY - y) / std::abs(centroidY - y); | ||
double height = builder->getBufferHeight() * wireSegmentUnit_ * dir; | ||
double width = builder->getBufferWidth() * wireSegmentUnit_ * dir; | ||
|
||
int steps = std::max((int) (std::abs((centroidY - y) / height)), 1); | ||
int buffPerStep = std::ceil((float) bufLevels / (float) steps); |
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.
const
src/cts/src/LevelBalancer.cpp
Outdated
int x = prevLevelSubNet->getDriver()->getX(); | ||
int y = prevLevelSubNet->getDriver()->getY(); | ||
|
||
int dir = (centroidY - y) / std::abs(centroidY - y); |
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 use the same direction for both x & y? You might be moving away from the centroid in x.
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.
Yes, I missed that. It was already fixed, thanks.
Secure Ci is passing, only need to update a antenna diode count metric for 1 design. I am going to create a PR for this update. |
Signed-off-by: arthur <[email protected]>
Signed-off-by: arthur <[email protected]>
Signed-off-by: arthur <[email protected]>
clang-tidy review says "All clean, LGTM! 👍" |
The current Level Balancer of CTS tends to insert buffers one on top of the other and when they are legalized a cluster of buffers is formed, issue #2305 shows an example of this. This happens specially if the clock buffers are large and it creates a high congested area that can lead to the global router finishing with overflow.
This PR changes the level balancer to avoid overlapping the inserted buffers and preventing the creation of the clusters of buffers. The next images show the result for the regressions test of CTS balance_levels:
Current:
New: