Skip to content

Commit 7643295

Browse files
authored
Merge pull request #2344 from Pinata-Consulting/floorplan-less-rules-and-surprises
floorplan: replace surprises and documentation with actionable error messages
2 parents 2352dc9 + 6be3f39 commit 7643295

File tree

3 files changed

+58
-44
lines changed

3 files changed

+58
-44
lines changed

docs/user/FlowVariables.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -265,16 +265,18 @@ configuration file.
265265

266266
| Variable | Description |
267267
|-----------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
268-
| `CORE_UTILIZATION` | The core utilization percentage (0-100). Overrides `DIE_AREA` and `CORE_AREA`. |
269-
| `CORE_ASPECT_RATIO` | The core aspect ratio (height / width). This values is ignored if `CORE_UTILIZATION` undefined. |
270-
| `CORE_MARGIN` | The margin between the core area and die area, in multiples of SITE heights. The margin is applied to each side. This variable is ignored if `CORE_UTILIZATION` is undefined. |
271-
| `DIE_AREA` | The die area specified as a list of lower-left and upper-right corners in microns (X1 Y1 X2 Y2). This variable is ignored if `CORE_UTILIZATION` and `CORE_ASPECT_RATIO` are defined. |
272-
| `CORE_AREA` | The core area specified as a list of lower-left and upper-right corners in microns (X1 Y1 X2 Y2). This variable is ignored if `CORE_UTILIZATION` and `CORE_ASPECT_RATIO` are defined. |
268+
| `CORE_UTILIZATION` | The core utilization percentage (0-100). |
269+
| `CORE_ASPECT_RATIO` | The core aspect ratio (height / width). This values is ignored if `CORE_UTILIZATION` undefined. |
270+
| `CORE_MARGIN` | The margin between the core area and die area, in multiples of SITE heights. The margin is applied to each side. This variable is ignored if `CORE_UTILIZATION` is undefined. |
271+
| `DIE_AREA` | The die area specified as a list of lower-left and upper-right corners in microns (X1 Y1 X2 Y2). |
272+
| `CORE_AREA` | The core area specified as a list of lower-left and upper-right corners in microns (X1 Y1 X2 Y2). |
273273
| `RESYNTH_AREA_RECOVER` | Enable re-synthesis for area reclaim. |
274274
| `RESYNTH_TIMING_RECOVER` | Enable re-synthesis for timing optimization. |
275275
| `MACRO_HALO_X` | Set macro halo for x-direction. Only available for ASAP7 PDK. |
276276
| `MACRO_HALO_Y` | Set macro halo for y-direction. Only available for ASAP7 PDK. |
277277

278+
The various methods to specify the die and core area(`FLOORPLAN_DEF`, `FOOTPRINT`, `DIE_AREA` and `CORE_UTILIZATION`) are mutually exclusive. If two methods are specified, floorplan.tcl will exit with an error requiring that a single method is used.
279+
278280
#### Placement
279281

280282

flow/Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,9 @@ export RECOVER_POWER ?= 0
145145
export SKIP_INCREMENTAL_REPAIR ?= 0
146146
export DETAILED_METRICS ?= 0
147147
export EQUIVALENCE_CHECK ?= 0
148+
export CORE_UTILIZATION ?=
149+
export DIE_AREA ?=
150+
export CORE_AREA ?=
148151

149152
# If we are running headless use offscreen rendering for save_image
150153
ifndef DISPLAY

flow/scripts/floorplan.tcl

Lines changed: 48 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -44,48 +44,57 @@ if { [info exists ::env(ADDITIONAL_SITES)]} {
4444
append additional_args " -additional_sites $::env(ADDITIONAL_SITES)"
4545
}
4646

47-
# Initialize floorplan by reading in floorplan DEF
48-
# ---------------------------------------------------------------------------
49-
if {[info exists ::env(FLOORPLAN_DEF)]} {
50-
puts "Read in Floorplan DEF to initialize floorplan: $env(FLOORPLAN_DEF)"
51-
read_def -floorplan_initialize $env(FLOORPLAN_DEF)
52-
# Initialize floorplan using ICeWall FOOTPRINT
53-
# ----------------------------------------------------------------------------
54-
} elseif {[info exists ::env(FOOTPRINT)]} {
55-
56-
ICeWall load_footprint $env(FOOTPRINT)
47+
proc env_var_exists_and_non_empty {env_var} {
48+
return [expr {[info exists ::env($env_var)] && ![string equal $::env($env_var) ""]}]
49+
}
5750

58-
initialize_floorplan \
59-
-die_area [ICeWall get_die_area] \
60-
-core_area [ICeWall get_core_area] \
61-
-site $::env(PLACE_SITE)
51+
set use_floorplan_def [env_var_exists_and_non_empty FLOORPLAN_DEF]
52+
set use_footprint [env_var_exists_and_non_empty FOOTPRINT]
53+
set use_die_and_core_area [expr {[env_var_exists_and_non_empty DIE_AREA] && [env_var_exists_and_non_empty CORE_AREA]}]
54+
set use_core_utilization [env_var_exists_and_non_empty CORE_UTILIZATION]
6255

63-
ICeWall init_footprint $env(SIG_MAP_FILE)
56+
set methods_defined [expr {$use_floorplan_def + $use_footprint + $use_die_and_core_area + $use_core_utilization}]
57+
if {$methods_defined > 1} {
58+
puts "ERROR: Floorplan initialization methods are mutually exclusive, pick one."
59+
exit 1
60+
}
6461

65-
# Initialize floorplan using CORE_UTILIZATION
66-
# ----------------------------------------------------------------------------
67-
} elseif {[info exists ::env(CORE_UTILIZATION)] && $::env(CORE_UTILIZATION) != "" } {
68-
set aspect_ratio 1.0
69-
if {[info exists ::env(CORE_ASPECT_RATIO)] && $::env(CORE_ASPECT_RATIO) != ""} {
70-
set aspect_ratio $::env(CORE_ASPECT_RATIO)
71-
}
72-
set core_margin 1.0
73-
if {[info exists ::env(CORE_MARGIN)] && $::env(CORE_MARGIN) != ""} {
74-
set core_margin $::env(CORE_MARGIN)
75-
}
76-
initialize_floorplan -utilization $::env(CORE_UTILIZATION) \
77-
-aspect_ratio $aspect_ratio \
78-
-core_space $core_margin \
79-
-site $::env(PLACE_SITE) \
80-
{*}$additional_args
81-
82-
# Initialize floorplan using DIE_AREA/CORE_AREA
83-
# ----------------------------------------------------------------------------
62+
if {$use_floorplan_def} {
63+
# Initialize floorplan by reading in floorplan DEF
64+
puts "Read in Floorplan DEF to initialize floorplan: $env(FLOORPLAN_DEF)"
65+
read_def -floorplan_initialize $env(FLOORPLAN_DEF)
66+
} elseif {$use_footprint} {
67+
# Initialize floorplan using ICeWall FOOTPRINT
68+
ICeWall load_footprint $env(FOOTPRINT)
69+
70+
initialize_floorplan \
71+
-die_area [ICeWall get_die_area] \
72+
-core_area [ICeWall get_core_area] \
73+
-site $::env(PLACE_SITE)
74+
75+
ICeWall init_footprint $env(SIG_MAP_FILE)
76+
} elseif {$use_die_and_core_area} {
77+
initialize_floorplan -die_area $::env(DIE_AREA) \
78+
-core_area $::env(CORE_AREA) \
79+
-site $::env(PLACE_SITE) \
80+
{*}$additional_args
81+
} elseif {$use_core_utilization} {
82+
set aspect_ratio 1.0
83+
if {[env_var_exists_and_non_empty "CORE_ASPECT_RATIO"]} {
84+
set aspect_ratio $::env(CORE_ASPECT_RATIO)
85+
}
86+
set core_margin 1.0
87+
if {[env_var_exists_and_non_empty "CORE_MARGIN"]} {
88+
set core_margin $::env(CORE_MARGIN)
89+
}
90+
initialize_floorplan -utilization $::env(CORE_UTILIZATION) \
91+
-aspect_ratio $aspect_ratio \
92+
-core_space $core_margin \
93+
-site $::env(PLACE_SITE) \
94+
{*}$additional_args
8495
} else {
85-
initialize_floorplan -die_area $::env(DIE_AREA) \
86-
-core_area $::env(CORE_AREA) \
87-
-site $::env(PLACE_SITE) \
88-
{*}$additional_args
96+
puts "ERROR: No floorplan initialization method specified"
97+
exit 1
8998
}
9099

91100
if { [info exists ::env(MAKE_TRACKS)] } {
@@ -100,8 +109,8 @@ if {[info exists ::env(FOOTPRINT_TCL)]} {
100109
source $::env(FOOTPRINT_TCL)
101110
}
102111

103-
# remove buffers inserted by yosys/abc
104112
if { [info exists ::env(REMOVE_ABC_BUFFERS)] && $::env(REMOVE_ABC_BUFFERS) == 1 } {
113+
# remove buffers inserted by yosys/abc
105114
remove_buffers
106115
} else {
107116
repair_timing_helper 0

0 commit comments

Comments
 (0)