From 1e49da1976cd09187af900eb7e4554e442b0c987 Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Sat, 27 May 2017 20:35:28 +0200 Subject: [PATCH] Select S/T in AutoSegments_Aligneds. Priority moved to TrackSegment. * In Katana::AutoSegments_Aligneds, allow the the caller to select if we are propagating through source or target only (or both). Note that if no flag is given, it is assumed that we want to propagate the old way on both source and target. * In Katana::TrackElement, Katana::TrackSegment and Katana::RoutingEvent, move the event priority from RoutingEvent to TrackSegment. Add accessor and mutators associated in TrackElement (virtual methods). --- anabatic/src/AutoHorizontal.cpp | 2 +- anabatic/src/AutoSegment.cpp | 2 ++ anabatic/src/AutoSegments.cpp | 14 ++++++++++---- anabatic/src/AutoVertical.cpp | 2 +- anabatic/src/anabatic/AutoSegments.h | 2 +- katana/src/RoutingEvent.cpp | 17 ++++------------- katana/src/TrackFixedSegment.cpp | 8 ++++++++ katana/src/TrackSegment.cpp | 22 ++++++++++++++++++++++ katana/src/katana/RoutingEvent.h | 3 +-- katana/src/katana/TrackElement.h | 4 ++++ katana/src/katana/TrackFixedSegment.h | 5 ++--- katana/src/katana/TrackSegment.h | 3 +++ 12 files changed, 59 insertions(+), 25 deletions(-) diff --git a/anabatic/src/AutoHorizontal.cpp b/anabatic/src/AutoHorizontal.cpp index c6807e23..ea4bde74 100644 --- a/anabatic/src/AutoHorizontal.cpp +++ b/anabatic/src/AutoHorizontal.cpp @@ -389,7 +389,7 @@ namespace Anabatic { if (_horizontal->getY() == axis) return; - cdebug_log(145,0) << "_setAxis() @Y " << DbU::getValueString(axis) << " " << this << endl; + cdebug_log(144,0) << "_setAxis() @Y " << DbU::getValueString(axis) << " " << this << endl; _horizontal->setY( axis ); invalidate(); diff --git a/anabatic/src/AutoSegment.cpp b/anabatic/src/AutoSegment.cpp index 71e5cc80..07ea93a3 100644 --- a/anabatic/src/AutoSegment.cpp +++ b/anabatic/src/AutoSegment.cpp @@ -837,6 +837,8 @@ namespace Anabatic { if (flags & Flags::Realignate) setAxis( getAxis(), flags ); + //setAxis( optimalMin, flags ); + cdebug_tabw(149,-1); return false; } diff --git a/anabatic/src/AutoSegments.cpp b/anabatic/src/AutoSegments.cpp index a01ced8f..767c546b 100644 --- a/anabatic/src/AutoSegments.cpp +++ b/anabatic/src/AutoSegments.cpp @@ -329,17 +329,23 @@ namespace Anabatic { , _stack () { if (not _master) return; + if (not _flags.intersect(Flags::Source|Flags::Target)) + _flags |= Flags::Source | Flags::Target; _flags |= (_master->isHorizontal()) ? Flags::Horizontal : Flags::Vertical; if (_flags & Flags::WithDoglegs) _flags |= Flags::WithPerpands; cdebug_log(144,0) << "AutoSegments_Aligneds::Locator::Locator() _flags:" << _flags.asString(FlagsFunction) << endl; - AutoContact* contact = segment->getAutoSource(); - if (contact) _stack.push( contact, segment ); + if (_flags & Flags::Source) { + AutoContact* contact = segment->getAutoSource(); + if (contact) _stack.push( contact, segment ); + } - contact = segment->getAutoTarget(); - if (contact) _stack.push( contact, segment ); + if (_flags & Flags::Target) { + AutoContact* contact = segment->getAutoTarget(); + if (contact) _stack.push( contact, segment ); + } if (not (_flags & Flags::WithSelf)) progress(); } diff --git a/anabatic/src/AutoVertical.cpp b/anabatic/src/AutoVertical.cpp index a44da88d..b0092f5b 100644 --- a/anabatic/src/AutoVertical.cpp +++ b/anabatic/src/AutoVertical.cpp @@ -328,7 +328,7 @@ namespace Anabatic { if (_vertical->getX() == axis) return; - cdebug_log(149,0) << "_setAxis() @X " << DbU::getValueString(axis) << " " << this << endl; + cdebug_log(144,0) << "_setAxis() @X " << DbU::getValueString(axis) << " " << this << endl; _vertical->setX( axis ); invalidate(); diff --git a/anabatic/src/anabatic/AutoSegments.h b/anabatic/src/anabatic/AutoSegments.h index 979ad288..3dbdb66b 100644 --- a/anabatic/src/anabatic/AutoSegments.h +++ b/anabatic/src/anabatic/AutoSegments.h @@ -233,7 +233,7 @@ namespace Anabatic { public: // AutoSegments_Aligneds Methods. - AutoSegments_Aligneds ( AutoSegment*, Flags flags=Flags::NoFlags ); + AutoSegments_Aligneds ( AutoSegment*, Flags flags ); AutoSegments_Aligneds ( const AutoSegments_Aligneds& ); virtual AutoSegmentHC* getClone () const; virtual AutoSegmentHL* getLocator () const; diff --git a/katana/src/RoutingEvent.cpp b/katana/src/RoutingEvent.cpp index 63a7d5c2..865c3846 100644 --- a/katana/src/RoutingEvent.cpp +++ b/katana/src/RoutingEvent.cpp @@ -80,6 +80,9 @@ namespace Katana { if (lhs._eventLevel > rhs._eventLevel) return false; if (lhs._eventLevel < rhs._eventLevel) return true; + //if (lhs._net->getName() != rhs._net->getName()) + // return lhs._net->getName() < rhs._net->getName(); + // Process all M2 (terminal access) before any others. //if ((lhs._layerDepth == 1) and (rhs._layerDepth != 1)) return false; //if ((lhs._layerDepth != 1) and (rhs._layerDepth == 1)) return true; @@ -178,7 +181,6 @@ namespace Katana { , _mode (mode) , _rippleState (0) , _eventLevel (0) - , _priority (0.0) , _key (this) { if (_idCounter == std::numeric_limits::max()) { @@ -653,18 +655,7 @@ namespace Katana { and _segment->base()->getAutoTarget()->isTerminal(); } - double length = DbU::toLambda(_segment->getLength()); - double slack = DbU::toLambda(_segment->base()->getSlack()); - - //if (length > 200.0) length = 200.0 - std::log(length)*20.0; - //if (length < 0.0) length = 0.0; - //if (slack / DbU::toLambda(_segment->getPitch()) < 2.0) slack = 999.0; - - _priority = (length + 1.0) * (slack + 1.0); - - //if (_priority > 10000.0) cerr << "_priority:" << _priority - // << " length:" << DbU::toLambda(_segment->getLength()) - // << " slack:" << DbU::toLambda(_segment->base()->getSlack()) << endl; + _segment->updatePriority(); cdebug_log(159,0) << _segment << " has " << (int)_tracksNb << " choices " << perpandicular << endl; cdebug_tabw(159,-1); diff --git a/katana/src/TrackFixedSegment.cpp b/katana/src/TrackFixedSegment.cpp index d928ddcd..fb465ce6 100644 --- a/katana/src/TrackFixedSegment.cpp +++ b/katana/src/TrackFixedSegment.cpp @@ -171,6 +171,14 @@ namespace Katana { } + float TrackFixedSegment::getPriority () const + { return 0.0; } + + + void TrackFixedSegment::updatePriority ( float ) + { } + + string TrackFixedSegment::_getTypeName () const { return "TrackFixedSegment"; } diff --git a/katana/src/TrackSegment.cpp b/katana/src/TrackSegment.cpp index c2289eaf..6cf9628f 100644 --- a/katana/src/TrackSegment.cpp +++ b/katana/src/TrackSegment.cpp @@ -65,6 +65,7 @@ namespace Katana { , _freedomDegree(0) , _ppitch (0) , _data (NULL) + , _priority (0.0) , _dogLegLevel (0) { cdebug_log(155,0) << "CTOR TrackSegment " << (void*)this << ":" << this << endl; @@ -172,6 +173,7 @@ namespace Katana { DbU::Unit TrackSegment::getPPitch () const { return _ppitch; } DbU::Unit TrackSegment::getAxis () const { return _base->getAxis(); } unsigned long TrackSegment::getFreedomDegree () const { return _freedomDegree; } + float TrackSegment::getPriority () const { return _priority; } uint32_t TrackSegment::getDoglegLevel () const { return _dogLegLevel; } Interval TrackSegment::getSourceConstraints () const { return _base->getSourceConstraints(); } Interval TrackSegment::getTargetConstraints () const { return _base->getTargetConstraints(); } @@ -307,6 +309,26 @@ namespace Katana { { _freedomDegree = _base->getSlack(); } + void TrackSegment::updatePriority ( float forced ) + { + if (forced != 0.0) { _priority = forced; return; } + + double length = DbU::toLambda(getLength()); + double slack = DbU::toLambda(base()->getSlack()); + + //if (length > 200.0) length = 200.0 - std::log(length)*20.0; + //if (length < 0.0) length = 0.0; + //if (slack / DbU::toLambda(_segment->getPitch()) < 2.0 ) slack = 999.0; + if (slack / DbU::toLambda(getPitch()) > 10.0) slack = 10.0*getPitch(); + + _priority = (length + 1.0) * (slack + 1.0); + + //if (_priority > 10000.0) cerr << "_priority:" << _priority + // << " length:" << DbU::toLambda(getLength()) + // << " slack:" << DbU::toLambda(base()->getSlack()) << endl; + } + + void TrackSegment::updatePPitch () { _ppitch = _base->getPPitch(); diff --git a/katana/src/katana/RoutingEvent.h b/katana/src/katana/RoutingEvent.h index 4aea9a8d..2367bca9 100644 --- a/katana/src/katana/RoutingEvent.h +++ b/katana/src/katana/RoutingEvent.h @@ -196,7 +196,6 @@ namespace Katana { unsigned int _mode : 4; unsigned int _rippleState : 4; uint32_t _eventLevel; - float _priority; //vector _perpandiculars; Key _key; }; @@ -224,7 +223,7 @@ namespace Katana { inline const Interval& RoutingEvent::getOptimal () const { return _optimal; } inline const Interval& RoutingEvent::getPerpandicularFree () const { return _dataNegociate->getPerpandicularFree(); } //inline const Interval& RoutingEvent::getPerpandicular () const { return _perpandicular; } - inline float RoutingEvent::getPriority () const { return _priority; } + inline float RoutingEvent::getPriority () const { return _segment->getPriority(); } inline uint32_t RoutingEvent::getEventLevel () const { return _eventLevel; } inline uint32_t RoutingEvent::getTracksNb () const { return _tracksNb; } inline uint32_t RoutingEvent::getTracksFree () const { return _tracksFree; } diff --git a/katana/src/katana/TrackElement.h b/katana/src/katana/TrackElement.h index 082ef524..692e9be0 100644 --- a/katana/src/katana/TrackElement.h +++ b/katana/src/katana/TrackElement.h @@ -132,6 +132,7 @@ namespace Katana { virtual DbU::Unit getPPitch () const; inline Track* getTrack () const; inline size_t getIndex () const; + virtual float getPriority () const = 0; virtual unsigned long getFreedomDegree () const; virtual float getMaxUnderDensity ( Flags flags=Flags::NoFlags ) const; inline Box getBoundingBox () const; @@ -161,6 +162,8 @@ namespace Katana { virtual void setTrack ( Track* ); inline void setIndex ( size_t ); virtual void setSymmetric ( TrackElement* ); + inline void updatePriority (); + virtual void updatePriority ( float priority ) = 0; virtual void updateFreedomDegree (); virtual void setDoglegLevel ( uint32_t ); virtual void swapTrack ( TrackElement* ); @@ -231,6 +234,7 @@ namespace Katana { inline DbU::Unit TrackElement::getTargetU () const { return _targetU; } inline Interval TrackElement::getCanonicalInterval () const { return Interval(getSourceU(),getTargetU()); } inline void TrackElement::setIndex ( size_t index ) { _index=index; } + inline void TrackElement::updatePriority () { updatePriority( 0.0 ); } inline void TrackElement::setRouted() { diff --git a/katana/src/katana/TrackFixedSegment.h b/katana/src/katana/TrackFixedSegment.h index 3af7060b..b9772cee 100644 --- a/katana/src/katana/TrackFixedSegment.h +++ b/katana/src/katana/TrackFixedSegment.h @@ -53,15 +53,15 @@ namespace Katana { virtual TrackElement* getPrevious () const; virtual DbU::Unit getAxis () const; virtual Interval getFreeInterval () const; + virtual float getPriority () const; + virtual void updatePriority ( float ); virtual Record* _getRecord () const; virtual string _getString () const; virtual string _getTypeName () const; - protected: // Attributes. static Net* _blockageNet; Segment* _segment; - protected: // Constructors & Destructors. TrackFixedSegment ( Track*, Segment* ) ; @@ -71,7 +71,6 @@ namespace Katana { private: TrackFixedSegment ( const TrackFixedSegment& ); TrackFixedSegment& operator= ( const TrackFixedSegment& ); - }; diff --git a/katana/src/katana/TrackSegment.h b/katana/src/katana/TrackSegment.h index ea6dbce7..9b3ab788 100644 --- a/katana/src/katana/TrackSegment.h +++ b/katana/src/katana/TrackSegment.h @@ -88,6 +88,7 @@ namespace Katana { virtual DbU::Unit getPitch () const; virtual DbU::Unit getPPitch () const; virtual unsigned long getFreedomDegree () const; + virtual float getPriority () const; virtual uint32_t getDoglegLevel () const; virtual TrackElement* getNext () const; virtual TrackElement* getPrevious () const; @@ -107,6 +108,7 @@ namespace Katana { // Mutators. virtual void setTrack ( Track* ); virtual void setSymmetric ( TrackElement* ); + virtual void updatePriority ( float ); virtual void updateFreedomDegree (); virtual void setDoglegLevel ( uint32_t ); virtual void swapTrack ( TrackElement* ); @@ -140,6 +142,7 @@ namespace Katana { unsigned long _freedomDegree; DbU::Unit _ppitch; DataNegociate* _data; + float _priority; unsigned int _dogLegLevel:4; protected: