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).
This commit is contained in:
parent
e12e45e495
commit
1e49da1976
|
@ -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();
|
||||
|
|
|
@ -837,6 +837,8 @@ namespace Anabatic {
|
|||
|
||||
if (flags & Flags::Realignate) setAxis( getAxis(), flags );
|
||||
|
||||
//setAxis( optimalMin, flags );
|
||||
|
||||
cdebug_tabw(149,-1);
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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<uint32_t>::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);
|
||||
|
|
|
@ -171,6 +171,14 @@ namespace Katana {
|
|||
}
|
||||
|
||||
|
||||
float TrackFixedSegment::getPriority () const
|
||||
{ return 0.0; }
|
||||
|
||||
|
||||
void TrackFixedSegment::updatePriority ( float )
|
||||
{ }
|
||||
|
||||
|
||||
string TrackFixedSegment::_getTypeName () const
|
||||
{ return "TrackFixedSegment"; }
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -196,7 +196,6 @@ namespace Katana {
|
|||
unsigned int _mode : 4;
|
||||
unsigned int _rippleState : 4;
|
||||
uint32_t _eventLevel;
|
||||
float _priority;
|
||||
//vector<TrackElement*> _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; }
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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& );
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue