Xplace_for_ICCAD/cpp_to_py/common/db/SiteMap.cpp
2022-10-20 22:46:17 +08:00

79 lines
2.7 KiB
C++

#include "Database.h"
using namespace db;
/***** SiteMap *****/
void SiteMap::initSiteMap(unsigned nx, unsigned ny) {
this->nx = nx;
this->ny = ny;
sites.resize(nx, vector<unsigned char>(ny));
regions.resize(nx, vector<unsigned char>(ny));
}
void SiteMap::getSiteBound(int x, int y, int &lx, int &ly, int &hx, int &hy) const {
lx = siteL + x * siteStepX;
ly = siteB + y * siteStepY;
hx = lx + siteStepX;
hy = ly + siteStepY;
}
void SiteMap::blockRegion(const unsigned x, const unsigned y) { regions[x][y] = Region::InvalidRegion; }
void SiteMap::setSites(int lx, int ly, int hx, int hy, unsigned char property, bool isContained) {
int slx = 0;
int sly = 0;
int shx = 0;
int shy = 0;
if (isContained) {
slx = binContainedL(lx, siteL, siteR, siteStepX);
sly = binContainedL(ly, siteB, siteT, siteStepY);
shx = binContainedR(hx, siteL, siteR, siteStepX);
shy = binContainedR(hy, siteB, siteT, siteStepY);
} else {
slx = binOverlappedL(lx, siteL, siteR, siteStepX);
sly = binOverlappedL(ly, siteB, siteT, siteStepY);
shx = binOverlappedR(hx, siteL, siteR, siteStepX);
shy = binOverlappedR(hy, siteB, siteT, siteStepY);
}
for (int x = slx; x <= shx; ++x) {
for (int y = sly; y <= shy; ++y) {
setSiteMap(x, y, property);
}
}
}
void SiteMap::unsetSites(int lx, int ly, int hx, int hy, unsigned char property) {
const int slx = binOverlappedL(lx, siteL, siteR, siteStepX);
const int sly = binOverlappedL(ly, siteB, siteT, siteStepY);
const int shx = binOverlappedR(hx, siteL, siteR, siteStepX);
const int shy = binOverlappedR(hy, siteB, siteT, siteStepY);
for (int x = slx; x <= shx; ++x) {
for (int y = sly; y <= shy; ++y) {
unsetSiteMap(x, y, property);
}
}
}
void SiteMap::blockRegion(int lx, int ly, int hx, int hy) {
int slx = binOverlappedL(lx, siteL, siteR, siteStepX);
int sly = binOverlappedL(ly, siteB, siteT, siteStepY);
int shx = binOverlappedR(hx, siteL, siteR, siteStepX);
int shy = binOverlappedR(hy, siteB, siteT, siteStepY);
for (int x = slx; x <= shx; x++) {
for (int y = sly; y <= shy; y++) {
setRegion(x, y, Region::InvalidRegion);
}
}
}
void SiteMap::setRegion(int lx, int ly, int hx, int hy, unsigned char region) {
int slx = binContainedL(lx, siteL, siteR, siteStepX);
int sly = binContainedL(ly, siteB, siteT, siteStepY);
int shx = binContainedR(hx, siteL, siteR, siteStepX);
int shy = binContainedR(hy, siteB, siteT, siteStepY);
for (int x = slx; x <= shx; x++) {
for (int y = sly; y <= shy; y++) {
setRegion(x, y, region);
}
}
}