Skip to content

Commit

Permalink
ifp: add option to flip sites
Browse files Browse the repository at this point in the history
* `ifp::initialize_floorplan`: new key `-flip_sites` allows listing sites to flip in the floorplan, i.e., use FS on even rows and N on odd rows.
  * + test case
* `src/ifp/src/InitFloorplan.i`: More consistent indentation
* `default.nix`: added handy alias to format changed c/cxx files

Signed-off-by: Mohamed Gaber <[email protected]>
  • Loading branch information
donn committed Oct 10, 2024
1 parent d628f2d commit b3a4462
Show file tree
Hide file tree
Showing 9 changed files with 689 additions and 32 deletions.
5 changes: 5 additions & 0 deletions default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
# or-tools
stdenv,
overrideSDK,
git,
}: let
or-tools' =
(or-tools.override {
Expand Down Expand Up @@ -102,6 +103,10 @@
patchShebangs .
'';

shellHook = ''
alias ord-format-changed="${git}/bin/git diff --name-only | grep -E '\.(cpp|cc|c|h|hh)$' | xargs clang-format -i -style=file:.clang-format";
'';

qt5Libs = [
libsForQt5.qt5.qtbase
libsForQt5.qt5.qtcharts
Expand Down
9 changes: 6 additions & 3 deletions src/ifp/include/ifp/InitFloorplan.hh
Original file line number Diff line number Diff line change
Expand Up @@ -78,15 +78,17 @@ class InitFloorplan
int core_space_right,
odb::dbSite* base_site,
const std::vector<odb::dbSite*>& additional_sites = {},
RowParity row_parity = RowParity::NONE);
RowParity row_parity = RowParity::NONE,
const std::vector<odb::dbSite*>& flipped_sites = {});

// The base_site determines the single-height rows. For hybrid rows it is
// a site containing a row pattern.
void initFloorplan(const odb::Rect& die,
const odb::Rect& core,
odb::dbSite* base_site,
const std::vector<odb::dbSite*>& additional_sites = {},
RowParity row_parity = RowParity::NONE);
RowParity row_parity = RowParity::NONE,
const std::vector<odb::dbSite*>& flipped_sites = {});

void insertTiecells(odb::dbMTerm* tie_term,
const std::string& prefix = "TIEOFF_");
Expand Down Expand Up @@ -115,7 +117,8 @@ class InitFloorplan
void makeUniformRows(odb::dbSite* base_site,
const SitesByName& sites_by_name,
const odb::Rect& core,
RowParity row_parity);
RowParity row_parity,
const std::set<odb::dbSite*>& flipped_sites);
void makeHybridRows(odb::dbSite* base_hybrid_site,
const SitesByName& sites_by_name,
const odb::Rect& core);
Expand Down
27 changes: 19 additions & 8 deletions src/ifp/src/InitFloorplan.cc
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,8 @@ void InitFloorplan::initFloorplan(
int core_space_right,
odb::dbSite* base_site,
const std::vector<odb::dbSite*>& additional_sites,
RowParity row_parity)
RowParity row_parity,
const std::vector<odb::dbSite*>& flipped_sites)
{
utl::Validator v(logger_, IFP);
v.check_non_negative("utilization", utilization, 12);
Expand Down Expand Up @@ -135,7 +136,8 @@ void InitFloorplan::initFloorplan(
{core_lx, core_ly, core_ux, core_uy},
base_site,
additional_sites,
row_parity);
row_parity,
flipped_sites);
}

double InitFloorplan::designArea()
Expand All @@ -160,7 +162,8 @@ void InitFloorplan::initFloorplan(
const odb::Rect& core,
odb::dbSite* base_site,
const std::vector<odb::dbSite*>& additional_sites,
RowParity row_parity)
RowParity row_parity,
const std::vector<odb::dbSite*>& flipped_sites)
{
Rect die_area(snapToMfgGrid(die.xMin()),
snapToMfgGrid(die.yMin()),
Expand Down Expand Up @@ -227,7 +230,12 @@ void InitFloorplan::initFloorplan(
}
makeHybridRows(base_site, sites_by_name, snapped_core);
} else {
makeUniformRows(base_site, sites_by_name, snapped_core, row_parity);
makeUniformRows(
base_site,
sites_by_name,
snapped_core,
row_parity,
std::set<odb::dbSite*>(flipped_sites.begin(), flipped_sites.end()));
}

updateVoltageDomain(clx, cly, cux, cuy);
Expand Down Expand Up @@ -417,7 +425,8 @@ void InitFloorplan::addUsedSites(
void InitFloorplan::makeUniformRows(odb::dbSite* base_site,
const SitesByName& sites_by_name,
const odb::Rect& core,
RowParity row_parity)
RowParity row_parity,
const std::set<odb::dbSite*>& flipped_sites)
{
const int core_dx = core.dx();
const int core_dy = core.dy();
Expand All @@ -427,7 +436,8 @@ void InitFloorplan::makeUniformRows(odb::dbSite* base_site,
auto make_rows = [&](dbSite* site) {
const uint site_dy = site->getHeight();
int rows_y = core_dy / site_dy;

bool flip = flipped_sites.find(site) != flipped_sites.end();
bool flipNum = flip ? 1 : 0;
switch (row_parity) {
case RowParity::NONE:
break;
Expand All @@ -445,8 +455,9 @@ void InitFloorplan::makeUniformRows(odb::dbSite* base_site,

int y = core.yMin();
for (int row = 0; row < rows_y; row++) {
dbOrientType orient = (row % 2 == 0) ? dbOrientType::R0 // N
: dbOrientType::MX; // FS
dbOrientType orient = ((row + flipNum) % 2 == 0)
? dbOrientType::R0 // N
: dbOrientType::MX; // FS
string row_name = fmt::format("ROW_{}", block_->getRows().size());
dbRow::create(block_,
row_name.c_str(),
Expand Down
35 changes: 19 additions & 16 deletions src/ifp/src/InitFloorplan.i
Original file line number Diff line number Diff line change
Expand Up @@ -102,37 +102,40 @@ namespace ifp {

void
init_floorplan_core(int die_lx,
int die_ly,
int die_ux,
int die_uy,
int core_lx,
int core_ly,
int core_ux,
int core_uy,
odb::dbSite* site,
const std::vector<odb::dbSite*>& additional_sites,
ifp::RowParity row_parity)
int die_ly,
int die_ux,
int die_uy,
int core_lx,
int core_ly,
int core_ux,
int core_uy,
odb::dbSite* site,
const std::vector<odb::dbSite*>& additional_sites,
ifp::RowParity row_parity,
const std::vector<odb::dbSite*>& flipped_sites)
{
get_floorplan().initFloorplan({die_lx, die_ly, die_ux, die_uy},
{core_lx, core_ly, core_ux, core_uy},
site, additional_sites, row_parity);
site, additional_sites, row_parity, flipped_sites);
}

void
init_floorplan_util(double util,
double aspect_ratio,
int core_space_bottom,
int core_space_top,
int core_space_top,
int core_space_left,
int core_space_right,
odb::dbSite* site,
const std::vector<odb::dbSite*>& additional_sites,
ifp::RowParity row_parity)
odb::dbSite* site,
const std::vector<odb::dbSite*>& additional_sites,
ifp::RowParity row_parity,
const std::vector<odb::dbSite*>& flipped_sites)
{
get_floorplan().initFloorplan(util, aspect_ratio,
core_space_bottom, core_space_top,
core_space_left, core_space_right,
site, additional_sites, row_parity);
site, additional_sites, row_parity,
flipped_sites);
}

void
Expand Down
18 changes: 14 additions & 4 deletions src/ifp/src/InitFloorplan.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,13 @@ sta::define_cmd_args "initialize_floorplan" {[-utilization util]\
[-core_area {lx ly ux uy}]\
[-additional_sites site_names]\
[-site site_name]\
[-row_parity NONE|ODD|EVEN]}
[-row_parity NONE|ODD|EVEN]\
[-flip_sites site_names]}

proc initialize_floorplan { args } {
sta::parse_key_args "initialize_floorplan" args \
keys {-utilization -aspect_ratio -core_space \
-die_area -core_area -site -additional_sites -row_parity} \
-die_area -core_area -site -additional_sites -row_parity -flip_sites} \
flags {}

sta::check_argc_eq0 "initialize_floorplan" $args
Expand All @@ -64,6 +65,13 @@ proc initialize_floorplan { args } {
}
}

set flipped_sites {}
if { [info exists keys(-flip_sites)] } {
foreach sitename $keys(-flip_sites) {
lappend flipped_sites [ifp::find_site $sitename]
}
}

set row_parity "NONE"
if { [info exists keys(-row_parity)] } {
set row_parity $keys(-row_parity)
Expand Down Expand Up @@ -111,7 +119,8 @@ proc initialize_floorplan { args } {
[ord::microns_to_dbu $core_sp_right] \
$site \
$additional_sites \
$row_parity
$row_parity \
$flipped_sites
} elseif { [info exists keys(-die_area)] } {
set die_area $keys(-die_area)
if { [llength $die_area] != 4 } {
Expand Down Expand Up @@ -143,7 +152,8 @@ proc initialize_floorplan { args } {
[ord::microns_to_dbu $core_ux] [ord::microns_to_dbu $core_uy] \
$site \
$additional_sites \
$row_parity
$row_parity \
$flipped_sites
} else {
utl::error IFP 17 "no -core_area specified."
}
Expand Down
Loading

0 comments on commit b3a4462

Please sign in to comment.