Fix Pin managment on north & east side of the cell abutment box.
* Change: In AnabaticEngine::setupPrerouteds(), take into account the number of Pins. Now consider a net containing multiple Pins and, at most, one segment as *non-routed". This case may specifically happens for nets with pins on the north and east side, which are slightly *inside* the abutment box (to be seen by the router) and draw with them their *outside* direct connection wire. * Bug: In cumulus/plugins.chip.CoreWire, no longer put the north or east side external Pin *exacyly* on the abutment box but *one pitch* inside so they are correctly seens by the P&R (must be *inside* the area of a GCell).
This commit is contained in:
parent
67ca0997c3
commit
4ab6888b94
|
@ -251,7 +251,14 @@ namespace Anabatic {
|
||||||
or (source.getY() > gcellsArea.getYMax())
|
or (source.getY() > gcellsArea.getYMax())
|
||||||
or (target.getX() <= gcellsArea.getXMin())
|
or (target.getX() <= gcellsArea.getXMin())
|
||||||
or (target.getY() <= gcellsArea.getYMin()) ) {
|
or (target.getY() <= gcellsArea.getYMin()) ) {
|
||||||
cerr << Error( "RawGCellsUnder::commonCtor(): Area is completly outside the GCells area (ignored)."
|
cerr << Error( "RawGCellsUnder::commonCtor(): Area is completly outside the GCells area (ignored).\n"
|
||||||
|
" * GCells area: %s\n"
|
||||||
|
" * Obstacle area: [%s %s %s %s]"
|
||||||
|
, getString(gcellsArea).c_str()
|
||||||
|
, DbU::getValueString(source.getX()).c_str()
|
||||||
|
, DbU::getValueString(source.getY()).c_str()
|
||||||
|
, DbU::getValueString(target.getX()).c_str()
|
||||||
|
, DbU::getValueString(target.getY()).c_str()
|
||||||
) << endl;
|
) << endl;
|
||||||
cdebug_tabw(112,-1);
|
cdebug_tabw(112,-1);
|
||||||
DebugSession::close();
|
DebugSession::close();
|
||||||
|
|
|
@ -83,6 +83,7 @@ namespace Anabatic {
|
||||||
if (net->getType() == Net::Type::GROUND) continue;
|
if (net->getType() == Net::Type::GROUND) continue;
|
||||||
// Don't skip the clock.
|
// Don't skip the clock.
|
||||||
|
|
||||||
|
vector<Pin*> pins;
|
||||||
vector<Segment*> segments;
|
vector<Segment*> segments;
|
||||||
vector<Contact*> contacts;
|
vector<Contact*> contacts;
|
||||||
|
|
||||||
|
@ -92,7 +93,11 @@ namespace Anabatic {
|
||||||
size_t rpCount = 0;
|
size_t rpCount = 0;
|
||||||
|
|
||||||
for( Component* component : net->getComponents() ) {
|
for( Component* component : net->getComponents() ) {
|
||||||
if (dynamic_cast<Pin *>(component)) continue;
|
Pin* pin = dynamic_cast<Pin *>( component );
|
||||||
|
if (pin) {
|
||||||
|
pins.push_back( pin );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (dynamic_cast<Plug*>(component)) continue;
|
if (dynamic_cast<Plug*>(component)) continue;
|
||||||
|
|
||||||
const RegularLayer* layer = dynamic_cast<const RegularLayer*>(component->getLayer());
|
const RegularLayer* layer = dynamic_cast<const RegularLayer*>(component->getLayer());
|
||||||
|
@ -138,6 +143,12 @@ namespace Anabatic {
|
||||||
if (vertical->getWidth() != Session::getWireWidth(vertical->getLayer()))
|
if (vertical->getWidth() != Session::getWireWidth(vertical->getLayer()))
|
||||||
isFixed = true;
|
isFixed = true;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
Pin* pin = dynamic_cast<Pin*>(component);
|
||||||
|
if (pin) {
|
||||||
|
//cerr << "| " << pin << endl;
|
||||||
|
if (not ab.intersect(pin->getBoundingBox())) continue;
|
||||||
|
pins.push_back( pin );
|
||||||
} else {
|
} else {
|
||||||
Contact* contact = dynamic_cast<Contact*>(component);
|
Contact* contact = dynamic_cast<Contact*>(component);
|
||||||
if (contact) {
|
if (contact) {
|
||||||
|
@ -168,6 +179,15 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// cerr << net << " deepNet:" << net->isDeepNet()
|
||||||
|
// << " pins:" << pins.size()
|
||||||
|
// << " segments:" << segments.size() << endl;
|
||||||
|
if (not net->isDeepNet() and (pins.size() >= 1) and (segments.size() < 2)) {
|
||||||
|
++toBeRouteds;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if ( (not isFixed)
|
if ( (not isFixed)
|
||||||
and (not isManualGlobalRouted)
|
and (not isManualGlobalRouted)
|
||||||
|
@ -213,6 +233,10 @@ namespace Anabatic {
|
||||||
for ( auto segment : segments ) {
|
for ( auto segment : segments ) {
|
||||||
AutoContact* source = Session::lookup( dynamic_cast<Contact*>( segment->getSource() ));
|
AutoContact* source = Session::lookup( dynamic_cast<Contact*>( segment->getSource() ));
|
||||||
AutoContact* target = Session::lookup( dynamic_cast<Contact*>( segment->getTarget() ));
|
AutoContact* target = Session::lookup( dynamic_cast<Contact*>( segment->getTarget() ));
|
||||||
|
if (not source or not target) {
|
||||||
|
cerr << Error( "Unable to protect %s", getString(segment).c_str() ) << endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
AutoSegment* autoSegment = AutoSegment::create( source, target, segment );
|
AutoSegment* autoSegment = AutoSegment::create( source, target, segment );
|
||||||
autoSegment->setFlags( AutoSegment::SegUserDefined|AutoSegment::SegAxisSet );
|
autoSegment->setFlags( AutoSegment::SegUserDefined|AutoSegment::SegAxisSet );
|
||||||
}
|
}
|
||||||
|
|
|
@ -221,7 +221,7 @@ class CoreWire ( object ):
|
||||||
xPadMax = self.bbSegment.getXMax()
|
xPadMax = self.bbSegment.getXMax()
|
||||||
xContact = self.corona.coreSymBb.getXMax() + self.offset * 2*vPitch
|
xContact = self.corona.coreSymBb.getXMax() + self.offset * 2*vPitch
|
||||||
xPadMin = xContact
|
xPadMin = xContact
|
||||||
xCore = coronaAb.getXMax()
|
xCore = coronaAb.getXMax() - vPitch
|
||||||
if not self.preferredDir:
|
if not self.preferredDir:
|
||||||
#xPadMin -= self.bbSegment.getHeight()//2
|
#xPadMin -= self.bbSegment.getHeight()//2
|
||||||
xPadMin -= 3*vPitch
|
xPadMin -= 3*vPitch
|
||||||
|
@ -375,7 +375,7 @@ class CoreWire ( object ):
|
||||||
yPadMax = self.bbSegment.getYMax()
|
yPadMax = self.bbSegment.getYMax()
|
||||||
yPadMin = self.corona.coreSymBb.getYMax() + self.offset * 2*hPitch
|
yPadMin = self.corona.coreSymBb.getYMax() + self.offset * 2*hPitch
|
||||||
yContact = yPadMin
|
yContact = yPadMin
|
||||||
yCore = coronaAb.getYMax()
|
yCore = coronaAb.getYMax() - vPitch
|
||||||
#if not self.preferredDir:
|
#if not self.preferredDir:
|
||||||
# yPadMin -= self.bbSegment.getWidth()//2
|
# yPadMin -= self.bbSegment.getWidth()//2
|
||||||
# yPadMin -= 3*hPitch
|
# yPadMin -= 3*hPitch
|
||||||
|
|
Loading…
Reference in New Issue