Fix wrong move up of non-preferred direction segments.

* Change: In GCell::stepNetDesaturate(), never move up a segment in
    non-preferred direction as they are usually attached to terminals,
    so they won't reduce the GCell density anyway.
* Change: In LayerAssign::RpsInRow::slacken(), do not slacken horizontals
    from M1 vertical terminals when they are tall enough. Arbitrarily
    choose above 6 H-tracks (should be made a configuration parameter).
* Change: In DataNegociate::update(), when processing perpandicular,
    we were taking into account "fixed axis" even when they were
    reduced (so not in tracks). Now do not.
This commit is contained in:
Jean-Paul Chaput 2023-09-28 15:10:03 +02:00
parent 1ae4eb71e2
commit f22b7000b6
3 changed files with 16 additions and 3 deletions

View File

@ -1838,6 +1838,7 @@ namespace Anabatic {
for ( ; (isegment != iend) ; isegment++ ) {
unsigned int segmentDepth = Session::getRoutingGauge()->getLayerDepth((*isegment)->getLayer());
if ((*isegment)->isNonPref()) continue;
if (segmentDepth < depth) continue;
if (segmentDepth > depth) break;

View File

@ -214,24 +214,34 @@ namespace {
{
cdebug_log(149,1) << "RpsInRow::slacken()" << endl;
DbU::Unit hpitch = 0;
for ( RoutingPad* rp : _rps ) {
cdebug_log(149,0) << "Slacken from: " << rp << endl;
if (rp->getLayer()) {
if (_anabatic->getConfiguration()->getLayerDepth(rp->getLayer()) == 1) {
size_t depth = _anabatic->getConfiguration()->getLayerDepth( rp->getLayer() );
if (depth == 1) {
cdebug_log(149,0) << "In METAL2, skiping" << endl;
continue;
}
hpitch = _anabatic->getConfiguration()->getPitch( depth, Flags::AboveLayer );
}
for ( Component* component : rp->getSlaveComponents() ) {
AutoContact* rpContact = Session::lookup( dynamic_cast<Contact*>(component) );
if (rpContact) {
cdebug_log(149,0) << "+ " << rpContact << endl;
if (hpitch) {
Box bb = rp->getBoundingBox();
if (bb.getHeight() / hpitch > 6) {
cdebug_log(149,0) << "| Terminal is tall enough (> 6 pitch), skipping." << endl;
continue;
}
}
for ( AutoSegment* segment : rpContact->getAutoSegments() ) {
cdebug_log(149,0) << "| " << segment << endl;
if (segment->isVertical()) {
if (segment->isVertical() and not segment->isNonPref()) {
if (segment->getDepth() == 1) {
cdebug_log(149,0) << "| Slacken: " << segment << endl;
segment->changeDepth( 2, Flags::NoFlags );

View File

@ -198,7 +198,9 @@ namespace Katana {
_perpandicularFree.intersection( trackFree.inflate ( -sourceCap, -targetCap ) );
cdebug_log(159,0) << "Source cap:"
<< DbU::getValueString(perpandicular->getExtensionCap(Flags::Source)) << endl;
} else if (perpandicular->isFixedAxis() /*or _trackSegment->isDogleg()*/) {
} else if ( perpandicular->isFixedAxis()
and not perpandicular->isReduced()
/*or _trackSegment->isDogleg()*/) {
RoutingPlane* plane = Session::getKatanaEngine()->getRoutingPlaneByLayer(perpandicular->getLayer());
Track* track = plane->getTrackByPosition( perpandicular->getAxis() );
if (track and (perpandicular->getAxis() == track->getAxis())) {