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