Etesian adjustements, patch contributed by G. Gouvine.

This commit is contained in:
Jean-Paul Chaput 2015-03-24 10:40:53 +01:00
parent 1e73466199
commit 1aa416e82a
1 changed files with 22 additions and 27 deletions

View File

@ -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
} }
@ -713,7 +704,7 @@ namespace Etesian {
// Get the system to optimize (tolerance, maximum and minimum pin counts) // Get the system to optimize (tolerance, maximum and minimum pin counts)
// and the pulling forces (threshold distance) // and the pulling forces (threshold distance)
auto solv = get_HPWLF_linear_system ( _circuit, _placementLB, 0.5 * sliceHeight, 2, 100000 ) auto solv = get_HPWLF_linear_system ( _circuit, _placementLB, 0.5 * sliceHeight, 2, 100000 )
+ get_linear_pulling_forces( _circuit, _placementUB, _placementLB, pullingForce, 2.0f * linearDisruption); + get_linear_pulling_forces( _circuit, _placementUB, _placementLB, pullingForce, 2.0f * linearDisruption);
solve_linear_system( _circuit, _placementLB, solv, 400 ); // number of iterations solve_linear_system( _circuit, _placementLB, solv, 400 ); // number of iterations
_progressReport2( startTime, " Linear." ); _progressReport2( startTime, " Linear." );
@ -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;