Skip to content

Commit 84d8666

Browse files
authored
Merge pull request #7108 from eder-matheus/ppl_top_layer_grid
ppl: move top layer grid definition to odb
2 parents a5f487c + 36e6d61 commit 84d8666

32 files changed

Lines changed: 473 additions & 266 deletions

src/odb/include/odb/db.h

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -892,6 +892,26 @@ class dbBlock : public dbObject
892892
std::vector<dbBTerm*> bterms;
893893
bool order = false;
894894
};
895+
896+
struct dbBTermTopLayerGrid
897+
{
898+
// The single top-most routing layer of the placement grid.
899+
dbTechLayer* layer = nullptr;
900+
// The distance between each valid position on the grid in the x- and
901+
// y-directions, respectively.
902+
int x_step = 0;
903+
int y_step = 0;
904+
// The region of the placement grid.
905+
Polygon region;
906+
// The width and height of the pins assigned to this grid. The centers of
907+
// the pins are placed on the grid positions.
908+
int pin_width = 0;
909+
int pin_height = 0;
910+
// The boundary around existing routing obstructions that the pins should
911+
// avoid.
912+
int keepout = 0;
913+
};
914+
895915
///
896916
/// Get block chip name.
897917
///
@@ -971,6 +991,21 @@ class dbBlock : public dbObject
971991
///
972992
void addBTermGroup(const std::vector<dbBTerm*>& bterms, bool order);
973993

994+
///
995+
/// Define the top layer grid for pin placement.
996+
///
997+
void setBTermTopLayerGrid(const dbBTermTopLayerGrid& top_layer_grid);
998+
999+
///
1000+
/// Get the top layer grid for pin placement.
1001+
///
1002+
std::optional<dbBTermTopLayerGrid> getBTermTopLayerGrid();
1003+
1004+
///
1005+
/// Get only the polygon corresponding to the top layer grid region.
1006+
///
1007+
Polygon getBTermTopLayerGridRegion();
1008+
9741009
///
9751010
/// Find the rectangle corresponding to the constraint region in a specific
9761011
/// edge of the die area.

src/odb/include/odb/util.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ class dbBlock;
1919
class dbBox;
2020
class dbDatabase;
2121
class dbNet;
22+
class dbTechLayer;
23+
class Rect;
24+
class Polygon;
2225

2326
// A class that implements an array that can grow efficiently
2427
template <class T>
@@ -207,6 +210,15 @@ void cutRows(dbBlock* block,
207210
// individual macro placement
208211
std::string generateMacroPlacementString(dbBlock* block);
209212

213+
void set_bterm_top_layer_grid(dbBlock* block,
214+
dbTechLayer* layer,
215+
int x_step,
216+
int y_step,
217+
Rect region,
218+
int width,
219+
int height,
220+
int keepout);
221+
210222
class WireLengthEvaluator
211223
{
212224
public:

src/odb/src/db/dbBlock.cpp

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -719,6 +719,30 @@ dbIStream& operator>>(dbIStream& stream, _dbBTermGroup& obj)
719719
return stream;
720720
}
721721

722+
dbOStream& operator<<(dbOStream& stream, const _dbBTermTopLayerGrid& obj)
723+
{
724+
stream << obj.layer;
725+
stream << obj.x_step;
726+
stream << obj.y_step;
727+
stream << obj.region;
728+
stream << obj.pin_width;
729+
stream << obj.pin_height;
730+
stream << obj.keepout;
731+
return stream;
732+
}
733+
734+
dbIStream& operator>>(dbIStream& stream, _dbBTermTopLayerGrid& obj)
735+
{
736+
stream >> obj.layer;
737+
stream >> obj.x_step;
738+
stream >> obj.y_step;
739+
stream >> obj.region;
740+
stream >> obj.pin_width;
741+
stream >> obj.pin_height;
742+
stream >> obj.keepout;
743+
return stream;
744+
}
745+
722746
dbOStream& operator<<(dbOStream& stream, const _dbBlock& block)
723747
{
724748
std::list<dbBlockCallBackObj*>::const_iterator cbitr;
@@ -840,6 +864,9 @@ dbOStream& operator<<(dbOStream& stream, const _dbBlock& block)
840864
if (db->isSchema(db_schema_block_pin_groups)) {
841865
stream << block._bterm_groups;
842866
}
867+
if (db->isSchema(db_schema_bterm_top_layer_grid)) {
868+
stream << block._bterm_top_layer_grid;
869+
}
843870

844871
//---------------------------------------------------------- stream out
845872
// properties
@@ -1012,6 +1039,9 @@ dbIStream& operator>>(dbIStream& stream, _dbBlock& block)
10121039
if (db->isSchema(db_schema_block_pin_groups)) {
10131040
stream >> block._bterm_groups;
10141041
}
1042+
if (db->isSchema(db_schema_bterm_top_layer_grid)) {
1043+
stream >> block._bterm_top_layer_grid;
1044+
}
10151045

10161046
//---------------------------------------------------------- stream in
10171047
// properties
@@ -1604,6 +1634,99 @@ void dbBlock::addBTermGroup(const std::vector<dbBTerm*>& bterms, bool order)
16041634
block->_bterm_groups.push_back(std::move(group));
16051635
}
16061636

1637+
void dbBlock::setBTermTopLayerGrid(
1638+
const dbBlock::dbBTermTopLayerGrid& top_layer_grid)
1639+
{
1640+
_dbBlock* block = (_dbBlock*) this;
1641+
_dbBTermTopLayerGrid& top_grid = block->_bterm_top_layer_grid;
1642+
1643+
utl::Logger* logger = block->getImpl()->getLogger();
1644+
const odb::Rect& die_area = getDieArea();
1645+
1646+
if (!die_area.contains(top_layer_grid.region.getEnclosingRect())) {
1647+
logger->error(
1648+
utl::ODB, 124, "Top layer grid region is out of the die area.");
1649+
}
1650+
1651+
if (top_layer_grid.x_step <= 0) {
1652+
logger->error(
1653+
utl::ODB,
1654+
500,
1655+
"The x_step for the top layer grid must be greater than zero.");
1656+
}
1657+
if (top_layer_grid.y_step <= 0) {
1658+
logger->error(
1659+
utl::ODB,
1660+
501,
1661+
"The y_step for the top layer grid must be greater than zero.");
1662+
}
1663+
if (top_layer_grid.pin_width <= 0) {
1664+
logger->error(
1665+
utl::ODB,
1666+
502,
1667+
"The pin width for the top layer grid must be greater than zero.");
1668+
}
1669+
if (top_layer_grid.pin_height <= 0) {
1670+
logger->error(
1671+
utl::ODB,
1672+
503,
1673+
"The pin height for the top layer grid must be greater than zero.");
1674+
}
1675+
if (top_layer_grid.keepout <= 0) {
1676+
logger->error(
1677+
utl::ODB,
1678+
504,
1679+
"The pin keepout for the top layer grid must be greater than zero.");
1680+
}
1681+
1682+
top_grid.layer = top_layer_grid.layer->getId();
1683+
top_grid.x_step = top_layer_grid.x_step;
1684+
top_grid.y_step = top_layer_grid.y_step;
1685+
top_grid.region = top_layer_grid.region;
1686+
top_grid.pin_width = top_layer_grid.pin_width;
1687+
top_grid.pin_height = top_layer_grid.pin_height;
1688+
top_grid.keepout = top_layer_grid.keepout;
1689+
}
1690+
1691+
std::optional<dbBlock::dbBTermTopLayerGrid> dbBlock::getBTermTopLayerGrid()
1692+
{
1693+
_dbBlock* block = (_dbBlock*) this;
1694+
1695+
dbBlock::dbBTermTopLayerGrid top_layer_grid;
1696+
1697+
odb::dbTech* tech = getDb()->getTech();
1698+
if (block->_bterm_top_layer_grid.region.getPoints().empty()) {
1699+
return std::nullopt;
1700+
}
1701+
1702+
top_layer_grid.layer = odb::dbTechLayer::getTechLayer(
1703+
tech, block->_bterm_top_layer_grid.layer);
1704+
top_layer_grid.x_step = block->_bterm_top_layer_grid.x_step;
1705+
top_layer_grid.y_step = block->_bterm_top_layer_grid.y_step;
1706+
top_layer_grid.region = block->_bterm_top_layer_grid.region;
1707+
top_layer_grid.pin_width = block->_bterm_top_layer_grid.pin_width;
1708+
top_layer_grid.pin_height = block->_bterm_top_layer_grid.pin_height;
1709+
top_layer_grid.keepout = block->_bterm_top_layer_grid.keepout;
1710+
1711+
return top_layer_grid;
1712+
}
1713+
1714+
Polygon dbBlock::getBTermTopLayerGridRegion()
1715+
{
1716+
_dbBlock* block = (_dbBlock*) this;
1717+
1718+
const Polygon& region = block->_bterm_top_layer_grid.region;
1719+
if (region.getPoints().empty()) {
1720+
utl::Logger* logger = block->getImpl()->getLogger();
1721+
logger->error(utl::ODB,
1722+
428,
1723+
"Cannot get top layer grid region. Pin placement grid on top "
1724+
"layer not created.");
1725+
}
1726+
1727+
return region;
1728+
}
1729+
16071730
Rect dbBlock::findConstraintRegion(const Direction2D& edge, int begin, int end)
16081731
{
16091732
Rect constraint_region;

src/odb/src/db/dbBlock.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,17 @@ struct _dbBTermGroup
125125
bool order = false;
126126
};
127127

128+
struct _dbBTermTopLayerGrid
129+
{
130+
dbId<_dbTechLayer> layer;
131+
int x_step = 0;
132+
int y_step = 0;
133+
Polygon region;
134+
int pin_width = 0;
135+
int pin_height = 0;
136+
int keepout = 0;
137+
};
138+
128139
class _dbBlock : public _dbObject
129140
{
130141
public:
@@ -182,6 +193,7 @@ class _dbBlock : public _dbObject
182193
int _min_layer_for_clock;
183194
int _max_layer_for_clock;
184195
std::vector<_dbBTermGroup> _bterm_groups;
196+
_dbBTermTopLayerGrid _bterm_top_layer_grid;
185197

186198
// NON-PERSISTANT-STREAMED-MEMBERS
187199
dbTable<_dbBTerm>* _bterm_tbl;
@@ -309,4 +321,7 @@ dbIStream& operator>>(dbIStream& stream, _dbBlock& block);
309321
dbOStream& operator<<(dbOStream& stream, const _dbBTermGroup& obj);
310322
dbIStream& operator>>(dbIStream& stream, _dbBTermGroup& obj);
311323

324+
dbOStream& operator<<(dbOStream& stream, const _dbBTermTopLayerGrid& obj);
325+
dbIStream& operator>>(dbIStream& stream, _dbBTermTopLayerGrid& obj);
326+
312327
} // namespace odb

src/odb/src/db/dbDatabase.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ namespace odb {
4343
const uint db_schema_major = 0; // Not used...
4444
const uint db_schema_initial = 57;
4545

46-
const uint db_schema_minor = 106; // Current revision number
46+
const uint db_schema_minor = 107; // Current revision number
47+
48+
// Revision where dbBTerm top layer grid was added to dbBlock
49+
const uint db_schema_bterm_top_layer_grid = 107;
4750

4851
// Revision where die area is converted to a polygon
4952
const uint db_schema_die_area_is_polygon = 106;

src/odb/src/swig/common/odb.i

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,11 @@ using namespace odb;
7575
%include "odb/wOrder.h"
7676

7777
std::string generateMacroPlacementString(odb::dbBlock* block);
78-
78+
void set_bterm_top_layer_grid(odb::dbBlock* block,
79+
odb::dbTechLayer* layer,
80+
int x_step,
81+
int y_step,
82+
odb::Rect region,
83+
int width,
84+
int height,
85+
int keepout);

0 commit comments

Comments
 (0)