@@ -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+
722746dbOStream& 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+
16071730Rect dbBlock::findConstraintRegion (const Direction2D& edge, int begin, int end)
16081731{
16091732 Rect constraint_region;
0 commit comments