* ./kite:

- New: In Configuration & RoutingEvent, adds support for minimal break length
        by layer (METAL1 through METAL7).
    - New: Added measures for final detailed wirelength, wirelength expansion ratio,
        failed wirelength, number of processeds events and number of unique events.
This commit is contained in:
Jean-Paul Chaput 2010-08-22 12:38:27 +00:00
parent 1d525fec35
commit 551adf4213
6 changed files with 67 additions and 20 deletions

View File

@ -56,7 +56,6 @@ namespace Kite {
, _postEventCb () , _postEventCb ()
, _edgeCapacityPercent(Cfg::getParamPercentage("kite.edgeCapacity", 80.0)->asDouble()) , _edgeCapacityPercent(Cfg::getParamPercentage("kite.edgeCapacity", 80.0)->asDouble())
, _expandStep (Cfg::getParamPercentage("kite.expandStep" ,100.0)->asDouble()) , _expandStep (Cfg::getParamPercentage("kite.expandStep" ,100.0)->asDouble())
, _globalMinBreak (DbU::lambda((double)Cfg::getParamInt("kite.globalMinBreak",29*50)->asInt())) // Ugly: direct uses of SxLib gauge.
, _ripupLimits () , _ripupLimits ()
, _ripupCost (Cfg::getParamInt("kite.ripupCost" , 3)->asInt()) , _ripupCost (Cfg::getParamInt("kite.ripupCost" , 3)->asInt())
, _eventsLimit (Cfg::getParamInt("kite.eventsLimit" ,4000000)->asInt()) , _eventsLimit (Cfg::getParamInt("kite.eventsLimit" ,4000000)->asInt())
@ -66,6 +65,24 @@ namespace Kite {
_ripupLimits[LocalRipupLimit] = Cfg::getParamInt("kite.localRipupLimit" , 7)->asInt(); _ripupLimits[LocalRipupLimit] = Cfg::getParamInt("kite.localRipupLimit" , 7)->asInt();
_ripupLimits[GlobalRipupLimit] = Cfg::getParamInt("kite.globalRipupLimit" , 5)->asInt(); _ripupLimits[GlobalRipupLimit] = Cfg::getParamInt("kite.globalRipupLimit" , 5)->asInt();
_ripupLimits[LongGlobalRipupLimit] = Cfg::getParamInt("kite.longGlobalRipupLimit" , 5)->asInt(); _ripupLimits[LongGlobalRipupLimit] = Cfg::getParamInt("kite.longGlobalRipupLimit" , 5)->asInt();
for ( size_t i=0 ; i<MaxMetalDepth ; ++i ) {
ostringstream paramName;
paramName << "kite.metal" << (i+1) << "MinBreak";
int threshold = 29*50;
switch ( i ) {
case 0:
case 1:
threshold = 2*50;
break;
default:
threshold = 29*50;
break;
}
_globalMinBreaks[i] = DbU::lambda(Cfg::getParamInt(paramName.str(),threshold)->asInt());
}
} }
@ -148,6 +165,13 @@ namespace Kite {
DbU::Unit Configuration::getGlobalThreshold () const DbU::Unit Configuration::getGlobalThreshold () const
{ return _base->getGlobalThreshold(); } { return _base->getGlobalThreshold(); }
size_t Configuration::getHEdgeCapacity () const
{ return _base->getHEdgeCapacity(); }
size_t Configuration::getVEdgeCapacity () const
{ return _base->getVEdgeCapacity(); }
void Configuration::setAllowedDepth ( size_t allowedDepth ) void Configuration::setAllowedDepth ( size_t allowedDepth )
{ _base->setAllowedDepth(allowedDepth); } { _base->setAllowedDepth(allowedDepth); }

View File

@ -474,8 +474,9 @@ namespace Kite {
<< "% [" << totalWireLength << "] " << "% [" << totalWireLength << "] "
<< (totalWireLength - routedWireLength) << " remains." << endl; << (totalWireLength - routedWireLength) << " remains." << endl;
float expandRatio = 1.0;
if ( _minimumWL != 0.0 ) { if ( _minimumWL != 0.0 ) {
float expandRatio = totalWireLength / _minimumWL; expandRatio = totalWireLength / _minimumWL;
cout << " - Wire Length Expand Ratio := " cout << " - Wire Length Expand Ratio := "
<< setprecision(4) << expandRatio << setprecision(4) << expandRatio
<< "% [min:" << setprecision(9) << _minimumWL << "] " << "% [min:" << setprecision(9) << _minimumWL << "] "
@ -484,7 +485,10 @@ namespace Kite {
_toolSuccess = (unrouteds == 0); _toolSuccess = (unrouteds == 0);
addMeasure<size_t> ( getCell(), "Segs", routeds+unrouteds ); addMeasure<size_t> ( getCell(), "Segs" , routeds+unrouteds );
addMeasure<unsigned long long> ( getCell(), "DWL(l)" , totalWireLength , 12 );
addMeasure<unsigned long long> ( getCell(), "fWL(l)" , totalWireLength-routedWireLength , 12);
addMeasure<double> ( getCell(), "WLER(%)", (expandRatio-1.0)*100.0 );
} }
@ -507,6 +511,11 @@ namespace Kite {
measuresLabels.push_back ( "algoS" ); measuresLabels.push_back ( "algoS" );
measuresLabels.push_back ( "finT" ); measuresLabels.push_back ( "finT" );
measuresLabels.push_back ( "Segs" ); measuresLabels.push_back ( "Segs" );
measuresLabels.push_back ( "DWL(l)" );
measuresLabels.push_back ( "fWL(l)" );
measuresLabels.push_back ( "WLER(%)" );
measuresLabels.push_back ( "Events" );
measuresLabels.push_back ( "UEvents" );
const MeasuresSet* measures = Measures::get(getCell()); const MeasuresSet* measures = Measures::get(getCell());

View File

@ -32,6 +32,7 @@
#include "hurricane/Cell.h" #include "hurricane/Cell.h"
#include "crlcore/Utilities.h" #include "crlcore/Utilities.h"
#include "crlcore/AllianceFramework.h" #include "crlcore/AllianceFramework.h"
#include "crlcore/Measures.h"
#include "kite/DataNegociate.h" #include "kite/DataNegociate.h"
#include "kite/TrackElement.h" #include "kite/TrackElement.h"
@ -151,6 +152,7 @@ namespace Kite {
using Hurricane::ltracein; using Hurricane::ltracein;
using Hurricane::ltraceout; using Hurricane::ltraceout;
using Hurricane::ForEachIterator; using Hurricane::ForEachIterator;
using CRL::addMeasure;
// ------------------------------------------------------------------- // -------------------------------------------------------------------
@ -544,6 +546,9 @@ namespace Kite {
,(RoutingEvent::getProcesseds() - RoutingEvent::getCloneds())) << endl; ,(RoutingEvent::getProcesseds() - RoutingEvent::getCloneds())) << endl;
cmess1 << Dots::asSizet(" - Biggest Events Chunk" ,biggestEventsCount) << endl; cmess1 << Dots::asSizet(" - Biggest Events Chunk" ,biggestEventsCount) << endl;
cmess1 << Dots::asSizet(" - Biggest Routing Set" ,biggestRSsize) << endl; cmess1 << Dots::asSizet(" - Biggest Routing Set" ,biggestRSsize) << endl;
addMeasure<size_t>( getCell(), "Events" , RoutingEvent::getProcesseds(), 12 );
addMeasure<size_t>( getCell(), "UEvents", RoutingEvent::getProcesseds()-RoutingEvent::getCloneds(), 12 );
} }

View File

@ -1161,8 +1161,11 @@ namespace {
for ( ; (begin < end) ; begin++ ) { for ( ; (begin < end) ; begin++ ) {
other = track->getSegment(begin); other = track->getSegment(begin);
if ( other->getNet() == segment->getNet() ) continue; if ( other->getNet() == segment->getNet() ) continue;
if ( !other->getCanonicalInterval().intersect(overlap) ) continue; if ( not other->getCanonicalInterval().intersect(overlap) ) {
if ( otherNet == NULL ) candidates.back().setBegin ( begin );
continue;
}
ltrace(200) << " | Conflict: " << begin << " " << other << endl; ltrace(200) << " | Conflict: " << begin << " " << other << endl;
if ( otherNet != other->getNet() ) { if ( otherNet != other->getNet() ) {
@ -1244,12 +1247,15 @@ namespace {
//if ( track && (track->getAxis() < constraints.getVMin()) ) track = track->getNext(); //if ( track && (track->getAxis() < constraints.getVMin()) ) track = track->getNext();
//for ( ; !success && track && (track->getAxis() <= constraints.getVMax()) ; track = track->getNext() ) //for ( ; !success && track && (track->getAxis() <= constraints.getVMax()) ; track = track->getNext() )
if ( not success and (segment->getLength() >= Session::getConfiguration()->getGlobalMinBreak()) ) { unsigned int depth = Session::getConfiguration()->getRoutingGauge()->getLayerDepth(segment->getLayer());
ltrace(200) << "Long global wire, break in the middle." << endl; if ( not success ) {
Interval span; if ( (segment->getLength() >= Session::getConfiguration()->getGlobalMinBreak(depth)) ) {
segment->getCanonical ( span ); ltrace(200) << "Long global wire, break in the middle." << endl;
Interval span;
segment->getCanonical ( span );
success = Manipulator(segment,*this).makeDogLeg ( span.getCenter() ); success = Manipulator(segment,*this).makeDogLeg ( span.getCenter() );
}
} }
if ( not success and segment->isGlobal() and (_costs.size() <= 1) ) { if ( not success and segment->isGlobal() and (_costs.size() <= 1) ) {

View File

@ -59,6 +59,7 @@ namespace Kite {
, LongGlobalRipupLimit=4 , LongGlobalRipupLimit=4
, RipupLimitsTableSize=5 , RipupLimitsTableSize=5
}; };
enum Constants { MaxMetalDepth=20 };
public: public:
// Constructor & Destructor. // Constructor & Destructor.
virtual Configuration* clone () const; virtual Configuration* clone () const;
@ -78,6 +79,8 @@ namespace Kite {
virtual float getSaturateRatio () const; virtual float getSaturateRatio () const;
virtual size_t getSaturateRp () const; virtual size_t getSaturateRp () const;
virtual DbU::Unit getGlobalThreshold () const; virtual DbU::Unit getGlobalThreshold () const;
virtual size_t getHEdgeCapacity () const;
virtual size_t getVEdgeCapacity () const;
virtual void setAllowedDepth ( size_t ); virtual void setAllowedDepth ( size_t );
virtual void setSaturateRatio ( float ); virtual void setSaturateRatio ( float );
virtual void setSaturateRp ( size_t ); virtual void setSaturateRp ( size_t );
@ -88,13 +91,13 @@ namespace Kite {
inline PostEventCb_t& getPostEventCb (); inline PostEventCb_t& getPostEventCb ();
inline unsigned long getEventsLimit () const; inline unsigned long getEventsLimit () const;
inline float getExpandStep () const; inline float getExpandStep () const;
inline DbU::Unit getGlobalMinBreak () const; inline DbU::Unit getGlobalMinBreak ( unsigned int depth ) const;
inline unsigned int getRipupCost () const; inline unsigned int getRipupCost () const;
unsigned int getRipupLimit ( unsigned int type ) const; unsigned int getRipupLimit ( unsigned int type ) const;
inline float getEdgeCapacityPercent () const; inline float getEdgeCapacityPercent () const;
inline void setEventsLimit ( unsigned long ); inline void setEventsLimit ( unsigned long );
inline void setExpandStep ( float ); inline void setExpandStep ( float );
inline void setGlobalMinBreak ( DbU::Unit ); inline void setGlobalMinBreak ( unsigned int depth, DbU::Unit );
inline void setRipupCost ( unsigned int ); inline void setRipupCost ( unsigned int );
void setRipupLimit ( unsigned int limit, unsigned int type ); void setRipupLimit ( unsigned int limit, unsigned int type );
inline void setPostEventCb ( PostEventCb_t ); inline void setPostEventCb ( PostEventCb_t );
@ -108,8 +111,8 @@ namespace Kite {
PostEventCb_t _postEventCb; PostEventCb_t _postEventCb;
float _edgeCapacityPercent; float _edgeCapacityPercent;
float _expandStep; float _expandStep;
DbU::Unit _globalMinBreak; DbU::Unit _globalMinBreaks[MaxMetalDepth];
unsigned int _ripupLimits[RipupLimitsTableSize]; unsigned int _ripupLimits [RipupLimitsTableSize];
unsigned int _ripupCost; unsigned int _ripupCost;
unsigned long _eventsLimit; unsigned long _eventsLimit;
private: private:
@ -125,12 +128,12 @@ namespace Kite {
inline unsigned int Configuration::getRipupCost () const { return _ripupCost; } inline unsigned int Configuration::getRipupCost () const { return _ripupCost; }
inline float Configuration::getExpandStep () const { return _expandStep; } inline float Configuration::getExpandStep () const { return _expandStep; }
inline float Configuration::getEdgeCapacityPercent () const { return _edgeCapacityPercent; } inline float Configuration::getEdgeCapacityPercent () const { return _edgeCapacityPercent; }
inline DbU::Unit Configuration::getGlobalMinBreak () const { return _globalMinBreak; } inline DbU::Unit Configuration::getGlobalMinBreak ( unsigned int depth ) const { return _globalMinBreaks[ (depth>=MaxMetalDepth) ? MaxMetalDepth-1 : depth ]; }
inline void Configuration::setRipupCost ( unsigned int cost ) { _ripupCost = cost; } inline void Configuration::setRipupCost ( unsigned int cost ) { _ripupCost = cost; }
inline void Configuration::setExpandStep ( float step ) { _expandStep = step; } inline void Configuration::setExpandStep ( float step ) { _expandStep = step; }
inline void Configuration::setPostEventCb ( PostEventCb_t cb ) { _postEventCb = cb; } inline void Configuration::setPostEventCb ( PostEventCb_t cb ) { _postEventCb = cb; }
inline void Configuration::setEventsLimit ( unsigned long limit ) { _eventsLimit = limit; } inline void Configuration::setEventsLimit ( unsigned long limit ) { _eventsLimit = limit; }
inline void Configuration::setGlobalMinBreak ( DbU::Unit threshold ) { _globalMinBreak = threshold; } inline void Configuration::setGlobalMinBreak ( unsigned int depth, DbU::Unit threshold ) { _globalMinBreaks[ (depth>=MaxMetalDepth) ? MaxMetalDepth-1 : depth ] = threshold; }

View File

@ -92,7 +92,7 @@ namespace Kite {
inline unsigned int getRipupCost () const; inline unsigned int getRipupCost () const;
inline float getExpandStep () const; inline float getExpandStep () const;
inline float getEdgeCapacityPercent () const; inline float getEdgeCapacityPercent () const;
inline DbU::Unit getGlobalMinBreak () const; inline DbU::Unit getGlobalMinBreak ( unsigned int depth ) const;
inline GCellGrid* getGCellGrid () const; inline GCellGrid* getGCellGrid () const;
virtual const Name& getName () const; virtual const Name& getName () const;
inline Configuration::PostEventCb_t& inline Configuration::PostEventCb_t&
@ -113,7 +113,7 @@ namespace Kite {
inline void setRipupCost ( unsigned int ); inline void setRipupCost ( unsigned int );
inline void setExpandStep ( float ); inline void setExpandStep ( float );
inline void setEdgeCapacityPercent ( float ); inline void setEdgeCapacityPercent ( float );
inline void setGlobalMinBreak ( DbU::Unit ); inline void setGlobalMinBreak ( unsigned int depth, DbU::Unit );
void preProcess (); void preProcess ();
void buildBlockages (); void buildBlockages ();
void buildPowerRails (); void buildPowerRails ();
@ -176,7 +176,7 @@ namespace Kite {
inline unsigned int KiteEngine::getRipupCost () const { return _configuration->getRipupCost(); } inline unsigned int KiteEngine::getRipupCost () const { return _configuration->getRipupCost(); }
inline float KiteEngine::getExpandStep () const { return _configuration->getExpandStep(); } inline float KiteEngine::getExpandStep () const { return _configuration->getExpandStep(); }
inline float KiteEngine::getEdgeCapacityPercent () const { return _configuration->getEdgeCapacityPercent(); } inline float KiteEngine::getEdgeCapacityPercent () const { return _configuration->getEdgeCapacityPercent(); }
inline DbU::Unit KiteEngine::getGlobalMinBreak () const { return _configuration->getGlobalMinBreak(); } inline DbU::Unit KiteEngine::getGlobalMinBreak ( unsigned int depth ) const { return _configuration->getGlobalMinBreak(depth); }
inline unsigned int KiteEngine::getRipupLimit ( unsigned int type ) const { return _configuration->getRipupLimit(type); } inline unsigned int KiteEngine::getRipupLimit ( unsigned int type ) const { return _configuration->getRipupLimit(type); }
inline GCellGrid* KiteEngine::getGCellGrid () const { return _kiteGrid; } inline GCellGrid* KiteEngine::getGCellGrid () const { return _kiteGrid; }
inline NegociateWindow* KiteEngine::getNegociateWindow () { return _negociateWindow; } inline NegociateWindow* KiteEngine::getNegociateWindow () { return _negociateWindow; }
@ -186,7 +186,7 @@ namespace Kite {
inline void KiteEngine::setRipupCost ( unsigned int cost ) { _configuration->setRipupCost(cost); } inline void KiteEngine::setRipupCost ( unsigned int cost ) { _configuration->setRipupCost(cost); }
inline void KiteEngine::setExpandStep ( float step ) { _configuration->setExpandStep(step); } inline void KiteEngine::setExpandStep ( float step ) { _configuration->setExpandStep(step); }
inline void KiteEngine::setEdgeCapacityPercent ( float percent ) { _configuration->setEdgeCapacityPercent(percent); } inline void KiteEngine::setEdgeCapacityPercent ( float percent ) { _configuration->setEdgeCapacityPercent(percent); }
inline void KiteEngine::setGlobalMinBreak ( DbU::Unit threshold ) { _configuration->setGlobalMinBreak(threshold); } inline void KiteEngine::setGlobalMinBreak ( unsigned int depth, DbU::Unit threshold ) { _configuration->setGlobalMinBreak(depth,threshold); }
inline void KiteEngine::setMinimumWL ( double minimum ) { _minimumWL = minimum; } inline void KiteEngine::setMinimumWL ( double minimum ) { _minimumWL = minimum; }
inline void KiteEngine::setPostEventCb ( Configuration::PostEventCb_t cb ) { _configuration->setPostEventCb(cb); } inline void KiteEngine::setPostEventCb ( Configuration::PostEventCb_t cb ) { _configuration->setPostEventCb(cb); }
inline void KiteEngine::printConfiguration () const { _configuration->print(getCell()); } inline void KiteEngine::printConfiguration () const { _configuration->print(getCell()); }