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 );
|
Session::dogleg( segment2 );
|
||||||
|
|
||||||
if (autoSource->isTerminal() and autoTarget->isTerminal()) {
|
if (autoSource->isTerminal() and autoTarget->isTerminal()) {
|
||||||
segment1->setRpDistance( 1 );
|
|
||||||
segment2->setRpDistance( 0 );
|
|
||||||
dlContact1->setFlags ( CntWeakTerminal );
|
dlContact1->setFlags ( CntWeakTerminal );
|
||||||
dlContact2->setFlags ( CntWeakTerminal );
|
dlContact2->setFlags ( CntWeakTerminal );
|
||||||
|
|
||||||
if (autoTarget->getGCell() == doglegGCell) dlContact1->migrateConstraintBox( autoTarget );
|
if (autoTarget->getGCell() == doglegGCell) dlContact1->migrateConstraintBox( autoTarget );
|
||||||
if (autoSource->getGCell() == doglegGCell) dlContact2->migrateConstraintBox( autoSource );
|
if (autoSource->getGCell() == doglegGCell) dlContact2->migrateConstraintBox( autoSource );
|
||||||
} else if (autoSource->isTerminal()) {
|
} else if (autoSource->isTerminal()) {
|
||||||
segment1->setRpDistance( 1 );
|
|
||||||
segment2->setRpDistance( 2 );
|
|
||||||
|
|
||||||
autoTarget->unsetFlags( CntWeakTerminal );
|
autoTarget->unsetFlags( CntWeakTerminal );
|
||||||
dlContact1->setFlags ( CntWeakTerminal );
|
dlContact1->setFlags ( CntWeakTerminal );
|
||||||
if (autoTarget->getGCell() == doglegGCell) dlContact1->migrateConstraintBox( autoTarget );
|
if (autoTarget->getGCell() == doglegGCell) dlContact1->migrateConstraintBox( autoTarget );
|
||||||
} else if (autoTarget->isTerminal()) {
|
} else if (autoTarget->isTerminal()) {
|
||||||
segment2->setRpDistance( 0 );
|
|
||||||
segment1->setRpDistance( 1 );
|
|
||||||
setRpDistance( 2 );
|
|
||||||
|
|
||||||
unsetFlags( SegTargetTerminal );
|
unsetFlags( SegTargetTerminal );
|
||||||
setFlags( SegWeakTerminal1 );
|
setFlags( SegWeakTerminal1 );
|
||||||
autoSource->unsetFlags( CntWeakTerminal );
|
autoSource->unsetFlags( CntWeakTerminal );
|
||||||
|
@ -888,11 +879,6 @@ namespace Anabatic {
|
||||||
} else if (isWeakTerminal()) {
|
} else if (isWeakTerminal()) {
|
||||||
segment1->setFlags( SegWeakTerminal1 );
|
segment1->setFlags( SegWeakTerminal1 );
|
||||||
segment2->setFlags( SegWeakTerminal1 );
|
segment2->setFlags( SegWeakTerminal1 );
|
||||||
segment1->setRpDistance( getRpDistance() );
|
|
||||||
segment2->setRpDistance( getRpDistance() );
|
|
||||||
} else {
|
|
||||||
segment1->setRpDistance( getRpDistance() );
|
|
||||||
segment2->setRpDistance( getRpDistance() );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// if (autoSource->isTerminal()) {
|
// if (autoSource->isTerminal()) {
|
||||||
|
@ -943,7 +929,7 @@ namespace Anabatic {
|
||||||
Interval dragConstraints = autoTarget->getNativeUConstraints(Flags::Horizontal);
|
Interval dragConstraints = autoTarget->getNativeUConstraints(Flags::Horizontal);
|
||||||
segment1->mergeUserConstraints( dragConstraints );
|
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 );
|
Session::dogleg( segment2 );
|
||||||
|
|
||||||
if (autoSource->isTerminal() and autoTarget->isTerminal()) {
|
if (autoSource->isTerminal() and autoTarget->isTerminal()) {
|
||||||
segment1->setRpDistance( 1 );
|
|
||||||
segment2->setRpDistance( 0 );
|
|
||||||
dlContact1->setFlags ( CntWeakTerminal );
|
dlContact1->setFlags ( CntWeakTerminal );
|
||||||
dlContact2->setFlags ( CntWeakTerminal );
|
dlContact2->setFlags ( CntWeakTerminal );
|
||||||
|
|
||||||
if (autoTarget->getGCell() == doglegGCell) dlContact1->migrateConstraintBox( autoTarget );
|
if (autoTarget->getGCell() == doglegGCell) dlContact1->migrateConstraintBox( autoTarget );
|
||||||
if (autoSource->getGCell() == doglegGCell) dlContact2->migrateConstraintBox( autoSource );
|
if (autoSource->getGCell() == doglegGCell) dlContact2->migrateConstraintBox( autoSource );
|
||||||
} else if (autoSource->isTerminal()) {
|
} else if (autoSource->isTerminal()) {
|
||||||
segment1->setRpDistance( 1 );
|
|
||||||
segment2->setRpDistance( 2 );
|
|
||||||
|
|
||||||
autoTarget->unsetFlags( CntWeakTerminal );
|
autoTarget->unsetFlags( CntWeakTerminal );
|
||||||
dlContact1->setFlags ( CntWeakTerminal );
|
dlContact1->setFlags ( CntWeakTerminal );
|
||||||
if (autoTarget->getGCell() == doglegGCell) dlContact1->migrateConstraintBox( autoTarget );
|
if (autoTarget->getGCell() == doglegGCell) dlContact1->migrateConstraintBox( autoTarget );
|
||||||
} else if (autoTarget->isTerminal()) {
|
} else if (autoTarget->isTerminal()) {
|
||||||
segment2->setRpDistance( 0 );
|
|
||||||
segment1->setRpDistance( 1 );
|
|
||||||
setRpDistance( 2 );
|
|
||||||
|
|
||||||
unsetFlags( SegTargetTerminal );
|
unsetFlags( SegTargetTerminal );
|
||||||
setFlags( SegWeakTerminal1 );
|
setFlags( SegWeakTerminal1 );
|
||||||
autoSource->unsetFlags( CntWeakTerminal );
|
autoSource->unsetFlags( CntWeakTerminal );
|
||||||
|
@ -771,11 +762,6 @@ namespace Anabatic {
|
||||||
} else if (isWeakTerminal()) {
|
} else if (isWeakTerminal()) {
|
||||||
segment1->setFlags( SegWeakTerminal1 );
|
segment1->setFlags( SegWeakTerminal1 );
|
||||||
segment2->setFlags( SegWeakTerminal1 );
|
segment2->setFlags( SegWeakTerminal1 );
|
||||||
segment1->setRpDistance( getRpDistance() );
|
|
||||||
segment2->setRpDistance( getRpDistance() );
|
|
||||||
} else {
|
|
||||||
segment1->setRpDistance( getRpDistance() );
|
|
||||||
segment2->setRpDistance( getRpDistance() );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// if (isSourceTerminal()) {
|
// if (isSourceTerminal()) {
|
||||||
|
@ -826,7 +812,7 @@ namespace Anabatic {
|
||||||
Interval dragConstraints = autoTarget->getNativeUConstraints(Flags::Vertical);
|
Interval dragConstraints = autoTarget->getNativeUConstraints(Flags::Vertical);
|
||||||
segment1->mergeUserConstraints( dragConstraints );
|
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);
|
cdebug_tabw(146,1);
|
||||||
|
|
||||||
vector<RoutingPad*> routingPads;
|
vector<RoutingPad*> routingPads;
|
||||||
forEach ( Component*, icomponent, net->getComponents() ) {
|
for ( Component* component : net->getComponents() ) {
|
||||||
Contact* contact = dynamic_cast<Contact*>( *icomponent );
|
Contact* contact = dynamic_cast<Contact*>( component );
|
||||||
if (contact) {
|
if (contact) {
|
||||||
AutoContact* autoContact = Session::lookup( contact );
|
AutoContact* autoContact = Session::lookup( contact );
|
||||||
if (autoContact)
|
if (autoContact)
|
||||||
autoContact->restoreNativeConstraintBox();
|
autoContact->restoreNativeConstraintBox();
|
||||||
} else {
|
} else {
|
||||||
RoutingPad* routingPad = dynamic_cast<RoutingPad*>( *icomponent );
|
Segment* segment = dynamic_cast<Segment*>( component );
|
||||||
if (routingPad) routingPads.push_back( routingPad );
|
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