Xplace_for_ICCAD/cpp_to_py/common/db/SiteMap.cpp

96 lines
3.2 KiB
C++
Raw Normal View History

#include "SiteMap.h"
#include "DatabaseClass.h"
#include "Region.h"
#include "common/utils/utils.h"
2022-10-20 22:46:17 +08:00
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::setSiteMap(const unsigned x, const unsigned y, const unsigned char property) {
setBit(sites[x][y], property);
}
void SiteMap::unsetSiteMap(const unsigned x, const unsigned y, const unsigned char property) {
unsetBit(sites[x][y], property);
}
bool SiteMap::getSiteMap(const unsigned x, const unsigned y, const unsigned char property) const {
return (getBit(sites[x][y], property) == property);
}
2022-10-20 22:46:17 +08:00
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);
}
}
}