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:
Jean-Paul Chaput 2019-08-23 23:48:09 +02:00
parent 02eb5c56ad
commit c6ea1bccdd
3 changed files with 13 additions and 34 deletions

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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 );
}
}
}