* ./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:
Jean-Paul Chaput 2010-05-13 09:45:53 +00:00
parent cd7a294ca9
commit 10de86a8dc
4 changed files with 53 additions and 16 deletions

View File

@ -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;

View File

@ -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
// *****************************
{

View File

@ -427,6 +427,8 @@ namespace Knik {
addMeasure<double> ( getCell(), "knikT", 0.0 );
addMeasure<size_t> ( getCell(), "knikS", 0 );
computeSymbolicWireLength ();
}

View File

@ -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" ); };
};