From c6ea1bccdde3b0b0a02cd8e11cf8d42dbe63802c Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Fri, 23 Aug 2019 23:48:09 +0200 Subject: [PATCH] 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). --- anabatic/src/AutoHorizontal.cpp | 16 +--------------- anabatic/src/AutoVertical.cpp | 16 +--------------- anabatic/src/NetConstraints.cpp | 15 +++++++++++---- 3 files changed, 13 insertions(+), 34 deletions(-) diff --git a/anabatic/src/AutoHorizontal.cpp b/anabatic/src/AutoHorizontal.cpp index 33ac1cbb..083250d1 100644 --- a/anabatic/src/AutoHorizontal.cpp +++ b/anabatic/src/AutoHorizontal.cpp @@ -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; } } diff --git a/anabatic/src/AutoVertical.cpp b/anabatic/src/AutoVertical.cpp index 014eff98..69dd551c 100644 --- a/anabatic/src/AutoVertical.cpp +++ b/anabatic/src/AutoVertical.cpp @@ -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; } } diff --git a/anabatic/src/NetConstraints.cpp b/anabatic/src/NetConstraints.cpp index 97a31c2e..f78fbf2b 100644 --- a/anabatic/src/NetConstraints.cpp +++ b/anabatic/src/NetConstraints.cpp @@ -233,15 +233,22 @@ namespace Anabatic { cdebug_tabw(146,1); vector routingPads; - forEach ( Component*, icomponent, net->getComponents() ) { - Contact* contact = dynamic_cast( *icomponent ); + for ( Component* component : net->getComponents() ) { + Contact* contact = dynamic_cast( component ); if (contact) { AutoContact* autoContact = Session::lookup( contact ); if (autoContact) autoContact->restoreNativeConstraintBox(); } else { - RoutingPad* routingPad = dynamic_cast( *icomponent ); - if (routingPad) routingPads.push_back( routingPad ); + Segment* segment = dynamic_cast( component ); + if (segment) { + AutoSegment* autoSegment = Session::lookup( segment ); + if (autoSegment) + autoSegment->setRpDistance( 15 ); + } else { + RoutingPad* routingPad = dynamic_cast( component ); + if (routingPad) routingPads.push_back( routingPad ); + } } }