diff --git a/anabatic/src/AnabaticEngine.cpp b/anabatic/src/AnabaticEngine.cpp index a35fe28d..093a0499 100644 --- a/anabatic/src/AnabaticEngine.cpp +++ b/anabatic/src/AnabaticEngine.cpp @@ -606,7 +606,6 @@ namespace Anabatic { void AnabaticEngine::ripup ( Segment* seed, Flags flags ) { - Net* net = seed->getNet(); DebugSession::open( net, 112, 120 ); diff --git a/anabatic/src/AutoSegment.cpp b/anabatic/src/AutoSegment.cpp index 07ea93a3..eb1c7fb3 100644 --- a/anabatic/src/AutoSegment.cpp +++ b/anabatic/src/AutoSegment.cpp @@ -233,6 +233,77 @@ namespace { } + // --------------------------------------------------------------- + // Class : "SideStack". + + class SideStack { + public: + SideStack ( Flags direction, DbU::Unit pitch ); + const Interval& getSideAt ( DbU::Unit ) const; + inline const Interval& getGSide () const; + inline DbU::Unit getGSideMin () const; + inline DbU::Unit getGSideMax () const; + void addGCell ( const GCell* ); + inline void restrictGSide ( const Interval& ); + void show () const; + private: + Flags _direction; + DbU::Unit _pitch; + Interval _full; + Interval _gside; + map _sides; + }; + + + SideStack::SideStack ( Flags direction, DbU::Unit pitch ) + : _direction( (direction & Flags::Horizontal) ? Flags::Vertical : Flags::Horizontal ) + , _pitch (pitch) + , _full (false) + , _gside (false) + , _sides () + { } + + + inline const Interval& SideStack::getGSide () const { return _gside; } + inline DbU::Unit SideStack::getGSideMin () const { return _gside.getVMin(); } + inline DbU::Unit SideStack::getGSideMax () const { return _gside.getVMax(); } + inline void SideStack::restrictGSide ( const Interval& restrict ) { _gside.intersection( restrict ); } + + + const Interval& SideStack::getSideAt ( DbU::Unit position ) const + { + if (_sides.empty()) return _full; + if (_sides.size() == 1) return _sides.begin()->second; + + if (_sides.begin()->first > position) return _sides.begin()->second; + for ( auto iside = ++_sides.begin() ; iside != _sides.end() ; ++iside ) { + if (iside->first >= position) return (--iside)->second; + } + return _sides.rbegin()->second; + } + + + void SideStack::addGCell ( const GCell* gcell ) + { + Interval side = gcell->getSide( _direction, _pitch ); + DbU::Unit position = (_direction & Flags::Vertical) ? gcell->getBoundingBox().getXMin() + : gcell->getBoundingBox().getYMin(); + + _gside.intersection( side ); + _sides.insert( make_pair(position,side) ); + } + + + void SideStack::show () const + { + cdebug_log(145,0) << "SideStack::show()" << endl; + for ( auto pside : _sides ) { + cdebug_log(145,0) << "@ " << DbU::getValueString(pside.first) + << " " << pside.second << endl; + } + } + + } // End of local namespace. @@ -828,7 +899,7 @@ namespace Anabatic { cdebug_tabw(149,-1); return true; } - + if (getAxis() > optimalMax) { setAxis( optimalMax, flags ); cdebug_tabw(149,-1); @@ -922,6 +993,7 @@ namespace Anabatic { DbU::Unit constraintMin; DbU::Unit constraintMax; vector aligneds; + SideStack sideStack ( (isHorizontal() ? Flags::Horizontal : Flags::Vertical), getPitch() ); getConstraints( constraintMin, constraintMax ); cdebug_log(145,0) << "Constraints: [" << DbU::getValueString(constraintMin) @@ -931,43 +1003,37 @@ namespace Anabatic { optimalMin = optimalMax = getAxis(); aligneds.push_back( this ); } else { - DbU::Unit minGCell = getOrigin(); - DbU::Unit maxGCell = getExtremity(); DbU::Unit terminalMin; DbU::Unit terminalMax; AttractorsMap attractors; Flags flags = (isAnalog() ? Flags::WithDoglegs : Flags::NoFlags); - Flags f2 = flags | Flags::WithSelf; getAligneds( Flags::WithSelf|flags ).fill( aligneds ); - if (not getGCell()->isMatrix()) { - Flags direction = (isHorizontal()) ? Flags::Vertical : Flags::Horizontal; - Interval gcellSide ( false ); + if (getGCell()->isMatrix()) { + sideStack.addGCell( getGCell() ); + } else { vector gcells; - DbU::Unit pitch = getPitch(); - cdebug_log(145,0) << "Using pitch for L/T shrink:" << DbU::getValueString(pitch) << endl; + cdebug_log(145,0) << "Using pitch for L/T shrink:" << DbU::getValueString(getPitch()) << endl; for ( AutoSegment* aligned : aligneds ) { aligned->getGCells( gcells ); for ( GCell* gcell : gcells ) { - gcellSide.intersection( gcell->getSide(direction,pitch) ); - cdebug_log(145,0) << "| gcellSide:" << gcellSide << " (from " << gcell << ")" << endl; + sideStack.addGCell( gcell ); + cdebug_log(145,0) << "| gcellSide:" << sideStack.getGSide() << " (from " << gcell << ")" << endl; } if (aligned->isStrongTerminal()) { Interval terminalConstraints; aligned->getConstraints( terminalConstraints ); - gcellSide.intersection( terminalConstraints ); - cdebug_log(145,0) << "| gcellSide:" << gcellSide << " (from " << aligned << ")" << endl; + sideStack.restrictGSide( terminalConstraints ); + cdebug_log(145,0) << "| gcellSide:" << sideStack.getGSide() << " (from " << aligned << ")" << endl; } } - minGCell = gcellSide.getVMin(); - maxGCell = gcellSide.getVMax(); } + sideStack.show(); - cdebug_log(145,0) << "GCell interval [" << DbU::getValueString(minGCell) - << ":" << DbU::getValueString(maxGCell) << "]" << endl; + cdebug_log(145,0) << "GCell interval " << sideStack.getGSide() << endl; AutoContact* anchor = getAutoSource(); if (anchor->isTerminal()) { @@ -1006,12 +1072,19 @@ namespace Anabatic { if (autoSegment->isGlobal()) { cdebug_log(145,0) << "Used as global." << endl; - // Sloppy implentation. - DbU::Unit perpandMin = autoSegment->getSourceU(); - DbU::Unit perpandMax = autoSegment->getTargetU(); + const Interval& side = sideStack.getSideAt( autoSegment->getAxis() ); + cdebug_log(145,0) << "Side @" << DbU::getValueString(autoSegment->getAxis()) + << " " << side << endl; - if (perpandMin < minGCell) attractors.addAttractor( minGCell ); - if (perpandMax > maxGCell) attractors.addAttractor( maxGCell ); + if (autoSegment->getSourceU() < side.getVMin()) attractors.addAttractor( sideStack.getGSideMin() ); + if (autoSegment->getTargetU() > side.getVMax()) attractors.addAttractor( sideStack.getGSideMax() ); + + // // Sloppy implentation. + // DbU::Unit perpandMin = autoSegment->getSourceU(); + // DbU::Unit perpandMax = autoSegment->getTargetU(); + + // if (perpandMin < minGCell) attractors.addAttractor( minGCell ); + // if (perpandMax > maxGCell) attractors.addAttractor( maxGCell ); } else if (autoSegment->isLocal()) { if (autoSegment->isStrongTerminal()) { cdebug_log(145,0) << "Used as strong terminal." << endl; @@ -1054,8 +1127,8 @@ namespace Anabatic { : _gcell->getBoundingBox().getXMax(); } - setInBound( minGCell, maxGCell, optimalMin ); - setInBound( minGCell, maxGCell, optimalMax ); + setInBound( sideStack.getGSideMin(), sideStack.getGSideMax(), optimalMin ); + setInBound( sideStack.getGSideMin(), sideStack.getGSideMax(), optimalMax ); cdebug_log(145,0) << "optimalMin: " << DbU::getValueString(optimalMin) << endl; cdebug_log(145,0) << "optimalMax: " << DbU::getValueString(optimalMax) << endl; diff --git a/anabatic/src/Dijkstra.cpp b/anabatic/src/Dijkstra.cpp index b3ad7cf7..5dbc0d1d 100644 --- a/anabatic/src/Dijkstra.cpp +++ b/anabatic/src/Dijkstra.cpp @@ -394,7 +394,8 @@ namespace Anabatic { IntervalC intervfrom = IntervalC(); if (_adata == NULL){ - cdebug_log(112,1) << "Point Vertex::getStartPathPoint( const Vertex* next ) const: GRAData unset." << endl; + cdebug_log(112,0) << "Point Vertex::getStartPathPoint( const Vertex* next ) const: GRAData unset." << endl; + cdebug_tabw(112,-1); return Point(0,0); } @@ -754,6 +755,7 @@ namespace Anabatic { } else { cdebug_log(112,0) << "[ERROR](void Vertex::setIntervals(...)): Something is wrong." << endl; + cdebug_tabw(112,-1); return; } cdebug_log(112,0) << "IntervFrom => min: " << DbU::getValueString(min) << ", max: " << DbU::getValueString(max) << ", axis:" << DbU::getValueString(axis) << endl; @@ -792,7 +794,7 @@ namespace Anabatic { if (_adata){ return _adata->isiSet(); } else { - cdebug_log(112,1) << "bool Vertex::isiSet() const: Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "bool Vertex::isiSet() const: Inappropriate usage of GRAData. " << endl; return false; } } @@ -803,7 +805,7 @@ namespace Anabatic { if (_adata){ return _adata->getIAxis(); } else { - cdebug_log(112,1) << "DbU::Unit Vertex::getIAxis() const: Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "DbU::Unit Vertex::getIAxis() const: Inappropriate usage of GRAData. " << endl; return 0; } } @@ -814,7 +816,7 @@ namespace Anabatic { if (_adata){ return _adata->getIMax(); } else { - cdebug_log(112,1) << "DbU::Unit Vertex::getIMax() const: Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "DbU::Unit Vertex::getIMax() const: Inappropriate usage of GRAData. " << endl; return 0; } } @@ -825,7 +827,7 @@ namespace Anabatic { if (_adata){ return _adata->getIMin(); } else { - cdebug_log(112,1) << "DbU::Unit Vertex::getIMin() const: Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "DbU::Unit Vertex::getIMin() const: Inappropriate usage of GRAData. " << endl; return 0; } } @@ -836,7 +838,7 @@ namespace Anabatic { if (_adata){ return _adata->getPIAxis(); } else { - cdebug_log(112,1) << "DbU::Unit Vertex::getPIAxis() const: Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "DbU::Unit Vertex::getPIAxis() const: Inappropriate usage of GRAData. " << endl; return 0; } } @@ -847,7 +849,7 @@ namespace Anabatic { if (_adata){ return _adata->getPIMax(); } else { - cdebug_log(112,1) << "DbU::Unit Vertex::getPIMax() const: Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "DbU::Unit Vertex::getPIMax() const: Inappropriate usage of GRAData. " << endl; return 0; } } @@ -858,7 +860,7 @@ namespace Anabatic { if (_adata){ return _adata->getPIMin(); } else { - cdebug_log(112,1) << "DbU::Unit Vertex::getPIMin() const: Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "DbU::Unit Vertex::getPIMin() const: Inappropriate usage of GRAData. " << endl; return 0; } } @@ -869,7 +871,7 @@ namespace Anabatic { if (_adata){ _adata->setInterv(min, max, axis); } else { - cdebug_log(112,1) << "void Vertex::setInterv( DbU::Unit min, DbU::Unit max, DbU::Unit axis ): Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "void Vertex::setInterv( DbU::Unit min, DbU::Unit max, DbU::Unit axis ): Inappropriate usage of GRAData. " << endl; } } @@ -879,7 +881,7 @@ namespace Anabatic { if (_adata){ _adata->setIntervfrom(min, max, axis); } else { - cdebug_log(112,1) << "void Vertex::setIntervfrom( DbU::Unit min, DbU::Unit max, DbU::Unit axis ): Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "void Vertex::setIntervfrom( DbU::Unit min, DbU::Unit max, DbU::Unit axis ): Inappropriate usage of GRAData. " << endl; } } @@ -889,7 +891,7 @@ namespace Anabatic { if (_adata){ _adata->setIntervfrom2(min, max, axis); } else { - cdebug_log(112,1) << "void Vertex::setIntervfrom2( DbU::Unit min, DbU::Unit max, DbU::Unit axis ): Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "void Vertex::setIntervfrom2( DbU::Unit min, DbU::Unit max, DbU::Unit axis ): Inappropriate usage of GRAData. " << endl; } } @@ -899,7 +901,7 @@ namespace Anabatic { if (_adata){ _adata->resetIntervals(); } else { - cdebug_log(112,1) << "void Vertex::resetIntervals(): Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "void Vertex::resetIntervals(): Inappropriate usage of GRAData. " << endl; } } @@ -909,7 +911,7 @@ namespace Anabatic { if (_adata){ _adata->clearFrom2(); } else { - cdebug_log(112,1) << "void Vertex::clearfrom2(): Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "void Vertex::clearfrom2(): Inappropriate usage of GRAData. " << endl; } } @@ -919,7 +921,7 @@ namespace Anabatic { if (_adata){ return _adata->getFrom2(); } else { - cdebug_log(112,1) << "Edge* Vertex::getFrom2() const: Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "Edge* Vertex::getFrom2() const: Inappropriate usage of GRAData. " << endl; return NULL; } } @@ -930,7 +932,7 @@ namespace Anabatic { if (_adata){ _adata->setFrom2(from); } else { - cdebug_log(112,1) << "void Vertex::setFrom2( Edge* from ): Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "void Vertex::setFrom2( Edge* from ): Inappropriate usage of GRAData. " << endl; } } @@ -940,7 +942,7 @@ namespace Anabatic { if (_adata){ //_adata->createIntervFrom2(); } else { - cdebug_log(112,1) << "void Vertex::createIntervFrom2(): Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "void Vertex::createIntervFrom2(): Inappropriate usage of GRAData. " << endl; } } @@ -950,7 +952,7 @@ namespace Anabatic { if (_adata){ return _adata->getPIMax2(); } else { - cdebug_log(112,1) << "DbU::Unit Vertex::getPIMax2() const: Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "DbU::Unit Vertex::getPIMax2() const: Inappropriate usage of GRAData. " << endl; return 0; } } @@ -961,7 +963,7 @@ namespace Anabatic { if (_adata){ return _adata->getPIMin2(); } else { - cdebug_log(112,1) << "DbU::Unit Vertex::getPIMin2() const: Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "DbU::Unit Vertex::getPIMin2() const: Inappropriate usage of GRAData. " << endl; return 0; } } @@ -972,7 +974,7 @@ namespace Anabatic { if (_adata){ return _adata->getPIAxis2(); } else { - cdebug_log(112,1) << "DbU::Unit Vertex::getPIAxis2() const: Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "DbU::Unit Vertex::getPIAxis2() const: Inappropriate usage of GRAData. " << endl; return 0; } } @@ -983,7 +985,7 @@ namespace Anabatic { if (_adata){ return _adata->getIntervFrom2(); } else { - cdebug_log(112,1) << "DbU::Unit Vertex::getIntervFrom2() const: Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "DbU::Unit Vertex::getIntervFrom2() const: Inappropriate usage of GRAData. " << endl; return IntervalC(); } } @@ -1017,7 +1019,7 @@ namespace Anabatic { return _adata->getIntervFrom(); } } else { - cdebug_log(112,1) << "DbU::Unit Vertex::getIntervFrom(Flags criteria) const: Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "DbU::Unit Vertex::getIntervFrom(Flags criteria) const: Inappropriate usage of GRAData. " << endl; return IntervalC(); } } @@ -1066,7 +1068,7 @@ namespace Anabatic { if (_adata){ return _adata->getInterv(); } else { - cdebug_log(112,1) << "DbU::Unit Vertex::getInterv() const: Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "DbU::Unit Vertex::getInterv() const: Inappropriate usage of GRAData. " << endl; return IntervalC(); } } @@ -1077,7 +1079,7 @@ namespace Anabatic { if (_adata){ _adata->printInterv(); } else { - cdebug_log(112,1) << "void Vertex::printInterv() const: Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "void Vertex::printInterv() const: Inappropriate usage of GRAData. " << endl; } } @@ -1087,7 +1089,7 @@ namespace Anabatic { if (_adata){ _adata->printIntervfrom(); } else { - cdebug_log(112,1) << "void Vertex::printIntervfrom() const: Inappropriate usage of GRAData. " << endl; + cdebug_log(112,0) << "void Vertex::printIntervfrom() const: Inappropriate usage of GRAData. " << endl; } } diff --git a/katana/src/DataSymmetric.cpp b/katana/src/DataSymmetric.cpp index 2524a1d4..aaf69f69 100644 --- a/katana/src/DataSymmetric.cpp +++ b/katana/src/DataSymmetric.cpp @@ -167,12 +167,13 @@ namespace Katana { _valid = false; } - if (std::abs( 2*getSymAxis() - paired[0]->getAxis() - paired[1]->getAxis() ) > 2*vPitch ) { + if (std::abs( 2*getSymAxis() - paired[0]->getAxis() - paired[1]->getAxis() ) > 5*vPitch ) { errors.newline() << "Mirror axis mismatch @ [" << index << "] " << DbU::getValueString(paired[1]->getAxis()) << " (should be: " << DbU::getValueString(2*getSymAxis() - paired[0]->getAxis()) << ")"; errors.newline() << "| " << paired[0]; errors.newline() << "| " << paired[1]; + errors.newline() << "| Tolerance (5*vPitch): " << DbU::getValueString(5*vPitch); _valid = false; } } else { @@ -184,32 +185,35 @@ namespace Katana { _valid = false; } - if ( std::abs( paired[0]->getAxis() - paired[1]->getAxis() ) > 2*hPitch ) { + if ( std::abs( paired[0]->getAxis() - paired[1]->getAxis() ) > 5*hPitch ) { errors.newline() << "Axis mismatch index " << index << " " << DbU::getValueString(paired[1]->getAxis()) << " (should be:" << DbU::getValueString(paired[0]->getAxis()) << ")"; errors.newline() << "| " << paired[0]; errors.newline() << "| " << paired[1]; + errors.newline() << "| Tolerance (5*hPitch): " << DbU::getValueString(5*hPitch); _valid = false; } } } else { if (paired[0]->isHorizontal()) { - if ( std::abs( 2*getSymAxis() - paired[0]->getAxis() - paired[1]->getAxis() ) > 2*hPitch ) { + if ( std::abs( 2*getSymAxis() - paired[0]->getAxis() - paired[1]->getAxis() ) > 5*hPitch ) { errors.newline() << "Mirror axis mismatch index " << index << " " << DbU::getValueString(paired[1]->getAxis()) << " (should be:" << DbU::getValueString(2*getSymAxis() - paired[0]->getAxis()) << ")"; errors.newline() << "| " << paired[0]; errors.newline() << "| " << paired[1]; + errors.newline() << "| Tolerance (5*hPitch): " << DbU::getValueString(5*hPitch); _valid = false; } } else { - if ( std::abs( paired[0]->getAxis() != paired[1]->getAxis() ) > 2*vPitch ) { + if ( std::abs( paired[0]->getAxis() != paired[1]->getAxis() ) > 5*vPitch ) { errors.newline() << "Axis mismatch index " << index << " " << DbU::getValueString(paired[1]->getAxis()) << " (should be:" << DbU::getValueString(paired[0]->getAxis()) << ")"; errors.newline() << "| " << paired[0]; errors.newline() << "| " << paired[1]; + errors.newline() << "| Tolerance (5*vPitch): " << DbU::getValueString(5*vPitch); _valid = false; } } diff --git a/katana/src/KatanaEngine.cpp b/katana/src/KatanaEngine.cpp index a752861f..d5ccc604 100644 --- a/katana/src/KatanaEngine.cpp +++ b/katana/src/KatanaEngine.cpp @@ -54,6 +54,9 @@ namespace { using Hurricane::NetRoutingExtension; using Hurricane::Net; using Hurricane::Cell; + using Hurricane::Segment; + using Katana::Session; + using Katana::TrackSegment; void setSymmetricSelf ( Cell* cell, string name ) @@ -562,7 +565,7 @@ namespace Katana { addMeasure( getCell(), "DWL(l)" , totalWireLength , 12 ); addMeasure( getCell(), "fWL(l)" , totalWireLength-routedWireLength , 12 ); addMeasure ( getCell(), "WLER(%)", (expandRatio-1.0)*100.0 ); -} + } void KatanaEngine::dumpMeasures ( ostream& out ) const diff --git a/katana/src/NegociateWindow.cpp b/katana/src/NegociateWindow.cpp index 20d4b396..d09ea9cb 100644 --- a/katana/src/NegociateWindow.cpp +++ b/katana/src/NegociateWindow.cpp @@ -18,6 +18,7 @@ #include #include #include +#include "hurricane/DebugSession.h" #include "hurricane/Warning.h" #include "hurricane/Bug.h" #include "hurricane/RoutingPad.h" @@ -133,6 +134,38 @@ namespace { } + class CompareByPriority { + public: + inline bool operator() ( const TrackSegment* lhs, const TrackSegment* rhs ) + { return lhs->getPriority() > rhs->getPriority(); } + }; + + + void computeNetPriority ( Net* net ) + { + DebugSession::open( net, 159, 160 ); + + cdebug_log(159,1) << "::computeNetPriority() " << net << endl; + + vector segments; + for ( Segment* segment : net->getSegments() ) { + TrackSegment* canonical = dynamic_cast( Session::lookup( segment ) ); + if (canonical) segments.push_back( canonical ); + } + + for ( TrackSegment* segment : segments ) segment->computePriority(); + sort( segments.begin(), segments.end(), CompareByPriority() ); + + for ( TrackSegment* segment : segments ) { + segment->computeAlignedPriority(); + } + + cdebug_tabw(159,-1); + + DebugSession::close(); + } + + } // Anonymous namespace. @@ -149,6 +182,7 @@ namespace Katana { using Hurricane::Bug; using Hurricane::tab; using Hurricane::ForEachIterator; + using Hurricane::DebugSession; using CRL::Histogram; using CRL::addMeasure; using Anabatic::AutoContact; @@ -343,6 +377,14 @@ namespace Katana { } + void NegociateWindow::_computePriorities () + { + for ( Net* net : getCell()->getNets() ) { + if (NetRoutingExtension::isAnalog(net)) computeNetPriority( net ); + } + } + + void NegociateWindow::_createRouting ( Anabatic::GCell* gcell ) { cdebug_log(159,1) << "NegociateWindow::_createRouting() - " << gcell << endl; @@ -561,6 +603,7 @@ namespace Katana { _createRouting( _gcells[igcell] ); } Session::revalidate(); + _computePriorities(); if (not (flags & Flags::PreRoutedStage)) { _katana->preProcess(); diff --git a/katana/src/RoutingEvent.cpp b/katana/src/RoutingEvent.cpp index 865c3846..ec7a3ef2 100644 --- a/katana/src/RoutingEvent.cpp +++ b/katana/src/RoutingEvent.cpp @@ -655,7 +655,7 @@ namespace Katana { and _segment->base()->getAutoTarget()->isTerminal(); } - _segment->updatePriority(); + _segment->computePriority(); cdebug_log(159,0) << _segment << " has " << (int)_tracksNb << " choices " << perpandicular << endl; cdebug_tabw(159,-1); diff --git a/katana/src/SegmentFsm.cpp b/katana/src/SegmentFsm.cpp index 08ebe923..26053225 100644 --- a/katana/src/SegmentFsm.cpp +++ b/katana/src/SegmentFsm.cpp @@ -570,6 +570,7 @@ namespace Katana { for ( Track* track1 : Tracks_Range::get(plane,_constraint) ) { uint32_t costflags = 0; costflags |= (segment1->isLocal() and (depth >= 3)) ? TrackCost::LocalAndTopDepth : 0; + costflags |= (segment1->isAnalog()) ? TrackCost::Analog : 0; Track* track2 = NULL; if (_event2) { diff --git a/katana/src/Session.cpp b/katana/src/Session.cpp index 0f543dd0..fe6df948 100644 --- a/katana/src/Session.cpp +++ b/katana/src/Session.cpp @@ -226,9 +226,10 @@ namespace Katana { cdebug_log(159,0) << "Session: reduce:" << revalidateds[i] << endl; } if (revalidateds[i]->mustRaise()) { - revalidateds[i]->raise(); - lookup( revalidateds[i] )->reschedule( 0 ); cdebug_log(159,0) << "Session: raise:" << revalidateds[i] << endl; + revalidateds[i]->raise(); + TrackElement* trackSegment = lookup( revalidateds[i] ); + if (trackSegment) trackSegment->reschedule( 0 ); } } diff --git a/katana/src/TrackCost.cpp b/katana/src/TrackCost.cpp index 57a04d86..e173ede2 100644 --- a/katana/src/TrackCost.cpp +++ b/katana/src/TrackCost.cpp @@ -91,34 +91,36 @@ namespace Katana { , _dataState (0) , _ripupCount (0) { - // This is the GCell side (it is *one* cell height from the gauge). - DbU::Unit cellHeight = Session::getSliceHeight(); + if (not (_flags & Analog)) { + // This is the GCell side (it is *one* cell height from the gauge). + DbU::Unit cellHeight = Session::getSliceHeight(); - TrackElement* neighbor; - if ( _begin != Track::npos ) { - neighbor = _track->getSegment(_begin); - if ( neighbor and (neighbor->getNet() != net) ) { - DbU::Unit distance = interval.getVMin() - neighbor->getTargetU(); - if ( distance < cellHeight ) - _distanceToFixed = distance; - } + TrackElement* neighbor; + if ( _begin != Track::npos ) { + neighbor = _track->getSegment(_begin); + if ( neighbor and (neighbor->getNet() != net) ) { + DbU::Unit distance = interval.getVMin() - neighbor->getTargetU(); + if ( distance < cellHeight ) + _distanceToFixed = distance; + } // if ( neighbor and neighbor->isFixed() ) { // if ( _distanceToFixed == DbU::Max ) _distanceToFixed = 0; // _distanceToFixed += interval.getVMin() - neighbor->getTargetU(); // } - } - if ( _end != Track::npos ) { - neighbor = _track->getSegment(_end); - if ( neighbor and (neighbor->getNet() != net) ) { - DbU::Unit distance = neighbor->getSourceU() - interval.getVMax(); - if ( _distanceToFixed == 2*cellHeight ) _distanceToFixed = 0; - if ( distance < cellHeight ) - _distanceToFixed += distance; } + if ( _end != Track::npos ) { + neighbor = _track->getSegment(_end); + if ( neighbor and (neighbor->getNet() != net) ) { + DbU::Unit distance = neighbor->getSourceU() - interval.getVMax(); + if ( _distanceToFixed == 2*cellHeight ) _distanceToFixed = 0; + if ( distance < cellHeight ) + _distanceToFixed += distance; + } // if ( neighbor and neighbor->isFixed() ) { // if ( _distanceToFixed == DbU::Max ) _distanceToFixed = 0; // _distanceToFixed += neighbor->getSourceU() - interval.getVMax(); // } + } } } @@ -162,12 +164,14 @@ namespace Katana { if (lhs._delta != rhs._delta) { //cdebug_log(155,0) << "TrackCost::Compare() lhs._delta:" << lhs._delta << " rhs._delta:" << rhs._delta << endl; - if ( not (_flags & TrackCost::IgnoreSharedLength) or (lhs._delta > 0) or (rhs._delta > 0) ) { + //if ( not (_flags & TrackCost::IgnoreSharedLength) or (lhs._delta > 0) or (rhs._delta > 0) ) { //if ( (lhs._delta > 0) or (rhs._delta > 0) ) { if (lhs._delta < rhs._delta) return true; if (lhs._delta > rhs._delta) return false; - } + //} + // Both delta should be negative, chose the least one. + //return lhs._delta > rhs._delta; return lhs._delta < rhs._delta; } @@ -210,8 +214,9 @@ namespace Katana { if ( not _infinite and not _hardOverlap ) { cdebug_log(159,0) << "TrackCost::consolidate() " << _delta << " - " << _deltaShared << endl; //_deltaPerpand += - (_deltaShared << 1); - _delta += - _deltaShared; - //_delta += _deltaShared; + _delta -= _deltaShared; + //if (_delta > 0) _delta -= _deltaShared; + //else _delta += _deltaShared; } } @@ -249,7 +254,7 @@ namespace Katana { s += "-" + /*DbU::getValueString(_deltaShared)*/ getString(_deltaShared); s += "/" + DbU::getValueString(_axisWeight); s += "/" + DbU::getValueString(_deltaPerpand); - s += "/" + DbU::getValueString(_distanceToFixed); + s += "/f:" + DbU::getValueString(_distanceToFixed); s += "/" + DbU::getValueString(_longuestOverlap); s += " " + getString(_dataState); s += ">"; diff --git a/katana/src/TrackElement.cpp b/katana/src/TrackElement.cpp index 2b28774b..c36399d9 100644 --- a/katana/src/TrackElement.cpp +++ b/katana/src/TrackElement.cpp @@ -144,6 +144,7 @@ namespace Katana { bool TrackElement::isReduced () const { return false; } bool TrackElement::isUTurn () const { return false; } bool TrackElement::isUserDefined () const { return false; } + bool TrackElement::isAnalog () const { return false; } // Predicates. bool TrackElement::hasSymmetric () const { return false; } bool TrackElement::canSlacken () const { return false; } diff --git a/katana/src/TrackFixedSegment.cpp b/katana/src/TrackFixedSegment.cpp index fb465ce6..dd763853 100644 --- a/katana/src/TrackFixedSegment.cpp +++ b/katana/src/TrackFixedSegment.cpp @@ -130,15 +130,16 @@ namespace Katana { } - AutoSegment* TrackFixedSegment::base () const { return NULL; } - Segment* TrackFixedSegment::getSegment () const { return _segment; } - DbU::Unit TrackFixedSegment::getAxis () const { return getTrack()->getAxis(); } - bool TrackFixedSegment::isHorizontal () const { return getTrack()->isHorizontal(); } - bool TrackFixedSegment::isVertical () const { return getTrack()->isVertical(); } - bool TrackFixedSegment::isFixed () const { return true; } - Flags TrackFixedSegment::getDirection () const { return getTrack()->getDirection(); } - const Layer* TrackFixedSegment::getLayer () const { return _segment->getLayer(); } - Interval TrackFixedSegment::getFreeInterval () const { return Interval(); } + AutoSegment* TrackFixedSegment::base () const { return NULL; } + Segment* TrackFixedSegment::getSegment () const { return _segment; } + DbU::Unit TrackFixedSegment::getAxis () const { return getTrack()->getAxis(); } + bool TrackFixedSegment::isHorizontal () const { return getTrack()->isHorizontal(); } + bool TrackFixedSegment::isVertical () const { return getTrack()->isVertical(); } + bool TrackFixedSegment::isFixed () const { return true; } + bool TrackFixedSegment::isPriorityLocked () const { return false; } + Flags TrackFixedSegment::getDirection () const { return getTrack()->getDirection(); } + const Layer* TrackFixedSegment::getLayer () const { return _segment->getLayer(); } + Interval TrackFixedSegment::getFreeInterval () const { return Interval(); } unsigned long TrackFixedSegment::getId () const @@ -175,7 +176,19 @@ namespace Katana { { return 0.0; } - void TrackFixedSegment::updatePriority ( float ) + void TrackFixedSegment::setPriorityLock ( bool ) + { } + + + void TrackFixedSegment::forcePriority ( float ) + { } + + + void TrackFixedSegment::computePriority () + { } + + + void TrackFixedSegment::computeAlignedPriority () { } diff --git a/katana/src/TrackSegment.cpp b/katana/src/TrackSegment.cpp index 6cf9628f..2554e2d2 100644 --- a/katana/src/TrackSegment.cpp +++ b/katana/src/TrackSegment.cpp @@ -67,6 +67,7 @@ namespace Katana { , _data (NULL) , _priority (0.0) , _dogLegLevel (0) + , _flags (NoFlags) { cdebug_log(155,0) << "CTOR TrackSegment " << (void*)this << ":" << this << endl; cdebug_log(155,0) << " over " << (void*)segment << ":" << segment << endl; @@ -162,6 +163,8 @@ namespace Katana { bool TrackSegment::isReduced () const { return _base->isReduced(); } bool TrackSegment::isUserDefined () const { return _base->isUserDefined(); } bool TrackSegment::isUTurn () const { return _base->isUTurn(); } + bool TrackSegment::isAnalog () const { return _base->isAnalog(); } + bool TrackSegment::isPriorityLocked () const { return _flags & PriorityLocked; } // Predicates. bool TrackSegment::hasSymmetric () const { return _symmetric != NULL; } // Accessors. @@ -305,22 +308,38 @@ namespace Katana { } + void TrackSegment::setPriorityLock ( bool state ) + { + if (state) _flags |= PriorityLocked; + else _flags &= ~PriorityLocked; + } + + void TrackSegment::updateFreedomDegree () { _freedomDegree = _base->getSlack(); } - void TrackSegment::updatePriority ( float forced ) + void TrackSegment::forcePriority ( float forced ) + { if (not isPriorityLocked()) _priority = forced; } + + + void TrackSegment::computePriority () { - if (forced != 0.0) { _priority = forced; return; } + if (isPriorityLocked()) return; + if (isAnalog() and isTerminal()) { _priority = 0.0; return; } double length = DbU::toLambda(getLength()); double slack = DbU::toLambda(base()->getSlack()); + double pitch = DbU::toLambda(getPitch()); //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(); + if (slack / pitch > 10.0) slack = 10.0*pitch; + //cerr << "TrackSegment::computePriority() length:" << length << " slack:" << slack + // << " pri:" << (length + 1.0) * (slack + 1.0) << " pitch:" << DbU::toLambda(getPitch()) << endl; + _priority = (length + 1.0) * (slack + 1.0); //if (_priority > 10000.0) cerr << "_priority:" << _priority @@ -431,6 +450,48 @@ namespace Katana { } + void TrackSegment::computeAlignedPriority () + { + if (isPriorityLocked() or isTerminal()) return; + + computePriority(); + + AutoSegment* canonical = base(); + + vector sourceAligneds; + vector targetAligneds; + for ( AutoSegment* segment : canonical->getAligneds(Flags::Source|Flags::WithDoglegs) ) { + if (not segment->isCanonical()) continue; + sourceAligneds.push_back( Session::lookup(segment) ); + } + for ( AutoSegment* segment : canonical->getAligneds(Flags::Target|Flags::WithDoglegs) ) { + if (not segment->isCanonical()) continue; + sourceAligneds.push_back( Session::lookup(segment) ); + } + + if (sourceAligneds.empty() and targetAligneds.empty()) return; + + setPriorityLock( true ); + + cdebug_log(159,0) << "TrackSegment::computeAlignedPriority() " << this << endl; + cdebug_log(159,0) << "Aligneds on:" << getPriority() << ":" << this << endl; + for ( size_t i=0 ; iforcePriority( getPriority() - 2.0*(i+1) + 1.0 ); + sourceAligneds[i]->setPriorityLock( true ); + + cdebug_log(159,0) << "| S:" << i << " " << sourceAligneds[i]->getPriority() + << ":" << sourceAligneds[i] << endl; + } + for ( size_t i=0 ; iforcePriority( getPriority() - 2.0*(i+1) ); + targetAligneds[i]->setPriorityLock( true ); + + cdebug_log(159,0) << "| T:" << i << " " << targetAligneds[i]->getPriority() + << ":" << targetAligneds[i] << endl; + } + } + + float TrackSegment::getMaxUnderDensity ( Flags flags ) const { return _base->getMaxUnderDensity( flags ); } @@ -911,6 +972,7 @@ namespace Katana { Record* record = TrackElement::_getRecord(); record->add( getSlot( "_base" , _base ) ); record->add( getSlot( "_symmetric", _symmetric ) ); + record->add( getSlot( "_flags" , _flags ) ); return record; } diff --git a/katana/src/katana/NegociateWindow.h b/katana/src/katana/NegociateWindow.h index 0a35dcdd..22350714 100644 --- a/katana/src/katana/NegociateWindow.h +++ b/katana/src/katana/NegociateWindow.h @@ -115,6 +115,7 @@ namespace Katana { void run ( Flags flags ); void printStatistics () const; void _createRouting ( Anabatic::GCell* ); + void _computePriorities (); void _associateSymmetrics (); void _pack ( size_t& count, bool last ); size_t _negociate (); diff --git a/katana/src/katana/TrackCost.h b/katana/src/katana/TrackCost.h index eba1e076..c0ba9ff3 100644 --- a/katana/src/katana/TrackCost.h +++ b/katana/src/katana/TrackCost.h @@ -39,11 +39,12 @@ namespace Katana { class TrackCost { public: - enum Flags { IgnoreAxisWeight = 0x0001 - , DiscardGlobals = 0x0002 - , IgnoreSharedLength = 0x0004 - , LocalAndTopDepth = 0x0008 - , ZeroCost = 0x0010 + enum Flags { IgnoreAxisWeight = (1 << 0) + , DiscardGlobals = (1 << 1) + , IgnoreSharedLength = (1 << 2) + , LocalAndTopDepth = (1 << 3) + , ZeroCost = (1 << 4) + , Analog = (1 << 5) }; public: diff --git a/katana/src/katana/TrackElement.h b/katana/src/katana/TrackElement.h index 692e9be0..b89691fe 100644 --- a/katana/src/katana/TrackElement.h +++ b/katana/src/katana/TrackElement.h @@ -84,112 +84,116 @@ namespace Katana { class TrackElement { public: - static SegmentOverlapCostCB* setOverlapCostCB ( SegmentOverlapCostCB* ); - static void notify ( TrackElement*, unsigned int flags ); - public: - void destroy (); - virtual AutoSegment* base () const; - virtual Segment* getSegment () const = 0; - // Wrapped AutoSegment Functions (when applicable). - virtual bool isFixed () const; - virtual bool isHorizontal () const = 0; - virtual bool isVertical () const = 0; - virtual bool isLocal () const; - virtual bool isGlobal () const; - virtual bool isBipoint () const; - virtual bool isTerminal () const; - virtual bool isStrongTerminal ( Flags flags=Flags::NoFlags ) const; - virtual bool isStrap () const; - virtual bool isSlackened () const; - virtual bool isDogleg () const; - virtual bool isReduced () const; - virtual bool isUTurn () const; - virtual bool isUserDefined () const; - // Predicates. - inline bool isCreated () const; - inline bool isInvalidated () const; - inline bool isBlockage () const; - inline bool isLocked () const; - inline bool isRouted () const; - virtual bool hasSymmetric () const; - inline bool hasSourceDogleg () const; - inline bool hasTargetDogleg () const; - inline bool canRipple () const; - virtual bool canSlacken () const; - virtual bool canPivotUp ( float reserve, Flags flags ) const; - virtual bool canPivotDown ( float reserve, Flags flags ) const; - virtual bool canMoveUp ( float reserve, Flags flags=Flags::WithPerpands ) const; - virtual bool canDogleg (); - virtual bool canDogleg ( Interval ); - virtual bool canDogleg ( Anabatic::GCell*, Flags flags=0 ); - // Accessors - inline Observer* getObserver (); - virtual unsigned long getId () const; - virtual Flags getDirection () const = 0; - virtual Net* getNet () const = 0; - virtual const Layer* getLayer () const = 0; - virtual DbU::Unit getPitch () const; - 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; - virtual TrackElement* getNext () const; - virtual TrackElement* getPrevious () const; - virtual DbU::Unit getAxis () const = 0; - inline DbU::Unit getSourceU () const; - inline DbU::Unit getTargetU () const; - inline DbU::Unit getLength () const; - inline Interval getCanonicalInterval () const; - virtual Interval getFreeInterval () const; - virtual Interval getSourceConstraints () const; - virtual Interval getTargetConstraints () const; - virtual DataNegociate* getDataNegociate ( Flags flags=Flags::DataSelf ) const; - virtual TrackElement* getCanonical ( Interval& ); - virtual size_t getGCells ( vector& ) const; - virtual TrackElement* getParent () const; - virtual uint32_t getDoglegLevel () const; - virtual TrackElement* getSourceDogleg (); - virtual TrackElement* getTargetDogleg (); - virtual TrackElement* getSymmetric (); - virtual TrackElements getPerpandiculars (); - // Mutators. - inline void setFlags ( uint32_t ); - inline void unsetFlags ( uint32_t ); - inline void setRouted (); - 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* ); - virtual void reschedule ( uint32_t level ); - virtual void detach (); - virtual void invalidate (); - virtual void revalidate (); - virtual void updatePPitch (); - virtual void incOverlapCost ( Net*, TrackCost& ) const; - virtual void setAxis ( DbU::Unit, uint32_t flags=Anabatic::SegAxisSet ); - virtual TrackElement* makeDogleg (); - inline bool makeDogleg ( Anabatic::GCell* ); - virtual TrackElement* makeDogleg ( Anabatic::GCell*, TrackElement*& perpandicular, TrackElement*& parallel ); - virtual TrackElement* makeDogleg ( Interval, Flags& flags ); - virtual void _postDoglegs ( TrackElement*& perpandicular, TrackElement*& parallel ); - virtual bool moveAside ( Flags flags ); - virtual bool slacken ( Flags flags=Flags::NoFlags ); - virtual bool moveUp ( Flags flags ); - virtual bool moveDown ( Flags flags ); -#if THIS_IS_DISABLED - virtual void desalignate (); -#endif - virtual bool _check () const; - virtual Record* _getRecord () const; - virtual string _getString () const; - virtual string _getTypeName () const; + static SegmentOverlapCostCB* setOverlapCostCB ( SegmentOverlapCostCB* ); + static void notify ( TrackElement*, unsigned int flags ); + public: + void destroy (); + virtual AutoSegment* base () const; + virtual Segment* getSegment () const = 0; + // Wrapped AutoSegment Functions (when applicable). + virtual bool isFixed () const; + virtual bool isHorizontal () const = 0; + virtual bool isVertical () const = 0; + virtual bool isLocal () const; + virtual bool isGlobal () const; + virtual bool isBipoint () const; + virtual bool isTerminal () const; + virtual bool isStrongTerminal ( Flags flags=Flags::NoFlags ) const; + virtual bool isStrap () const; + virtual bool isSlackened () const; + virtual bool isDogleg () const; + virtual bool isReduced () const; + virtual bool isUTurn () const; + virtual bool isUserDefined () const; + virtual bool isAnalog () const; + virtual bool isPriorityLocked () const = 0; + // Predicates. + inline bool isCreated () const; + inline bool isInvalidated () const; + inline bool isBlockage () const; + inline bool isLocked () const; + inline bool isRouted () const; + virtual bool hasSymmetric () const; + inline bool hasSourceDogleg () const; + inline bool hasTargetDogleg () const; + inline bool canRipple () const; + virtual bool canSlacken () const; + virtual bool canPivotUp ( float reserve, Flags flags ) const; + virtual bool canPivotDown ( float reserve, Flags flags ) const; + virtual bool canMoveUp ( float reserve, Flags flags=Flags::WithPerpands ) const; + virtual bool canDogleg (); + virtual bool canDogleg ( Interval ); + virtual bool canDogleg ( Anabatic::GCell*, Flags flags=0 ); + // Accessors + inline Observer* getObserver (); + virtual unsigned long getId () const; + virtual Flags getDirection () const = 0; + virtual Net* getNet () const = 0; + virtual const Layer* getLayer () const = 0; + virtual DbU::Unit getPitch () const; + 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; + virtual TrackElement* getNext () const; + virtual TrackElement* getPrevious () const; + virtual DbU::Unit getAxis () const = 0; + inline DbU::Unit getSourceU () const; + inline DbU::Unit getTargetU () const; + inline DbU::Unit getLength () const; + inline Interval getCanonicalInterval () const; + virtual Interval getFreeInterval () const; + virtual Interval getSourceConstraints () const; + virtual Interval getTargetConstraints () const; + virtual DataNegociate* getDataNegociate ( Flags flags=Flags::DataSelf ) const; + virtual TrackElement* getCanonical ( Interval& ); + virtual size_t getGCells ( vector& ) const; + virtual TrackElement* getParent () const; + virtual uint32_t getDoglegLevel () const; + virtual TrackElement* getSourceDogleg (); + virtual TrackElement* getTargetDogleg (); + virtual TrackElement* getSymmetric (); + virtual TrackElements getPerpandiculars (); + // Mutators. + inline void setFlags ( uint32_t ); + inline void unsetFlags ( uint32_t ); + inline void setRouted (); + virtual void setTrack ( Track* ); + inline void setIndex ( size_t ); + virtual void setSymmetric ( TrackElement* ); + virtual void setPriorityLock ( bool state ) = 0; + virtual void forcePriority ( float priority ) = 0; + virtual void computePriority () = 0; + virtual void computeAlignedPriority () = 0; + virtual void updateFreedomDegree (); + virtual void setDoglegLevel ( uint32_t ); + virtual void swapTrack ( TrackElement* ); + virtual void reschedule ( uint32_t level ); + virtual void detach (); + virtual void invalidate (); + virtual void revalidate (); + virtual void updatePPitch (); + virtual void incOverlapCost ( Net*, TrackCost& ) const; + virtual void setAxis ( DbU::Unit, uint32_t flags=Anabatic::SegAxisSet ); + virtual TrackElement* makeDogleg (); + inline bool makeDogleg ( Anabatic::GCell* ); + virtual TrackElement* makeDogleg ( Anabatic::GCell*, TrackElement*& perpandicular, TrackElement*& parallel ); + virtual TrackElement* makeDogleg ( Interval, Flags& flags ); + virtual void _postDoglegs ( TrackElement*& perpandicular, TrackElement*& parallel ); + virtual bool moveAside ( Flags flags ); + virtual bool slacken ( Flags flags=Flags::NoFlags ); + virtual bool moveUp ( Flags flags ); + virtual bool moveDown ( Flags flags ); +#if THIS_IS_DISABLED + virtual void desalignate (); +#endif + virtual bool _check () const; + virtual Record* _getRecord () const; + virtual string _getString () const; + virtual string _getTypeName () const; protected: // Static Attributes. @@ -234,7 +238,6 @@ 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 b9772cee..b5f623f3 100644 --- a/katana/src/katana/TrackFixedSegment.h +++ b/katana/src/katana/TrackFixedSegment.h @@ -38,26 +38,30 @@ namespace Katana { class TrackFixedSegment : public TrackElement { public: - static TrackElement* create ( Katana::Track* track , Segment* segment ); - public: - virtual AutoSegment* base () const; - virtual Segment* getSegment () const; - virtual bool isHorizontal () const; - virtual bool isVertical () const; - virtual bool isFixed () const; - virtual unsigned long getId () const; - virtual Flags getDirection () const; - virtual Net* getNet () const; - virtual const Layer* getLayer () const; - virtual TrackElement* getNext () const; - 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; + static TrackElement* create ( Katana::Track* track , Segment* segment ); + public: + virtual AutoSegment* base () const; + virtual Segment* getSegment () const; + virtual bool isHorizontal () const; + virtual bool isVertical () const; + virtual bool isFixed () const; + virtual bool isPriorityLocked () const; + virtual unsigned long getId () const; + virtual Flags getDirection () const; + virtual Net* getNet () const; + virtual const Layer* getLayer () const; + virtual TrackElement* getNext () const; + virtual TrackElement* getPrevious () const; + virtual DbU::Unit getAxis () const; + virtual Interval getFreeInterval () const; + virtual float getPriority () const; + virtual void setPriorityLock ( bool ); + virtual void forcePriority ( float ); + virtual void computePriority (); + virtual void computeAlignedPriority (); + virtual Record* _getRecord () const; + virtual string _getString () const; + virtual string _getTypeName () const; protected: // Attributes. static Net* _blockageNet; diff --git a/katana/src/katana/TrackSegment.h b/katana/src/katana/TrackSegment.h index 9b3ab788..c7135093 100644 --- a/katana/src/katana/TrackSegment.h +++ b/katana/src/katana/TrackSegment.h @@ -43,6 +43,11 @@ namespace Katana { // ------------------------------------------------------------------- // Class : "TrackSegment". + enum TrackSegmentFlag { NoFlags = 0 + , PriorityLocked = (1 << 0) + }; + + class TrackSegment : public TrackElement { public: class CompareById : public binary_function { @@ -71,6 +76,8 @@ namespace Katana { virtual bool isReduced () const; virtual bool isUTurn () const; virtual bool isUserDefined () const; + virtual bool isAnalog () const; + virtual bool isPriorityLocked () const; // Predicates. virtual bool hasSymmetric () const; virtual bool canDogleg (); @@ -108,7 +115,10 @@ namespace Katana { // Mutators. virtual void setTrack ( Track* ); virtual void setSymmetric ( TrackElement* ); - virtual void updatePriority ( float ); + virtual void setPriorityLock ( bool state ); + virtual void forcePriority ( float ); + virtual void computePriority (); + virtual void computeAlignedPriority (); virtual void updateFreedomDegree (); virtual void setDoglegLevel ( uint32_t ); virtual void swapTrack ( TrackElement* ); @@ -144,6 +154,7 @@ namespace Katana { DataNegociate* _data; float _priority; unsigned int _dogLegLevel:4; + uint32_t _flags; protected: // Constructors & Destructors.