From f8b9957d20aebf081964d229c4327319e48de835 Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Mon, 6 Feb 2017 20:58:57 +0100 Subject: [PATCH] Bug: reduced segments where axis was not set when placed. * Bug: In Kite::RoutingEvent::_processNegociate(), on insertion in free space of a reduced segment (less than one pitch) no insert event was generated, but the axis was not set to the selected track, leaving the segment at it's former place. Now, generate an insert event, but in Kite::Session::_revalidate() filter them so that reduced segments are not inserted in tracks but only have their axis set. Correction also applied on Katana. * Bug: In Kite::wipeoutRouting(), the removal was incomplete. We need to remove anchored Contacts, but in a second stage. This is a fragile workaround as it require that there is only one level of anchoring. --- katana/src/RoutingEvent.cpp | 3 +-- katana/src/Session.cpp | 9 +++++---- kite/src/KiteEngine.cpp | 11 +++++++++-- kite/src/RoutingEvent.cpp | 3 +-- kite/src/Session.cpp | 9 +++++---- 5 files changed, 21 insertions(+), 14 deletions(-) diff --git a/katana/src/RoutingEvent.cpp b/katana/src/RoutingEvent.cpp index 1f3bbc18..77851505 100644 --- a/katana/src/RoutingEvent.cpp +++ b/katana/src/RoutingEvent.cpp @@ -476,8 +476,7 @@ namespace Katana { _axisHistory = _segment->getAxis(); _eventLevel = 0; cdebug_log(9000,0) << "Deter| addInsertEvent() @" << fsm.getCost(itrack).getTrack() << endl; - if (not _segment->isReduced()) - Session::addInsertEvent( _segment, fsm.getCost(itrack).getTrack() ); + Session::addInsertEvent( _segment, fsm.getCost(itrack).getTrack() ); fsm.setState( SegmentFsm::SelfInserted ); } else { // Do ripup. diff --git a/katana/src/Session.cpp b/katana/src/Session.cpp index 1c912158..051d168c 100644 --- a/katana/src/Session.cpp +++ b/katana/src/Session.cpp @@ -153,11 +153,12 @@ namespace Katana { _doRemovalEvents(); - for ( size_t i=0 ; i<_insertEvents.size() ; ++i ) { - if (_insertEvents[i]._segment) { - _insertEvents[i]._track->insert( _insertEvents[i]._segment ); + for ( const Event& event : _insertEvents ) { + if (event._segment) { + if (event._segment->isReduced()) event._segment->setAxis( event._track->getAxis() ); + else event._track->insert( event._segment ); } - if (_insertEvents[i]._marker) _insertEvents[i]._track->insert( _insertEvents[i]._marker ); + if (event._marker) event._track->insert( event._marker ); } _insertEvents.clear(); diff --git a/kite/src/KiteEngine.cpp b/kite/src/KiteEngine.cpp index d4fc36ef..493ef554 100644 --- a/kite/src/KiteEngine.cpp +++ b/kite/src/KiteEngine.cpp @@ -218,6 +218,7 @@ namespace Kite { UpdateSession::open(); for ( Net* net : cell->getNets() ) { + if (net->isClock() or net->isSupply()) continue; if (NetRoutingExtension::isManualGlobalRoute(net)) continue; // First pass: destroy the contacts @@ -227,8 +228,14 @@ namespace Kite { if (contact and not contact->getAnchorHook()->isAttached()) contacts.push_back( contact ); } - for ( Contact* contact : contacts ) - contact->destroy(); + for ( Contact* contact : contacts ) contact->destroy(); + + contacts.clear(); + for ( Component* component : net->getComponents() ) { + Contact* contact = dynamic_cast(component); + if (contact) contacts.push_back( contact ); + } + for ( Contact* contact : contacts ) contact->destroy(); // Second pass: destroy unconnected segments added by Knik as blockages std::vector segments; diff --git a/kite/src/RoutingEvent.cpp b/kite/src/RoutingEvent.cpp index a1c4f37c..bbe1dc27 100644 --- a/kite/src/RoutingEvent.cpp +++ b/kite/src/RoutingEvent.cpp @@ -476,8 +476,7 @@ namespace Kite { _axisHistory = _segment->getAxis(); _eventLevel = 0; cdebug_log(9000,0) << "Deter| addInsertEvent() @" << fsm.getCost(itrack).getTrack() << endl; - if (not _segment->isReduced()) - Session::addInsertEvent( _segment, fsm.getCost(itrack).getTrack() ); + Session::addInsertEvent( _segment, fsm.getCost(itrack).getTrack() ); fsm.setState( SegmentFsm::SelfInserted ); } else { // Do ripup. diff --git a/kite/src/Session.cpp b/kite/src/Session.cpp index 978d7616..930d1341 100644 --- a/kite/src/Session.cpp +++ b/kite/src/Session.cpp @@ -155,11 +155,12 @@ namespace Kite { _doRemovalEvents(); - for ( size_t i=0 ; i<_insertEvents.size() ; ++i ) { - if (_insertEvents[i]._segment) { - _insertEvents[i]._track->insert( _insertEvents[i]._segment ); + for ( const Event& event : _insertEvents ) { + if (event._segment) { + if (event._segment->isReduced()) event._segment->setAxis( event._track->getAxis() ); + else event._track->insert( event._segment ); } - if (_insertEvents[i]._marker) _insertEvents[i]._track->insert( _insertEvents[i]._marker ); + if (event._marker) event._track->insert( event._marker ); } _insertEvents.clear();