| # Copyright 2020-2021 Efabless Corporation |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| foreach lib $::env(LIB_SYNTH_COMPLETE) { |
| read_liberty $lib |
| } |
| |
| if { [info exists ::env(EXTRA_LIBS) ] } { |
| foreach lib $::env(EXTRA_LIBS) { |
| read_liberty $lib |
| } |
| } |
| |
| if {[catch {read_lef $::env(MERGED_LEF_UNPADDED)} errmsg]} { |
| puts stderr $errmsg |
| exit 1 |
| } |
| |
| read_verilog $::env(synthesis_results)/$::env(DESIGN_NAME).v |
| link_design $::env(DESIGN_NAME) |
| read_sdc -echo $::env(CURRENT_SDC) |
| unset_propagated_clock [all_clocks] |
| |
| set bottom_margin [expr $::env(PLACE_SITE_HEIGHT) * $::env(BOTTOM_MARGIN_MULT)] |
| set top_margin [expr $::env(PLACE_SITE_HEIGHT) * $::env(TOP_MARGIN_MULT)] |
| set left_margin [expr $::env(PLACE_SITE_WIDTH) * $::env(LEFT_MARGIN_MULT)] |
| set right_margin [expr $::env(PLACE_SITE_WIDTH) * $::env(RIGHT_MARGIN_MULT)] |
| |
| if {$::env(FP_SIZING) == "absolute"} { |
| if { ! [info exists ::env(CORE_AREA)] } { |
| set die_ll_x [lindex $::env(DIE_AREA) 0] |
| set die_ll_y [lindex $::env(DIE_AREA) 1] |
| set die_ur_x [lindex $::env(DIE_AREA) 2] |
| set die_ur_y [lindex $::env(DIE_AREA) 3] |
| |
| set core_ll_x [expr {$die_ll_x + $left_margin}] |
| set core_ll_y [expr {$die_ll_y + $bottom_margin}] |
| set core_ur_x [expr {$die_ur_x - $right_margin}] |
| set core_ur_y [expr {$die_ur_y - $top_margin}] |
| |
| set ::env(CORE_AREA) [list $core_ll_x $core_ll_y $core_ur_x $core_ur_y] |
| } else { |
| puts "\[INFO] Using the set CORE_AREA; ignoring core margin parameters" |
| } |
| |
| initialize_floorplan \ |
| -die_area $::env(DIE_AREA) \ |
| -core_area $::env(CORE_AREA) \ |
| -site $::env(PLACE_SITE) |
| |
| } else { |
| |
| initialize_floorplan \ |
| -utilization $::env(FP_CORE_UTIL) \ |
| -aspect_ratio $::env(FP_ASPECT_RATIO) \ |
| -core_space "$bottom_margin $top_margin $left_margin $right_margin" \ |
| -site $::env(PLACE_SITE) |
| |
| set ::chip [[::ord::get_db] getChip] |
| set ::tech [[::ord::get_db] getTech] |
| set ::block [$::chip getBlock] |
| puts "\[INFO] Extracting DIE_AREA and CORE_AREA from the floorplan" |
| set ::env(DIE_AREA) [list] |
| set ::env(CORE_AREA) [list] |
| |
| set die_area [$::block getDieArea] |
| set core_area [$::block getCoreArea] |
| |
| set die_area [list [$die_area xMin] [$die_area yMin] [$die_area xMax] [$die_area yMax]] |
| set core_area [list [$core_area xMin] [$core_area yMin] [$core_area xMax] [$core_area yMax]] |
| |
| set dbu [$tech getDbUnitsPerMicron] |
| |
| foreach coord $die_area { |
| lappend ::env(DIE_AREA) [expr {1.0 * $coord / $dbu}] |
| } |
| foreach coord $core_area { |
| lappend ::env(CORE_AREA) [expr {1.0 * $coord / $dbu}] |
| } |
| |
| puts "\[INFO] Floorplanned on a die area of $::env(DIE_AREA) (microns). Saving to $::env(fp_report_prefix)_die_area.rpt." |
| puts "\[INFO] Floorplanned on a core area of $::env(CORE_AREA) (microns). Saving to $::env(fp_report_prefix)_core_area.rpt." |
| } |
| source $::env(TRACKS_INFO_FILE_PROCESSED) |
| |
| set die_area_file [open $::env(fp_report_prefix)_die_area.rpt w] |
| set core_area_file [open $::env(fp_report_prefix)_core_area.rpt w] |
| puts -nonewline $die_area_file $::env(DIE_AREA) |
| puts -nonewline $core_area_file $::env(CORE_AREA) |
| close $core_area_file |
| close $die_area_file |
| |
| write_def $::env(SAVE_DEF) |
| write_sdc $::env(SAVE_SDC) |