Etesian adjustements, patch contributed by G. Gouvine.
This commit is contained in:
parent
1e73466199
commit
1aa416e82a
|
@ -157,27 +157,17 @@ namespace {
|
||||||
{
|
{
|
||||||
DbU::Unit tx = position.x_ * pitch;
|
DbU::Unit tx = position.x_ * pitch;
|
||||||
DbU::Unit ty = position.y_ * pitch;
|
DbU::Unit ty = position.y_ * pitch;
|
||||||
//Point center = model->getAbutmentBox().getCenter();
|
|
||||||
Box cellBox = model->getAbutmentBox();
|
Box cellBox = model->getAbutmentBox();
|
||||||
Transformation::Orientation orient = Transformation::Orientation::ID;
|
Transformation::Orientation orient = Transformation::Orientation::ID;
|
||||||
|
|
||||||
// TODO offsets
|
if ( not orientation.x_ and orientation.y_) {
|
||||||
if ( orientation.x_ and orientation.y_ ) {
|
|
||||||
//tx += - center.getX();
|
|
||||||
//ty += - center.getY();
|
|
||||||
} else if ( not orientation.x_ and orientation.y_) {
|
|
||||||
//tx += center.getX();
|
|
||||||
tx += cellBox.getWidth();
|
tx += cellBox.getWidth();
|
||||||
//ty += - center.getY();
|
|
||||||
orient = Transformation::Orientation::MX;
|
orient = Transformation::Orientation::MX;
|
||||||
} else if ( orientation.x_ and not orientation.y_) {
|
} else if ( orientation.x_ and not orientation.y_) {
|
||||||
//tx += - center.getX();
|
|
||||||
//ty += center.getY();
|
|
||||||
ty += cellBox.getHeight();
|
ty += cellBox.getHeight();
|
||||||
orient = Transformation::Orientation::MY;
|
orient = Transformation::Orientation::MY;
|
||||||
} else if ( not orientation.x_ and not orientation.y_) {
|
} else if ( not orientation.x_ and not orientation.y_) {
|
||||||
//tx += center.getX();
|
|
||||||
//ty += center.getY();
|
|
||||||
tx += cellBox.getWidth();
|
tx += cellBox.getWidth();
|
||||||
ty += cellBox.getHeight();
|
ty += cellBox.getHeight();
|
||||||
orient = Transformation::Orientation::R2;
|
orient = Transformation::Orientation::R2;
|
||||||
|
@ -287,7 +277,7 @@ namespace Etesian {
|
||||||
{
|
{
|
||||||
// Ugly: Name based detection of ISPD benchmarks.
|
// Ugly: Name based detection of ISPD benchmarks.
|
||||||
if (getString(getCell()->getName()).substr(0,7) == "bigblue") {
|
if (getString(getCell()->getName()).substr(0,7) == "bigblue") {
|
||||||
cmess1 << " o ISPD benchmark <" << getCell()->getName()
|
cmess2 << " o ISPD benchmark <" << getCell()->getName()
|
||||||
<< ">, no feed cells will be added." << endl;
|
<< ">, no feed cells will be added." << endl;
|
||||||
} else {
|
} else {
|
||||||
// Ugly: Direct uses of Alliance Framework.
|
// Ugly: Direct uses of Alliance Framework.
|
||||||
|
@ -455,7 +445,7 @@ namespace Etesian {
|
||||||
|
|
||||||
if (_cellWidget) _cellWidget->refresh();
|
if (_cellWidget) _cellWidget->refresh();
|
||||||
|
|
||||||
_placed = true;
|
_placed = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -571,7 +561,7 @@ namespace Etesian {
|
||||||
|
|
||||||
dots.dot();
|
dots.dot();
|
||||||
|
|
||||||
nets[netId] = temporary_net( netId, 1000 );
|
nets[netId] = temporary_net( netId, 1 );
|
||||||
|
|
||||||
forEach ( RoutingPad*, irp, (*inet)->getRoutingPads() ) {
|
forEach ( RoutingPad*, irp, (*inet)->getRoutingPads() ) {
|
||||||
string insName = extractInstanceName( *irp );
|
string insName = extractInstanceName( *irp );
|
||||||
|
@ -624,7 +614,8 @@ namespace Etesian {
|
||||||
Density densityConf = getSpreadingConf();
|
Density densityConf = getSpreadingConf();
|
||||||
|
|
||||||
cmess1 << " o Running Coloquinte." << endl;
|
cmess1 << " o Running Coloquinte." << endl;
|
||||||
cmess1 << " - Computing initial placement..." << endl;
|
cmess1 << " o Global placement." << endl;
|
||||||
|
cmess2 << " - Computing initial placement..." << endl;
|
||||||
cmess2 << setfill('0') << right;
|
cmess2 << setfill('0') << right;
|
||||||
|
|
||||||
|
|
||||||
|
@ -636,7 +627,7 @@ namespace Etesian {
|
||||||
cmess2 << " o Initial wirelength " << get_HPWL_wirelength(_circuit, _placementLB) << "." << endl;
|
cmess2 << " o Initial wirelength " << get_HPWL_wirelength(_circuit, _placementLB) << "." << endl;
|
||||||
startMeasures();
|
startMeasures();
|
||||||
|
|
||||||
cmess1 << " o Simple legalization." << endl;
|
cmess2 << " o Simple legalization." << endl;
|
||||||
auto first_legalizer = region_distribution::uniform_density_distribution(_surface, _circuit, _placementLB);
|
auto first_legalizer = region_distribution::uniform_density_distribution(_surface, _circuit, _placementLB);
|
||||||
first_legalizer.selfcheck();
|
first_legalizer.selfcheck();
|
||||||
get_rough_legalization( _circuit, _placementUB, first_legalizer);
|
get_rough_legalization( _circuit, _placementUB, first_legalizer);
|
||||||
|
@ -655,7 +646,7 @@ namespace Etesian {
|
||||||
_updatePlacement( _placementUB );
|
_updatePlacement( _placementUB );
|
||||||
|
|
||||||
// Early topology-independent solution + negligible pulling forces to avoid dumb solutions
|
// Early topology-independent solution + negligible pulling forces to avoid dumb solutions
|
||||||
cmess1 << " o Star (*) Optimization." << endl;
|
cmess2 << " o Star (*) Optimization." << endl;
|
||||||
auto solv = get_star_linear_system( _circuit, _placementLB, 1.0, 0, 10000)
|
auto solv = get_star_linear_system( _circuit, _placementLB, 1.0, 0, 10000)
|
||||||
+ get_pulling_forces( _circuit, _placementUB, 1000000.0);
|
+ get_pulling_forces( _circuit, _placementUB, 1000000.0);
|
||||||
solve_linear_system( _circuit, _placementLB, solv, 200 );
|
solve_linear_system( _circuit, _placementLB, solv, 200 );
|
||||||
|
@ -664,7 +655,7 @@ namespace Etesian {
|
||||||
if(placementUpdate <= LowerBound)
|
if(placementUpdate <= LowerBound)
|
||||||
_updatePlacement( _placementLB );
|
_updatePlacement( _placementLB );
|
||||||
|
|
||||||
cmess1 << " o Simple legalization." << endl;
|
cmess2 << " o Simple legalization." << endl;
|
||||||
auto snd_legalizer = region_distribution::uniform_density_distribution(_surface, _circuit, _placementLB);
|
auto snd_legalizer = region_distribution::uniform_density_distribution(_surface, _circuit, _placementLB);
|
||||||
get_rough_legalization( _circuit, _placementUB, snd_legalizer);
|
get_rough_legalization( _circuit, _placementUB, snd_legalizer);
|
||||||
|
|
||||||
|
@ -686,18 +677,18 @@ namespace Etesian {
|
||||||
targetImprovement = 0.05f; // 5/100 per iteration
|
targetImprovement = 0.05f; // 5/100 per iteration
|
||||||
}
|
}
|
||||||
else if(placementEffort == Standard){
|
else if(placementEffort == Standard){
|
||||||
minPenaltyIncrease = 0.003f;
|
minPenaltyIncrease = 0.001f;
|
||||||
maxPenaltyIncrease = 0.04f;
|
maxPenaltyIncrease = 0.04f;
|
||||||
targetImprovement = 0.02f; // 2/100 per iteration
|
targetImprovement = 0.02f; // 2/100 per iteration
|
||||||
}
|
}
|
||||||
else if(placementEffort == High){
|
else if(placementEffort == High){
|
||||||
minPenaltyIncrease = 0.001f;
|
minPenaltyIncrease = 0.0005f;
|
||||||
maxPenaltyIncrease = 0.02f;
|
maxPenaltyIncrease = 0.02f;
|
||||||
targetImprovement = 0.01f; // 1/100 per iteration
|
targetImprovement = 0.01f; // 1/100 per iteration
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
minPenaltyIncrease = 0.0002f;
|
minPenaltyIncrease = 0.0002f;
|
||||||
maxPenaltyIncrease = 0.015f;
|
maxPenaltyIncrease = 0.01f;
|
||||||
targetImprovement = 0.005f; // 5/1000 per iteration
|
targetImprovement = 0.005f; // 5/1000 per iteration
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -757,10 +748,11 @@ namespace Etesian {
|
||||||
) );
|
) );
|
||||||
currentDisruption = newDisruption;
|
currentDisruption = newDisruption;
|
||||||
linearDisruption = get_mean_linear_disruption(_circuit, _placementLB, _placementUB);
|
linearDisruption = get_mean_linear_disruption(_circuit, _placementLB, _placementUB);
|
||||||
|
cparanoid << " Pulling force: " << pullingForce << " Increase: " << penaltyIncrease << endl;
|
||||||
|
|
||||||
pullingForce += penaltyIncrease;
|
pullingForce += penaltyIncrease;
|
||||||
++i;
|
++i;
|
||||||
}while(linearDisruption >= 0.5 * sliceHeight and currentDisruption <= 0.95);
|
}while(linearDisruption >= 0.5 * sliceHeight and currentDisruption <= 0.9);
|
||||||
|
|
||||||
cmess1 << " o Detailed Placement." << endl;
|
cmess1 << " o Detailed Placement." << endl;
|
||||||
index_t detailedIterations;
|
index_t detailedIterations;
|
||||||
|
@ -796,12 +788,14 @@ namespace Etesian {
|
||||||
_updatePlacement( _placementUB );
|
_updatePlacement( _placementUB );
|
||||||
|
|
||||||
OSRP_convex_HPWL( _circuit, legalizer );
|
OSRP_convex_HPWL( _circuit, legalizer );
|
||||||
|
//OSRP_noncvx_RSMT( _circuit, legalizer );
|
||||||
coloquinte::dp::get_result( _circuit, legalizer, _placementUB );
|
coloquinte::dp::get_result( _circuit, legalizer, _placementUB );
|
||||||
_progressReport1( startTime, " Row Optimization" );
|
_progressReport1( startTime, " Row Optimization" );
|
||||||
if(placementUpdate == UpdateAll)
|
if(placementUpdate == UpdateAll)
|
||||||
_updatePlacement( _placementUB );
|
_updatePlacement( _placementUB );
|
||||||
|
|
||||||
swaps_row_convex_HPWL( _circuit, legalizer, 4 );
|
swaps_row_convex_HPWL( _circuit, legalizer, 4 );
|
||||||
|
//swaps_row_noncvx_RSMT( _circuit, legalizer, 4 );
|
||||||
coloquinte::dp::get_result( _circuit, legalizer, _placementUB );
|
coloquinte::dp::get_result( _circuit, legalizer, _placementUB );
|
||||||
_progressReport1( startTime, " Local Swaps ...." );
|
_progressReport1( startTime, " Local Swaps ...." );
|
||||||
if(placementUpdate <= LowerBound)
|
if(placementUpdate <= LowerBound)
|
||||||
|
@ -817,7 +811,7 @@ namespace Etesian {
|
||||||
}
|
}
|
||||||
_updatePlacement( _placementUB );
|
_updatePlacement( _placementUB );
|
||||||
|
|
||||||
cmess1 << " o Adding feed cells." << endl;
|
cmess2 << " o Adding feed cells." << endl;
|
||||||
addFeeds();
|
addFeeds();
|
||||||
|
|
||||||
cmess1 << " o Placement finished." << endl;
|
cmess1 << " o Placement finished." << endl;
|
||||||
|
@ -828,7 +822,7 @@ namespace Etesian {
|
||||||
cmess1 << ::Dots::asString
|
cmess1 << ::Dots::asString
|
||||||
( " - RMST", DbU::getValueString( (DbU::Unit)get_RSMT_wirelength(_circuit,_placementUB )*getPitch() ) ) << endl;
|
( " - RMST", DbU::getValueString( (DbU::Unit)get_RSMT_wirelength(_circuit,_placementUB )*getPitch() ) ) << endl;
|
||||||
|
|
||||||
_placed = false;
|
_placed = true;
|
||||||
#else
|
#else
|
||||||
cerr << Warning("Coloquinte library wasn't found, Etesian is disabled.") << endl;
|
cerr << Warning("Coloquinte library wasn't found, Etesian is disabled.") << endl;
|
||||||
#endif
|
#endif
|
||||||
|
@ -851,7 +845,8 @@ namespace Etesian {
|
||||||
cmess2 << label << elapsed.str()
|
cmess2 << label << elapsed.str()
|
||||||
<< " HPWL:" << coloquinte::gp::get_HPWL_wirelength( _circuit, _placementUB )
|
<< " HPWL:" << coloquinte::gp::get_HPWL_wirelength( _circuit, _placementUB )
|
||||||
<< " RMST:" << coloquinte::gp::get_RSMT_wirelength( _circuit, _placementUB )
|
<< " RMST:" << coloquinte::gp::get_RSMT_wirelength( _circuit, _placementUB )
|
||||||
<< "\n" << indent
|
<< endl;
|
||||||
|
cparanoid << indent
|
||||||
<< " Linear Disrupt.:" << coloquinte::gp::get_mean_linear_disruption ( _circuit, _placementLB, _placementUB )
|
<< " Linear Disrupt.:" << coloquinte::gp::get_mean_linear_disruption ( _circuit, _placementLB, _placementUB )
|
||||||
<< " Quad Disrupt.:" << coloquinte::gp::get_mean_quadratic_disruption( _circuit, _placementLB, _placementUB )
|
<< " Quad Disrupt.:" << coloquinte::gp::get_mean_quadratic_disruption( _circuit, _placementLB, _placementUB )
|
||||||
<< endl;
|
<< endl;
|
||||||
|
|
Loading…
Reference in New Issue