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:
parent
43ea63d98d
commit
1da71ae740
|
@ -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'):
|
||||
|
|
|
@ -150,7 +150,7 @@ namespace Etesian {
|
|||
if (xsize < 6) return vpitch*8;
|
||||
if (xsize < 8) return vpitch*6;
|
||||
|
||||
return vpitch*4;
|
||||
return vpitch*3;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
@ -558,7 +561,6 @@ namespace Katana {
|
|||
|
||||
if (segment1->isNonPref()) {
|
||||
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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue