#pragma once #include "GRSetting.h" #include "GrNet.h" #include "common/common.h" #include "common/db/Database.h" #include "io_parser/gp/GPDatabase.h" namespace gr { enum class AggrParaRunSpace { DEFAULT, LARGER_WIDTH, LARGER_LENGTH }; class RectOnLayer { public: int layer = -1; int lx, ly, hx, hy; RectOnLayer() {} RectOnLayer(const int layer_, const int lx_, const int ly_, const int hx_, const int hy_) : layer(layer_), lx(lx_), ly(ly_), hx(hx_), hy(hy_) {} int getDirRange(unsigned i) { return (i == 0) ? hx - lx : hy - ly; } }; // class GRNet { // std::vector>> global_pins; // std::vector> pins; // GCell locations // }; class GRDatabase { public: db::Database& rawdb; gp::GPDatabase& gpdb; // GR Obstacle std::vector fixObs; std::vector movObs; // for movable nodes std::vector> tracks; // Metal Layer std::vector layerWidth; std::vector layerPitch; std::vector defaultSpacing; std::vector maxEOLSpacingVec; // from all spacing types std::vector maxEOLWidthVec; // from all spacing types // Design int nLayers; int xSize; int ySize; int nMaxGrid; int gridGraphSize; int m1direction; // layer 0 direction, 'v': 1, 'h': 0 double m2pitch; int microns; int mainGcellStepX, mainGcellStepY; std::vector> gridlines; std::vector> gridCenters; int ISPD19 = 0; int ISPD18 = 0; int METAL5 = 0; int csrnScale = 0; int cgxsize, cgysize; // GR variables std::vector capacity, wireDist; // init once std::vector fixTmpUsage, fixTmpLength; // init once std::vector movTmpUsage, movTmpLength; // update dynamically std::vector fixedUsage, fixedLength; // variables for GR std::vector grNets; std::vector gpdbPinId2gbPinId; GRDatabase(std::shared_ptr rawdb_, std::shared_ptr gpdb_); ~GRDatabase(); void setupCapacity(); void setupCapacityBookshelf(); void setupWireDist(); void addFixObs(); void addMovObs(); void updateUsageLength(); void setupObs(); void setupGrNets(); void resetGrNetsRoute(); void resetGrNets() { grNets.clear(); }; std::pair reportGRStat(); void writeGuides(std::string outputFile); int encodeId(int l, int x, int y); std::tuple getOrientOffset(int orient, int lx, int ly, int hx, int hy); int getEOLSpace(int width, int l); int getParallelRunSpace(int l, int width, int length); utils::PointT getObsMargin(RectOnLayer box, AggrParaRunSpace aggr); utils::IntervalT rangeSearchTracks(const utils::IntervalT& locRange, int layerIdx); void markObs(std::vector& allObs, std::vector& wireUsage, std::vector& wireTotalLength); void markObsBookShelf(std::vector& allObs, std::vector& wireUsage, std::vector& wireTotalLength); void addCellObs(std::vector& allObs, db::Cell* cell); }; } // namespace gr