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:
parent
7aa0e1321e
commit
aece850a6c
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue