Ignore short overlaping same-net segments in realign stage.

* Change: In Track::addOverlapCost(), in some configuration, we can
    have two overlapping short segments that can *both* be realigned.
    But they prevent that because we account their shared length on
    the track.
      So now, in realign mode only, do not account same-net shared
    length if the segment length is less than *two perpandicular pitches*.
      This helps the antenna protection by making the diode connected
    directly to METAL2 long stripes, and not keeping them isolated.
This commit is contained in:
Jean-Paul Chaput 2021-05-11 14:19:27 +02:00
parent ef8133b1c6
commit 7ad26f1a37
4 changed files with 16 additions and 1 deletions

View File

@ -671,6 +671,8 @@ namespace Katana {
and (fsm.getCost(0)->getTrack() != getSegment()->getTrack())) {
cdebug_log(159,0) << "Insert in free space." << endl;
fsm.moveToTrack( 0 );
cdebug_log(155,0) << " @" << DbU::getValueString(getSegment()->getAxis())
<< " -> " << DbU::getValueString(fsm.getCost(0)->getTrack()->getAxis()) << endl;
fsm.doActions();
queue.commit();
}

View File

@ -566,7 +566,15 @@ namespace Katana {
cdebug_log(155,0) << "Segment istself in track, skip." << endl;
continue;
}
cdebug_log(155,0) << "Same net overlap, increase delta shared." << endl;
if ( cost.doIgnoreShort()
and (_segments[begin]->getLength() < 2*_segments[begin]->getPPitch())) {
cdebug_log(155,0) << "Overlap with same net and less than one p-pitch, skip." << endl;
continue;
}
cdebug_log(155,0) << "Same net overlap, increase delta shared ("
<< DbU::getValueString(_segments[begin]->getLength())
<< " > 2*" << DbU::getValueString(_segments[begin]->getPPitch())
<< ")" << endl;
cost.incDeltaShared ( overlap.getSize() );
}
_segments[begin]->incOverlapCost( cost );

View File

@ -63,6 +63,8 @@ namespace Katana {
, _selectFlags (NoFlags)
, _selectIndex (0)
{
if (Session::getStage() == StageRealign) _flags |= IgnoreShort;
if (refSegment->isNonPref()) {
DbU::Unit axisShift = getRefCandidateAxis() - refSegment->getAxis();
_interval1.translate( axisShift );

View File

@ -60,6 +60,7 @@ namespace Katana {
, GlobalEnclosed = (1 << 17)
, AtRipupLimit = (1 << 18)
, IgnoreTerminals = (1 << 19)
, IgnoreShort = (1 << 20)
, MergeMask = ForGlobal |Blockage|Fixed |Infinite
|HardOverlap |Overlap |RightOverlap|LeftOverlap|OverlapGlobal
|GlobalEnclosed |AtRipupLimit
@ -104,6 +105,7 @@ namespace Katana {
bool isFree () const;
inline bool isSymmetric () const;
inline bool isWide () const;
inline bool doIgnoreShort () const;
inline uint32_t getFlags () const;
inline size_t getSpan () const;
inline Net* getNet () const;
@ -208,6 +210,7 @@ namespace Katana {
inline bool TrackCost::isAtRipupLimit () const { return _flags & AtRipupLimit; }
inline bool TrackCost::isSymmetric () const { return _flags & Symmetric; }
inline bool TrackCost::isWide () const { return (_span > 1); }
inline bool TrackCost::doIgnoreShort () const { return _flags & IgnoreShort; }
inline uint32_t TrackCost::getFlags () const { return _flags; }
inline size_t TrackCost::getSpan () const { return _span; }
inline Net* TrackCost::getNet () const { return (_selectFlags & Symmetric) ? getNet2() : getNet1(); }