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.
This commit is contained in:
Jean-Paul Chaput 2019-10-16 21:47:32 +02:00
parent 43ea63d98d
commit 1da71ae740
3 changed files with 15 additions and 7 deletions

View File

@ -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'):

View File

@ -150,7 +150,7 @@ namespace Etesian {
if (xsize < 6) return vpitch*8;
if (xsize < 8) return vpitch*6;
return vpitch*4;
return vpitch*3;
}

View File

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