@@ -30,8 +30,6 @@ namespace gpl {
3030using odb::dbBlock;
3131using utl::GPL ;
3232
33- static int fastModulo (int input, int ceil);
34-
3533static float calculateBiVariateNormalCDF (biNormalParameters i);
3634
3735static 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)
978987std::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
990997std::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
10021007std::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
10121015std::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-
33793374static float getOverlapDensityArea (const Bin& bin, const GCell* cell)
33803375{
33813376 const int rectLx = std::max (bin.lx (), cell->dLx ());
0 commit comments