Anabatic transient commit 16. First implementation of edge's historical cost.

This commit is contained in:
Jean-Paul Chaput 2016-08-10 23:48:06 +02:00
parent 4aec49e08a
commit d29cbe976a
9 changed files with 79 additions and 27 deletions

View File

@ -18,6 +18,7 @@
#include <iostream> #include <iostream>
#include "hurricane/Bug.h" #include "hurricane/Bug.h"
#include "hurricane/Error.h" #include "hurricane/Error.h"
#include "hurricane/Breakpoint.h"
#include "hurricane/RegularLayer.h" #include "hurricane/RegularLayer.h"
#include "hurricane/Horizontal.h" #include "hurricane/Horizontal.h"
#include "hurricane/RoutingPad.h" #include "hurricane/RoutingPad.h"
@ -38,6 +39,7 @@ namespace Anabatic {
using std::ostringstream; using std::ostringstream;
using Hurricane::Bug; using Hurricane::Bug;
using Hurricane::Error; using Hurricane::Error;
using Hurricane::Breakpoint;
using Hurricane::RegularLayer; using Hurricane::RegularLayer;
using Hurricane::Component; using Hurricane::Component;
using Hurricane::Horizontal; using Hurricane::Horizontal;
@ -554,6 +556,7 @@ namespace Anabatic {
void AnabaticEngine::ripup ( Segment* seed, Flags flags ) void AnabaticEngine::ripup ( Segment* seed, Flags flags )
{ {
Net* net = seed->getNet(); Net* net = seed->getNet();
DebugSession::open( net, 112, 120 ); DebugSession::open( net, 112, 120 );
@ -614,6 +617,8 @@ namespace Anabatic {
Contact* source = dynamic_cast<Contact*>( segment->getSource() ); Contact* source = dynamic_cast<Contact*>( segment->getSource() );
Contact* target = dynamic_cast<Contact*>( segment->getTarget() ); Contact* target = dynamic_cast<Contact*>( segment->getTarget() );
segment->getSourceHook()->detach();
segment->getTargetHook()->detach();
segment->destroy(); segment->destroy();
bool deletedSource = gcells->gcellAt( 0 )->unrefContact( source ); bool deletedSource = gcells->gcellAt( 0 )->unrefContact( source );
bool deletedTarget = gcells->gcellAt( gcells->size()-1 )->unrefContact( target ); bool deletedTarget = gcells->gcellAt( gcells->size()-1 )->unrefContact( target );
@ -635,7 +640,7 @@ namespace Anabatic {
getNetData( net )->setGlobalRouted( false ); getNetData( net )->setGlobalRouted( false );
cdebug_tabw(111,-1); cdebug_tabw(112,-1);
DebugSession::close(); DebugSession::close();
} }

View File

@ -78,6 +78,7 @@ namespace Anabatic {
, _edgeWidth (DbU::fromLambda(Cfg::getParamInt("anabatic.edgeWidth" , 4)->asInt())) , _edgeWidth (DbU::fromLambda(Cfg::getParamInt("anabatic.edgeWidth" , 4)->asInt()))
, _edgeCostH (Cfg::getParamDouble("anabatic.edgeCostH", 9.0)->asDouble()) , _edgeCostH (Cfg::getParamDouble("anabatic.edgeCostH", 9.0)->asDouble())
, _edgeCostK (Cfg::getParamDouble("anabatic.edgeCostK",-10.0)->asDouble()) , _edgeCostK (Cfg::getParamDouble("anabatic.edgeCostK",-10.0)->asDouble())
, _edgeHInc (Cfg::getParamDouble("anabatic.edgeHInc" , 1.5)->asDouble())
, _hEdgeLocal (Cfg::getParamInt("kite.hTracksReservedLocal",0)->asInt()) , _hEdgeLocal (Cfg::getParamInt("kite.hTracksReservedLocal",0)->asInt())
, _vEdgeLocal (Cfg::getParamInt("kite.vTracksReservedLocal",0)->asInt()) , _vEdgeLocal (Cfg::getParamInt("kite.vTracksReservedLocal",0)->asInt())
{ {
@ -131,6 +132,7 @@ namespace Anabatic {
, _allowedDepth (other._allowedDepth) , _allowedDepth (other._allowedDepth)
, _edgeCostH (other._edgeCostH) , _edgeCostH (other._edgeCostH)
, _edgeCostK (other._edgeCostK) , _edgeCostK (other._edgeCostK)
, _edgeHInc (other._edgeHInc)
{ {
if (other._cg) _cg = other._cg->getClone(); if (other._cg) _cg = other._cg->getClone();
if (other._rg) _rg = other._rg->getClone(); if (other._rg) _rg = other._rg->getClone();
@ -335,6 +337,9 @@ namespace Anabatic {
{ return _edgeCostK; } { return _edgeCostK; }
float ConfigurationConcrete::getEdgeHInc () const
{ return _edgeHInc; }
void ConfigurationConcrete::print ( Cell* cell ) const void ConfigurationConcrete::print ( Cell* cell ) const
{ {

View File

@ -172,17 +172,18 @@ namespace Anabatic {
Dijkstra::Dijkstra ( AnabaticEngine* anabatic ) Dijkstra::Dijkstra ( AnabaticEngine* anabatic )
: _anabatic (anabatic) : _anabatic (anabatic)
, _vertexes () , _vertexes ()
, _distanceCb (_distance) , _distanceCb (_distance)
, _mode (Mode::Standart) , _mode (Mode::Standart)
, _net (NULL) , _net (NULL)
, _stamp (-1) , _stamp (-1)
, _sources () , _sources ()
, _targets () , _targets ()
, _searchArea () , _searchArea ()
, _connectedsId(-1) , _searchAreaHalo(0)
, _queue () , _connectedsId (-1)
, _queue ()
{ {
const vector<GCell*>& gcells = _anabatic->getGCells(); const vector<GCell*>& gcells = _anabatic->getGCells();
for ( GCell* gcell : gcells ) { for ( GCell* gcell : gcells ) {
@ -216,6 +217,8 @@ namespace Anabatic {
for ( auto rp : rps ) { for ( auto rp : rps ) {
Point center = rp->getBoundingBox().getCenter(); Point center = rp->getBoundingBox().getCenter();
GCell* gcell = _anabatic->getGCellUnder( center ); GCell* gcell = _anabatic->getGCellUnder( center );
cdebug_log(112,0) << "| " << rp << endl;
if (not gcell) { if (not gcell) {
cerr << Error( "Dijkstra::load(): %s of %s is not under any GCell.\n" cerr << Error( "Dijkstra::load(): %s of %s is not under any GCell.\n"
@ -244,7 +247,7 @@ namespace Anabatic {
vertex->setFrom ( NULL ); vertex->setFrom ( NULL );
vertex->clearRestriction(); vertex->clearRestriction();
_targets.insert( vertex ); _targets.insert( vertex );
cdebug_log(112,0) << "Add Vertex: " << vertex << endl; cdebug_log(112,0) << "| Add: " << vertex << endl;
} }
} }
@ -254,6 +257,7 @@ namespace Anabatic {
rp->getBodyHook()->attach( vcontact->getBodyHook() ); rp->getBodyHook()->attach( vcontact->getBodyHook() );
} }
_searchArea.inflate( _searchAreaHalo );
cdebug_log(112,0) << "Search area: " << _searchArea << endl; cdebug_log(112,0) << "Search area: " << _searchArea << endl;
cdebug_tabw(112,-1); cdebug_tabw(112,-1);
DebugSession::close(); DebugSession::close();

View File

@ -39,6 +39,7 @@ namespace Anabatic {
, _capacity (0) , _capacity (0)
, _realOccupancy (0) , _realOccupancy (0)
, _estimateOccupancy(0.0) , _estimateOccupancy(0.0)
, _historicCost (0.0)
, _source (source) , _source (source)
, _target (target) , _target (target)
, _axis (0) , _axis (0)
@ -299,6 +300,7 @@ namespace Anabatic {
s.insert( s.size()-1, " "+DbU::getValueString(_axis) ); s.insert( s.size()-1, " "+DbU::getValueString(_axis) );
s.insert( s.size()-1, " "+getString(_realOccupancy) ); s.insert( s.size()-1, " "+getString(_realOccupancy) );
s.insert( s.size()-1, "/"+getString(_capacity) ); s.insert( s.size()-1, "/"+getString(_capacity) );
s.insert( s.size()-1, " h:"+getString(_historicCost) );
s.insert( s.size()-1, " "+getString(_flags) ); s.insert( s.size()-1, " "+getString(_flags) );
return s; return s;
} }

View File

@ -594,7 +594,7 @@ namespace Anabatic {
GCell* GCell::vcut ( DbU::Unit x ) GCell* GCell::vcut ( DbU::Unit x )
{ {
cdebug_log(119,1) << "GCell::vcut() @x:" << DbU::getValueString(x) << " " << this << endl; cdebug_log(110,1) << "GCell::vcut() @x:" << DbU::getValueString(x) << " " << this << endl;
if ( (x < getXMin()) or (x > getXMax()) ) if ( (x < getXMin()) or (x > getXMax()) )
throw Error( "GCell::vcut(): Vertical cut axis at %s is outside GCell box,\n" throw Error( "GCell::vcut(): Vertical cut axis at %s is outside GCell box,\n"
@ -604,7 +604,7 @@ namespace Anabatic {
); );
GCell* chunk = _create( x, getYMin() ); GCell* chunk = _create( x, getYMin() );
cdebug_log(119,0) << "New chunk:" << chunk << endl; cdebug_log(110,0) << "New chunk:" << chunk << endl;
_moveEdges( chunk, 0, Flags::EastSide ); _moveEdges( chunk, 0, Flags::EastSide );
Edge::create( this, chunk, Flags::Horizontal ); Edge::create( this, chunk, Flags::Horizontal );
@ -646,7 +646,7 @@ namespace Anabatic {
_revalidate(); _revalidate();
chunk->_revalidate(); chunk->_revalidate();
cdebug_tabw(119,-1); cdebug_tabw(110,-1);
return chunk; return chunk;
} }
@ -654,7 +654,7 @@ namespace Anabatic {
GCell* GCell::hcut ( DbU::Unit y ) GCell* GCell::hcut ( DbU::Unit y )
{ {
cdebug_log(119,1) << "GCell::hcut() @y:" << DbU::getValueString(y) << " " << this << endl; cdebug_log(110,1) << "GCell::hcut() @y:" << DbU::getValueString(y) << " " << this << endl;
if ( (y < getYMin()) or (y > getYMax()) ) if ( (y < getYMin()) or (y > getYMax()) )
throw Error( "GCell::hcut(): Horizontal cut axis at %s is outside GCell box,\n" throw Error( "GCell::hcut(): Horizontal cut axis at %s is outside GCell box,\n"
@ -664,7 +664,7 @@ namespace Anabatic {
); );
GCell* chunk = _create( getXMin(), y ); GCell* chunk = _create( getXMin(), y );
cdebug_log(119,0) << "New chunk:" << chunk << endl; cdebug_log(110,0) << "New chunk:" << chunk << endl;
_moveEdges( chunk, 0, Flags::NorthSide ); _moveEdges( chunk, 0, Flags::NorthSide );
Edge::create( this, chunk, Flags::Vertical ); Edge::create( this, chunk, Flags::Vertical );
@ -698,7 +698,7 @@ namespace Anabatic {
_revalidate(); _revalidate();
chunk->_revalidate(); chunk->_revalidate();
cdebug_tabw(119,-1); cdebug_tabw(110,-1);
return chunk; return chunk;
} }

View File

@ -63,7 +63,9 @@ 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 distance = (float)source->getDistance() + congestionCost * (float)edge->getDistance(); float distance = (float)source->getDistance()
+ congestionCost * (float)edge->getDistance();
+ edge->getHistoricCost();
// Edge* sourceFrom = source->getFrom(); // Edge* sourceFrom = source->getFrom();
// if (sourceFrom) { // if (sourceFrom) {
@ -77,6 +79,19 @@ namespace {
} }
void computeNextHCost ( Edge* edge, float edgeHInc )
{
float congestion = (float)edge->getRealOccupancy() / (float)edge->getCapacity();
float hCost = edge->getHistoricCost();
float alpha = (congestion < 1.0) ? congestion : std::exp( std::log(8)*( congestion - 1 ) );
edge->setHistoricCost( alpha * (hCost + ((congestion < 1.0) ? 0.0 : edgeHInc) ));
cdebug_log(113,0) << edge << endl;
}
} // Anonymous namespace. } // Anonymous namespace.
@ -119,6 +134,7 @@ namespace Anabatic {
//DebugSession::addToTrace( cell->getNet("a_from_pads(0)") ); //DebugSession::addToTrace( cell->getNet("a_from_pads(0)") );
//DebugSession::addToTrace( cell->getNet("ialu.not_aux104") ); //DebugSession::addToTrace( cell->getNet("ialu.not_aux104") );
//DebugSession::addToTrace( cell->getNet("mips_r3000_1m_dp_shift32_rshift_se_muxoutput(159)") ); //DebugSession::addToTrace( cell->getNet("mips_r3000_1m_dp_shift32_rshift_se_muxoutput(159)") );
//DebugSession::addToTrace( cell->getNet("mips_r3000_1m_dp_shift32_rshift_se_c1(3)") );
startMeasures(); startMeasures();
@ -145,7 +161,9 @@ namespace Anabatic {
cmess1 << " o Running global routing..." << endl; cmess1 << " o Running global routing..." << endl;
UpdateSession::open(); float edgeHInc = getConfiguration()->getEdgeHInc();
Session::open( this );
Dijkstra* dijkstra = new Dijkstra ( this ); Dijkstra* dijkstra = new Dijkstra ( this );
dijkstra->setDistance( DigitalDistance( getConfiguration()->getEdgeCostH() dijkstra->setDistance( DigitalDistance( getConfiguration()->getEdgeCostH()
, getConfiguration()->getEdgeCostK() ) ); , getConfiguration()->getEdgeCostK() ) );
@ -165,9 +183,13 @@ namespace Anabatic {
} }
cmess2 << left << setw(6) << netCount << right; cmess2 << left << setw(6) << netCount << right;
//Session::revalidate();
const vector<Edge*>& ovEdges = getOvEdges(); const vector<Edge*>& ovEdges = getOvEdges();
cmess2 << " ovEdges:" << ovEdges.size(); cmess2 << " ovEdges:" << ovEdges.size();
for ( Edge* edge : ovEdges ) computeNextHCost( edge, edgeHInc );
netCount = 0; netCount = 0;
while ( not ovEdges.empty() ) { while ( not ovEdges.empty() ) {
Edge* ovEdge = ovEdges[0]; Edge* ovEdge = ovEdges[0];
@ -181,8 +203,9 @@ namespace Anabatic {
} }
} }
cmess2 << " ripup:" << netCount; dijkstra->setSearchAreaHalo( Session::getSliceHeight()*3 );
cmess2 << " ripup:" << netCount;
stopMeasures(); stopMeasures();
cmess2 << " " << setw(10) << Timer::getStringTime (_timer.getCombTime()) cmess2 << " " << setw(10) << Timer::getStringTime (_timer.getCombTime())
<< " " << setw( 6) << Timer::getStringMemory(_timer.getIncrease()) << endl; << " " << setw( 6) << Timer::getStringMemory(_timer.getIncrease()) << endl;
@ -218,7 +241,7 @@ namespace Anabatic {
printMeasures( "Dijkstra" ); printMeasures( "Dijkstra" );
delete dijkstra; delete dijkstra;
UpdateSession::close(); Session::close();
_state = EngineGlobalLoaded; _state = EngineGlobalLoaded;
} }

View File

@ -94,6 +94,7 @@ namespace Anabatic {
virtual DbU::Unit getEdgeWidth () const = 0; virtual DbU::Unit getEdgeWidth () const = 0;
virtual float getEdgeCostH () const = 0; virtual float getEdgeCostH () const = 0;
virtual float getEdgeCostK () const = 0; virtual float getEdgeCostK () const = 0;
virtual float getEdgeHInc () const = 0;
virtual size_t getHEdgeLocal () const = 0; virtual size_t getHEdgeLocal () const = 0;
virtual size_t getVEdgeLocal () const = 0; virtual size_t getVEdgeLocal () const = 0;
virtual void print ( Cell* ) const = 0; virtual void print ( Cell* ) const = 0;
@ -157,6 +158,7 @@ namespace Anabatic {
virtual DbU::Unit getEdgeWidth () const; virtual DbU::Unit getEdgeWidth () const;
virtual float getEdgeCostH () const; virtual float getEdgeCostH () const;
virtual float getEdgeCostK () const; virtual float getEdgeCostK () const;
virtual float getEdgeHInc () const;
virtual size_t getHEdgeLocal () const; virtual size_t getHEdgeLocal () const;
virtual size_t getVEdgeLocal () const; virtual size_t getVEdgeLocal () const;
virtual void print ( Cell* ) const; virtual void print ( Cell* ) const;
@ -179,6 +181,7 @@ namespace Anabatic {
DbU::Unit _edgeWidth; DbU::Unit _edgeWidth;
float _edgeCostH; float _edgeCostH;
float _edgeCostK; float _edgeCostK;
float _edgeHInc;
size_t _hEdgeLocal; size_t _hEdgeLocal;
size_t _vEdgeLocal; size_t _vEdgeLocal;
private: private:

View File

@ -293,7 +293,9 @@ namespace Anabatic {
inline bool isBipoint () const; inline bool isBipoint () const;
inline bool isSourceVertex ( Vertex* ) const; inline bool isSourceVertex ( Vertex* ) const;
inline bool isTargetVertex ( Vertex* ) const; inline bool isTargetVertex ( Vertex* ) const;
inline DbU::Unit getSearchAreaHalo () const;
inline void setDistance ( distance_t ); inline void setDistance ( distance_t );
inline void setSearchAreaHalo ( DbU::Unit );
void load ( Net* ); void load ( Net* );
void run ( Mode mode=Mode::Standart ); void run ( Mode mode=Mode::Standart );
private: private:
@ -319,6 +321,7 @@ namespace Anabatic {
VertexSet _sources; VertexSet _sources;
VertexSet _targets; VertexSet _targets;
Box _searchArea; Box _searchArea;
DbU::Unit _searchAreaHalo;
int _connectedsId; int _connectedsId;
PriorityQueue _queue; PriorityQueue _queue;
}; };
@ -327,10 +330,12 @@ namespace Anabatic {
inline Dijkstra::Mode::Mode ( unsigned int flags ) : BaseFlags(flags) { } inline Dijkstra::Mode::Mode ( unsigned int flags ) : BaseFlags(flags) { }
inline Dijkstra::Mode::Mode ( BaseFlags base ) : BaseFlags(base) { } inline Dijkstra::Mode::Mode ( BaseFlags base ) : BaseFlags(base) { }
inline bool Dijkstra::isBipoint () const { return _net and (_targets.size()+_sources.size() == 2); } inline bool Dijkstra::isBipoint () const { return _net and (_targets.size()+_sources.size() == 2); }
inline bool Dijkstra::isSourceVertex ( Vertex* v ) const { return (_sources.find(v) != _sources.end()); } inline bool Dijkstra::isSourceVertex ( Vertex* v ) const { return (_sources.find(v) != _sources.end()); }
inline bool Dijkstra::isTargetVertex ( Vertex* v ) const { return (_targets.find(v) != _targets.end()); } inline bool Dijkstra::isTargetVertex ( Vertex* v ) const { return (_targets.find(v) != _targets.end()); }
inline void Dijkstra::setDistance ( distance_t cb ) { _distanceCb = cb; } inline DbU::Unit Dijkstra::getSearchAreaHalo () const { return _searchAreaHalo; }
inline void Dijkstra::setDistance ( distance_t cb ) { _distanceCb = cb; }
inline void Dijkstra::setSearchAreaHalo ( DbU::Unit halo ) { _searchAreaHalo = halo; }
} // Anabatic namespace. } // Anabatic namespace.

View File

@ -62,6 +62,7 @@ namespace Anabatic {
inline unsigned int getCapacity () const; inline unsigned int getCapacity () const;
inline unsigned int getRealOccupancy () const; inline unsigned int getRealOccupancy () const;
inline unsigned int getEstimateOccupancy () const; inline unsigned int getEstimateOccupancy () const;
inline float getHistoricCost () const;
DbU::Unit getDistance () const; DbU::Unit getDistance () const;
inline GCell* getSource () const; inline GCell* getSource () const;
inline GCell* getTarget () const; inline GCell* getTarget () const;
@ -74,6 +75,7 @@ namespace Anabatic {
inline const vector<Segment*>& getSegments () const; inline const vector<Segment*>& getSegments () const;
inline void incCapacity ( int ); inline void incCapacity ( int );
void incRealOccupancy ( int ); void incRealOccupancy ( int );
inline void setHistoricCost ( float );
void add ( Segment* ); void add ( Segment* );
void remove ( Segment* ); void remove ( Segment* );
void replace ( Segment* orig, Segment* repl ); void replace ( Segment* orig, Segment* repl );
@ -110,6 +112,7 @@ namespace Anabatic {
unsigned int _capacity; unsigned int _capacity;
unsigned int _realOccupancy; unsigned int _realOccupancy;
float _estimateOccupancy; float _estimateOccupancy;
float _historicCost;
GCell* _source; GCell* _source;
GCell* _target; GCell* _target;
DbU::Unit _axis; DbU::Unit _axis;
@ -124,11 +127,13 @@ namespace Anabatic {
inline unsigned int Edge::getCapacity () const { return _capacity; } inline unsigned int Edge::getCapacity () const { return _capacity; }
inline unsigned int Edge::getRealOccupancy () const { return _realOccupancy; } inline unsigned int Edge::getRealOccupancy () const { return _realOccupancy; }
inline unsigned int Edge::getEstimateOccupancy () const { return _estimateOccupancy; } inline unsigned int Edge::getEstimateOccupancy () const { return _estimateOccupancy; }
inline float Edge::getHistoricCost () const { return _historicCost; }
inline GCell* Edge::getSource () const { return _source; } inline GCell* Edge::getSource () const { return _source; }
inline GCell* Edge::getTarget () const { return _target; } inline GCell* Edge::getTarget () const { return _target; }
inline DbU::Unit Edge::getAxis () const { return _axis; } inline DbU::Unit Edge::getAxis () const { return _axis; }
inline const vector<Segment*>& Edge::getSegments () const { return _segments; } inline const vector<Segment*>& Edge::getSegments () const { return _segments; }
inline void Edge::incCapacity ( int delta ) { _capacity = ((int)_capacity+delta > 0) ? _capacity+delta : 0; } inline void Edge::incCapacity ( int delta ) { _capacity = ((int)_capacity+delta > 0) ? _capacity+delta : 0; }
inline void Edge::setHistoricCost ( float hcost ) { _historicCost = hcost; }
inline const Flags& Edge::flags () const { return _flags; } inline const Flags& Edge::flags () const { return _flags; }
inline Flags& Edge::flags () { return _flags; } inline Flags& Edge::flags () { return _flags; }
inline void Edge::revalidate () const { /*if (_flags&Flags::Invalidated)*/ const_cast<Edge*>(this)->_revalidate(); } inline void Edge::revalidate () const { /*if (_flags&Flags::Invalidated)*/ const_cast<Edge*>(this)->_revalidate(); }