* ./knik:
- New: KnikEngine::computeSymbolicWireLength(), which adds to the measurments 1. - The sum of global wire length (in lambdas). 2. - The abutment box area of the design (in square lambdas). 3. - The saturation ratio of the design: wire length divided by area and normalized by a "fully routed GCell".
This commit is contained in:
parent
cd7a294ca9
commit
10de86a8dc
|
@ -1971,7 +1971,9 @@ unsigned Graph::analyseRouting ( set<Segment*>& segmentsToUnroute )
|
||||||
// This function construct the list of segments that participate to congestion
|
// This function construct the list of segments that participate to congestion
|
||||||
// empty Priority queue : easier than update each semgent when removing a semgent ...
|
// empty Priority queue : easier than update each semgent when removing a semgent ...
|
||||||
clearSTuplePQ();
|
clearSTuplePQ();
|
||||||
// 30/01/09 on remplace le parcours des nets/segments par un parcours des edges avec un map trié sur pointeur de segments et définissant un record : nbDep nBTot + sumOv pour chaque segment.
|
// 30/01/09 on remplace le parcours des nets/segments par un parcours des
|
||||||
|
// edges avec un map trié sur pointeur de segments et définissant un record:
|
||||||
|
// nbDep nBTot + sumOv pour chaque segment.
|
||||||
unsigned nbEdgesTot = 0;
|
unsigned nbEdgesTot = 0;
|
||||||
unsigned nbEdgesOv = 0;
|
unsigned nbEdgesOv = 0;
|
||||||
unsigned overflow = 0;
|
unsigned overflow = 0;
|
||||||
|
|
|
@ -1030,6 +1030,8 @@ void KnikEngine::run()
|
||||||
|
|
||||||
addMeasure<double> ( getCell(), "knikT", _timer.getCombTime () );
|
addMeasure<double> ( getCell(), "knikT", _timer.getCombTime () );
|
||||||
addMeasure<size_t> ( getCell(), "knikS", (_timer.getMemorySize() >> 20) );
|
addMeasure<size_t> ( getCell(), "knikS", (_timer.getMemorySize() >> 20) );
|
||||||
|
|
||||||
|
computeSymbolicWireLength ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void KnikEngine::Route()
|
void KnikEngine::Route()
|
||||||
|
@ -1218,6 +1220,36 @@ void KnikEngine::reroute()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void KnikEngine::computeSymbolicWireLength ()
|
||||||
|
{
|
||||||
|
// Ugly: hardcoded SxLib gauge characteristics.
|
||||||
|
const double normalize = (50.0 * 10 * 4) / (50 * 50) ;
|
||||||
|
Name obstacleNetName ("obstaclenet");
|
||||||
|
unsigned long long symbolicWireLength = 0;
|
||||||
|
|
||||||
|
forEach ( Net*, net, getCell()->getNets() ) {
|
||||||
|
if ( net->isGlobal()
|
||||||
|
or net->isSupply()
|
||||||
|
or net->isClock()
|
||||||
|
or (net->getName() == obstacleNetName) ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
forEach ( Segment*, isegment, net->getSegments() ) {
|
||||||
|
symbolicWireLength += (unsigned long long)DbU::getLambda ( isegment->getLength() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
addMeasure<unsigned long long> ( getCell(), "GWL(l)", symbolicWireLength, 14 );
|
||||||
|
|
||||||
|
Box ab ( getCell()->getAbutmentBox() );
|
||||||
|
double area = (DbU::getLambda(ab.getWidth()) * DbU::getLambda(ab.getHeight()) );
|
||||||
|
|
||||||
|
addMeasure<double> ( getCell(), "Area(l2)", area, 14 );
|
||||||
|
addMeasure<double> ( getCell(), "Sat." , (symbolicWireLength/area)/normalize );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Record* KnikEngine::_getRecord() const
|
Record* KnikEngine::_getRecord() const
|
||||||
// *****************************
|
// *****************************
|
||||||
{
|
{
|
||||||
|
|
|
@ -427,6 +427,8 @@ namespace Knik {
|
||||||
|
|
||||||
addMeasure<double> ( getCell(), "knikT", 0.0 );
|
addMeasure<double> ( getCell(), "knikT", 0.0 );
|
||||||
addMeasure<size_t> ( getCell(), "knikS", 0 );
|
addMeasure<size_t> ( getCell(), "knikS", 0 );
|
||||||
|
|
||||||
|
computeSymbolicWireLength ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -192,21 +192,22 @@ typedef vector<NetRecord> NetVector;
|
||||||
// Others
|
// Others
|
||||||
// ******
|
// ******
|
||||||
public:
|
public:
|
||||||
static KnikEngine* get ( const Cell* );
|
static KnikEngine* get ( const Cell* );
|
||||||
static const Name& staticGetName () { return _toolName; };
|
static const Name& staticGetName () { return _toolName; };
|
||||||
static float getEdgeCapacityPercent () { return _edgeCapacityPercent; };
|
static float getEdgeCapacityPercent () { return _edgeCapacityPercent; };
|
||||||
const Name& getName () const { return _toolName; };
|
const Name& getName () const { return _toolName; };
|
||||||
void printTime ();
|
void printTime ();
|
||||||
void computeOverflow ();
|
void computeOverflow ();
|
||||||
// void showOccupancy ();
|
void computeSymbolicWireLength ();
|
||||||
// void showEstimateOccupancy ();
|
// void showOccupancy ();
|
||||||
void getHorizontalCutLines ( vector<DbU::Unit>& horizontalCutLines );
|
// void showEstimateOccupancy ();
|
||||||
void getVerticalCutLines ( vector<DbU::Unit>& verticalCutLines );
|
void getHorizontalCutLines ( vector<DbU::Unit>& horizontalCutLines );
|
||||||
void saveSolution ( const string& fileName="" );
|
void getVerticalCutLines ( vector<DbU::Unit>& verticalCutLines );
|
||||||
void loadSolution ( const string& fileName="" );
|
void saveSolution ( const string& fileName="" );
|
||||||
string _getSolutionName () const;
|
void loadSolution ( const string& fileName="" );
|
||||||
virtual Record* _getRecord () const;
|
string _getSolutionName () const;
|
||||||
virtual string _getTypeName () const { return _TName ( "KnikEngine" ); };
|
virtual Record* _getRecord () const;
|
||||||
|
virtual string _getTypeName () const { return _TName ( "KnikEngine" ); };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue