diff --git a/configuration/README.md b/configuration/README.md index cd95cbbf..5127ffe6 100644 --- a/configuration/README.md +++ b/configuration/README.md @@ -109,6 +109,12 @@ These variables are optional that can be specified in the design configuration f | `PL_RESIZER_DESIGN_OPTIMIZATIONS` | Specifies whether resizer design optimizations should be performed or not. 0 = false, 1 = true
(Default: `1`) | | `PL_RESIZER_TIMING_OPTIMIZATIONS` | Specifies whether resizer timing optimizations should be performed or not. 0 = false, 1 = true
(Default: `1`) | | `PL_RESIZER_MAX_WIRE_LENGTH` | Specifies the maximum wire length cap used by resizer to insert buffers. If set to 0, no buffers will be inserted. Value in microns.
(Default: `0`)| +| `PL_RESIZER_MAX_SLEW_MARGIN` | Specifies a margin for the slews.
(Default: `1`)| +| `PL_RESIZER_MAX_CAP_MARGIN` | Specifies a margin for the capacitances.
(Default: `10`)| +| `PL_RESIZER_HOLD_SLACK_MARGIN` | Specifies a margin for the slack when fixing hold violations.
(Default: `0.2`)| +| `PL_RESIZER_SETUP_SLACK_MARGIN` | Specifies a margin for the slack when fixing setup violations.
(Default: `0.2`)| +| `PL_RESIZER_HOLD_MAX_BUFFER_PERCENT` | Specifies a max number of buffers to insert to fix hold violations. This number is calculated as a percentage of the number of instances in the design.
(Default: `30`)| +| `PL_RESIZER_SETUP_MAX_BUFFER_PERCENT` | Specifies a max number of buffers to insert to fix setup violations. This number is calculated as a percentage of the number of instances in the design.
(Default: `30`)| | `LIB_OPT` | Points to the lib file, corresponding to the slowest corner, for max delay calculation during OpenPhySyn optimizations. This is usually a trimmed version of `LIB_SLOWEST`.
Default: `$::env(TMP_DIR)/opt.lib` | | `LIB_RESIZER_OPT` | Points to the lib file, corresponding to the slowest corner, for max delay calculation during resizer optimizations. This is copy of `LIB_SLOWEST`.
Default: `$::env(TMP_DIR)/resizer.lib` | | `DONT_USE_CELLS` | The list of cells to not use during resizer optimizations.
Default: the contents of `DRC_EXCLUDE_CELL_LIST`. | diff --git a/configuration/placement.tcl b/configuration/placement.tcl index 582b8e6a..449993b9 100755 --- a/configuration/placement.tcl +++ b/configuration/placement.tcl @@ -29,3 +29,9 @@ set ::env(PL_RESIZER_MAX_WIRE_LENGTH) 0 set ::env(PL_OPTIMIZE_MIRRORING) 1 set ::env(PL_RESIZER_BUFFER_INPUT_PORTS) 1 set ::env(PL_RESIZER_BUFFER_OUTPUT_PORTS) 1 +set ::env(PL_RESIZER_MAX_SLEW_MARGIN) 1 +set ::env(PL_RESIZER_MAX_CAP_MARGIN) 10 +set ::env(PL_RESIZER_HOLD_SLACK_MARGIN) 0.2 +set ::env(PL_RESIZER_SETUP_SLACK_MARGIN) 0.2 +set ::env(PL_RESIZER_HOLD_MAX_BUFFER_PERCENT) 50 +set ::env(PL_RESIZER_SETUP_MAX_BUFFER_PERCENT) 50 diff --git a/dependencies/tool_metadata.yml b/dependencies/tool_metadata.yml index 5088e0de..08f27358 100644 --- a/dependencies/tool_metadata.yml +++ b/dependencies/tool_metadata.yml @@ -88,7 +88,7 @@ in_install: false - name: open_pdks repo: https://github.com/rtimothyedwards/open_pdks - commit: 5cad4f87435ae7f4e17e50d9c66cd79ecc14e663 + commit: 8d25606b95e3ca3ac20041bcbe42f4237de2906b build: '' in_install: false in_container: false diff --git a/designs/s44/config.tcl b/designs/s44/config.tcl index d0632e65..a1af149e 100755 --- a/designs/s44/config.tcl +++ b/designs/s44/config.tcl @@ -15,10 +15,6 @@ set ::env(PL_TARGET_DENSITY) 0.5 set ::env(PDN_CFG) $::env(DESIGN_DIR)/pdn.tcl -# Disable timing checks temporarily till the design configurations are updated -# to tackle the timing violations -set ::env(QUIT_ON_TIMING_VIOLATIONS) 0 - set filename $::env(DESIGN_DIR)/$::env(PDK)_$::env(STD_CELL_LIBRARY)_config.tcl if { [file exists $filename] == 1} { source $filename diff --git a/designs/spm/sky130A_sky130_fd_sc_hd_config.tcl b/designs/spm/sky130A_sky130_fd_sc_hd_config.tcl index 30e7c8ec..93e655a1 100755 --- a/designs/spm/sky130A_sky130_fd_sc_hd_config.tcl +++ b/designs/spm/sky130A_sky130_fd_sc_hd_config.tcl @@ -1,5 +1,5 @@ # SCL Configs set ::env(CLOCK_PERIOD) "10.0" set ::env(SYNTH_MAX_FANOUT) 5 -set ::env(FP_CORE_UTIL) 49 +set ::env(FP_CORE_UTIL) 45 set ::env(PL_TARGET_DENSITY) [ expr ($::env(FP_CORE_UTIL)+5) / 100.0 ] diff --git a/designs/usb/config.tcl b/designs/usb/config.tcl index 1ed7af53..284bcbee 100755 --- a/designs/usb/config.tcl +++ b/designs/usb/config.tcl @@ -4,16 +4,9 @@ set ::env(DESIGN_NAME) "usb" set ::env(VERILOG_FILES) "./designs/usb/src/usb2p0_core.v" -set ::env(CLOCK_PERIOD) "15.000" set ::env(CLOCK_PORT) "clk_48" - - set ::env(CLOCK_NET) $::env(CLOCK_PORT) -# Disable timing checks temporarily till the design configurations are updated -# to tackle the timing violations -set ::env(QUIT_ON_TIMING_VIOLATIONS) 0 - set filename $::env(OPENLANE_ROOT)/designs/$::env(DESIGN_NAME)/$::env(PDK)_$::env(STD_CELL_LIBRARY)_config.tcl if { [file exists $filename] == 1} { source $filename diff --git a/designs/usb/sky130A_sky130_fd_sc_hd_config.tcl b/designs/usb/sky130A_sky130_fd_sc_hd_config.tcl index befc1f23..dbe8dcfa 100755 --- a/designs/usb/sky130A_sky130_fd_sc_hd_config.tcl +++ b/designs/usb/sky130A_sky130_fd_sc_hd_config.tcl @@ -1,7 +1,8 @@ # SCL Configs set ::env(FP_CORE_UTIL) 40 -set ::env(CLOCK_PERIOD) "12.55" +set ::env(CLOCK_PERIOD) "15.00" +set ::env(SYNTH_STRATEGY) "DELAY 0" set ::env(SYNTH_MAX_FANOUT) 6 set ::env(PL_TARGET_DENSITY) [ expr ($::env(FP_CORE_UTIL)+5) / 100.0 ] diff --git a/designs/usb_cdc_core/sky130A_sky130_fd_sc_hd_config.tcl b/designs/usb_cdc_core/sky130A_sky130_fd_sc_hd_config.tcl index f98353a9..44d10cd7 100755 --- a/designs/usb_cdc_core/sky130A_sky130_fd_sc_hd_config.tcl +++ b/designs/usb_cdc_core/sky130A_sky130_fd_sc_hd_config.tcl @@ -1,6 +1,6 @@ # SCL Configs set ::env(CLOCK_PERIOD) "15.6" -set ::env(FP_CORE_UTIL) 45 +set ::env(FP_CORE_UTIL) 30 set ::env(SYNTH_MAX_FANOUT) 6 -set ::env(PL_TARGET_DENSITY) [ expr ($::env(FP_CORE_UTIL)+5) / 100.0 ] +set ::env(PL_TARGET_DENSITY) "0.32" diff --git a/designs/wbqspiflash/sky130A_sky130_fd_sc_hd_config.tcl b/designs/wbqspiflash/sky130A_sky130_fd_sc_hd_config.tcl index 68106978..022d4540 100755 --- a/designs/wbqspiflash/sky130A_sky130_fd_sc_hd_config.tcl +++ b/designs/wbqspiflash/sky130A_sky130_fd_sc_hd_config.tcl @@ -1,6 +1,6 @@ # SCL Configs set ::env(CLOCK_PERIOD) "18.86" -set ::env(FP_CORE_UTIL) 40 -set ::env(SYNTH_MAX_FANOUT) 6 +set ::env(FP_CORE_UTIL) 25 +set ::env(SYNTH_MAX_FANOUT) 4 set ::env(PL_TARGET_DENSITY) [ expr ($::env(FP_CORE_UTIL)+5) / 100.0 ] diff --git a/designs/zipdiv/config.tcl b/designs/zipdiv/config.tcl index 804048db..34810fed 100755 --- a/designs/zipdiv/config.tcl +++ b/designs/zipdiv/config.tcl @@ -5,15 +5,9 @@ set ::env(DESIGN_NAME) "zipdiv" set ::env(VERILOG_FILES) "./designs/zipdiv/src/zipdiv.v" set ::env(SDC_FILE) "./designs/zipdiv/src/zipdiv.sdc" -set ::env(CLOCK_PERIOD) "2.5" set ::env(CLOCK_PORT) "i_clk" - - set ::env(CLOCK_NET) $::env(CLOCK_PORT) -# Disable timing checks temporarily till the design configurations are updated -# to tackle the timing violations -set ::env(QUIT_ON_TIMING_VIOLATIONS) 0 set filename $::env(OPENLANE_ROOT)/designs/$::env(DESIGN_NAME)/$::env(PDK)_$::env(STD_CELL_LIBRARY)_config.tcl if { [file exists $filename] == 1} { diff --git a/designs/zipdiv/sky130A_sky130_fd_sc_hd_config.tcl b/designs/zipdiv/sky130A_sky130_fd_sc_hd_config.tcl index f2875f6b..9ce056c9 100755 --- a/designs/zipdiv/sky130A_sky130_fd_sc_hd_config.tcl +++ b/designs/zipdiv/sky130A_sky130_fd_sc_hd_config.tcl @@ -1,7 +1,9 @@ # SCL Configs +set ::env(SYNTH_STRATEGY) "DELAY 2" + set ::env(GLB_RT_ADJUSTMENT) 0.15 -set ::env(CLOCK_PERIOD) "19.09" +set ::env(CLOCK_PERIOD) "20.00" set ::env(SYNTH_MAX_FANOUT) 6 set ::env(FP_CORE_UTIL) 40 set ::env(PL_TARGET_DENSITY) [ expr ($::env(FP_CORE_UTIL)+5) / 100.0 ] diff --git a/designs/zipdiv/sky130A_sky130_fd_sc_hdll_config.tcl b/designs/zipdiv/sky130A_sky130_fd_sc_hdll_config.tcl index f2875f6b..138e6a36 100644 --- a/designs/zipdiv/sky130A_sky130_fd_sc_hdll_config.tcl +++ b/designs/zipdiv/sky130A_sky130_fd_sc_hdll_config.tcl @@ -1,7 +1,7 @@ # SCL Configs set ::env(GLB_RT_ADJUSTMENT) 0.15 -set ::env(CLOCK_PERIOD) "19.09" +set ::env(CLOCK_PERIOD) "20.00" set ::env(SYNTH_MAX_FANOUT) 6 set ::env(FP_CORE_UTIL) 40 set ::env(PL_TARGET_DENSITY) [ expr ($::env(FP_CORE_UTIL)+5) / 100.0 ] diff --git a/designs/zipdiv/sky130A_sky130_fd_sc_hs_config.tcl b/designs/zipdiv/sky130A_sky130_fd_sc_hs_config.tcl index 6efe651f..07d50464 100644 --- a/designs/zipdiv/sky130A_sky130_fd_sc_hs_config.tcl +++ b/designs/zipdiv/sky130A_sky130_fd_sc_hs_config.tcl @@ -1,7 +1,7 @@ # SCL Configs set ::env(GLB_RT_ADJUSTMENT) 0.15 -set ::env(CLOCK_PERIOD) "19.09" +set ::env(CLOCK_PERIOD) "20.00" set ::env(SYNTH_MAX_FANOUT) 6 set ::env(FP_CORE_UTIL) 35 set ::env(PL_TARGET_DENSITY) [ expr ($::env(FP_CORE_UTIL)+5) / 100.0 ] diff --git a/designs/zipdiv/sky130A_sky130_fd_sc_ls_config.tcl b/designs/zipdiv/sky130A_sky130_fd_sc_ls_config.tcl index f2875f6b..138e6a36 100644 --- a/designs/zipdiv/sky130A_sky130_fd_sc_ls_config.tcl +++ b/designs/zipdiv/sky130A_sky130_fd_sc_ls_config.tcl @@ -1,7 +1,7 @@ # SCL Configs set ::env(GLB_RT_ADJUSTMENT) 0.15 -set ::env(CLOCK_PERIOD) "19.09" +set ::env(CLOCK_PERIOD) "20.00" set ::env(SYNTH_MAX_FANOUT) 6 set ::env(FP_CORE_UTIL) 40 set ::env(PL_TARGET_DENSITY) [ expr ($::env(FP_CORE_UTIL)+5) / 100.0 ] diff --git a/designs/zipdiv/sky130A_sky130_fd_sc_ms_config.tcl b/designs/zipdiv/sky130A_sky130_fd_sc_ms_config.tcl index 6efe651f..07d50464 100644 --- a/designs/zipdiv/sky130A_sky130_fd_sc_ms_config.tcl +++ b/designs/zipdiv/sky130A_sky130_fd_sc_ms_config.tcl @@ -1,7 +1,7 @@ # SCL Configs set ::env(GLB_RT_ADJUSTMENT) 0.15 -set ::env(CLOCK_PERIOD) "19.09" +set ::env(CLOCK_PERIOD) "20.00" set ::env(SYNTH_MAX_FANOUT) 6 set ::env(FP_CORE_UTIL) 35 set ::env(PL_TARGET_DENSITY) [ expr ($::env(FP_CORE_UTIL)+5) / 100.0 ] diff --git a/scripts/openroad/or_cts.tcl b/scripts/openroad/or_cts.tcl index 96b0de35..15eb9a41 100755 --- a/scripts/openroad/or_cts.tcl +++ b/scripts/openroad/or_cts.tcl @@ -71,6 +71,8 @@ detailed_placement if { [info exists ::env(PL_OPTIMIZE_MIRRORING)] && $::env(PL_OPTIMIZE_MIRRORING) } { optimize_mirroring } +estimate_parasitics -placement + write_def $::env(SAVE_DEF) write_sdc $::env(SAVE_SDC) if { [check_placement -verbose] } { diff --git a/scripts/openroad/or_resizer.tcl b/scripts/openroad/or_resizer.tcl index 14d4808a..c30312ec 100644 --- a/scripts/openroad/or_resizer.tcl +++ b/scripts/openroad/or_resizer.tcl @@ -15,6 +15,10 @@ foreach lib $::env(LIB_RESIZER_OPT) { read_liberty $lib } + +read_liberty -max $::env(LIB_SLOWEST) +read_liberty -min $::env(LIB_FASTEST) + if {[catch {read_lef $::env(MERGED_LEF_UNPADDED)} errmsg]} { puts stderr $errmsg exit 1 @@ -47,9 +51,12 @@ if { [info exists ::env(PL_RESIZER_BUFFER_OUTPUT_PORTS)] && $::env(PL_RESIZER_BU } if { [info exists ::env(PL_RESIZER_MAX_WIRE_LENGTH)] && $::env(PL_RESIZER_MAX_WIRE_LENGTH) } { - repair_design -max_wire_length $::env(PL_RESIZER_MAX_WIRE_LENGTH) + repair_design -max_wire_length $::env(PL_RESIZER_MAX_WIRE_LENGTH) \ + -max_slew_margin $::env(PL_RESIZER_MAX_SLEW_MARGIN) \ + -max_cap_margin $::env(PL_RESIZER_MAX_CAP_MARGIN) } else { - repair_design + repair_design -max_slew_margin $::env(PL_RESIZER_MAX_SLEW_MARGIN) \ + -max_cap_margin $::env(PL_RESIZER_MAX_CAP_MARGIN) } report_floating_nets -verbose diff --git a/scripts/openroad/or_resizer_routing_timing.tcl b/scripts/openroad/or_resizer_routing_timing.tcl index 0c226c6d..723b4cb4 100644 --- a/scripts/openroad/or_resizer_routing_timing.tcl +++ b/scripts/openroad/or_resizer_routing_timing.tcl @@ -16,6 +16,9 @@ foreach lib $::env(LIB_RESIZER_OPT) { read_liberty $lib } +read_liberty -max $::env(LIB_SLOWEST) +read_liberty -min $::env(LIB_FASTEST) + if {[catch {read_lef $::env(MERGED_LEF_UNPADDED)} errmsg]} { puts stderr $errmsg exit 1 @@ -43,7 +46,14 @@ global_route source $::env(SCRIPTS_DIR)/openroad/or_set_rc.tcl estimate_parasitics -global_routing set_propagated_clock [all_clocks] -repair_timing +repair_timing -hold \ + -slack_margin $::env(PL_RESIZER_HOLD_SLACK_MARGIN) \ + -max_buffer_percent $::env(PL_RESIZER_HOLD_MAX_BUFFER_PERCENT) + +repair_timing -setup \ + -slack_margin $::env(PL_RESIZER_SETUP_SLACK_MARGIN) \ + -max_buffer_percent $::env(PL_RESIZER_SETUP_MAX_BUFFER_PERCENT) + # set_placement_padding -global -right $::env(CELL_PAD) # set_placement_padding -masters $::env(CELL_PAD_EXCLUDE) -right 0 -left 0 diff --git a/scripts/openroad/or_resizer_timing.tcl b/scripts/openroad/or_resizer_timing.tcl index 3e16355f..353fc0ab 100644 --- a/scripts/openroad/or_resizer_timing.tcl +++ b/scripts/openroad/or_resizer_timing.tcl @@ -15,6 +15,10 @@ foreach lib $::env(LIB_RESIZER_OPT) { read_liberty $lib } + +read_liberty -max $::env(LIB_SLOWEST) +read_liberty -min $::env(LIB_FASTEST) + if {[catch {read_lef $::env(MERGED_LEF_UNPADDED)} errmsg]} { puts stderr $errmsg exit 1 @@ -41,7 +45,14 @@ if { [info exists ::env(DONT_USE_CELLS)] } { source $::env(SCRIPTS_DIR)/openroad/or_set_rc.tcl estimate_parasitics -placement set_propagated_clock [all_clocks] -repair_timing + +repair_timing -hold \ + -slack_margin $::env(PL_RESIZER_HOLD_SLACK_MARGIN) \ + -max_buffer_percent $::env(PL_RESIZER_HOLD_MAX_BUFFER_PERCENT) + +repair_timing -setup \ + -slack_margin $::env(PL_RESIZER_SETUP_SLACK_MARGIN) \ + -max_buffer_percent $::env(PL_RESIZER_SETUP_MAX_BUFFER_PERCENT) set_placement_padding -global -right $::env(CELL_PAD) diff --git a/scripts/tcl_commands/routing.tcl b/scripts/tcl_commands/routing.tcl index e9f26ab7..5d5738f4 100755 --- a/scripts/tcl_commands/routing.tcl +++ b/scripts/tcl_commands/routing.tcl @@ -431,7 +431,7 @@ proc run_resizer_timing_routing {args} { TIMER::timer_start if { ! [info exists ::env(LIB_RESIZER_OPT) ] } { set ::env(LIB_RESIZER_OPT) $::env(TMP_DIR)/resizer.lib - file copy -force $::env(LIB_SLOWEST) $::env(LIB_RESIZER_OPT) + file copy -force $::env(LIB_SYNTH_COMPLETE) $::env(LIB_RESIZER_OPT) } if { ! [info exists ::env(DONT_USE_CELLS)] } { gen_exclude_list -lib $::env(LIB_RESIZER_OPT) -drc_exclude_only -create_dont_use_list