* ./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
|
||||
// empty Priority queue : easier than update each semgent when removing a semgent ...
|
||||
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 nbEdgesOv = 0;
|
||||
unsigned overflow = 0;
|
||||
|
|
|
@ -1030,6 +1030,8 @@ void KnikEngine::run()
|
|||
|
||||
addMeasure<double> ( getCell(), "knikT", _timer.getCombTime () );
|
||||
addMeasure<size_t> ( getCell(), "knikS", (_timer.getMemorySize() >> 20) );
|
||||
|
||||
computeSymbolicWireLength ();
|
||||
}
|
||||
|
||||
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
|
||||
// *****************************
|
||||
{
|
||||
|
|
|
@ -427,6 +427,8 @@ namespace Knik {
|
|||
|
||||
addMeasure<double> ( getCell(), "knikT", 0.0 );
|
||||
addMeasure<size_t> ( getCell(), "knikS", 0 );
|
||||
|
||||
computeSymbolicWireLength ();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -192,21 +192,22 @@ typedef vector<NetRecord> NetVector;
|
|||
// Others
|
||||
// ******
|
||||
public:
|
||||
static KnikEngine* get ( const Cell* );
|
||||
static const Name& staticGetName () { return _toolName; };
|
||||
static float getEdgeCapacityPercent () { return _edgeCapacityPercent; };
|
||||
const Name& getName () const { return _toolName; };
|
||||
void printTime ();
|
||||
void computeOverflow ();
|
||||
// void showOccupancy ();
|
||||
// void showEstimateOccupancy ();
|
||||
void getHorizontalCutLines ( vector<DbU::Unit>& horizontalCutLines );
|
||||
void getVerticalCutLines ( vector<DbU::Unit>& verticalCutLines );
|
||||
void saveSolution ( const string& fileName="" );
|
||||
void loadSolution ( const string& fileName="" );
|
||||
string _getSolutionName () const;
|
||||
virtual Record* _getRecord () const;
|
||||
virtual string _getTypeName () const { return _TName ( "KnikEngine" ); };
|
||||
static KnikEngine* get ( const Cell* );
|
||||
static const Name& staticGetName () { return _toolName; };
|
||||
static float getEdgeCapacityPercent () { return _edgeCapacityPercent; };
|
||||
const Name& getName () const { return _toolName; };
|
||||
void printTime ();
|
||||
void computeOverflow ();
|
||||
void computeSymbolicWireLength ();
|
||||
// void showOccupancy ();
|
||||
// void showEstimateOccupancy ();
|
||||
void getHorizontalCutLines ( vector<DbU::Unit>& horizontalCutLines );
|
||||
void getVerticalCutLines ( vector<DbU::Unit>& verticalCutLines );
|
||||
void saveSolution ( const string& fileName="" );
|
||||
void loadSolution ( const string& fileName="" );
|
||||
string _getSolutionName () const;
|
||||
virtual Record* _getRecord () const;
|
||||
virtual string _getTypeName () const { return _TName ( "KnikEngine" ); };
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue