Fix bugs in power supply obstacle management.

* Bug: In PowerRailsPlanes::Rail::doLayout(), in case of non-blockage but
    fixed segments (that is, power lines), expand the segment box of one
    picth to put blockage on too close neigboring tracks.
* Change: In Manipulator::avoidBlockage(), more accurate computation of
    the blocked area for pushing aside the terminal & turn of the non-pref
    segment.
This commit is contained in:
Jean-Paul Chaput 2021-03-05 00:43:24 +01:00
parent 7aa0e1321e
commit aece850a6c
2 changed files with 50 additions and 30 deletions

View File

@ -1697,14 +1697,10 @@ namespace Katana {
return false; return false;
} }
AutoContact* terminal = _segment->base()->getAutoSource(); AutoContact* terminal = _segment->base()->getAutoSource();
AutoContact* turn = _segment->base()->getAutoTarget(); AutoContact* turn = _segment->base()->getAutoTarget();
bool isSourceTerminal = true;
if (not terminal->isTerminal()) { if (not terminal->isTerminal()) std::swap( terminal, turn );
std::swap( terminal, turn );
isSourceTerminal = false;
}
TrackElement* perpandicular = _event->getPerpandiculars()[0]; TrackElement* perpandicular = _event->getPerpandiculars()[0];
DataNegociate* data = perpandicular->getDataNegociate(); DataNegociate* data = perpandicular->getDataNegociate();
@ -1716,30 +1712,52 @@ namespace Katana {
Box termConstraints ( terminal->getConstraintBox() ); Box termConstraints ( terminal->getConstraintBox() );
Box turnConstraints ( turn ->getConstraintBox() ); Box turnConstraints ( turn ->getConstraintBox() );
Interval axisRange = terminal->getUConstraints( Flags::Vertical );
if (isSourceTerminal) { size_t offset = Track::npos;
terminal->setConstraintBox( Box( termConstraints.getXMin() size_t minBlockage = Track::npos;
, termConstraints.getYMin() size_t maxBlockage = Track::npos;
, termConstraints.getXMax() RoutingPlane* plane = Session::getKatanaEngine()->getRoutingPlaneByLayer(_segment->getLayer());
, perpandicular->getAxis() - perpandicular->getPitch() for ( Track* track : Tracks_Range::get(plane,axisRange) ) {
) ); if (offset == Track::npos) offset = track->getIndex();
turn->setConstraintBox( Box( turnConstraints.getXMin() TrackElement* element = track->getSegment( terminal->getX() );
, turnConstraints.getYMin() if (element and (element->isBlockage() or element->isFixed())) {
, turnConstraints.getXMax() if (track->getIndex() == offset) {
, perpandicular->getAxis() - perpandicular->getPitch() minBlockage = track->getIndex();
) ); continue;
} else { }
terminal->setConstraintBox( Box( termConstraints.getXMin() if ((minBlockage != Track::npos) and (minBlockage+1 == track->getIndex())) {
, perpandicular->getAxis() + perpandicular->getPitch() minBlockage = track->getIndex();
, termConstraints.getXMax() continue;
, termConstraints.getYMax() }
) ); maxBlockage = track->getIndex();
turn->setConstraintBox( Box( turnConstraints.getXMin() break;
, perpandicular->getAxis() + perpandicular->getPitch() }
, turnConstraints.getXMax()
, turnConstraints.getYMax()
) );
} }
Interval nonBlocked ( (minBlockage == Track::npos) ? terminal->getGCell()->getYMin()
: plane->getTrackByIndex(minBlockage)->getAxis()
, (maxBlockage == Track::npos) ? terminal->getGCell()->getYMax()
: plane->getTrackByIndex(maxBlockage)->getAxis() );
cdebug_log(159,0) << "Non blocked vertical " << nonBlocked << endl;
Interval turnVConstraints = Interval( turn ->getUConstraints(Flags::Vertical) );
Interval termVConstraints = Interval( terminal->getUConstraints(Flags::Vertical) );
turnVConstraints.inflate( perpandicular->getPitch() );
turnVConstraints.intersection( nonBlocked );
termVConstraints.intersection( nonBlocked );
cdebug_log(159,0) << "Using: pitch=" << DbU::getValueString(perpandicular->getPitch())
<< " axis=" << DbU::getValueString(perpandicular->getAxis())
<< " pp=" << perpandicular << endl;
terminal->setConstraintBox( Box( termConstraints.getXMin()
, termVConstraints.getVMin()
, termConstraints.getXMax()
, termVConstraints.getVMax()
) );
turn->setConstraintBox( Box( turnConstraints.getXMin()
, turnVConstraints.getVMin()
, turnConstraints.getXMax()
, turnVConstraints.getVMax()
) );
cdebug_log(159,0) << "Restrict: " << terminal << " to " << terminal->getConstraintBox() << endl; cdebug_log(159,0) << "Restrict: " << terminal << " to " << terminal->getConstraintBox() << endl;
cdebug_log(159,0) << "Restrict: " << turn << " to " << turn ->getConstraintBox() << endl; cdebug_log(159,0) << "Restrict: " << turn << " to " << turn ->getConstraintBox() << endl;

View File

@ -522,6 +522,8 @@ namespace {
if (AllianceFramework::get()->getCellGauge()->getName() == Name("FlexLib")) { if (AllianceFramework::get()->getCellGauge()->getName() == Name("FlexLib")) {
if (_width >= DbU::fromPhysical( 10.0, DbU::UnitPower::Micro )) { if (_width >= DbU::fromPhysical( 10.0, DbU::UnitPower::Micro )) {
delta = 2 * plane->getLayerGauge()->getPitch(); delta = 2 * plane->getLayerGauge()->getPitch();
} else {
delta = plane->getLayerGauge()->getPitch();
} }
} }
} }
@ -595,7 +597,7 @@ namespace {
list<Interval>::iterator ichunk = _chunks.begin(); list<Interval>::iterator ichunk = _chunks.begin();
for ( ; ichunk != _chunks.end() ; ichunk++ ) { for ( ; ichunk != _chunks.end() ; ichunk++ ) {
cdebug_log(159,0) << " chunk: [" << DbU::getValueString((*ichunk).getVMin()) cdebug_log(159,0) << " chunk: [" << DbU::getValueString((*ichunk).getVMin())
<< ":" << DbU::getValueString((*ichunk).getVMax()) << "]" << endl; << ":" << DbU::getValueString((*ichunk).getVMax()) << "]" << endl;
segment = Vertical::create ( net segment = Vertical::create ( net
, layer , layer