From 1da71ae7401d02c284504c38f450ac0cab14d36f Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Wed, 16 Oct 2019 21:47:32 +0200 Subject: [PATCH] Bug when the METAL3 pitch is not multiple of METAL1. * Bug: In Katana::SegmentFsm CTOR, when computing costs for METAL2 in non-preferred direction attached to METAL1 terminals, do not try to align on a METAL3 track, as there may be not. Especially when the METAL3 pitch is not multiple of the METAL1 one. Compute at least one cost (with the same axis as the vertical METAL1 terminal). * Change: In Etesian::BloatCells, adjust the "90%" bloat profile for a METAL3 pitch of 8 lambdas (sligh decrease). * Bug: In cumulus/plugins/ChipPLace.py, import chip.Chip, not only chip. --- cumulus/src/plugins/ChipPlace.py | 2 +- etesian/src/BloatCells.cpp | 2 +- katana/src/SegmentFsm.cpp | 18 +++++++++++++----- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/cumulus/src/plugins/ChipPlace.py b/cumulus/src/plugins/ChipPlace.py index ff99411f..8b3814e7 100644 --- a/cumulus/src/plugins/ChipPlace.py +++ b/cumulus/src/plugins/ChipPlace.py @@ -21,7 +21,7 @@ try: from helpers.io import ErrorMessage from helpers.io import WarningMessage import plugins - import chip + import chip.Chip except ImportError, e: serror = str(e) if serror.startswith('No module named'): diff --git a/etesian/src/BloatCells.cpp b/etesian/src/BloatCells.cpp index 341dddc1..3229b33e 100644 --- a/etesian/src/BloatCells.cpp +++ b/etesian/src/BloatCells.cpp @@ -150,7 +150,7 @@ namespace Etesian { if (xsize < 6) return vpitch*8; if (xsize < 8) return vpitch*6; - return vpitch*4; + return vpitch*3; } diff --git a/katana/src/SegmentFsm.cpp b/katana/src/SegmentFsm.cpp index ea8f44b1..89ef85f3 100644 --- a/katana/src/SegmentFsm.cpp +++ b/katana/src/SegmentFsm.cpp @@ -541,7 +541,10 @@ namespace Katana { _constraint.intersection( perpandicular ); } else { cdebug_log(159,0) << "No Track in perpandicular free." << endl; - _state = EmptyTrackList; + if (not segment1->isNonPref()) _state = EmptyTrackList; + else { + cdebug_log(159,0) << "But in non-preferred direction, so that may happen." << endl; + } } if (_state == EmptyTrackList) return; @@ -557,8 +560,7 @@ namespace Katana { RoutingPlane* plane = Session::getKatanaEngine()->getRoutingPlaneByLayer(segment1->getLayer()); if (segment1->isNonPref()) { - Track* baseTrack = plane->getTrackByPosition( segment1->base()->getSourcePosition(), Constant::Superior ); - + Track* baseTrack = plane->getTrackByPosition( segment1->base()->getSourcePosition(), Constant::Superior ); RoutingPlane* perpPlane = plane->getTop(); if (not perpPlane) perpPlane = plane->getBottom(); @@ -574,7 +576,11 @@ namespace Katana { cdebug_log(155,0) << "| " << _costs.back() << ((_fullBlocked)?" FB ": " -- ") << ptrack << endl; } - + if (_costs.empty()) { + _costs.push_back( new TrackCost(segment1,NULL,baseTrack,NULL,segment1->getAxis(),0) ); + if ( _fullBlocked and (not _costs.back()->isBlockage() and not _costs.back()->isFixed()) ) + _fullBlocked = false; + } } else { for ( Track* track1 : Tracks_Range::get(plane,_constraint) ) { Track* track2 = NULL; @@ -1208,7 +1214,9 @@ namespace Katana { uint32_t nextState = data->getState(); Manipulator manipulator ( segment, *this ); - if (segment->isNonPref() and (getCost(0)->isBlockage() or getCost(0)->isAtRipupLimit())) { + if (segment->isNonPref() + and not getCosts().empty() + and (getCost(0)->isBlockage() or getCost(0)->isAtRipupLimit())) { cdebug_log(159,0) << "Non-preferred conflicts with a blockage or other's at ripup limit." << endl; success = manipulator.avoidBlockage(); }