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.
This commit is contained in:
Jean-Paul Chaput 2017-02-06 20:58:57 +01:00
parent 4163fc044a
commit f8b9957d20
5 changed files with 21 additions and 14 deletions

View File

@ -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.

View File

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

View File

@ -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<Contact*>(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<Component*> segments;

View File

@ -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.

View File

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