Forgot to perform Track re-order after removing zero-length segments.

* Change: In Anabatic::Autocontact, replace getMinDepth() and
    getMaxDepth() by getDepthSpan().
* New: In Anabatic::AutoSegment::canMoveUp(), add an optional check of
    low up density (Flags::CheckLowUpDensity). Allows to move up a
    segment if the up density is (very) low, and in this case it's more
    efficient than breaking it to fit in the lower layer.
      canMoveUp() is now able to perform the same work as canPivotUp()
    if *not* supplied the flag Flags::IgnoreContacts.
* New: In Katana, in GlobalRouting::DigitalDistance() now take into
    account the cost of a VIA (currently set to 2.5). Need to known the
    Net currently routed in the DigitalDistance object itself.
* Change: In Katana::Track::Element::canPivotUp(), now also takes a flag
    parameter.
* Change: In Katana::Manipulator, new flag IgnoreContacts to mirror the
    one of Anabatic.
* Change: In Katana::SegmentFsm, allocate once a Manipulator object instead
    of many times on the fly.
      In SegmentFsm::_slackenGlobal(), in the slacken state, if the up
    density is (very) low, bypass to move up instead of slackening.
    This solve better the routing of the control part of the register file.
    The register file having a pathological case of terminal placement:
    many punctual terminals aligneds in METAL2 *and* a grid of METAL2 and
    METAL3 blockages near below...
* Bug: In Katana::Session::_revalidate(), after removing the zero-length
    segments, forgot to re-order the track, leading to many stranges effects
    as the indexes where no longer coherent in the Track.
This commit is contained in:
Jean-Paul Chaput 2016-09-20 11:30:45 +02:00
parent 6e1d3f0372
commit bff9a38742
23 changed files with 200 additions and 162 deletions

View File

@ -183,35 +183,21 @@ namespace Anabatic {
{ return NULL; } { return NULL; }
unsigned int AutoContact::getMinDepth () const void AutoContact::getDepthSpan ( size_t& minDepth, size_t& maxDepth ) const
{ {
size_t minDepth = (size_t)-1; minDepth = (size_t)-1;
maxDepth = 0;
Component* anchor = getAnchor (); Component* anchor = getAnchor ();
if (anchor) { if (anchor) {
minDepth = std::min( minDepth, Session::getRoutingGauge()->getLayerDepth(anchor->getLayer()) ); minDepth = std::min( minDepth, Session::getRoutingGauge()->getLayerDepth(anchor->getLayer()) );
maxDepth = std::max( maxDepth, Session::getRoutingGauge()->getLayerDepth(anchor->getLayer()) );
} }
for ( AutoSegment* segment : const_cast<AutoContact*>(this)->getAutoSegments() ) { for ( AutoSegment* segment : const_cast<AutoContact*>(this)->getAutoSegments() ) {
minDepth = std::min( minDepth, Session::getRoutingGauge()->getLayerDepth(segment->getLayer()) ); minDepth = std::min( minDepth, Session::getRoutingGauge()->getLayerDepth(segment->getLayer()) );
maxDepth = std::max( maxDepth, Session::getRoutingGauge()->getLayerDepth(segment->getLayer()) );
} }
return (unsigned int)minDepth;
}
unsigned int AutoContact::getMaxDepth () const
{
size_t maxDepth = 0;
Component* anchor = getAnchor ();
if ( anchor ) {
maxDepth = std::max ( maxDepth, Session::getRoutingGauge()->getLayerDepth(anchor->getLayer()) );
}
for ( AutoSegment* segment : const_cast<AutoContact*>(this)->getAutoSegments() ) {
maxDepth = std::max ( maxDepth, Session::getRoutingGauge()->getLayerDepth(segment->getLayer()) );
}
return (unsigned int)maxDepth;
} }

View File

@ -323,17 +323,18 @@ namespace Anabatic {
, _parent (NULL) , _parent (NULL)
, _observers () , _observers ()
{ {
AutoContact* source = Session::lookup(dynamic_cast<Contact*>(segment->getSource()));
AutoContact* target = Session::lookup(dynamic_cast<Contact*>(segment->getTarget()));
_allocateds++; _allocateds++;
if (dynamic_cast<Horizontal*>(segment)) setFlags( SegHorizontal ); if (dynamic_cast<Horizontal*>(segment)) setFlags( SegHorizontal );
if (source->isTerminal()) setFlags( SegSourceTerminal );
if (target->isTerminal()) setFlags( SegTargetTerminal );
_globalsCount += isGlobal() ? 1 : 0; _globalsCount += isGlobal() ? 1 : 0;
AutoContact* source = Session::lookup(dynamic_cast<Contact*>(segment->getSource()));
AutoContact* target = Session::lookup(dynamic_cast<Contact*>(segment->getTarget()));
if (source->isTerminal()) setFlags( SegSourceTerminal );
if (target->isTerminal()) setFlags( SegTargetTerminal );
source->invalidate( Flags::Topology ); source->invalidate( Flags::Topology );
} }
@ -859,21 +860,19 @@ namespace Anabatic {
void AutoSegment::computeTerminal () void AutoSegment::computeTerminal ()
{ {
AutoContact* source = getAutoSource(); AutoContact* source = getAutoSource();
AutoContact* target = getAutoTarget(); AutoContact* target = getAutoTarget();
cdebug_log(145,0) << "computeTerminal() S:" << source->isTerminal()
<< " T:" << target->isTerminal()
<< " " << this << endl;
if (source->isTerminal()) { if (source->isTerminal()) {
unsetFlags( SegWeakTerminal ); unsetFlags( SegWeakTerminal );
setFlags ( SegSourceTerminal ); setFlags ( SegSourceTerminal );
if (not target->isTerminal()) if (not target->isTerminal())
target->setFlags( CntWeakTerminal ); target->setFlags( CntWeakTerminal );
} else if (target->isTerminal()) { } else if (target->isTerminal()) {
unsetFlags( SegWeakTerminal ); unsetFlags( SegWeakTerminal );
setFlags ( SegTargetTerminal ); setFlags ( SegTargetTerminal );
if (not source->isTerminal()) if (not source->isTerminal())
source->setFlags( CntWeakTerminal ); source->setFlags( CntWeakTerminal );
} else { } else {
@ -896,6 +895,10 @@ namespace Anabatic {
unsetFlags( SegWeakTerminal ); unsetFlags( SegWeakTerminal );
setFlags ( terminalFlag ); setFlags ( terminalFlag );
} }
cdebug_log(145,0) << "computeTerminal() S:" << source->isTerminal()
<< " T:" << target->isTerminal()
<< " " << this << endl;
} }
@ -1400,7 +1403,8 @@ namespace Anabatic {
<< " (reserve:" << reserve << ")" << endl; << " (reserve:" << reserve << ")" << endl;
if ( isLayerChange() or isFixed() ) return false; if ( isLayerChange() or isFixed() ) return false;
if ( isStrongTerminal() or isLocal() ) return false; if ( isStrongTerminal() and (not (flags & Flags::AllowTerminal)) ) return false;
if ( isLocal() and (not (flags & Flags::AllowLocal )) ) return false;
size_t depth = Session::getRoutingGauge()->getLayerDepth( getLayer() ); size_t depth = Session::getRoutingGauge()->getLayerDepth( getLayer() );
if (depth+2 >= Session::getRoutingGauge()->getDepth()) return false; if (depth+2 >= Session::getRoutingGauge()->getDepth()) return false;
@ -1415,8 +1419,8 @@ namespace Anabatic {
cdebug_log(149,0) << getAutoSource() << endl; cdebug_log(149,0) << getAutoSource() << endl;
cdebug_log(149,0) << getAutoTarget() << endl; cdebug_log(149,0) << getAutoTarget() << endl;
cdebug_log(149,0) << "min depths, Segment:" << depth cdebug_log(149,0) << "min depths, Segment:" << depth
<< " S:" << getAutoSource()->getMinDepth() << " S:" << getAutoSource()->getMinDepth()
<< " T:" << getAutoTarget()->getMinDepth() << endl; << " T:" << getAutoTarget()->getMinDepth() << endl;
if (getAutoSource()->getMinDepth() < depth) return false; if (getAutoSource()->getMinDepth() < depth) return false;
if (getAutoTarget()->getMinDepth() < depth) return false; if (getAutoTarget()->getMinDepth() < depth) return false;
@ -1491,12 +1495,11 @@ namespace Anabatic {
bool AutoSegment::canMoveUp ( float reserve, unsigned int flags ) const bool AutoSegment::canMoveUp ( float reserve, unsigned int flags ) const
{ {
cdebug_log(149,0) << "AutoSegment::canMoveUp() " << flags cdebug_log(159,0) << "AutoSegment::canMoveUp() " << flags
<< " (reserve:" << reserve << ")" << endl; << " (reserve:" << reserve << ") " << this << endl;
bool lowDensity = true; bool nLowDensity = true;
GCell* begin = NULL; bool nLowUpDensity = true;
GCell* end = NULL;
if ( isLayerChange() or isFixed() ) return false; if ( isLayerChange() or isFixed() ) return false;
if ( isStrongTerminal() and (not (flags & Flags::AllowTerminal)) ) return false; if ( isStrongTerminal() and (not (flags & Flags::AllowTerminal)) ) return false;
@ -1507,65 +1510,79 @@ namespace Anabatic {
vector<GCell*> gcells; vector<GCell*> gcells;
getGCells( gcells ); getGCells( gcells );
begin = *gcells.begin ();
end = *gcells.rbegin();
for ( size_t i=0 ; i<gcells.size() ; i++ ) { for ( size_t i=0 ; i<gcells.size() ; i++ ) {
if ( lowDensity and (gcells[i]->getWDensity(depth-2) > 0.5) ) lowDensity = false; if ( nLowDensity and (gcells[i]->getWDensity(depth-2) > 0.5) ) nLowDensity = false;
if ( nLowUpDensity and (gcells[i]->getWDensity(depth) > 0.2) ) nLowUpDensity = false;
if (not gcells[i]->hasFreeTrack(depth,reserve)) { if (not gcells[i]->hasFreeTrack(depth,reserve)) {
cdebug_log(149,0) << "Not enough free track in " << gcells[i] << endl; cdebug_log(159,0) << "Not enough free track in " << gcells[i] << endl;
return false; return false;
} }
} }
cdebug_log(149,0) << "Enough free track under canonical segment." << endl; cdebug_log(159,0) << "Enough free track under canonical segment." << endl;
if (not (flags & Flags::IgnoreContacts)) {
if (getAutoSource()->getMinDepth() < depth-2) return false;
if (getAutoTarget()->getMinDepth() < depth-2) return false;
}
if ( isLocal() and not (flags & Flags::Propagate) ) { if ( isLocal() and not (flags & Flags::Propagate) ) {
if (not getAutoSource()->canMoveUp(this)) return false; if (not getAutoSource()->canMoveUp(this)) return false;
if (not getAutoTarget()->canMoveUp(this)) return false; if (not getAutoTarget()->canMoveUp(this)) return false;
return true; return true;
} }
cdebug_log(159,0) << "Both source & target Contacts can move up." << endl;
//bool hasGlobalSegment = false; //bool hasGlobalSegment = false;
if ((flags & Flags::Propagate) and not isNotAligned()) { if ((flags & Flags::Propagate) and not isNotAligned()) {
forEach ( AutoSegment*, isegment, const_cast<AutoSegment*>(this)->getAligneds(flags) ) { for ( AutoSegment* segment : const_cast<AutoSegment*>(this)->getAligneds(flags) ) {
if (isegment->isFixed ()) return false; if (segment->isFixed ()) return false;
//if (isegment->isGlobal()) hasGlobalSegment = true; //if (segment->isGlobal()) hasGlobalSegment = true;
isegment->getGCells( gcells ); if (not (flags & Flags::IgnoreContacts)) {
//if ( (*gcells.begin ())->getIndex() < begin->getIndex() ) begin = *gcells.begin (); if (segment->getAutoSource()->getMinDepth() < depth-2) return false;
//if ( (*gcells.rbegin())->getIndex() > end ->getIndex() ) end = *gcells.rbegin(); if (segment->getAutoTarget()->getMinDepth() < depth-2) return false;
}
segment->getGCells( gcells );
for ( size_t i=0 ; i<gcells.size() ; i++ ) { for ( size_t i=0 ; i<gcells.size() ; i++ ) {
if ( lowDensity and (gcells[i]->getWDensity(depth-2) > 0.6) ) lowDensity = false; if ( nLowDensity and (gcells[i]->getWDensity(depth-2) > 0.6) ) nLowDensity = false;
if ( nLowUpDensity and (gcells[i]->getWDensity(depth) > 0.2) ) {
cdebug_log(159,0) << "lowUpDensity false in " << gcells[i]
<< "d:" << gcells[i]->getWDensity(depth) << endl;
nLowUpDensity = false;
}
if (not gcells[i]->hasFreeTrack(depth,reserve)) { if (not gcells[i]->hasFreeTrack(depth,reserve)) {
cdebug_log(149,0) << "Not enough free track in " << gcells[i] << endl; cdebug_log(159,0) << "Not enough free track in " << gcells[i] << endl;
return false; return false;
} }
} }
} }
} }
if (lowDensity and (flags & Flags::CheckLowDensity)) return false; if ( nLowDensity and (flags & Flags::CheckLowDensity )) return false;
if (not nLowUpDensity and (flags & Flags::CheckLowUpDensity)) return false;
if ( (depth >= 4) and (flags & Flags::WithPerpands) ) { if ( (depth >= 4) and (flags & Flags::WithPerpands) ) {
float fragmentation = begin->getFragmentation( depth-1 ); float fragmentation = (*gcells.begin())->getFragmentation( depth-1 );
cdebug_log(149,0) << "Check begin GCell perpandicular fragmentation: " << fragmentation << endl; cdebug_log(159,0) << "Check begin GCell perpandicular fragmentation: " << fragmentation << endl;
if (fragmentation < 0.5) { if (fragmentation < 0.5) {
cdebug_log(149,0) << "Not enough free track for perpandicular in begin GCell " cdebug_log(159,0) << "Not enough free track for perpandicular in begin GCell "
<< "(frag:" << fragmentation << ")." << "(frag:" << fragmentation << ")."
<< endl; << endl;
return false; return false;
} }
fragmentation = end->getFragmentation( depth-1 ); fragmentation = (*gcells.rbegin())->getFragmentation( depth-1 );
cdebug_log(149,0) << "Check end GCell perpandicular fragmentation: " << fragmentation << endl; cdebug_log(159,0) << "Check end GCell perpandicular fragmentation: " << fragmentation << endl;
if (fragmentation < 0.5) { if (fragmentation < 0.5) {
cdebug_log(149,0) << "Not enough free track for perpandicular in end GCell " cdebug_log(159,0) << "Not enough free track for perpandicular in end GCell "
<< "(frag:" << fragmentation << ")." << "(frag:" << fragmentation << ")."
<< endl; << endl;
return false; return false;
} }
} }

View File

@ -82,7 +82,8 @@ namespace Anabatic {
const unsigned int Flags::NoGCellShrink = (1 << 27); const unsigned int Flags::NoGCellShrink = (1 << 27);
const unsigned int Flags::CParanoid = (1 << 28); const unsigned int Flags::CParanoid = (1 << 28);
const unsigned int Flags::CheckLowDensity = (1 << 29); const unsigned int Flags::CheckLowDensity = (1 << 29);
const unsigned int Flags::NoUpdate = (1 << 30); const unsigned int Flags::CheckLowUpDensity = (1 << 30);
const unsigned int Flags::NoUpdate = (1 << 31);
Flags::~Flags () Flags::~Flags ()

View File

@ -125,8 +125,9 @@ namespace Anabatic {
virtual AutoSegment* getOpposite ( const AutoSegment* ) const = 0; virtual AutoSegment* getOpposite ( const AutoSegment* ) const = 0;
virtual AutoSegment* getPerpandicular ( const AutoSegment* ) const = 0; virtual AutoSegment* getPerpandicular ( const AutoSegment* ) const = 0;
virtual AutoSegment* getSegment ( unsigned int ) const = 0; virtual AutoSegment* getSegment ( unsigned int ) const = 0;
unsigned int getMinDepth () const; void getDepthSpan ( size_t& minDepth, size_t& maxDepth ) const;
unsigned int getMaxDepth () const; inline unsigned int getMinDepth () const;
inline unsigned int getMaxDepth () const;
void getLengths ( DbU::Unit* lengths, AutoSegment::DepthLengthSet& ); void getLengths ( DbU::Unit* lengths, AutoSegment::DepthLengthSet& );
virtual Box getNativeConstraintBox () const; virtual Box getNativeConstraintBox () const;
Interval getNativeUConstraints ( unsigned int direction ) const; Interval getNativeUConstraints ( unsigned int direction ) const;
@ -266,6 +267,12 @@ namespace Anabatic {
inline DbU::Unit AutoContact::getCBYMax () const inline DbU::Unit AutoContact::getCBYMax () const
{ return isFixed() ? _contact->getY() : DbU::fromLambda(_dyMax) + _gcell->getYMin(); } { return isFixed() ? _contact->getY() : DbU::fromLambda(_dyMax) + _gcell->getYMin(); }
inline unsigned int AutoContact::getMinDepth () const
{ size_t minDepth, maxDepth; getDepthSpan(minDepth,maxDepth); return minDepth; }
inline unsigned int AutoContact::getMaxDepth () const
{ size_t minDepth, maxDepth; getDepthSpan(minDepth,maxDepth); return maxDepth; }
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "Anabatic::LocatorHelper". // Class : "Anabatic::LocatorHelper".

View File

@ -84,6 +84,7 @@ namespace Anabatic {
static const unsigned int NoGCellShrink ; static const unsigned int NoGCellShrink ;
static const unsigned int CParanoid ; static const unsigned int CParanoid ;
static const unsigned int CheckLowDensity ; static const unsigned int CheckLowDensity ;
static const unsigned int CheckLowUpDensity ;
static const unsigned int NoUpdate ; static const unsigned int NoUpdate ;
public: public:
inline Flags ( unsigned int flags = NoFlags ); inline Flags ( unsigned int flags = NoFlags );

View File

@ -64,7 +64,7 @@ namespace Anabatic {
//inline Vertex ( size_t id ); //inline Vertex ( size_t id );
inline ~Vertex (); inline ~Vertex ();
inline bool hasDoneAllRps () const; inline bool hasDoneAllRps () const;
inline Contact* hasGContact ( Net* ); inline Contact* hasGContact ( Net* ) const;
inline unsigned int getId () const; inline unsigned int getId () const;
inline GCell* getGCell () const; inline GCell* getGCell () const;
inline AnabaticEngine* getAnabatic () const; inline AnabaticEngine* getAnabatic () const;
@ -149,7 +149,7 @@ namespace Anabatic {
inline Vertex::~Vertex () { _gcell->setObserver( GCell::Observable::Vertex, NULL ); } inline Vertex::~Vertex () { _gcell->setObserver( GCell::Observable::Vertex, NULL ); }
inline Contact* Vertex::hasGContact ( Net* net ) { return _gcell->hasGContact(net); } inline Contact* Vertex::hasGContact ( Net* net ) const { return _gcell->hasGContact(net); }
inline unsigned int Vertex::getId () const { return _id; } inline unsigned int Vertex::getId () const { return _id; }
inline GCell* Vertex::getGCell () const { return _gcell; } inline GCell* Vertex::getGCell () const { return _gcell; }
inline AnabaticEngine* Vertex::getAnabatic () const { return _gcell->getAnabatic(); } inline AnabaticEngine* Vertex::getAnabatic () const { return _gcell->getAnabatic(); }

View File

@ -1317,7 +1317,7 @@ namespace Katabatic {
ostringstream s; ostringstream s;
const Layer* layer = rg->getRoutingLayer(depth)->getBlockageLayer(); const Layer* layer = rg->getRoutingLayer(depth)->getBlockageLayer();
s << "_blockages[" << depth << ":" << ((layer) ? layer->getName() : "None") << "]"; s << "_blockages[" << depth << ":" << ((layer) ? layer->getName() : "None") << "]";
record->add ( getSlot ( s.str(), &_blockages[depth] ) ); record->add ( DbU::getValueSlot ( s.str(), &_blockages[depth] ) );
} }
for ( size_t depth=0 ; depth<_depth ; ++depth ) { for ( size_t depth=0 ; depth<_depth ; ++depth ) {

View File

@ -28,6 +28,7 @@ namespace {
using std::left; using std::left;
using std::right; using std::right;
using Hurricane::DbU; using Hurricane::DbU;
using Hurricane::Net;
using Anabatic::Edge; using Anabatic::Edge;
using Anabatic::Vertex; using Anabatic::Vertex;
@ -35,16 +36,19 @@ namespace {
class DigitalDistance { class DigitalDistance {
public: public:
inline DigitalDistance ( float h, float k ); inline DigitalDistance ( float h, float k );
inline void setNet ( Net* );
DbU::Unit operator() ( const Vertex* source ,const Vertex* target,const Edge* edge ) const; DbU::Unit operator() ( const Vertex* source ,const Vertex* target,const Edge* edge ) const;
private: private:
// For an explanation of h & k parameters, see: // For an explanation of h & k parameters, see:
// "KNIK, routeur global pour la plateforme Coriolis", p. 52. // "KNIK, routeur global pour la plateforme Coriolis", p. 52.
float _h; float _h;
float _k; float _k;
Net* _net;
}; };
inline DigitalDistance::DigitalDistance ( float h, float k ) : _h(h), _k(k) { } inline DigitalDistance::DigitalDistance ( float h, float k ) : _h(h), _k(k), _net(NULL) { }
inline void DigitalDistance::setNet ( Net* net ) { _net = net; }
DbU::Unit DigitalDistance::operator() ( const Vertex* source ,const Vertex* target,const Edge* edge ) const DbU::Unit DigitalDistance::operator() ( const Vertex* source ,const Vertex* target,const Edge* edge ) const
@ -54,8 +58,15 @@ namespace {
float congestion = (float)edge->getRealOccupancy() / (float)edge->getCapacity(); float congestion = (float)edge->getRealOccupancy() / (float)edge->getCapacity();
float congestionCost = 1.0 + _h / (1.0 + std::exp(_k * (congestion - 1.0))); float congestionCost = 1.0 + _h / (1.0 + std::exp(_k * (congestion - 1.0)));
float viaCost = 0.0;
if ( source->getFrom()
and (source->getFrom()->isHorizontal() xor edge->isHorizontal())
and not source->hasGContact(_net) ) {
viaCost += 2.5;
}
float distance = (float)source->getDistance() float distance = (float)source->getDistance()
+ congestionCost * (float)edge->getDistance(); + (congestionCost + viaCost) * (float)edge->getDistance()
+ edge->getHistoricCost(); + edge->getHistoricCost();
// Edge* sourceFrom = source->getFrom(); // Edge* sourceFrom = source->getFrom();
@ -155,9 +166,10 @@ namespace Katana {
float edgeHInc = getConfiguration()->getEdgeHInc(); float edgeHInc = getConfiguration()->getEdgeHInc();
openSession(); openSession();
Dijkstra* dijkstra = new Dijkstra ( this ); Dijkstra* dijkstra = new Dijkstra ( this );
dijkstra->setDistance( DigitalDistance( getConfiguration()->getEdgeCostH() DigitalDistance distance ( getConfiguration()->getEdgeCostH()
, getConfiguration()->getEdgeCostK() ) ); , getConfiguration()->getEdgeCostK() );
dijkstra->setDistance( distance );
size_t iteration = 0; size_t iteration = 0;
size_t netCount = 0; size_t netCount = 0;
@ -168,6 +180,7 @@ namespace Katana {
for ( NetData* netData : getNetOrdering() ) { for ( NetData* netData : getNetOrdering() ) {
if (netData->isGlobalRouted()) continue; if (netData->isGlobalRouted()) continue;
distance.setNet( netData->getNet() );
dijkstra->load( netData->getNet() ); dijkstra->load( netData->getNet() );
dijkstra->run(); dijkstra->run();
++netCount; ++netCount;

View File

@ -95,7 +95,7 @@ namespace Katana {
if (not _segment) if (not _segment)
throw Error( "Manipulator::Manipulator(): cannot build upon a NULL TrackElement." ); throw Error( "Manipulator::Manipulator(): cannot build upon a NULL TrackElement." );
DebugSession::open( _segment->getNet(), 150, 160 ); DebugSession::open( _segment->getNet(), 149, 160 );
_data = _segment->getDataNegociate(); _data = _segment->getDataNegociate();
if (_data) _event = _data->getRoutingEvent(); if (_data) _event = _data->getRoutingEvent();
@ -1067,9 +1067,9 @@ namespace Katana {
cdebug_log(159,0) << "Manipulator::pivotDown() " << _segment << endl; cdebug_log(159,0) << "Manipulator::pivotDown() " << _segment << endl;
return false; return false;
if ( _segment->isFixed () ) return false; if ( _segment->isFixed () ) return false;
if ( _segment->isStrap () ) return false; if ( _segment->isStrap () ) return false;
if (not _segment->canPivotDown(2.0)) return false; if (not _segment->canPivotDown(2.0,Flags::NoFlags)) return false;
return _segment->moveDown( Flags::NoFlags ); return _segment->moveDown( Flags::NoFlags );
} }
@ -1081,16 +1081,17 @@ namespace Katana {
unsigned int kflags = Flags::WithNeighbors; unsigned int kflags = Flags::WithNeighbors;
//kflags |= (flags & AllowLocalMoveUp ) ? Flags::AutoSegment::AllowLocal : 0; //kflags |= (flags & AllowLocalMoveUp ) ? Flags::AutoSegment::AllowLocal : 0;
kflags |= (flags & AllowTerminalMoveUp) ? Flags::AllowTerminal : 0; kflags |= (flags & AllowTerminalMoveUp) ? Flags::AllowTerminal : 0;
kflags |= (flags & IgnoreContacts ) ? Flags::IgnoreContacts : 0;
if (_segment->isFixed()) return false; if (_segment->isFixed()) return false;
if (not (flags & AllowLocalMoveUp)) { if (not (flags & AllowLocalMoveUp)) {
if (_segment->isLocal()) { if (_segment->isLocal()) {
if (not _segment->canPivotUp(0.5)) return false; if (not _segment->canPivotUp(0.5,kflags)) return false;
} else { } else {
if (_segment->getLength() < 20*getPitch()) { if (_segment->getLength() < 20*getPitch()) {
if (not (flags & AllowShortPivotUp)) return false; if (not (flags & AllowShortPivotUp)) return false;
if (not _segment->canPivotUp(1.0)) return false; if (not _segment->canPivotUp(1.0,kflags)) return false;
} }
if (not _segment->canMoveUp(0.5,kflags)) return false; if (not _segment->canMoveUp(0.5,kflags)) return false;
} }

View File

@ -244,6 +244,7 @@ namespace {
if (segment and segment->isFixed() and segment->isTerminal()) { if (segment and segment->isFixed() and segment->isTerminal()) {
Interval freeInterval = track->getFreeInterval( segment->getSourceU(), segment->getNet() ); Interval freeInterval = track->getFreeInterval( segment->getSourceU(), segment->getNet() );
DbU::Unit ppitch = segment->getPPitch(); DbU::Unit ppitch = segment->getPPitch();
//DbU::Unit pitch = segment->getPitch();
//if (freeInterval.getSize() < ppitch*6) { //if (freeInterval.getSize() < ppitch*6) {
if ( (segment->getSourceU() - freeInterval.getVMin() < ppitch*3) if ( (segment->getSourceU() - freeInterval.getVMin() < ppitch*3)

View File

@ -393,7 +393,7 @@ namespace Katana {
#endif #endif
} }
DebugSession::open( _segment->getNet(), 150, 160 ); DebugSession::open( _segment->getNet(), 149, 160 );
cdebug_log(9000,0) << "Deter| Event " cdebug_log(9000,0) << "Deter| Event "
<< getProcesseds() << getProcesseds()

View File

@ -568,9 +568,9 @@ namespace Katana {
void SegmentFsm::addAction ( TrackElement* segment void SegmentFsm::addAction ( TrackElement* segment
, unsigned int type , unsigned int type
, DbU::Unit axisHint , DbU::Unit axisHint
, unsigned int toSegmentFsm ) , unsigned int toSegmentFsm )
{ {
if ( not segment->isFixed() ) { if ( not segment->isFixed() ) {
_actions.push_back ( SegmentAction(segment,type,axisHint,toSegmentFsm) ); _actions.push_back ( SegmentAction(segment,type,axisHint,toSegmentFsm) );
@ -720,7 +720,7 @@ namespace Katana {
Interval constraints; Interval constraints;
vector<Cs1Candidate> candidates; vector<Cs1Candidate> candidates;
TrackElement* segment = _event->getSegment(); TrackElement* segment = _event->getSegment();
bool canMoveUp = (segment->isLocal()) ? segment->canPivotUp(0.5) : segment->canMoveUp(1.0,Flags::CheckLowDensity); // MARK 1 bool canMoveUp = (segment->isLocal()) ? segment->canPivotUp(0.5,Flags::NoFlags) : segment->canMoveUp(1.0,Flags::CheckLowDensity); // MARK 1
unsigned int relaxFlags = Manipulator::NoDoglegReuse unsigned int relaxFlags = Manipulator::NoDoglegReuse
| ((_data and (_data->getStateCount() < 2)) ? Manipulator::AllowExpand | ((_data and (_data->getStateCount() < 2)) ? Manipulator::AllowExpand
: Manipulator::NoExpand); : Manipulator::NoExpand);
@ -1001,19 +1001,20 @@ namespace Katana {
{ {
cdebug_log(159,0) << "Strap segment Fsm." << endl; cdebug_log(159,0) << "Strap segment Fsm." << endl;
bool success = false; bool success = false;
unsigned int nextState = data->getState(); unsigned int nextState = data->getState();
Manipulator manipulator ( segment, *this );
switch ( data->getState() ) { switch ( data->getState() ) {
case DataNegociate::RipupPerpandiculars: case DataNegociate::RipupPerpandiculars:
nextState = DataNegociate::Minimize; nextState = DataNegociate::Minimize;
success = Manipulator(segment,*this).ripupPerpandiculars(); success = manipulator.ripupPerpandiculars();
if (success) break; if (success) break;
case DataNegociate::Minimize: case DataNegociate::Minimize:
if (data->getStateCount() >= 2) { if (data->getStateCount() >= 2) {
nextState = DataNegociate::MaximumSlack; nextState = DataNegociate::MaximumSlack;
} }
success = Manipulator(segment,*this).minimize(); success = manipulator.minimize();
if (success) break; if (success) break;
case DataNegociate::Dogleg: case DataNegociate::Dogleg:
case DataNegociate::Slacken: case DataNegociate::Slacken:
@ -1027,7 +1028,7 @@ namespace Katana {
} }
if (not success and (nextState != DataNegociate::Unimplemented)) if (not success and (nextState != DataNegociate::Unimplemented))
success = Manipulator(segment,*this).ripupPerpandiculars(Manipulator::ToRipupLimit); success = manipulator.ripupPerpandiculars(Manipulator::ToRipupLimit);
if (not (flags&NoTransition)) { if (not (flags&NoTransition)) {
data->setState( nextState ); data->setState( nextState );
@ -1042,13 +1043,14 @@ namespace Katana {
{ {
cdebug_log(159,0) << "Local segment Fsm." << endl; cdebug_log(159,0) << "Local segment Fsm." << endl;
bool success = false; bool success = false;
unsigned int nextState = data->getState(); unsigned int nextState = data->getState();
Manipulator manipulator ( segment, *this );
switch (data->getState()) { switch (data->getState()) {
case DataNegociate::RipupPerpandiculars: case DataNegociate::RipupPerpandiculars:
nextState = DataNegociate::Minimize; nextState = DataNegociate::Minimize;
success = Manipulator(segment,*this).ripupPerpandiculars(); success = manipulator.ripupPerpandiculars();
if (success) break; if (success) break;
case DataNegociate::Minimize: case DataNegociate::Minimize:
if (isFullBlocked() and not segment->isTerminal()) { if (isFullBlocked() and not segment->isTerminal()) {
@ -1057,15 +1059,15 @@ namespace Katana {
break; break;
} }
nextState = DataNegociate::Dogleg; nextState = DataNegociate::Dogleg;
success = Manipulator(segment,*this).minimize(); success = manipulator.minimize();
if (success) break; if (success) break;
case DataNegociate::Dogleg: case DataNegociate::Dogleg:
nextState = DataNegociate::Slacken; nextState = DataNegociate::Slacken;
success = Manipulator(segment,*this).makeDogleg(); success = manipulator.makeDogleg();
if (success) break; if (success) break;
case DataNegociate::Slacken: case DataNegociate::Slacken:
nextState = DataNegociate::ConflictSolveByPlaceds; nextState = DataNegociate::ConflictSolveByPlaceds;
success = Manipulator(segment,*this).slacken(); success = manipulator.slacken();
if (success) break; if (success) break;
case DataNegociate::ConflictSolveByHistory: case DataNegociate::ConflictSolveByHistory:
case DataNegociate::ConflictSolveByPlaceds: case DataNegociate::ConflictSolveByPlaceds:
@ -1079,7 +1081,7 @@ namespace Katana {
break; break;
case DataNegociate::MoveUp: case DataNegociate::MoveUp:
nextState = DataNegociate::MaximumSlack; nextState = DataNegociate::MaximumSlack;
success = Manipulator(segment,*this).moveUp(); success = manipulator.moveUp();
if (success) break; if (success) break;
case DataNegociate::MaximumSlack: case DataNegociate::MaximumSlack:
if (segment->isStrap()) { if (segment->isStrap()) {
@ -1096,7 +1098,7 @@ namespace Katana {
if (not success and (nextState != DataNegociate::Unimplemented)) { if (not success and (nextState != DataNegociate::Unimplemented)) {
if (data->getStateCount() < 6) if (data->getStateCount() < 6)
success = Manipulator(segment,*this).ripupPerpandiculars(Manipulator::ToRipupLimit); success = manipulator.ripupPerpandiculars(Manipulator::ToRipupLimit);
} }
if (not success if (not success
@ -1117,8 +1119,10 @@ namespace Katana {
bool SegmentFsm::_slackenGlobal ( TrackElement*& segment, DataNegociate*& data, unsigned int flags ) bool SegmentFsm::_slackenGlobal ( TrackElement*& segment, DataNegociate*& data, unsigned int flags )
{ {
bool success = false; bool success = false;
unsigned int nextState = data->getState(); unsigned int nextState = data->getState();
Manipulator manipulator ( segment, *this );
unsigned int moveUpFlags = Manipulator::AllowShortPivotUp|Manipulator::IgnoreContacts;
switch ( data->getState() ) { switch ( data->getState() ) {
case DataNegociate::RipupPerpandiculars: case DataNegociate::RipupPerpandiculars:
@ -1128,14 +1132,22 @@ namespace Katana {
nextState = DataNegociate::Slacken; nextState = DataNegociate::Slacken;
break; break;
case DataNegociate::Slacken: case DataNegociate::Slacken:
cdebug_log(159,0) << "Global, SegmentFsm: Slacken." << endl; cdebug_log(159,0) << "Global, SegmentFsm: Slacken "
if ((success = Manipulator(segment,*this).slacken(Flags::HalfSlacken))) { << ((manipulator.getEvent())
nextState = DataNegociate::RipupPerpandiculars; ? manipulator.getEvent()->getConstraints() : "(not event yet)") << endl;
break; if ( manipulator.getEvent()
and manipulator.getEvent()->getConstraints().isPonctual()
and segment->canMoveUp(1.0,Flags::CheckLowUpDensity|Flags::AllowTerminal) ) {
moveUpFlags |= Manipulator::AllowTerminalMoveUp;
} else {
if ((success = manipulator.slacken(Flags::HalfSlacken))) {
nextState = DataNegociate::RipupPerpandiculars;
break;
}
} }
case DataNegociate::MoveUp: case DataNegociate::MoveUp:
cdebug_log(159,0) << "Global, SegmentFsm: MoveUp." << endl; cdebug_log(159,0) << "Global, SegmentFsm: MoveUp." << endl;
if ((success = Manipulator(segment,*this).moveUp(Manipulator::AllowShortPivotUp))) { if ((success = manipulator.moveUp(moveUpFlags))) {
break; break;
} }
nextState = DataNegociate::ConflictSolveByHistory; nextState = DataNegociate::ConflictSolveByHistory;
@ -1155,7 +1167,7 @@ namespace Katana {
break; break;
} }
case DataNegociate::MaximumSlack: case DataNegociate::MaximumSlack:
if ((success=Manipulator(segment,*this).forceOverLocals())) { if ((success=manipulator.forceOverLocals())) {
break; break;
} }
case DataNegociate::Unimplemented: case DataNegociate::Unimplemented:
@ -1166,7 +1178,7 @@ namespace Katana {
if (not success and (nextState != DataNegociate::Unimplemented)) { if (not success and (nextState != DataNegociate::Unimplemented)) {
if (data->getStateCount() < 6) if (data->getStateCount() < 6)
success = Manipulator(segment,*this).ripupPerpandiculars(Manipulator::ToRipupLimit); success = manipulator.ripupPerpandiculars(Manipulator::ToRipupLimit);
} }
// Special case: all tracks are overlaping a blockage. // Special case: all tracks are overlaping a blockage.

View File

@ -21,6 +21,7 @@
#include "katana/Track.h" #include "katana/Track.h"
#include "katana/TrackElement.h" #include "katana/TrackElement.h"
#include "katana/KatanaEngine.h" #include "katana/KatanaEngine.h"
#include "katana/RoutingPlane.h"
namespace { namespace {
@ -207,25 +208,10 @@ namespace Katana {
for ( size_t i=0 ; i<revalidateds.size() ; ++i ) { for ( size_t i=0 ; i<revalidateds.size() ; ++i ) {
revalidateds[i]->check(); revalidateds[i]->check();
} }
//_getKatanaEngine()->_showOverlap ();
# endif # endif
_sortEvents.clear(); _sortEvents.clear();
#if THIS_IS_DISABLED
if (not faileds.empty()) {
set<TrackElement*>::iterator ifailed = faileds.begin();
Anabatic::GCellVector gcells;
for ( ; ifailed != faileds.end() ; ++ifailed ) {
(*ifailed)->getGCells ( gcells );
(*ifailed)->makeDogLeg( gcells[0] );
}
count += _revalidate();
}
#endif
// Looking for reduced/raised segments. // Looking for reduced/raised segments.
for ( size_t i=0 ; i<revalidateds.size() ; ++i ) { for ( size_t i=0 ; i<revalidateds.size() ; ++i ) {
if (revalidateds[i]->canReduce()) { if (revalidateds[i]->canReduce()) {
@ -242,6 +228,8 @@ namespace Katana {
} }
_doRemovalEvents(); _doRemovalEvents();
for ( Track* track : _sortEvents ) track->doReorder();
_sortEvents.clear();
cdebug_tabw(159,-1); cdebug_tabw(159,-1);
return count; return count;

View File

@ -275,7 +275,7 @@ namespace Katana {
if (_segments[end]->getSourceU() >= interval.getVMax()) break; if (_segments[end]->getSourceU() >= interval.getVMax()) break;
} }
cdebug_log(159,0) << "Track::getOverlapBounds(): begin:" << begin << " end:" << end << endl; cdebug_log(155,0) << "Track::getOverlapBounds(): begin:" << begin << " end:" << end << endl;
} }
@ -287,7 +287,7 @@ namespace Katana {
{ {
TrackCost cost ( const_cast<Track*>(this), interval, begin, end, net, flags ); TrackCost cost ( const_cast<Track*>(this), interval, begin, end, net, flags );
cdebug_log(159,1) << "getOverlapCost() @" << DbU::getValueString(_axis) cdebug_log(155,1) << "getOverlapCost() @" << DbU::getValueString(_axis)
<< " [" << DbU::getValueString(interval.getVMin()) << " [" << DbU::getValueString(interval.getVMin())
<< ":" << DbU::getValueString(interval.getVMax()) << ":" << DbU::getValueString(interval.getVMax())
<< "] <-> [" << begin << ":" << end << "]" << "] <-> [" << begin << ":" << end << "]"
@ -299,16 +299,16 @@ namespace Katana {
for ( ; (mbegin < _markers.size()) for ( ; (mbegin < _markers.size())
and (_markers[mbegin]->getSourceU() <= interval.getVMax()) ; mbegin++ ) { and (_markers[mbegin]->getSourceU() <= interval.getVMax()) ; mbegin++ ) {
cdebug_log(159,0) << "| @" << DbU::getValueString(_axis) << _markers[mbegin] << endl; cdebug_log(155,0) << "| @" << DbU::getValueString(_axis) << _markers[mbegin] << endl;
if ( _markers[mbegin]->getNet() != net ) { if ( _markers[mbegin]->getNet() != net ) {
cdebug_log(159,0) << "* Mark: @" << DbU::getValueString(_axis) << " " << _markers[mbegin] << endl; cdebug_log(155,0) << "* Mark: @" << DbU::getValueString(_axis) << " " << _markers[mbegin] << endl;
cost.incTerminals( _markers[mbegin]->getWeight(this) ); cost.incTerminals( _markers[mbegin]->getWeight(this) );
} }
} }
if (begin == npos) { if (begin == npos) {
cdebug_log(159,0) << " begin == npos (after last TrackElement)." << endl; cdebug_log(155,0) << " begin == npos (after last TrackElement)." << endl;
cdebug_tabw(159,-1); cdebug_tabw(155,-1);
return cost; return cost;
} }
@ -317,12 +317,12 @@ namespace Katana {
if ( _segments[begin]->getNet() == net ) { if ( _segments[begin]->getNet() == net ) {
cost.incDeltaShared ( overlap.getSize() ); cost.incDeltaShared ( overlap.getSize() );
} }
cdebug_log(159,0) << "| overlap: " << _segments[begin] << endl; cdebug_log(155,0) << "| overlap: " << _segments[begin] << endl;
_segments[begin]->incOverlapCost( net, cost ); _segments[begin]->incOverlapCost( net, cost );
if (cost.isInfinite()) break; if (cost.isInfinite()) break;
} }
cdebug_tabw(159,-1); cdebug_tabw(155,-1);
return cost; return cost;
} }
@ -345,7 +345,7 @@ namespace Katana {
void Track::getTerminalWeight ( Interval interval, Net* net, size_t& count, unsigned int& weight ) const void Track::getTerminalWeight ( Interval interval, Net* net, size_t& count, unsigned int& weight ) const
{ {
cdebug_log(159,1) << "getTerminalWeight() @" << DbU::getValueString(_axis) cdebug_log(155,1) << "getTerminalWeight() @" << DbU::getValueString(_axis)
<< " [" << interval.getVMin() << " " << interval.getVMax() << "]" << endl; << " [" << interval.getVMin() << " " << interval.getVMax() << "]" << endl;
//count = 0; //count = 0;
@ -357,14 +357,14 @@ namespace Katana {
for ( ; (mbegin < _markers.size()) for ( ; (mbegin < _markers.size())
&& (_markers[mbegin]->getSourceU() <= interval.getVMax()) ; mbegin++ ) { && (_markers[mbegin]->getSourceU() <= interval.getVMax()) ; mbegin++ ) {
cdebug_log(159,0) << "| @" << DbU::getValueString(_axis) << _markers[mbegin] << endl; cdebug_log(155,0) << "| @" << DbU::getValueString(_axis) << _markers[mbegin] << endl;
if ( _markers[mbegin]->getNet() == net ) { if ( _markers[mbegin]->getNet() == net ) {
cdebug_log(159,0) << "* Mark: @" << DbU::getValueString(_axis) << " " << _markers[mbegin] << endl; cdebug_log(155,0) << "* Mark: @" << DbU::getValueString(_axis) << " " << _markers[mbegin] << endl;
weight += _markers[mbegin]->getWeight(this); weight += _markers[mbegin]->getWeight(this);
++count; ++count;
} }
} }
cdebug_tabw(159,-1); cdebug_tabw(155,-1);
} }
@ -409,7 +409,11 @@ namespace Katana {
Interval Track::expandFreeInterval ( size_t& begin, size_t& end, unsigned int state, Net* net ) const Interval Track::expandFreeInterval ( size_t& begin, size_t& end, unsigned int state, Net* net ) const
{ {
cdebug_log(155,1) << "Track::expandFreeInterval() begin:" << begin << " end:" << end << " " << net << endl;
cdebug_log(155,0) << _segments[begin] << endl;
DbU::Unit minFree = _min; DbU::Unit minFree = _min;
cdebug_log(155,0) << "minFree:" << DbU::getValueString(minFree) << " (track min)" << endl;
if (not (state & BeginIsTrackMin) ) { if (not (state & BeginIsTrackMin) ) {
if (_segments[begin]->getNet() == net) if (_segments[begin]->getNet() == net)
@ -417,6 +421,7 @@ namespace Katana {
if (begin != npos) { if (begin != npos) {
minFree = getOccupiedInterval(begin).getVMax(); minFree = getOccupiedInterval(begin).getVMax();
cdebug_log(155,0) << "minFree:" << DbU::getValueString(minFree) << " begin:" << begin << endl;
} }
} }
@ -432,6 +437,7 @@ namespace Katana {
} }
} }
} }
cdebug_tabw(155,-1);
return Interval( minFree, getMaximalPosition(end,state) ); return Interval( minFree, getMaximalPosition(end,state) );
} }
@ -452,7 +458,7 @@ namespace Katana {
{ {
// cdebug_log(9000,0) << "Deter| Track::insert() " << getLayer()->getName() // cdebug_log(9000,0) << "Deter| Track::insert() " << getLayer()->getName()
// << " @" << DbU::getValueString(getAxis()) << " " << segment << endl; // << " @" << DbU::getValueString(getAxis()) << " " << segment << endl;
cdebug_log(159,0) << "Track::insert() " << getLayer()->getName() cdebug_log(155,0) << "Track::insert() " << getLayer()->getName()
<< " @" << DbU::getValueString(getAxis()) << " " << segment << endl; << " @" << DbU::getValueString(getAxis()) << " " << segment << endl;
if ( (getLayer()->getMask() != segment->getLayer()->getMask()) if ( (getLayer()->getMask() != segment->getLayer()->getMask())
@ -596,10 +602,14 @@ namespace Katana {
Interval mergedInterval; Interval mergedInterval;
_segments[seed]->getCanonical( mergedInterval ); _segments[seed]->getCanonical( mergedInterval );
cdebug_log(155,0) << "| seed:" << _segments[seed] << endl;
size_t i = seed; size_t i = seed;
while ( --i != npos ) { while ( --i != npos ) {
if (_segments[i]->getNet() != owner) break; if (_segments[i]->getNet() != owner) break;
cdebug_log(155,0) << "| merge:" << _segments[i] << endl;
_segments[i]->getCanonical ( segmentInterval ); _segments[i]->getCanonical ( segmentInterval );
if (segmentInterval.getVMax() >= mergedInterval.getVMin()) { if (segmentInterval.getVMax() >= mergedInterval.getVMin()) {
mergedInterval.merge( segmentInterval ); mergedInterval.merge( segmentInterval );
@ -623,7 +633,7 @@ namespace Katana {
size_t Track::doRemoval () size_t Track::doRemoval ()
{ {
cdebug_log(159,1) << "Track::doRemoval() - " << this << endl; cdebug_log(155,1) << "Track::doRemoval() - " << this << endl;
size_t size = _segments.size(); size_t size = _segments.size();
@ -632,8 +642,8 @@ namespace Katana {
_segments.erase( beginRemove, _segments.end() ); _segments.erase( beginRemove, _segments.end() );
cdebug_log(159,0) << "After doRemoval " << this << endl; cdebug_log(155,0) << "After doRemoval " << this << endl;
cdebug_tabw(159,-1); cdebug_tabw(155,-1);
return size - _segments.size(); return size - _segments.size();
} }
@ -641,18 +651,18 @@ namespace Katana {
void Track::doReorder () void Track::doReorder ()
{ {
cdebug_log(159,0) << "Track::doReorder() " << this << endl; cdebug_log(155,0) << "Track::doReorder() " << this << endl;
if (not _segmentsValid ) { if (not _segmentsValid) {
std::sort ( _segments.begin(), _segments.end(), SegmentCompare() ); std::sort( _segments.begin(), _segments.end(), SegmentCompare() );
for ( size_t i=0 ; i < _segments.size() ; i++ ) { for ( size_t i=0 ; i < _segments.size() ; i++ ) {
_segments[i]->setIndex ( i ); _segments[i]->setIndex( i );
} }
_segmentsValid = true; _segmentsValid = true;
} }
if (not _markersValid ) { if (not _markersValid) {
std::sort ( _markers.begin(), _markers.end(), TrackMarker::Compare() ); std::sort( _markers.begin(), _markers.end(), TrackMarker::Compare() );
_markersValid = true; _markersValid = true;
} }
} }

View File

@ -146,8 +146,8 @@ namespace Katana {
bool TrackElement::isUserDefined () const { return false; } bool TrackElement::isUserDefined () const { return false; }
// Predicates. // Predicates.
bool TrackElement::canSlacken () const { return false; } bool TrackElement::canSlacken () const { return false; }
bool TrackElement::canPivotUp ( float ) const { return false; }; bool TrackElement::canPivotUp ( float, unsigned int ) const { return false; };
bool TrackElement::canPivotDown ( float ) const { return false; }; bool TrackElement::canPivotDown ( float, unsigned int ) const { return false; };
bool TrackElement::canMoveUp ( float, unsigned int ) const { return false; }; bool TrackElement::canMoveUp ( float, unsigned int ) const { return false; };
bool TrackElement::canDogleg () { return false; }; bool TrackElement::canDogleg () { return false; };
bool TrackElement::canDogleg ( Interval ) { return false; }; bool TrackElement::canDogleg ( Interval ) { return false; };

View File

@ -406,12 +406,12 @@ namespace Katana {
{ return _base->getMaxUnderDensity( flags ); } { return _base->getMaxUnderDensity( flags ); }
bool TrackSegment::canPivotUp ( float reserve ) const bool TrackSegment::canPivotUp ( float reserve, unsigned int flags ) const
{ return _base->canPivotUp(reserve); } { return _base->canPivotUp( reserve, flags ); }
bool TrackSegment::canPivotDown ( float reserve ) const bool TrackSegment::canPivotDown ( float reserve, unsigned int flags ) const
{ return _base->canPivotDown( reserve ); } { return _base->canPivotDown( reserve, flags ); }
bool TrackSegment::canMoveUp ( float reserve, unsigned int flags ) const bool TrackSegment::canMoveUp ( float reserve, unsigned int flags ) const

View File

@ -10,7 +10,7 @@
// | Author : Jean-Paul CHAPUT | // | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@lip6.fr | // | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Header : "./katana/DataNegociate.h" | // | C++ Header : "./katana/DataNegociate.h" |
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+

View File

@ -10,7 +10,7 @@
// | Author : Jean-Paul CHAPUT | // | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Header : "./katana/Manipulator.h" | // | C++ Header : "./katana/Manipulator.h" |
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
@ -48,6 +48,7 @@ namespace Katana {
, LeftAxisHint = 0x0200 , LeftAxisHint = 0x0200
, RightAxisHint = 0x0400 , RightAxisHint = 0x0400
, NotOnLastRipup = 0x0800 , NotOnLastRipup = 0x0800
, IgnoreContacts = 0x1000
}; };
public: public:
Manipulator ( TrackElement*, SegmentFsm& ); Manipulator ( TrackElement*, SegmentFsm& );

View File

@ -10,7 +10,7 @@
// | Author : Jean-Paul CHAPUT | // | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Header : "./katana/RoutingEvent.h" | // | C++ Header : "./katana/RoutingEvent.h" |
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+

View File

@ -10,7 +10,7 @@
// | Author : Jean-Paul CHAPUT | // | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Header : "./katana/RoutingPlane.h" | // | C++ Header : "./katana/RoutingPlane.h" |
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
@ -37,7 +37,7 @@ namespace Katana {
void destroy (); void destroy ();
inline bool isHorizontal () const; inline bool isHorizontal () const;
inline bool isVertical () const; inline bool isVertical () const;
inline KatanaEngine* getKatanaEngine () const; inline KatanaEngine* getKatanaEngine () const;
inline RoutingLayerGauge* getLayerGauge () const; inline RoutingLayerGauge* getLayerGauge () const;
inline unsigned int getDirection () const; inline unsigned int getDirection () const;
inline size_t getDepth () const; inline size_t getDepth () const;
@ -91,7 +91,7 @@ namespace Katana {
inline bool RoutingPlane::TrackCompare::operator() ( Track* lhs, Track* rhs ) inline bool RoutingPlane::TrackCompare::operator() ( Track* lhs, Track* rhs )
{ return lhs->getAxis() > rhs->getAxis(); }; { return lhs->getAxis() > rhs->getAxis(); };
inline KatanaEngine* RoutingPlane::getKatanaEngine () const { return _katana; } inline KatanaEngine* RoutingPlane::getKatanaEngine () const { return _katana; }
inline RoutingLayerGauge* RoutingPlane::getLayerGauge () const { return _layerGauge; } inline RoutingLayerGauge* RoutingPlane::getLayerGauge () const { return _layerGauge; }
inline unsigned int RoutingPlane::getDirection () const { return _flags & Flags::DirectionMask; } inline unsigned int RoutingPlane::getDirection () const { return _flags & Flags::DirectionMask; }
inline size_t RoutingPlane::getDepth () const { return _depth; } inline size_t RoutingPlane::getDepth () const { return _depth; }

View File

@ -10,7 +10,7 @@
// | Author : Jean-Paul CHAPUT | // | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@lip6.fr | // | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Header : "./katana/Track.h" | // | C++ Header : "./katana/Track.h" |
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+

View File

@ -115,8 +115,8 @@ namespace Katana {
inline bool hasTargetDogleg () const; inline bool hasTargetDogleg () const;
inline bool canRipple () const; inline bool canRipple () const;
virtual bool canSlacken () const; virtual bool canSlacken () const;
virtual bool canPivotUp ( float reserve ) const; virtual bool canPivotUp ( float reserve, unsigned int flags ) const;
virtual bool canPivotDown ( float reserve ) const; virtual bool canPivotDown ( float reserve, unsigned int flags ) const;
virtual bool canMoveUp ( float reserve, unsigned int flags=Flags::WithPerpands ) const; virtual bool canMoveUp ( float reserve, unsigned int flags=Flags::WithPerpands ) const;
virtual bool canDogleg (); virtual bool canDogleg ();
virtual bool canDogleg ( Interval ); virtual bool canDogleg ( Interval );

View File

@ -75,8 +75,8 @@ namespace Katana {
virtual bool canDogleg (); virtual bool canDogleg ();
virtual bool canDogleg ( Interval ); virtual bool canDogleg ( Interval );
virtual bool canDogleg ( Anabatic::GCell*, unsigned int flags=0 ); virtual bool canDogleg ( Anabatic::GCell*, unsigned int flags=0 );
virtual bool canPivotUp ( float reserve ) const; virtual bool canPivotUp ( float reserve, unsigned int flags ) const;
virtual bool canPivotDown ( float reserve ) const; virtual bool canPivotDown ( float reserve, unsigned int flags ) const;
virtual bool canMoveUp ( float reserve, unsigned int flags ) const; virtual bool canMoveUp ( float reserve, unsigned int flags ) const;
virtual bool canSlacken () const; virtual bool canSlacken () const;
virtual float getMaxUnderDensity ( unsigned int flags ) const; virtual float getMaxUnderDensity ( unsigned int flags ) const;