* ./metis:
- Change: In doQuadriPart, manage correctly non-square designs. So that after an initial non-quadripartition step, the partitions are rougly squares. Seems to have trouble with small designs.
This commit is contained in:
parent
8bca37c2fa
commit
563a9dec26
|
@ -165,6 +165,7 @@ namespace Metis {
|
||||||
_globalEdgeCut += graph->part ( output );
|
_globalEdgeCut += graph->part ( output );
|
||||||
}
|
}
|
||||||
catch ( MetisGraph::TooLowNVTXSException& e ) {
|
catch ( MetisGraph::TooLowNVTXSException& e ) {
|
||||||
|
if ( cmess2.enabled() ) cerr << "\n";
|
||||||
cerr << Warning("Impossible to part graph, only %d nodes",e._nvtxs);
|
cerr << Warning("Impossible to part graph, only %d nodes",e._nvtxs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -178,7 +179,7 @@ namespace Metis {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
output << endl;
|
output << "\n";
|
||||||
|
|
||||||
for ( MetisGraphs::iterator mgit=_actualGraphs->begin(); mgit != _actualGraphs->end(); ++mgit )
|
for ( MetisGraphs::iterator mgit=_actualGraphs->begin(); mgit != _actualGraphs->end(); ++mgit )
|
||||||
delete *mgit;
|
delete *mgit;
|
||||||
|
@ -270,14 +271,27 @@ namespace Metis {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned int MetisEngine::computeQuadriPartitions ( Cell* cell )
|
unsigned int MetisEngine::computeQuadriPartitions ( Cell* cell, int& xsplits, int& ysplits )
|
||||||
{
|
{
|
||||||
size_t gates = getInstancesCount ( cell );
|
size_t gates = getInstancesCount ( cell );
|
||||||
|
Box ab = cell->getAbutmentBox();
|
||||||
|
double aspectRatio = (double)(ab.getWidth()) / (double)(ab.getHeight());
|
||||||
|
|
||||||
|
if ( aspectRatio >= 1.0 ) {
|
||||||
|
xsplits = ((int)(trunc ( aspectRatio +0.5 ) )) * 2;
|
||||||
|
ysplits = 2;
|
||||||
|
} else {
|
||||||
|
xsplits = 2;
|
||||||
|
ysplits = ((int)(trunc ( (1.0/aspectRatio)+0.5 ) )) * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
cerr << "gates:" << gates << endl;
|
||||||
|
cerr << "ar:" << aspectRatio << " xsplits:" << xsplits << " ysplits:" << ysplits << endl;
|
||||||
|
|
||||||
int partitionSizeStop = Cfg::getParamInt("metis.numberOfInstancesStopCriterion",45)->asInt();
|
int partitionSizeStop = Cfg::getParamInt("metis.numberOfInstancesStopCriterion",45)->asInt();
|
||||||
double partitions = log((double)gates / (double)partitionSizeStop) / log(4.0) + 1.0;
|
double quadPartitions = log((double)gates / (double)(partitionSizeStop*xsplits*ysplits) ) / log(4.0) + 1.0;
|
||||||
|
|
||||||
return (unsigned int)(partitions);
|
return (unsigned int)(quadPartitions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -297,9 +311,6 @@ namespace Metis {
|
||||||
// throw Error ("Metis::doQuadriPart(): Nimbus already exists on <%s>"
|
// throw Error ("Metis::doQuadriPart(): Nimbus already exists on <%s>"
|
||||||
// ,getString(cell->getName()).c_str());
|
// ,getString(cell->getName()).c_str());
|
||||||
|
|
||||||
// nimbus = NimbusEngine::create ( cell, AllianceFramework::get()->getLibrary(1) );
|
|
||||||
// metis = MetisEngine ::create ( cell );
|
|
||||||
|
|
||||||
NimbusEngine* nimbus = NimbusEngine::get ( cell );
|
NimbusEngine* nimbus = NimbusEngine::get ( cell );
|
||||||
if ( nimbus == NULL )
|
if ( nimbus == NULL )
|
||||||
nimbus = NimbusEngine::create ( cell );
|
nimbus = NimbusEngine::create ( cell );
|
||||||
|
@ -308,10 +319,16 @@ namespace Metis {
|
||||||
if ( metis == NULL )
|
if ( metis == NULL )
|
||||||
metis = MetisEngine ::create ( cell );
|
metis = MetisEngine ::create ( cell );
|
||||||
|
|
||||||
size_t partitions = computeQuadriPartitions ( cell );
|
int xsplits;
|
||||||
|
int ysplits;
|
||||||
|
size_t partitions = computeQuadriPartitions ( cell, xsplits, ysplits );
|
||||||
|
|
||||||
for ( size_t part=0 ; part<partitions ; ++part ) {
|
for ( size_t part=0 ; part<partitions ; ++part ) {
|
||||||
nimbus->progress ();
|
nimbus->progress ( xsplits, ysplits );
|
||||||
metis-> run ();
|
metis-> run ();
|
||||||
|
|
||||||
|
xsplits = 2;
|
||||||
|
ysplits = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,7 @@ namespace Metis {
|
||||||
static MetisEngine* create ( Cell* );
|
static MetisEngine* create ( Cell* );
|
||||||
static MetisEngine* get ( Cell* );
|
static MetisEngine* get ( Cell* );
|
||||||
// Methods.
|
// Methods.
|
||||||
static unsigned int computeQuadriPartitions ( Cell* );
|
static unsigned int computeQuadriPartitions ( Cell*, int& xsplits, int& ysplits );
|
||||||
static void doQuadriPart ( Cell* );
|
static void doQuadriPart ( Cell* );
|
||||||
static bool isHMetisCapable ();
|
static bool isHMetisCapable ();
|
||||||
static const Name& staticGetName ();
|
static const Name& staticGetName ();
|
||||||
|
|
Loading…
Reference in New Issue