Improvements in routing quality for ARMv2a, reached 100% success.
Now reliably work for 20 successive runs (doRun.sh) with pseudo-random variations. * Change: In AnabaticEngine::computeNetConstraints(), fully recompute the "distance to RoutingPads" for all AutoSegments. Previously we tried to do it incrementally, but as it's computed as a minimum, it stayed stuck at the lowest value, event after a net's change of topology that could made it increase (a new dogleg did appear between the segment and the RoutingPad).
This commit is contained in:
parent
02eb5c56ad
commit
c6ea1bccdd
|
@ -861,25 +861,16 @@ namespace Anabatic {
|
|||
Session::dogleg( segment2 );
|
||||
|
||||
if (autoSource->isTerminal() and autoTarget->isTerminal()) {
|
||||
segment1->setRpDistance( 1 );
|
||||
segment2->setRpDistance( 0 );
|
||||
dlContact1->setFlags ( CntWeakTerminal );
|
||||
dlContact2->setFlags ( CntWeakTerminal );
|
||||
|
||||
if (autoTarget->getGCell() == doglegGCell) dlContact1->migrateConstraintBox( autoTarget );
|
||||
if (autoSource->getGCell() == doglegGCell) dlContact2->migrateConstraintBox( autoSource );
|
||||
} else if (autoSource->isTerminal()) {
|
||||
segment1->setRpDistance( 1 );
|
||||
segment2->setRpDistance( 2 );
|
||||
|
||||
autoTarget->unsetFlags( CntWeakTerminal );
|
||||
dlContact1->setFlags ( CntWeakTerminal );
|
||||
if (autoTarget->getGCell() == doglegGCell) dlContact1->migrateConstraintBox( autoTarget );
|
||||
} else if (autoTarget->isTerminal()) {
|
||||
segment2->setRpDistance( 0 );
|
||||
segment1->setRpDistance( 1 );
|
||||
setRpDistance( 2 );
|
||||
|
||||
unsetFlags( SegTargetTerminal );
|
||||
setFlags( SegWeakTerminal1 );
|
||||
autoSource->unsetFlags( CntWeakTerminal );
|
||||
|
@ -888,11 +879,6 @@ namespace Anabatic {
|
|||
} else if (isWeakTerminal()) {
|
||||
segment1->setFlags( SegWeakTerminal1 );
|
||||
segment2->setFlags( SegWeakTerminal1 );
|
||||
segment1->setRpDistance( getRpDistance() );
|
||||
segment2->setRpDistance( getRpDistance() );
|
||||
} else {
|
||||
segment1->setRpDistance( getRpDistance() );
|
||||
segment2->setRpDistance( getRpDistance() );
|
||||
}
|
||||
|
||||
// if (autoSource->isTerminal()) {
|
||||
|
@ -943,7 +929,7 @@ namespace Anabatic {
|
|||
Interval dragConstraints = autoTarget->getNativeUConstraints(Flags::Horizontal);
|
||||
segment1->mergeUserConstraints( dragConstraints );
|
||||
|
||||
cdebug_log(149,0) << "Perpandical has drag constraints: " << dragConstraints << endl;
|
||||
cdebug_log(149,0) << "Perpandicular has drag constraints: " << dragConstraints << endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -744,25 +744,16 @@ namespace Anabatic {
|
|||
Session::dogleg( segment2 );
|
||||
|
||||
if (autoSource->isTerminal() and autoTarget->isTerminal()) {
|
||||
segment1->setRpDistance( 1 );
|
||||
segment2->setRpDistance( 0 );
|
||||
dlContact1->setFlags ( CntWeakTerminal );
|
||||
dlContact2->setFlags ( CntWeakTerminal );
|
||||
|
||||
if (autoTarget->getGCell() == doglegGCell) dlContact1->migrateConstraintBox( autoTarget );
|
||||
if (autoSource->getGCell() == doglegGCell) dlContact2->migrateConstraintBox( autoSource );
|
||||
} else if (autoSource->isTerminal()) {
|
||||
segment1->setRpDistance( 1 );
|
||||
segment2->setRpDistance( 2 );
|
||||
|
||||
autoTarget->unsetFlags( CntWeakTerminal );
|
||||
dlContact1->setFlags ( CntWeakTerminal );
|
||||
if (autoTarget->getGCell() == doglegGCell) dlContact1->migrateConstraintBox( autoTarget );
|
||||
} else if (autoTarget->isTerminal()) {
|
||||
segment2->setRpDistance( 0 );
|
||||
segment1->setRpDistance( 1 );
|
||||
setRpDistance( 2 );
|
||||
|
||||
unsetFlags( SegTargetTerminal );
|
||||
setFlags( SegWeakTerminal1 );
|
||||
autoSource->unsetFlags( CntWeakTerminal );
|
||||
|
@ -771,11 +762,6 @@ namespace Anabatic {
|
|||
} else if (isWeakTerminal()) {
|
||||
segment1->setFlags( SegWeakTerminal1 );
|
||||
segment2->setFlags( SegWeakTerminal1 );
|
||||
segment1->setRpDistance( getRpDistance() );
|
||||
segment2->setRpDistance( getRpDistance() );
|
||||
} else {
|
||||
segment1->setRpDistance( getRpDistance() );
|
||||
segment2->setRpDistance( getRpDistance() );
|
||||
}
|
||||
|
||||
// if (isSourceTerminal()) {
|
||||
|
@ -826,7 +812,7 @@ namespace Anabatic {
|
|||
Interval dragConstraints = autoTarget->getNativeUConstraints(Flags::Vertical);
|
||||
segment1->mergeUserConstraints( dragConstraints );
|
||||
|
||||
cdebug_log(149,0) << "Perpandical has drag constraints: " << dragConstraints << endl;
|
||||
cdebug_log(149,0) << "Perpandicular has drag constraints: " << dragConstraints << endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -233,15 +233,22 @@ namespace Anabatic {
|
|||
cdebug_tabw(146,1);
|
||||
|
||||
vector<RoutingPad*> routingPads;
|
||||
forEach ( Component*, icomponent, net->getComponents() ) {
|
||||
Contact* contact = dynamic_cast<Contact*>( *icomponent );
|
||||
for ( Component* component : net->getComponents() ) {
|
||||
Contact* contact = dynamic_cast<Contact*>( component );
|
||||
if (contact) {
|
||||
AutoContact* autoContact = Session::lookup( contact );
|
||||
if (autoContact)
|
||||
autoContact->restoreNativeConstraintBox();
|
||||
} else {
|
||||
RoutingPad* routingPad = dynamic_cast<RoutingPad*>( *icomponent );
|
||||
if (routingPad) routingPads.push_back( routingPad );
|
||||
Segment* segment = dynamic_cast<Segment*>( component );
|
||||
if (segment) {
|
||||
AutoSegment* autoSegment = Session::lookup( segment );
|
||||
if (autoSegment)
|
||||
autoSegment->setRpDistance( 15 );
|
||||
} else {
|
||||
RoutingPad* routingPad = dynamic_cast<RoutingPad*>( component );
|
||||
if (routingPad) routingPads.push_back( routingPad );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue