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:
parent
1ae4eb71e2
commit
f22b7000b6
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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())) {
|
||||
|
|
Loading…
Reference in New Issue