From 47aadd8ef4b90baf07e4be7d070a5340e6aad901 Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Mon, 3 Jul 2023 19:59:10 +0200 Subject: [PATCH] Give priority of non-pref segments anchored on punctuals over regular ones. Introduce a new kind of flag "NonPrefOnVSmall" to mark non-preferred segments anchoreds on small terminals (i.e. punctual). They should have absolute priority over segments in prefered direction. --- anabatic/src/AutoSegment.cpp | 1 + anabatic/src/Constants.cpp | 1 + anabatic/src/NetBuilderHV.cpp | 4 +++- anabatic/src/anabatic/AutoSegment.h | 3 +++ anabatic/src/anabatic/Constants.h | 1 + katana/src/NegociateWindow.cpp | 10 ++++++++++ katana/src/TrackElement.cpp | 1 + katana/src/TrackSegment.cpp | 1 + katana/src/katana/TrackElement.h | 1 + katana/src/katana/TrackSegment.h | 1 + 10 files changed, 23 insertions(+), 1 deletion(-) diff --git a/anabatic/src/AutoSegment.cpp b/anabatic/src/AutoSegment.cpp index 53527aa9..ac7d982e 100644 --- a/anabatic/src/AutoSegment.cpp +++ b/anabatic/src/AutoSegment.cpp @@ -3069,6 +3069,7 @@ namespace Anabatic { if (wPitch > 1) segment->setFlags( SegWide ); if (source->canDrag() or target->canDrag()) segment->setFlags( SegDrag ); if (dir & Flags::UseNonPref) segment->setFlags( SegNonPref ); + if (dir.contains(Flags::UseNonPref|Flags::OnVSmall)) segment->setFlags( SegOnVSmall ); return segment; } diff --git a/anabatic/src/Constants.cpp b/anabatic/src/Constants.cpp index 3a08772c..dc4c2bee 100644 --- a/anabatic/src/Constants.cpp +++ b/anabatic/src/Constants.cpp @@ -132,6 +132,7 @@ namespace Anabatic { const BaseFlags Flags::NoMinLength = (1L << 37); const BaseFlags Flags::NoSegExt = (1L << 38); const BaseFlags Flags::NullLength = (1L << 39); + const BaseFlags Flags::OnVSmall = (1L << 40); Flags::~Flags () diff --git a/anabatic/src/NetBuilderHV.cpp b/anabatic/src/NetBuilderHV.cpp index 63585ee2..644d7951 100644 --- a/anabatic/src/NetBuilderHV.cpp +++ b/anabatic/src/NetBuilderHV.cpp @@ -277,7 +277,9 @@ namespace Anabatic { if (flags & (VSmall|UseNonPref)) { cdebug_log(145,0) << "case: UseNonPref" << endl; - + + if (flags & VSmall) + useNonPref.reset( Flags::UseNonPref ); AutoContact* subContact1 = AutoContactTurn::create( gcell, rp->getNet(), Session::getBuildContactLayer(rpDepth+1) ); AutoSegment::create( rpSourceContact, subContact1, Flags::Vertical|useNonPref ); rpSourceContact = subContact1; diff --git a/anabatic/src/anabatic/AutoSegment.h b/anabatic/src/anabatic/AutoSegment.h index 55803bfc..89404160 100644 --- a/anabatic/src/anabatic/AutoSegment.h +++ b/anabatic/src/anabatic/AutoSegment.h @@ -109,6 +109,7 @@ namespace Anabatic { static const uint64_t SegNonPref = (1L<<37); static const uint64_t SegAtMinArea = (1L<<38); static const uint64_t SegNoMoveUp = (1L<<39); + static const uint64_t SegOnVSmall = (1L<<40); // Masks. static const uint64_t SegWeakTerminal = SegStrongTerminal|SegWeakTerminal1|SegWeakTerminal2; static const uint64_t SegNotAligned = SegNotSourceAligned|SegNotTargetAligned; @@ -202,6 +203,7 @@ namespace Anabatic { inline bool isTerminal () const; inline bool isUnbreakable () const; inline bool isNonPref () const; + inline bool isNonPrefOnVSmall () const; inline bool isDrag () const; inline bool isAtMinArea () const; inline bool isNotSourceAligned () const; @@ -536,6 +538,7 @@ namespace Anabatic { inline bool AutoSegment::isLocal () const { return not (_flags & SegGlobal); } inline bool AutoSegment::isUnbreakable () const { return _flags & SegUnbreakable; } inline bool AutoSegment::isNonPref () const { return _flags & SegNonPref; } + inline bool AutoSegment::isNonPrefOnVSmall () const { return (_flags & SegNonPref) and (_flags & SegOnVSmall); } inline bool AutoSegment::isBipoint () const { return _flags & SegBipoint; } inline bool AutoSegment::isWeakTerminal () const { return (_rpDistance < 2); } inline bool AutoSegment::isWeakTerminal1 () const { return (_rpDistance == 1); } diff --git a/anabatic/src/anabatic/Constants.h b/anabatic/src/anabatic/Constants.h index 8624d2fb..92e97564 100644 --- a/anabatic/src/anabatic/Constants.h +++ b/anabatic/src/anabatic/Constants.h @@ -110,6 +110,7 @@ namespace Anabatic { static const BaseFlags NoMinLength ; static const BaseFlags NoSegExt ; static const BaseFlags NullLength ; + static const BaseFlags OnVSmall ; public: inline Flags ( uint64_t flags = NoFlags ); inline Flags ( const Hurricane::BaseFlags& ); diff --git a/katana/src/NegociateWindow.cpp b/katana/src/NegociateWindow.cpp index ddf701bb..1f2af140 100644 --- a/katana/src/NegociateWindow.cpp +++ b/katana/src/NegociateWindow.cpp @@ -76,6 +76,16 @@ namespace { cdebug_tabw(159,-1); return; } + + if (segment->isNonPrefOnVSmall()) { + cdebug_log(159,0) << "Infinite cost from (NonPref on VSmall): " << segment << endl; + cost.setInfinite (); + cost.setOverlap (); + cost.setHardOverlap(); + cost.setBlockage (); + cdebug_tabw(159,-1); + return; + } } if (cost.getInterval().getVMax() > intersect.getVMax()) cost.setLeftOverlap(); diff --git a/katana/src/TrackElement.cpp b/katana/src/TrackElement.cpp index a2383d33..0adfa03b 100644 --- a/katana/src/TrackElement.cpp +++ b/katana/src/TrackElement.cpp @@ -152,6 +152,7 @@ namespace Katana { bool TrackElement::isAnalog () const { return false; } bool TrackElement::isWide () const { return false; } bool TrackElement::isNonPref () const { return false; } + bool TrackElement::isNonPrefOnVSmall () const { return false; } bool TrackElement::isShortNet () const { return false; } // Predicates. bool TrackElement::hasSymmetric () const { return false; } diff --git a/katana/src/TrackSegment.cpp b/katana/src/TrackSegment.cpp index 57fddbdc..77382dfb 100644 --- a/katana/src/TrackSegment.cpp +++ b/katana/src/TrackSegment.cpp @@ -195,6 +195,7 @@ namespace Katana { bool TrackSegment::isWide () const { return _base->isWide(); } bool TrackSegment::isShortNet () const { return _base->isShortNet(); } bool TrackSegment::isPriorityLocked () const { return _flags & PriorityLocked; } + bool TrackSegment::isNonPrefOnVSmall () const { return _base->isNonPrefOnVSmall(); } // Predicates. bool TrackSegment::hasSymmetric () const { return _symmetric != NULL; } // Accessors. diff --git a/katana/src/katana/TrackElement.h b/katana/src/katana/TrackElement.h index 34f67e14..d9f3cbd4 100644 --- a/katana/src/katana/TrackElement.h +++ b/katana/src/katana/TrackElement.h @@ -106,6 +106,7 @@ namespace Katana { virtual bool isVertical () const = 0; virtual bool isWide () const; virtual bool isNonPref () const; + virtual bool isNonPrefOnVSmall () const; virtual bool isUnbreakable () const; virtual bool isLocal () const; virtual bool isGlobal () const; diff --git a/katana/src/katana/TrackSegment.h b/katana/src/katana/TrackSegment.h index b552ec60..79f4d36a 100644 --- a/katana/src/katana/TrackSegment.h +++ b/katana/src/katana/TrackSegment.h @@ -82,6 +82,7 @@ namespace Katana { virtual bool isAnalog () const; virtual bool isWide () const; virtual bool isShortNet () const; + virtual bool isNonPrefOnVSmall () const; virtual bool isPriorityLocked () const; // Predicates. virtual bool hasSymmetric () const;