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: