Skip to content

Commit 6be0801

Browse files
committed
ifp: Add -gap option to make_rows and initialize_floorplan to specify space between power domains.
Also remove unused 2 args makeRows private prototype. Signed-off-by: Christian COSTA <[email protected]>
1 parent 2ef561b commit 6be0801

File tree

4 files changed

+76
-36
lines changed

4 files changed

+76
-36
lines changed

src/ifp/include/ifp/InitFloorplan.hh

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ class InitFloorplan
5050
odb::dbSite* base_site,
5151
const std::vector<odb::dbSite*>& additional_sites = {},
5252
RowParity row_parity = RowParity::NONE,
53-
const std::set<odb::dbSite*>& flipped_sites = {});
53+
const std::set<odb::dbSite*>& flipped_sites = {},
54+
int gap = -1);
5455

5556
// The base_site determines the single-height rows. For hybrid rows it is
5657
// a site containing a row pattern.
@@ -59,7 +60,8 @@ class InitFloorplan
5960
odb::dbSite* base_site,
6061
const std::vector<odb::dbSite*>& additional_sites = {},
6162
RowParity row_parity = RowParity::NONE,
62-
const std::set<odb::dbSite*>& flipped_sites = {});
63+
const std::set<odb::dbSite*>& flipped_sites = {},
64+
int gap = -1);
6365

6466
void insertTiecells(odb::dbMTerm* tie_term,
6567
const std::string& prefix = "TIEOFF_");
@@ -89,22 +91,25 @@ class InitFloorplan
8991
const std::vector<odb::dbSite*>& additional_sites
9092
= {},
9193
RowParity row_parity = RowParity::NONE,
92-
const std::set<odb::dbSite*>& flipped_sites = {});
94+
const std::set<odb::dbSite*>& flipped_sites = {},
95+
int gap = -1);
9396

9497
// The base_site determines the single-height rows. For hybrid rows it is
9598
// a site containing a row pattern.
9699
void makeRows(const odb::Rect& core,
97100
odb::dbSite* base_site,
98101
const std::vector<odb::dbSite*>& additional_sites = {},
99102
RowParity row_parity = RowParity::NONE,
100-
const std::set<odb::dbSite*>& flipped_sites = {});
103+
const std::set<odb::dbSite*>& flipped_sites = {},
104+
int gap = -1);
101105

102106
// Create rows for a polygon core area using true polygon-aware generation
103107
void makePolygonRows(const odb::Polygon& core_polygon,
104108
odb::dbSite* base_site,
105109
const std::vector<odb::dbSite*>& additional_sites = {},
106110
RowParity row_parity = RowParity::NONE,
107-
const std::set<odb::dbSite*>& flipped_sites = {});
111+
const std::set<odb::dbSite*>& flipped_sites = {},
112+
int gap = -1);
108113

109114
void makeTracks();
110115
void makeTracks(odb::dbTechLayer* layer,
@@ -127,7 +132,6 @@ class InitFloorplan
127132

128133
double designArea();
129134
void checkInstanceDimensions(const odb::Rect& core) const;
130-
void makeRows(const odb::dbSite::RowPattern& pattern, const odb::Rect& core);
131135
void makeUniformRows(odb::dbSite* base_site,
132136
const SitesByName& sites_by_name,
133137
const odb::Rect& core,
@@ -142,7 +146,11 @@ class InitFloorplan
142146
void makeTracks(const char* tracks_file, odb::Rect& die_area);
143147
void autoPlacePins(odb::dbTechLayer* pin_layer, odb::Rect& core);
144148
int snapToMfgGrid(int coord) const;
145-
void updateVoltageDomain(int core_lx, int core_ly, int core_ux, int core_uy);
149+
void updateVoltageDomain(int core_lx,
150+
int core_ly,
151+
int core_ux,
152+
int core_uy,
153+
int gap);
146154
void addUsedSites(std::map<std::string, odb::dbSite*>& sites_by_name) const;
147155

148156
// Private methods for polygon-aware row generation using scanline
@@ -151,7 +159,8 @@ class InitFloorplan
151159
odb::dbSite* base_site,
152160
const SitesByName& sites_by_name,
153161
RowParity row_parity,
154-
const std::set<odb::dbSite*>& flipped_sites);
162+
const std::set<odb::dbSite*>& flipped_sites,
163+
int gap);
155164

156165
std::vector<odb::Rect> intersectRowWithPolygon(const odb::Rect& row,
157166
const odb::Polygon& polygon);

src/ifp/src/InitFloorplan.cc

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ void InitFloorplan::initFloorplan(
9898
odb::dbSite* base_site,
9999
const std::vector<odb::dbSite*>& additional_sites,
100100
RowParity row_parity,
101-
const std::set<odb::dbSite*>& flipped_sites)
101+
const std::set<odb::dbSite*>& flipped_sites,
102+
const int gap)
102103
{
103104
makeDieUtilization(utilization,
104105
aspect_ratio,
@@ -113,7 +114,8 @@ void InitFloorplan::initFloorplan(
113114
base_site,
114115
additional_sites,
115116
row_parity,
116-
flipped_sites);
117+
flipped_sites,
118+
gap);
117119
}
118120

119121
// The base_site determines the single-height rows. For hybrid rows it is
@@ -124,10 +126,11 @@ void InitFloorplan::initFloorplan(
124126
odb::dbSite* base_site,
125127
const std::vector<odb::dbSite*>& additional_sites,
126128
RowParity row_parity,
127-
const std::set<odb::dbSite*>& flipped_sites)
129+
const std::set<odb::dbSite*>& flipped_sites,
130+
const int gap)
128131
{
129132
makeDie(die);
130-
makeRows(core, base_site, additional_sites, row_parity, flipped_sites);
133+
makeRows(core, base_site, additional_sites, row_parity, flipped_sites, gap);
131134
}
132135

133136
void InitFloorplan::makeDieUtilization(double utilization,
@@ -206,7 +209,8 @@ void InitFloorplan::makePolygonRows(
206209
odb::dbSite* base_site,
207210
const std::vector<odb::dbSite*>& additional_sites,
208211
RowParity row_parity,
209-
const std::set<odb::dbSite*>& flipped_sites)
212+
const std::set<odb::dbSite*>& flipped_sites,
213+
const int gap)
210214
{
211215
auto points = core_polygon.getPoints();
212216

@@ -271,7 +275,7 @@ void InitFloorplan::makePolygonRows(
271275

272276
// Use the new scanline-based approach
273277
makePolygonRowsScanline(
274-
core_poly, base_site, sites_by_name, row_parity, flipped_sites);
278+
core_poly, base_site, sites_by_name, row_parity, flipped_sites, gap);
275279

276280
logger_->info(IFP,
277281
997,
@@ -337,7 +341,8 @@ void InitFloorplan::makeRowsWithSpacing(
337341
odb::dbSite* base_site,
338342
const std::vector<odb::dbSite*>& additional_sites,
339343
RowParity row_parity,
340-
const std::set<odb::dbSite*>& flipped_sites)
344+
const std::set<odb::dbSite*>& flipped_sites,
345+
const int gap)
341346
{
342347
odb::Rect block_die_area = block_->getDieArea();
343348
if (block_die_area.area() == 0) {
@@ -365,14 +370,16 @@ void InitFloorplan::makeRowsWithSpacing(
365370
base_site,
366371
additional_sites,
367372
row_parity,
368-
flipped_sites);
373+
flipped_sites,
374+
gap);
369375
}
370376

371377
void InitFloorplan::makeRows(const odb::Rect& core,
372378
odb::dbSite* base_site,
373379
const std::vector<odb::dbSite*>& additional_sites,
374380
RowParity row_parity,
375-
const std::set<odb::dbSite*>& flipped_sites)
381+
const std::set<odb::dbSite*>& flipped_sites,
382+
const int gap)
376383
{
377384
odb::Rect block_die_area = block_->getDieArea();
378385
if (block_die_area.area() == 0) {
@@ -444,7 +451,7 @@ void InitFloorplan::makeRows(const odb::Rect& core,
444451
base_site, sites_by_name, snapped_core, row_parity, flipped_sites);
445452
}
446453

447-
updateVoltageDomain(clx, cly, cux, cuy);
454+
updateVoltageDomain(clx, cly, cux, cuy, gap);
448455
}
449456

450457
std::vector<dbBox*> blockage_bboxes;
@@ -465,7 +472,8 @@ void InitFloorplan::makeRows(const odb::Rect& core,
465472
void InitFloorplan::updateVoltageDomain(const int core_lx,
466473
const int core_ly,
467474
const int core_ux,
468-
const int core_uy)
475+
const int core_uy,
476+
const int gap)
469477
{
470478
// checks if a group is defined as a voltage domain, if so it creates a region
471479
for (dbGroup* group : block_->getGroups()) {
@@ -513,8 +521,8 @@ void InitFloorplan::updateVoltageDomain(const int core_lx,
513521
min_site_dx = site_dx;
514522
}
515523
}
516-
// Space is 6 times the minimum site height
517-
const int power_domain_y_space = 6 * min_site_dy;
524+
// Default space is 6 times the minimum site height
525+
const int power_domain_y_space = (gap == -1) ? 6 * min_site_dy : gap;
518526

519527
row_itr = rows.begin();
520528
for (int row_processed = 0; row_processed < total_row_count;
@@ -1081,7 +1089,8 @@ void InitFloorplan::makePolygonRowsScanline(
10811089
odb::dbSite* base_site,
10821090
const SitesByName& sites_by_name,
10831091
RowParity row_parity,
1084-
const std::set<odb::dbSite*>& flipped_sites)
1092+
const std::set<odb::dbSite*>& flipped_sites,
1093+
const int gap)
10851094
{
10861095
// Get the bounding box for the polygon
10871096
odb::Rect core_bbox = core_polygon.getEnclosingRect();
@@ -1136,7 +1145,7 @@ void InitFloorplan::makePolygonRowsScanline(
11361145
site, core_polygon, snapped_bbox, row_parity, flipped_sites);
11371146
}
11381147

1139-
updateVoltageDomain(clx, cly, cux, cuy);
1148+
updateVoltageDomain(clx, cly, cux, cuy, gap);
11401149
}
11411150

11421151
// Handle blockages as usual

src/ifp/src/InitFloorplan.i

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@ make_rows_with_spacing(ord::Design* design,
131131
odb::dbSite* site,
132132
const std::vector<odb::dbSite*>& additional_sites,
133133
ifp::RowParity row_parity,
134-
const std::vector<odb::dbSite*>& flipped_sites)
134+
const std::vector<odb::dbSite*>& flipped_sites,
135+
const int gap)
135136
{
136137
std::set<odb::dbSite*> flipped_sites_set(flipped_sites.begin(),
137138
flipped_sites.end());
@@ -140,7 +141,8 @@ make_rows_with_spacing(ord::Design* design,
140141
site,
141142
additional_sites,
142143
row_parity,
143-
flipped_sites_set);
144+
flipped_sites_set,
145+
gap);
144146
}
145147

146148
void
@@ -152,7 +154,8 @@ make_rows(ord::Design* design,
152154
odb::dbSite* site,
153155
const std::vector<odb::dbSite*>& additional_sites,
154156
ifp::RowParity row_parity,
155-
const std::vector<odb::dbSite*>& flipped_sites)
157+
const std::vector<odb::dbSite*>& flipped_sites,
158+
const int gap)
156159
{
157160

158161
std::set<odb::dbSite*> flipped_sites_set(flipped_sites.begin(),
@@ -161,7 +164,8 @@ make_rows(ord::Design* design,
161164
site,
162165
additional_sites,
163166
row_parity,
164-
flipped_sites_set);
167+
flipped_sites_set,
168+
gap);
165169
}
166170

167171
void
@@ -198,12 +202,13 @@ void make_polygon_rows_simple(ord::Design* design,
198202
odb::dbSite* base_site,
199203
const std::vector<odb::dbSite*>& additional_sites,
200204
ifp::RowParity row_parity,
201-
const std::vector<odb::dbSite*>& flipped_sites)
205+
const std::vector<odb::dbSite*>& flipped_sites,
206+
const int gap)
202207
{
203208
odb::Polygon polygon(core_polygon);
204209
std::set<odb::dbSite*> flipped_sites_set(flipped_sites.begin(),
205210
flipped_sites.end());
206-
design->getFloorplan().makePolygonRows(polygon, base_site, additional_sites, row_parity, flipped_sites_set);
211+
design->getFloorplan().makePolygonRows(polygon, base_site, additional_sites, row_parity, flipped_sites_set, gap);
207212
}
208213

209214
} // namespace

src/ifp/src/InitFloorplan.tcl

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ sta::define_cmd_args "initialize_floorplan" {[-utilization util]\
99
[-additional_sites site_names]\
1010
[-site site_name]\
1111
[-row_parity NONE|ODD|EVEN]\
12-
[-flip_sites site_names]}
12+
[-flip_sites site_names]\
13+
[-gap space]}
1314

1415
proc initialize_floorplan { args } {
1516
sta::parse_key_args "initialize_floorplan" args \
1617
keys {-utilization -aspect_ratio -core_space \
1718
-die_area -core_area \
18-
-site -additional_sites -row_parity -flip_sites} \
19+
-site -additional_sites -row_parity -flip_sites -gap} \
1920
flags {}
2021

2122
# Existing validation
@@ -68,11 +69,12 @@ sta::define_cmd_args "make_rows" {
6869
[-additional_sites site_names]\
6970
[-site site_name]\
7071
[-row_parity NONE|ODD|EVEN]\
71-
[-flip_sites site_names]}
72+
[-flip_sites site_names]\
73+
[-gap space]}
7274
proc make_rows { args } {
7375
sta::parse_key_args "make_rows" args \
7476
keys {-core_space \
75-
-core_area -site -additional_sites -row_parity -flip_sites} \
77+
-core_area -site -additional_sites -row_parity -flip_sites -gap} \
7678
flags {}
7779
make_rows_helper [array get keys]
7880
}
@@ -108,6 +110,12 @@ proc make_rows_helper { key_array } {
108110
}
109111
}
110112

113+
# Get gap space
114+
set gap -1
115+
if { [info exists keys(-gap)] } {
116+
set gap [ord::microns_to_dbu $keys(-gap)]
117+
}
118+
111119
if { [info exists keys(-core_area)] } {
112120
if { [info exists keys(-core_space)] } {
113121
utl::error IFP 60 "-core_space cannot be used with -core_area."
@@ -132,7 +140,8 @@ proc make_rows_helper { key_array } {
132140
$site \
133141
$additional_sites \
134142
$row_parity \
135-
$flipped_sites
143+
$flipped_sites \
144+
$gap
136145
return
137146
}
138147

@@ -165,7 +174,8 @@ proc make_rows_helper { key_array } {
165174
$site \
166175
$additional_sites \
167176
$row_parity \
168-
$flipped_sites
177+
$flipped_sites \
178+
$gap
169179
return
170180
}
171181

@@ -439,6 +449,12 @@ proc make_polygon_rows_helper { key_array } {
439449
}
440450
}
441451

452+
# Get gap space
453+
set gap -1
454+
if { [info exists keys(-gap)] } {
455+
set gap [ord::microns_to_dbu $keys(-gap)]
456+
}
457+
442458
# Handle core polygon - this is the key difference from rectangular rows
443459
if { [info exists keys(-core_area)] } {
444460
set core_vertices $keys(-core_area)
@@ -474,7 +490,8 @@ proc make_polygon_rows_helper { key_array } {
474490
$site \
475491
$additional_sites \
476492
$row_parity \
477-
$flipped_sites
493+
$flipped_sites \
494+
$gap
478495
return
479496
}
480497
}

0 commit comments

Comments
 (0)