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