Skip to content

Commit be58ca3

Browse files
authored
Merge pull request #6530 from The-OpenROAD-Project-staging/gpl-binSize-float
Gpl: change bin size from int to float
2 parents 2a1d05c + 5844318 commit be58ca3

64 files changed

Lines changed: 27774 additions & 27714 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/gpl/src/fft.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
namespace gpl {
1616

17-
FFT::FFT(int binCntX, int binCntY, int binSizeX, int binSizeY)
17+
FFT::FFT(int binCntX, int binCntY, float binSizeX, float binSizeY)
1818
: binCntX_(binCntX),
1919
binCntY_(binCntY),
2020
binSizeX_(binSizeX),

src/gpl/src/fft.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace gpl {
1111
class FFT
1212
{
1313
public:
14-
FFT(int binCntX, int binCntY, int binSizeX, int binSizeY);
14+
FFT(int binCntX, int binCntY, float binSizeX, float binSizeY);
1515
~FFT();
1616

1717
// input func
@@ -50,8 +50,8 @@ class FFT
5050

5151
int binCntX_ = 0;
5252
int binCntY_ = 0;
53-
int binSizeX_ = 0;
54-
int binSizeY_ = 0;
53+
float binSizeX_ = 0;
54+
float binSizeY_ = 0;
5555
};
5656

5757
//

src/gpl/src/graphics.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,33 @@ bool Graphics::populateMap()
492492
return true;
493493
}
494494

495+
void Graphics::populateXYGrid()
496+
{
497+
BinGrid& grid = nbVec_[0]->getBinGrid();
498+
std::vector<Bin>& bin = grid.bins();
499+
int x_grid = grid.binCntX();
500+
int y_grid = grid.binCntY();
501+
502+
std::vector<int> x_grid_set, y_grid_set;
503+
x_grid_set.reserve(x_grid + 1);
504+
y_grid_set.reserve(y_grid + 1);
505+
506+
x_grid_set.push_back(bin[0].lx());
507+
y_grid_set.push_back(bin[0].ly());
508+
509+
for (int x = 0; x < x_grid && x < static_cast<int>(bin.size()); x++) {
510+
x_grid_set.push_back(bin[x].ux());
511+
}
512+
513+
for (int y = 0; y < y_grid; y++) {
514+
size_t index = static_cast<size_t>(y) * static_cast<size_t>(x_grid);
515+
if (index < bin.size()) {
516+
y_grid_set.push_back(bin[index].uy());
517+
}
518+
}
519+
setXYMapGrid(x_grid_set, y_grid_set);
520+
}
521+
495522
void Graphics::combineMapData(bool base_has_value,
496523
double& base,
497524
const double new_data,

src/gpl/src/graphics.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ class Graphics : public gui::Renderer, public gui::HeatMapDataSource
7979
double data_area,
8080
double intersection_area,
8181
double rect_area) override;
82+
void populateXYGrid() override;
8283

8384
// Is the GUI being displayed (true) or are we in batch mode (false)
8485
static bool guiActive();

src/gpl/src/nesterovBase.cpp

Lines changed: 28 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ namespace gpl {
3030
using odb::dbBlock;
3131
using utl::GPL;
3232

33-
static int fastModulo(int input, int ceil);
34-
3533
static float calculateBiVariateNormalCDF(biNormalParameters i);
3634

3735
static int64_t getOverlapArea(const Bin* bin,
@@ -692,12 +690,12 @@ int BinGrid::binCntY() const
692690
return binCntY_;
693691
}
694692

695-
int BinGrid::binSizeX() const
693+
double BinGrid::binSizeX() const
696694
{
697695
return binSizeX_;
698696
}
699697

700-
int BinGrid::binSizeY() const
698+
double BinGrid::binSizeY() const
701699
{
702700
return binSizeY_;
703701
}
@@ -800,8 +798,8 @@ void BinGrid::initBins()
800798
log_->info(
801799
GPL, 28, "{:21} {:7d} , {:6d}", "Bin count (X, Y):", binCntX_, binCntY_);
802800

803-
binSizeX_ = std::ceil(static_cast<float>((ux_ - lx_)) / binCntX_);
804-
binSizeY_ = std::ceil(static_cast<float>((uy_ - ly_)) / binCntY_);
801+
binSizeX_ = static_cast<double>((ux_ - lx_)) / binCntX_;
802+
binSizeY_ = static_cast<double>((uy_ - ly_)) / binCntY_;
805803

806804
log_->info(GPL,
807805
29,
@@ -815,13 +813,24 @@ void BinGrid::initBins()
815813
#pragma omp parallel for num_threads(num_threads_)
816814
for (int idxY = 0; idxY < binCntY_; ++idxY) {
817815
for (int idxX = 0; idxX < binCntX_; ++idxX) {
818-
const int x = lx_ + idxX * binSizeX_;
819-
const int y = ly_ + idxY * binSizeY_;
820-
const int sizeX = std::min(ux_ - x, binSizeX_);
821-
const int sizeY = std::min(uy_ - y, binSizeY_);
822-
823-
bins_[idxY * binCntX_ + idxX]
824-
= Bin(idxX, idxY, x, y, x + sizeX, y + sizeY, targetDensity_);
816+
const int bin_lx = lx_ + std::lround(idxX * binSizeX_);
817+
const int bin_ly = ly_ + std::lround(idxY * binSizeY_);
818+
const int bin_ux = lx_ + std::lround((idxX + 1) * binSizeX_);
819+
const int bin_uy = ly_ + std::lround((idxY + 1) * binSizeY_);
820+
const int bin_index = idxY * binCntX_ + idxX;
821+
bins_[bin_index]
822+
= Bin(idxX, idxY, bin_lx, bin_ly, bin_ux, bin_uy, targetDensity_);
823+
auto& bin = bins_[bin_index];
824+
if (bin.dx() < 0 || bin.dy() < 0) {
825+
log_->warn(GPL,
826+
34,
827+
"Bin (center: {},{}, index: {}) has negative size: {}, {}",
828+
bin.cx(),
829+
bin.cy(),
830+
bin_index,
831+
bin.dx(),
832+
bin.dy());
833+
}
825834
}
826835
}
827836

@@ -978,9 +987,7 @@ void BinGrid::updateBinsGCellDensityArea(const std::vector<GCellHandle>& cells)
978987
std::pair<int, int> BinGrid::getDensityMinMaxIdxX(const GCell* gcell) const
979988
{
980989
int lowerIdx = (gcell->dLx() - lx()) / binSizeX_;
981-
int upperIdx = (fastModulo((gcell->dUx() - lx()), binSizeX_) == 0)
982-
? (gcell->dUx() - lx()) / binSizeX_
983-
: (gcell->dUx() - lx()) / binSizeX_ + 1;
990+
int upperIdx = std::ceil((gcell->dUx() - lx()) / binSizeX_);
984991

985992
lowerIdx = std::max(lowerIdx, 0);
986993
upperIdx = std::min(upperIdx, binCntX_);
@@ -990,9 +997,7 @@ std::pair<int, int> BinGrid::getDensityMinMaxIdxX(const GCell* gcell) const
990997
std::pair<int, int> BinGrid::getDensityMinMaxIdxY(const GCell* gcell) const
991998
{
992999
int lowerIdx = (gcell->dLy() - ly()) / binSizeY_;
993-
int upperIdx = (fastModulo((gcell->dUy() - ly()), binSizeY_) == 0)
994-
? (gcell->dUy() - ly()) / binSizeY_
995-
: (gcell->dUy() - ly()) / binSizeY_ + 1;
1000+
int upperIdx = std::ceil((gcell->dUy() - ly()) / binSizeY_);
9961001

9971002
lowerIdx = std::max(lowerIdx, 0);
9981003
upperIdx = std::min(upperIdx, binCntY_);
@@ -1002,19 +1007,15 @@ std::pair<int, int> BinGrid::getDensityMinMaxIdxY(const GCell* gcell) const
10021007
std::pair<int, int> BinGrid::getMinMaxIdxX(const Instance* inst) const
10031008
{
10041009
int lowerIdx = (inst->lx() - lx()) / binSizeX_;
1005-
int upperIdx = (fastModulo((inst->ux() - lx()), binSizeX_) == 0)
1006-
? (inst->ux() - lx()) / binSizeX_
1007-
: (inst->ux() - lx()) / binSizeX_ + 1;
1010+
int upperIdx = std::ceil((inst->ux() - lx()) / binSizeX_);
10081011

10091012
return std::make_pair(std::max(lowerIdx, 0), std::min(upperIdx, binCntX_));
10101013
}
10111014

10121015
std::pair<int, int> BinGrid::getMinMaxIdxY(const Instance* inst) const
10131016
{
10141017
int lowerIdx = (inst->ly() - ly()) / binSizeY_;
1015-
int upperIdx = (fastModulo((inst->uy() - ly()), binSizeY_) == 0)
1016-
? (inst->uy() - ly()) / binSizeY_
1017-
: (inst->uy() - ly()) / binSizeY_ + 1;
1018+
int upperIdx = std::ceil((inst->uy() - ly()) / binSizeY_);
10181019

10191020
return std::make_pair(std::max(lowerIdx, 0), std::min(upperIdx, binCntY_));
10201021
}
@@ -1901,12 +1902,12 @@ int NesterovBase::binCntY() const
19011902
return bg_.binCntY();
19021903
}
19031904

1904-
int NesterovBase::binSizeX() const
1905+
double NesterovBase::binSizeX() const
19051906
{
19061907
return bg_.binSizeX();
19071908
}
19081909

1909-
int NesterovBase::binSizeY() const
1910+
double NesterovBase::binSizeY() const
19101911
{
19111912
return bg_.binSizeY();
19121913
}
@@ -3370,12 +3371,6 @@ void NesterovBaseCommon::printGPins()
33703371
}
33713372
}
33723373

3373-
// https://stackoverflow.com/questions/33333363/built-in-mod-vs-custom-mod-function-improve-the-performance-of-modulus-op
3374-
static int fastModulo(const int input, const int ceil)
3375-
{
3376-
return input >= ceil ? input % ceil : input;
3377-
}
3378-
33793374
static float getOverlapDensityArea(const Bin& bin, const GCell* cell)
33803375
{
33813376
const int rectLx = std::max(bin.lx(), cell->dLx());

src/gpl/src/nesterovBase.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -676,8 +676,8 @@ class BinGrid
676676

677677
int binCntX() const;
678678
int binCntY() const;
679-
int binSizeX() const;
680-
int binSizeY() const;
679+
double binSizeX() const;
680+
double binSizeY() const;
681681

682682
int64_t overflowArea() const;
683683
int64_t overflowAreaUnscaled() const;
@@ -704,8 +704,8 @@ class BinGrid
704704
int uy_ = 0;
705705
int binCntX_ = 0;
706706
int binCntY_ = 0;
707-
int binSizeX_ = 0;
708-
int binSizeY_ = 0;
707+
double binSizeX_ = 0;
708+
double binSizeY_ = 0;
709709
float targetDensity_ = 0;
710710
int64_t sumOverflowArea_ = 0;
711711
int64_t sumOverflowAreaUnscaled_ = 0;
@@ -924,8 +924,8 @@ class NesterovBase
924924

925925
int binCntX() const;
926926
int binCntY() const;
927-
int binSizeX() const;
928-
int binSizeY() const;
927+
double binSizeX() const;
928+
double binSizeY() const;
929929
int64_t overflowArea() const;
930930
int64_t overflowAreaUnscaled() const;
931931

src/gpl/src/nesterovPlace.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,11 @@ int NesterovPlace::doNesterovPlace(int start_iter)
339339
}
340340

341341
if (num_region_diverged_ > 0) {
342-
divergeMsg_ = "RePlAce diverged at newStepLength.";
342+
divergeMsg_
343+
= "RePlAce diverged during gradient descent calculation, resulting "
344+
"in an invalid step length (Inf or NaN). This is often caused by "
345+
"numerical instability or high placement density. Consider "
346+
"reducing placement density to potentially resolve the issue.";
343347
divergeCode_ = 305;
344348
break;
345349
}

0 commit comments

Comments
 (0)