~ update STA signoff scripts to the latest version used for caravel (4d4129b)

This commit is contained in:
Passant 2023-04-19 04:28:00 -07:00
parent 8afe0b60d1
commit ded7570bc1
5 changed files with 916 additions and 278 deletions

View File

@ -1,58 +1,52 @@
if {\ if {\
[catch { [catch {
##PT script ##PT script
# Adding SCL and IO link libraries based on the process corner specified # Adding SCL and IO link libraries based on the PDK and process corner specified
if {$::env(PROC_CORNER) == "t"} { if {[string match gf180* $::env(PDK)]} {
set link_path "* $::env(PT_LIB_ROOT)/scs130hd_tt_1.80v_25C.lib \ source ./gf180_libs.tcl
$::env(PT_LIB_ROOT)/scs130hvl_tt_3.3v_25C.lib \ } elseif {[string match sky130* $::env(PDK)]} {
$::env(PT_LIB_ROOT)/scs130hvl_tt_3.3v_lowhv_3.3v_lv_1.8v_25C.lib \ source ./sky130_libs.tcl
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_xres4v2_tt_tt_025C_1v80_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__gpiov2_pad_tt_tt_025C_1v80_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped_pad_tt_025C_1v80_3v30_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vdda_hvc_clamped_pad_tt_025C_1v80_3v30_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssa_hvc_clamped_pad_tt_025C_1v80_3v30_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped3_pad_tt_025C_1v80_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped3_pad_tt_025C_1v80_3v30_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped_pad_tt_025C_1v80_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vddio_hvc_clamped_pad_tt_025C_1v80_3v30_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssio_hvc_clamped_pad_tt_025C_1v80_3v30_3v30.lib \
"
} elseif {$::env(PROC_CORNER) == "f"} {
set link_path "* $::env(PT_LIB_ROOT)/scs130hd_ff_1.95v_-40C.lib \
$::env(PT_LIB_ROOT)/scs130hvl_ff_5.5v_-40C.lib \
$::env(PT_LIB_ROOT)/scs130hvl_ff_5.5v_lowhv_5.5v_lv_1.95v_-40C.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_xres4v2_ff_ff_n40C_1v95_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__gpiov2_pad_wrapped_ff_ff_n40C_1v95_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped_pad_ff_n40C_1v95_5v50_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vdda_hvc_clamped_pad_ff_n40C_1v95_5v50_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssa_hvc_clamped_pad_ff_n40C_1v95_5v50_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped3_pad_ff_n40C_1v95_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped3_pad_ff_n40C_1v95_5v50_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped_pad_ff_n40C_1v95_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vddio_hvc_clamped_pad_ff_n40C_1v95_5v50_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssio_hvc_clamped_pad_ff_n40C_1v95_5v50_5v50.lib \
"
} elseif {$::env(PROC_CORNER) == "s"} {
set link_path "* $::env(PT_LIB_ROOT)/scs130hd_ss_1.40v_100C.lib \
$::env(PT_LIB_ROOT)/scs130hvl_ss_3.00v_100C.lib \
$::env(PT_LIB_ROOT)/scs130hvl_ss_3.00v_lowhv_1.65v_lv_1.6v_150C.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_xres4v2_ss_ss_100C_1v60_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__gpiov2_pad_wrapped_ss_ss_100C_1v60_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped_pad_ss_100C_1v60_3v00_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vdda_hvc_clamped_pad_ss_100C_1v60_3v00_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssa_hvc_clamped_pad_ss_100C_1v60_3v00_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped3_pad_ss_100C_1v60_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped3_pad_ss_100C_1v60_3v00_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped_pad_ss_100C_1v60_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vddio_hvc_clamped_pad_ss_100C_1v60_3v00_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssio_hvc_clamped_pad_ss_100C_1v60_3v00_3v00.lib \
"
} }
# Reading design netlist # Reading design netlist
set search_path "$::env(CARAVEL_ROOT)/verilog/gl $::env(MCW_ROOT)/verilog/gl $::env(UPRJ_ROOT)/verilog/gl $::env(PT_LIB_ROOT)" set search_path "$::env(CARAVEL_ROOT)/verilog/gl $::env(MCW_ROOT)/verilog/gl $::env(UPRJ_ROOT)/verilog/gl"
if {$::env(UPRJ_ROOT) == $::env(CARAVEL_ROOT)} {
set verilogs [concat [glob $::env(CARAVEL_ROOT)/verilog/gl/*.v]]
} elseif {$::env(MCW_ROOT) == $::env(CARAVEL_ROOT)} {
set verilogs [concat [glob $::env(CARAVEL_ROOT)/verilog/gl/*.v] \
[glob $::env(UPRJ_ROOT)/verilog/gl/*.v]]
} elseif {$::env(UPRJ_ROOT) == $::env(CARAVEL_ROOT)} {
set verilogs [concat [glob $::env(CARAVEL_ROOT)/verilog/gl/*.v] \
[glob $::env(MCW_ROOT)/verilog/gl/*.v]]
} else {
set verilogs [concat [glob $::env(CARAVEL_ROOT)/verilog/gl/*.v] \
[glob $::env(MCW_ROOT)/verilog/gl/*.v] \
[glob $::env(UPRJ_ROOT)/verilog/gl/*.v]]
}
set verilog_exceptions [concat [glob $::env(CARAVEL_ROOT)/verilog/gl/*-signoff.v] \
[glob $::env(CARAVEL_ROOT)/verilog/gl/__*.v]]
# remove empty wrapper when including non-empty wrapper only
if {!($::env(UPW))} {
if {$::env(DESIGN) == $::env(CHIP_CORE) || $::env(DESIGN) == $::env(CHIP)} {
set verilogs [concat $verilogs "$::env(CARAVEL_ROOT)/verilog/gl/__user_project_wrapper.v"]
set verilog_exceptions [concat $verilog_exceptions "$::env(UPRJ_ROOT)/verilog/gl/user_project_wrapper.v"]
}
}
foreach verilog_exception $verilog_exceptions {
puts "verilog exception: $verilog_exception"
set match_idx [lsearch $verilogs $verilog_exception]
if {$match_idx} {
puts "removing $verilog_exception from verilogs list"
set verilogs [lreplace $verilogs $match_idx $match_idx]
}
}
puts "list of verilog files:" puts "list of verilog files:"
foreach verilog "[glob $::env(CARAVEL_ROOT)/verilog/gl/*.v] [glob $::env(MCW_ROOT)/verilog/gl/*.v] [glob $::env(UPRJ_ROOT)/verilog/gl/*.v]" { foreach verilog $verilogs {
puts $verilog puts $verilog
read_verilog $verilog read_verilog $verilog
} }
@ -61,114 +55,115 @@ if {\
link link
# Reading constraints (signoff) # Reading constraints (signoff)
if {$::env(DESIGN) == "mgmt_core_wrapper" | $::env(DESIGN) == "RAM256" | $::env(DESIGN) == "RAM128"} { read_sdc $::env(ROOT)/signoff/$::env(DESIGN)/$::env(DESIGN).sdc
read_sdc $::env(MCW_ROOT)/signoff/$::env(DESIGN)/$::env(DESIGN).sdc
} else { # debug interface input for swift
read_sdc $::env(CARAVEL_ROOT)/signoff/$::env(DESIGN)/$::env(DESIGN).sdc if {$::env(DEBUG) && $::env(DESIGN) == $::env(CHIP)} {
reset_path -from [get_ports mprj_io[0]]
} }
# -filter is supported by PT but not in the read_sdc
# add max_tran constraint as the default max_tran of the ss hd SCL is 10 so the violations are not caught in ss corners
# apply the constraint to hd cells at the ss corner
if { $::env(PROC_CORNER) == "s" } {
set max_tran 1.5
puts "\[INFO\]: Setting maximum transition of HD cells in slow process corner to: $max_tran"
puts "For HD cells in the hierarchy of $::env(DESIGN)"
set_max_transition $max_tran [get_pins -of_objects [get_cells -filter {ref_name=~sky130_fd_sc_hd*}]]
set_max_transition $max_tran [get_pins -of_objects [get_cells */* -filter {ref_name=~sky130_fd_sc_hd*}]]
set_max_transition $max_tran [get_pins -of_objects [get_cells */*/* -filter {ref_name=~sky130_fd_sc_hd*}]]
}
# Reading parasitics based on the RC corner specified # Reading parasitics based on the RC corner specified
proc read_spefs {design rc_corner} { proc read_spefs {design rc_corner} {
source ./spef_mapping.tcl if {[string match gf180* $::env(PDK)]} {
source ./gf180_spef_mapping.tcl
} elseif {[string match sky130* $::env(PDK)]} {
source ./sky130_spef_mapping.tcl
}
foreach key [array names spef_mapping] { foreach key [array names spef_mapping] {
read_parasitics -keep_capacitive_coupling -path $key $spef_mapping($key) read_parasitics -keep_capacitive_coupling -path $key $spef_mapping($key)
} }
# add -complete_with wlm to let PT complete incomplete RC networks at the top-level # add -complete_with wlm to let PT complete incomplete RC networks at the top-level
if {$design == "mgmt_core_wrapper" | $design == "RAM128" | $design == "RAM256"} { read_parasitics -keep_capacitive_coupling $::env(ROOT)/signoff/${design}/openlane-signoff/spef/${design}.${rc_corner}.spef -pin_cap_included
read_parasitics -keep_capacitive_coupling -verbose $::env(MCW_ROOT)/signoff/${design}/openlane-signoff/spef/${design}.${rc_corner}.spef -complete_with wlm -pin_cap_included # read_parasitics -keep_capacitive_coupling $::env(ROOT)/signoff/${design}/openlane-signoff/spef/${design}.${rc_corner}.spef -pin_cap_included -complete_with wlm
} else {
read_parasitics -keep_capacitive_coupling -verbose $::env(CARAVEL_ROOT)/signoff/${design}/openlane-signoff/spef/${design}.${rc_corner}.spef -complete_with wlm -pin_cap_included
}
report_annotated_parasitics
} }
proc report_results {design rc_corner proc_corner} {
report_global_timing -separate_all_groups -significant_digits 4 > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-global.rpt
report_analysis_coverage -significant_digits 4 -nosplit -status_details {untested} > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-coverage.rpt
report_constraint -all_violators -significant_digits 4 -nosplit > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-all_viol.rpt proc report_results {design rc_corner proc_corner} {
report_global_timing -separate_all_groups -significant_digits 4 > $::env(OUT_DIR)/reports/${proc_corner}${proc_corner}/${design}.${rc_corner}-global.rpt
report_analysis_coverage -significant_digits 4 -nosplit -status_details {untested} > $::env(OUT_DIR)/reports/${proc_corner}${proc_corner}/${design}.${rc_corner}-coverage.rpt
report_constraint -all_violators -significant_digits 4 -nosplit > $::env(OUT_DIR)/reports/${proc_corner}${proc_corner}/${design}.${rc_corner}-all_viol.rpt
report_timing -unique_pins -delay min -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit \ report_timing -unique_pins -delay min -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit \
-max_paths 10000 -nworst 10 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-min_timing.rpt -max_paths 1000 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${proc_corner}${proc_corner}/${design}.${rc_corner}-min_timing.rpt
report_timing -unique_pins -delay max -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit \ report_timing -unique_pins -delay max -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit \
-max_paths 10000 -nworst 10 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-max_timing.rpt -max_paths 1000 -slack_lesser_than 20 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${proc_corner}${proc_corner}/${design}.${rc_corner}-max_timing.rpt
report_si_bottleneck -significant_digits 4 -nosplit -slack_lesser_than 10 -all_nets > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-si_bottleneck.rpt report_si_bottleneck -significant_digits 4 -nosplit -slack_lesser_than 10 -all_nets > $::env(OUT_DIR)/reports/${proc_corner}${proc_corner}/${design}.${rc_corner}-si_bottleneck.rpt
if {$design == "caravel" | $design == "caravan"} { if {$design == $::env(CHIP) | $design == $::env(CHIP_CORE)} {
if {$::env(UPW) && $design == $::env(CHIP)} {
report_timing -unique_pins -delay min -through [get_cells chip_core/mprj] -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit \
-max_paths 1000 -slack_lesser_than 100 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${proc_corner}${proc_corner}/${design}.${rc_corner}-mprj-min_timing.rpt
report_timing -unique_pins -delay max -through [get_cells chip_core/mprj] -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit \
-max_paths 1000 -slack_lesser_than 100 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${proc_corner}${proc_corner}/${design}.${rc_corner}-mprj-max_timing.rpt
}
if {$::env(DEBUG)} {
report_timing -unique_pins -delay min -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit -group debug_clk \
-max_paths 1000 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${proc_corner}${proc_corner}/${design}.${rc_corner}-debug_clk-min_timing.rpt
report_timing -unique_pins -delay max -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit -group debug_clk \
-max_paths 1000 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${proc_corner}${proc_corner}/${design}.${rc_corner}-debug_clk-max_timing.rpt
} else {
report_timing -unique_pins -delay max -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit -group hkspi_clk \
-max_paths 1000 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${proc_corner}${proc_corner}/${design}.${rc_corner}-hkspi_clk-max_timing.rpt
report_timing -unique_pins -delay min -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit -group hkspi_clk \
-max_paths 1000 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${proc_corner}${proc_corner}/${design}.${rc_corner}-hkspi_clk-min_timing.rpt
}
report_timing -unique_pins -delay min -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit -group clk \ report_timing -unique_pins -delay min -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit -group clk \
-max_paths 10000 -nworst 10 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-clk-min_timing.rpt -max_paths 1000 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${proc_corner}${proc_corner}/${design}.${rc_corner}-clk-min_timing.rpt
report_timing -unique_pins -delay max -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit -group clk \ report_timing -unique_pins -delay max -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit -group clk \
-max_paths 10000 -nworst 10 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-clk-max_timing.rpt -max_paths 1000 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${proc_corner}${proc_corner}/${design}.${rc_corner}-clk-max_timing.rpt
report_timing -unique_pins -delay min -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit -group hk_serial_clk \ report_timing -unique_pins -delay min -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit -group hk_serial_clk \
-max_paths 10000 -nworst 10 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-hk_serial_clk-min_timing.rpt -max_paths 1000 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${proc_corner}${proc_corner}/${design}.${rc_corner}-hk_serial_clk-min_timing.rpt
report_timing -unique_pins -delay max -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit -group hk_serial_clk \ report_timing -unique_pins -delay max -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit -group hk_serial_clk \
-max_paths 10000 -nworst 10 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-hk_serial_clk-max_timing.rpt -max_paths 1000 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${proc_corner}${proc_corner}/${design}.${rc_corner}-hk_serial_clk-max_timing.rpt
report_timing -unique_pins -delay max -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit -group hkspi_clk \
-max_paths 10000 -nworst 10 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-hkspi_clk-max_timing.rpt
report_timing -unique_pins -delay min -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit -group hkspi_clk \
-max_paths 10000 -nworst 10 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-hkspi_clk-min_timing.rpt
report_timing -unique_pins -delay min -through [get_cells soc] -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit \
-max_paths 10000 -nworst 10 -slack_lesser_than 100 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-soc-min_timing.rpt
report_timing -unique_pins -delay max -through [get_cells soc] -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit \
-max_paths 10000 -nworst 10 -slack_lesser_than 100 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-soc-max_timing.rpt
report_case_analysis -nosplit > $::env(OUT_DIR)/reports/${design}.case_analysis.rpt report_case_analysis -nosplit > $::env(OUT_DIR)/reports/${design}.case_analysis.rpt
report_exceptions -nosplit > $::env(OUT_DIR)/reports/${design}.false_paths.rpt report_exceptions -nosplit > $::env(OUT_DIR)/reports/${design}.false_paths.rpt
report_timing -unique_pins -delay min -through [get_cells mprj] -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit \
-max_paths 10000 -nworst 5 -slack_lesser_than 100 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-mprj-min_timing.rpt
report_timing -unique_pins -delay max -through [get_cells mprj] -path_type full_clock_expanded -transition_time -capacitance -nets -crosstalk_delta -derate -nosplit \
-max_paths 10000 -nworst 5 -slack_lesser_than 100 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-mprj-max_timing.rpt
} }
write_sdf -version 3.0 -significant_digits 4 $::env(OUT_DIR)/sdf/${rc_corner}/${design}.${proc_corner}${proc_corner}.sdf if {$::env(REPORTS_ONLY) == 0} {
write_sdf -compress gzip $::env(OUT_DIR)/sdf/${proc_corner}${proc_corner}/${design}.${rc_corner}.sdf.gz
# Extract timing model # Extract timing model
set extract_model_clock_transition_limit 0.75 set extract_model_clock_transition_limit 0.75
set extract_model_data_transition_limit 0.75 set extract_model_data_transition_limit 0.75
set_app_var extract_model_capacitance_limit 1.0 set_app_var extract_model_capacitance_limit 1.0
set extract_model_num_capacitance_points 7 set extract_model_num_capacitance_points 7
set extract_model_num_clock_transition_points 7 set extract_model_num_clock_transition_points 7
set extract_model_num_data_transition_points 7 set extract_model_num_data_transition_points 7
set extract_model_use_conservative_current_slew true set extract_model_use_conservative_current_slew true
set extract_model_enable_report_delay_calculation true set extract_model_enable_report_delay_calculation true
set extract_model_with_clock_latency_arcs true set extract_model_with_clock_latency_arcs true
extract_model -output $::env(OUT_DIR)/lib/${rc_corner}/${design}.${proc_corner}${proc_corner} -format {lib}
# remove boundary constraints
reset_timing_derate
remove_input_delay [all_inputs]
remove_output_delay [all_outputs]
remove_capacitance [all_outputs]
extract_model -output $::env(OUT_DIR)/lib/${proc_corner}${proc_corner}/${design}.${rc_corner} -format {lib}
}
} }
# set timing_report_unconstrained_paths TRUE # set timing_report_unconstrained_paths TRUE
set parasitics_log_file $::env(OUT_DIR)/logs/$::env(DESIGN)-$::env(RC_CORNER)-parasitics.log set parasitics_log_file $::env(OUT_DIR)/logs/$::env(RC_CORNER)-parasitics.log
set si_enable_analysis TRUE set si_enable_analysis TRUE
# set si_enable_analysis FALSE # set si_enable_analysis FALSE
set sh_message_limit 1500 set sh_message_limit 1500
read_spefs $::env(DESIGN) $::env(RC_CORNER) read_spefs $::env(DESIGN) $::env(RC_CORNER)
set parasitics_log_file $::env(OUT_DIR)/logs/$::env(RC_CORNER)-unannotated.log
report_annotated_parasitics -list_not_annotated -max_nets 5000
update_timing update_timing
report_results $::env(DESIGN) $::env(RC_CORNER) $::env(PROC_CORNER) report_results $::env(DESIGN) $::env(RC_CORNER) $::env(PROC_CORNER)
exit exit
} err] } err]
} { } {
puts stderr $err puts stderr $err
exit 1 exit 1
} }

View File

@ -1,7 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# This script runs PrimeTime STA # This script runs PrimeTime STA
# Rev 1
# 6/10/2022
import argparse import argparse
import os import os
@ -9,29 +8,31 @@ import os
def run_sta_all ( def run_sta_all (
design: str, design: str,
output_dir: str, output_dir: str,
log_dir: str log_dir: str,
root_dir: str,
): ):
proc_corners = ["t", "s", "f"] proc_corners = ["t", "s", "f"]
rc_corners = ["nom", "max", "min"] rc_corners = ["nom", "max", "min"]
for proc in proc_corners: for proc in proc_corners:
for rc in rc_corners: for rc in rc_corners:
run_sta (design, proc, rc, output_dir, log_dir) run_sta (design, proc, rc, output_dir, log_dir, root_dir)
def run_sta ( def run_sta (
design: str, design: str,
proc_corner: str, proc_corner: str,
rc_corner: str, rc_corner: str,
output_dir: str, output_dir: str,
log_dir: str log_dir: str,
root_dir: str,
): ):
print (f"PrimeTime STA run for design: {design} at process corner {proc_corner} and RC corner {rc_corner}") print (f"PrimeTime STA run for design: {design} at process corner {proc_corner} and RC corner {rc_corner}")
# Output directory structure # Output directory structure
sub_dirs = ['reports', 'sdf', 'lib'] sub_dirs = ['reports', 'sdf', 'lib']
for item in sub_dirs: for item in sub_dirs:
path=os.path.join(output_dir,item) path=os.path.join(output_dir,item)
try: try:
os.makedirs(os.path.join(path,rc_corner)) os.makedirs(os.path.join(path,f"{proc_corner}{proc_corner}"))
except FileExistsError: except FileExistsError:
# directory already exists # directory already exists
pass pass
@ -41,11 +42,13 @@ def run_sta (
check_env_vars() check_env_vars()
os.environ["PDK_ROOT"] = os.getenv('PDK_ROOT') os.environ["PDK_ROOT"] = os.getenv('PDK_ROOT')
os.environ["PDK"] = os.getenv('PDK') os.environ["PDK"] = os.getenv('PDK')
os.environ["PT_LIB_ROOT"] = os.getenv('PT_LIB_ROOT') if "sky130" in os.getenv('PDK'):
os.environ["PT_LIB_ROOT"] = os.getenv('PT_LIB_ROOT')
os.environ["CARAVEL_ROOT"] = os.getenv('CARAVEL_ROOT') os.environ["CARAVEL_ROOT"] = os.getenv('CARAVEL_ROOT')
os.environ["UPRJ_ROOT"] = os.getenv('UPRJ_ROOT') os.environ["UPRJ_ROOT"] = os.getenv('UPRJ_ROOT')
os.environ["MCW_ROOT"] = os.getenv('MCW_ROOT') os.environ["MCW_ROOT"] = os.getenv('MCW_ROOT')
os.environ["OUT_DIR"] = output_dir os.environ["OUT_DIR"] = output_dir
os.environ["ROOT"] = root_dir
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
os.environ["DESIGN"] = design os.environ["DESIGN"] = design
os.environ["PROC_CORNER"] = proc_corner os.environ["PROC_CORNER"] = proc_corner
@ -53,58 +56,73 @@ def run_sta (
# PrimeTime command # PrimeTime command
PT_tcl = f"{SCRIPT_DIR}/pt_sta.tcl" PT_tcl = f"{SCRIPT_DIR}/pt_sta.tcl"
pt_command = f"source /tools/bashrc_snps; pt_shell -f {PT_tcl} -output_log_file {log_dir}/{design}-{rc_corner}-{proc_corner}-sta.log" pt_command = f"pt_shell -f {PT_tcl} -output_log_file {log_dir}/{design}-{proc_corner}-{rc_corner}-sta.log"
os.system(pt_command) os.system(pt_command)
log = open(f"{log_dir}/{design}-{proc_corner}-{rc_corner}-sta.log", "a")
# Print missing spef
missing_spefs, spefs=find_missing_spefs(f"{log_dir}/{rc_corner}-parasitics.log")
if missing_spefs:
print("The following spefs are missing:")
log.write("The following spefs are missing:\n")
for spef in spefs:
print(spef)
log.write(f"{spef}\n")
# Check if there are any violations # Check if there are any violations
sta_pass=search_viol(f"{output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-global.rpt") sta_pass=search_viol(f"{output_dir}/reports/{proc_corner}{proc_corner}/{design}.{rc_corner}-global.rpt", f"{log_dir}/{design}-{proc_corner}-{rc_corner}-sta.log")
log = open(f"{log_dir}/{design}-{rc_corner}-{proc_corner}-sta.log", "a")
if sta_pass == "pass": if sta_pass == "pass":
print (f"STA run Passed!") print (f"STA run Passed!")
log.write(f"STA run Passed!") log.write(f"STA run Passed!")
elif sta_pass == "no link":
print (f"STA run Failed!")
log.write(f"STA run Failed!\n")
print(f"Linking failed. check log: {log_dir}/{design}-{proc_corner}-{rc_corner}-sta.log")
log.write(f"Linking failed. check log: {log_dir}/{design}-{proc_corner}-{rc_corner}-sta.log")
else: else:
if sta_pass == "max_tran_cap": if sta_pass == "max_tran_cap":
print (f"STA run Passed!") print (f"STA run Passed!")
log.write(f"STA run Passed!\n") log.write(f"STA run Passed!\n")
print (f"There are max_transition and max_capacitance violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-all_viol.rpt") print (f"There are max_transition and max_capacitance violations. check report: {output_dir}/reports/{proc_corner}{proc_corner}/{design}.{rc_corner}-all_viol.rpt")
log.write(f"There are max_transition and max_capacitance violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-all_viol.rpt") log.write(f"There are max_transition and max_capacitance violations. check report: {output_dir}/reports/{proc_corner}{proc_corner}/{design}.{rc_corner}-all_viol.rpt")
elif sta_pass == "max_tran": elif sta_pass == "max_tran":
print (f"STA run Passed!") print (f"STA run Passed!")
log.write(f"STA run Passed!\n") log.write(f"STA run Passed!\n")
print (f"There are max_transition violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-all_viol.rpt") print (f"There are max_transition violations. check report: {output_dir}/reports/{proc_corner}{proc_corner}/{design}.{rc_corner}-all_viol.rpt")
log.write(f"There are max_transition violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-all_viol.rpt") log.write(f"There are max_transition violations. check report: {output_dir}/reports/{proc_corner}{proc_corner}/{design}.{rc_corner}-all_viol.rpt")
elif sta_pass == "max_cap": elif sta_pass == "max_cap":
print (f"STA run Passed!") print (f"STA run Passed!")
log.write(f"STA run Passed!\n") log.write(f"STA run Passed!\n")
print (f"There are max_capacitance violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-all_viol.rpt") print (f"There are max_capacitance violations. check report: {output_dir}/reports/{proc_corner}{proc_corner}/{design}.{rc_corner}-all_viol.rpt")
log.write(f"There are max_capacitance violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-all_viol.rpt") log.write(f"There are max_capacitance violations. check report: {output_dir}/reports/{proc_corner}{proc_corner}/{design}.{rc_corner}-all_viol.rpt")
elif sta_pass == "viol":
print(f"There are other violations. check report: {output_dir}/reports/{proc_corner}{proc_corner}/{design}.{rc_corner}-all_viol.rpt")
log.write(f"There are other violations. check report: {output_dir}/reports/{proc_corner}{proc_corner}/{design}.{rc_corner}-all_viol.rpt")
else: else:
print (f"STA run Failed!") print (f"STA run Failed!")
log.write(f"STA run Failed!\n") log.write(f"STA run Failed!\n")
if sta_pass == "setup": if sta_pass == "setup":
print(f"There are setup violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-global.rpt") print(f"There are setup violations. check report: {output_dir}/reports/{proc_corner}{proc_corner}/{design}.{rc_corner}-global.rpt")
log.write(f"There are setup violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-global.rpt") log.write(f"There are setup violations. check report: {output_dir}/reports/{proc_corner}{proc_corner}/{design}.{rc_corner}-global.rpt")
elif sta_pass == "hold": elif sta_pass == "hold":
print(f"There are hold violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-global.rpt") print(f"There are hold violations. check report: {output_dir}/reports/{proc_corner}{proc_corner}/{design}.{rc_corner}-global.rpt")
log.write(f"There are hold violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-global.rpt") log.write(f"There are hold violations. check report: {output_dir}/reports/{proc_corner}{proc_corner}/{design}.{rc_corner}-global.rpt")
elif sta_pass == "viol":
print(f"There are violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-all_viol.rpt")
log.write(f"There are violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-all_viol.rpt")
elif sta_pass == "no cons": elif sta_pass == "no cons":
print(f"Reading constraints SDC failed. check log: {log_dir}/{design}-{rc_corner}-{proc_corner}-sta.log") print(f"Reading constraints SDC failed. check log: {log_dir}/{design}-{proc_corner}-{rc_corner}-sta.log")
log.write(f"Reading constraints SDC failed. check log: {log_dir}/{design}-{rc_corner}-{proc_corner}-sta.log") log.write(f"Reading constraints SDC failed. check log: {log_dir}/{design}-{proc_corner}-{rc_corner}-sta.log")
elif sta_pass == "spef":
print(f"Reading parasitics failed. check log: {log_dir}/{design}-{rc_corner}-parasitics.log")
log.write(f"Reading parasitics failed. check log: {log_dir}/{design}-{rc_corner}-parasitics.log")
else:
print(f"Linking failed. check log: {log_dir}/{design}-{rc_corner}-{proc_corner}-sta.log")
log.write(f"Linking failed. check log: {log_dir}/{design}-{rc_corner}-{proc_corner}-sta.log")
log.close() log.close()
# Check the required env variables # Check the required env variables
def check_env_vars(): def check_env_vars():
pdk_root = os.getenv('PDK_ROOT') pdk_root = os.getenv('PDK_ROOT')
pdk = os.getenv('PDK') pdk = os.getenv('PDK')
pt_lib_root = os.getenv('PT_LIB_ROOT') if "sky130" in os.getenv('PDK'):
pt_lib_root = os.getenv('PT_LIB_ROOT')
if pt_lib_root is None:
raise FileNotFoundError(
"Please export PT_LIB_ROOT to the PrimeTime liberties path"
)
caravel_root = os.getenv('CARAVEL_ROOT') caravel_root = os.getenv('CARAVEL_ROOT')
uprj_root = os.getenv('UPRJ_ROOT') uprj_root = os.getenv('UPRJ_ROOT')
mcw_root = os.getenv('MCW_ROOT') mcw_root = os.getenv('MCW_ROOT')
@ -116,10 +134,6 @@ def check_env_vars():
raise FileNotFoundError( raise FileNotFoundError(
"Please export PDK to either sky130A or sky130B" "Please export PDK to either sky130A or sky130B"
) )
if pt_lib_root is None:
raise FileNotFoundError(
"Please export PT_LIB_ROOT to the PrimeTime liberties path"
)
if caravel_root is None: if caravel_root is None:
raise FileNotFoundError( raise FileNotFoundError(
"Please export CARAVEL_ROOT to the Caravel repo path" "Please export CARAVEL_ROOT to the Caravel repo path"
@ -135,23 +149,15 @@ def check_env_vars():
# Analyze the STA all violators output report # Analyze the STA all violators output report
def search_viol( def search_viol(
report_path: str report_path: str,
log_path: str
): ):
proc_corner = report_path[-12]
rc_corner = os.path.basename(os.path.dirname(report_path))
log_path = report_path.replace(f"/reports/{rc_corner}/", "/logs/")
log_path = log_path.replace(f".{proc_corner}{proc_corner}-global.rpt", f"-{rc_corner}-{proc_corner}-sta.log")
with open(log_path, 'r') as report: with open(log_path, 'r') as report:
data = report.read() data = report.read()
if "Could not auto-link design" in data: if "Could not auto-link design" in data:
return "no link" return "no link"
elif "Error: Errors reading SDC file:" in data: elif "Error: Errors reading SDC file:" in data:
return "no cons" return "no cons"
log_path = log_path.replace(f"{proc_corner}-sta", f"parasitics")
with open(log_path, 'r') as report:
data = report.read()
if "Error: Cannot open file" in data:
return "spef"
with open(report_path, 'r') as report: with open(report_path, 'r') as report:
data = report.read() data = report.read()
if "Hold violations" in data: if "Hold violations" in data:
@ -172,6 +178,24 @@ def search_viol(
else: else:
return "pass" return "pass"
# Find missing spefs in parasitics annotation
def find_missing_spefs(
log_path: str
):
missing_spefs = 0
spefs = []
with open(log_path, 'r') as log:
data = log.read()
if "Error: Cannot open file" in data:
missing_spefs = 1
log.seek(0)
lines = log.readlines()
for line in lines:
if "Error: Cannot open file" in line:
spef = line.split(".")[0].split("/")[-1]
spefs.append(spef)
return missing_spefs, spefs
if __name__ == "__main__": if __name__ == "__main__":
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description="Run STA using PrimeTime" description="Run STA using PrimeTime"
@ -194,6 +218,12 @@ if __name__ == "__main__":
help="log directory", help="log directory",
required=True required=True
) )
parser.add_argument(
"-r",
"--root_dir",
help="design root directory",
required=True
)
parser.add_argument( parser.add_argument(
"-rc", "-rc",
"--rc_corner", "--rc_corner",
@ -214,11 +244,30 @@ if __name__ == "__main__":
help="Specify to run all the process corners and rc corners combinations for the design", help="Specify to run all the process corners and rc corners combinations for the design",
action='store_true' action='store_true'
) )
parser.add_argument(
"-upw",
"--upw",
help="Specify to run with non-empty user project wrapper <default is false",
nargs="?",
default="0"
)
parser.add_argument(
"-rep",
"--reports",
help="Specify to generate reports only skipping generating liberties and sdf (for faster runtime)",
action='store_true'
)
args = parser.parse_args() args = parser.parse_args()
output = os.path.abspath(args.output_dir) output = os.path.abspath(args.output_dir)
log = os.path.abspath(args.logs_dir) log = os.path.abspath(args.logs_dir)
root = os.path.abspath(args.root_dir)
os.environ["UPW"] = args.upw
if args.reports:
os.environ["REPORTS_ONLY"] = "1"
else:
os.environ["REPORTS_ONLY"] = "0"
try: try:
os.makedirs(output) os.makedirs(output)
@ -241,6 +290,6 @@ if __name__ == "__main__":
pass pass
if args.all: if args.all:
run_sta_all (args.design, output, log) run_sta_all (args.design, output, log, root)
else: else:
run_sta (args.design, args.proc_corner, args.rc_corner, output, log) run_sta (args.design, args.proc_corner, args.rc_corner, output, log, root)

462
scripts/signoff_automation.py Executable file → Normal file
View File

@ -8,7 +8,8 @@ import subprocess
from sys import stdout from sys import stdout
import count_lvs import count_lvs
import glob import glob
import run_pt_sta import time
import shutil
def build_caravel_caravan(caravel_root, mcw_root, pdk_root, log_dir, pdk_env, design): def build_caravel_caravan(caravel_root, mcw_root, pdk_root, log_dir, pdk_env, design):
@ -34,19 +35,30 @@ def build_caravel_caravan(caravel_root, mcw_root, pdk_root, log_dir, pdk_env, de
) )
subprocess.run(build_cmd, stderr=build_log, stdout=build_log) subprocess.run(build_cmd, stderr=build_log, stdout=build_log)
def run_drc(design_root, log_dir, signoff_dir, pdk_root, design): def run_drc(design_root, timestr, signoff_dir, pdk_path, design):
klayout_drc_cmd = [ log_dir = f"{signoff_dir}/{design}/standalone_pvr/{timestr}/logs"
"python3", if "sky130" in os.getenv('PDK'):
"klayout_drc.py", klayout_drc_cmd = [
"-g", "python3",
f"{design_root}/gds/{design}.gds", "klayout_drc.py",
"-l", "-g",
f"{log_dir}", f"{design_root}/gds/{design}.gds",
"-s", "-l",
f"{signoff_dir}/{design}/standalone_pvr", f"{log_dir}",
"-d", "-s",
f"{design}", f"{signoff_dir}/{design}/standalone_pvr/{timestr}",
] "-d",
f"{design}",
]
elif "gf180" in os.getenv('PDK'):
klayout_drc_cmd = [
"python3",
f"{pdk_path}/libs.tech/klayout/drc/run_drc.py",
"--variant=C",
f"--path={design_root}/gds/{design}.gds",
f"--run_dir={signoff_dir}/{design}/standalone_pvr/{timestr}",
]
p1 = subprocess.Popen(klayout_drc_cmd) p1 = subprocess.Popen(klayout_drc_cmd)
return p1 return p1
@ -138,21 +150,20 @@ def run_verification(caravel_root, pdk_root, pdk_env, sim, simulator="vcs"):
return p1 return p1
def run_sta(caravel_root, mcw_root, pt_lib_root, log_dir, signoff_dir, design): def run_sta(root, pt_lib_root, log_dir, signoff_dir, design, timestr, upw):
myenv = os.environ.copy() myenv = os.environ.copy()
myenv["CARAVEL_ROOT"] = caravel_root
myenv["MCW_ROOT"] = mcw_root
myenv["PT_LIB_ROOT"] = pt_lib_root myenv["PT_LIB_ROOT"] = pt_lib_root
if not os.path.exists(f"{pt_lib_root}"): if "sky130" in os.getenv('PDK'):
subprocess.run( if not os.path.exists(f"{pt_lib_root}"):
[ subprocess.run(
"git", [
"clone", "git",
"git@github.com:efabless/pt_libs.git", "clone",
], "git@github.com:efabless/pt_libs.git",
cwd=f"{caravel_root}/scripts", ],
stdout=subprocess.PIPE, cwd=f"{caravel_root}/scripts",
) stdout=subprocess.PIPE,
)
sta_cmd = [ sta_cmd = [
"python3", "python3",
"run_pt_sta.py", "run_pt_sta.py",
@ -160,9 +171,13 @@ def run_sta(caravel_root, mcw_root, pt_lib_root, log_dir, signoff_dir, design):
"-d", "-d",
f"{design}", f"{design}",
"-o", "-o",
f"{signoff_dir}/{design}/primetime-signoff", f"{signoff_dir}/{design}/primetime/{timestr}",
"-l", "-l",
f"{log_dir}", f"{log_dir}",
"-r",
f"{root}",
"-upw",
f"{upw}",
] ]
p1 = subprocess.Popen( p1 = subprocess.Popen(
sta_cmd, sta_cmd,
@ -174,24 +189,52 @@ def run_sta(caravel_root, mcw_root, pt_lib_root, log_dir, signoff_dir, design):
) )
return p1 return p1
def run_starxt (design_root, log_dir, signoff_dir, design, timestr):
def run_antenna( myenv = os.environ.copy()
log_dir, design_root, design, pdk_root, pdk_env, caravel_root, mcw_root SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
): if not os.path.exists(f"{SCRIPT_DIR}/gf180mcu-tech/"):
os.environ["DESIGN_GDS_ROOT"] = design_root subprocess.run(
os.environ["DESIGN"] = design [
os.environ["LOG_DIR"] = log_dir "git",
os.environ["CARAVEL_ROOT"] = caravel_root "clone",
os.environ["MCW_ROOT"] = mcw_root "git@github.com:efabless/gf180mcu-tech.git",
antenna_cmd = [ ],
"magic", cwd=f"{caravel_root}/scripts",
"-noconsole", stdout=subprocess.PIPE,
"-dnull", )
"-rcfile", starxt_cmd = [
f"{pdk_root}/{pdk_env}/libs.tech/magic/{pdk_env}.magicrc", "python3",
"tech-files/antenna_check.tcl", "extract_StarRC.py",
"-a",
"-d",
f"{design}",
"-o",
f"{signoff_dir}/{design}/StarRC/{timestr}",
"-r",
f"{design_root}",
"-l",
f"{log_dir}",
] ]
p1 = subprocess.Popen(antenna_cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE) p1 = subprocess.Popen(
starxt_cmd,
cwd=f"{caravel_root}/scripts",
env=myenv,
universal_newlines=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
return p1
def run_antenna(design_root, timestr, signoff_dir, pdk_path, design):
klayout_antenna_cmd = [
"python3",
f"{pdk_path}/libs.tech/klayout/drc/run_drc.py",
"--variant=C",
"--antenna_only",
f"--path={design_root}/gds/{design}.gds",
f"--run_dir={signoff_dir}/{design}/standalone_pvr/{timestr}/",
]
p1 = subprocess.Popen(klayout_antenna_cmd)
return p1 return p1
@ -200,14 +243,27 @@ def check_errors(
): ):
f = open(os.path.join(signoff_dir, f"{design}/signoff.rpt"), "w") f = open(os.path.join(signoff_dir, f"{design}/signoff.rpt"), "w")
if drc: if drc:
drc_count_klayout = os.path.join(log_dir, f"{design}_klayout_drc.total") if "sky130" in os.getenv('PDK'):
with open(drc_count_klayout) as rep: drc_count_klayout = os.path.join(log_dir, f"{design}_klayout_drc.total")
if rep.readline().strip() != "0": with open(drc_count_klayout) as rep:
logging.error(f"klayout DRC failed") if rep.readline().strip() != "0":
f.write("Klayout MR DRC: Failed\n") logging.error(f"klayout DRC failed")
else: f.write("Klayout MR DRC: Failed\n")
logging.info("Klayout MR DRC: Passed") else:
f.write("Klayout MR DRC: Passed\n") logging.info("Klayout MR DRC: Passed")
f.write("Klayout MR DRC: Passed\n")
elif "gf180" in os.getenv('PDK'):
drc_output_dir = f"{signoff_dir}/{design}/standalone_pvr/{timestr}"
log_drc_file = glob.glob(f"{drc_output_dir}/drc_run_*.log")[0]
os.remove(f"{drc_output_dir}/main.drc")
with open(log_drc_file) as rep:
for lines in rep:
if "not clean" in lines:
logging.error(f"klayout DRC failed")
f.write("Klayout MR DRC: Failed\n")
elif "clean" in lines:
logging.info("Klayout MR DRC: Passed")
f.write("Klayout MR DRC: Passed\n")
if lvs: if lvs:
lvs_summary_report = open( lvs_summary_report = open(
os.path.join(signoff_dir, f"{design}/standalone_pvr/lvs_summary.rpt"), "w" os.path.join(signoff_dir, f"{design}/standalone_pvr/lvs_summary.rpt"), "w"
@ -255,6 +311,10 @@ def check_errors(
with open(l) as rep: with open(l) as rep:
log_name = l.split("/")[-1] log_name = l.split("/")[-1]
log_name = log_name.split(".")[0] log_name = log_name.split(".")[0]
data = rep.read()
if "The following spefs are missing:" in data:
logging.warning(f"Missing spefs. check: {l}")
rep.seek(0)
lines = rep.readlines() lines = rep.readlines()
if "Passed" in lines[-1]: if "Passed" in lines[-1]:
logging.info(f"{log_name} STA: Passed") logging.info(f"{log_name} STA: Passed")
@ -271,25 +331,62 @@ def check_errors(
logging.warning(lines[-1]) logging.warning(lines[-1])
logging.info(f"{log_name} STA: Passed (except: max_cap)") logging.info(f"{log_name} STA: Passed (except: max_cap)")
f.write(f"{log_name} STA: Passed (except: max_cap)\n") f.write(f"{log_name} STA: Passed (except: max_cap)\n")
elif "other violations" in lines[-1]:
logging.warning(lines[-1])
logging.info(f"{log_name} STA: Passed")
f.write(f"{log_name} STA: Passed\n")
else: else:
logging.error(lines[-1]) logging.error(lines[-1])
logging.error(f"{log_name} STA: Failed")
if "setup" in lines[-1]: if "setup" in lines[-1]:
f.write(f"{log_name} STA: Failed (setup)\n") f.write(f"{log_name} STA: Failed (setup)\n")
logging.error(f"{log_name} STA: Failed (setup)")
elif "hold" in lines[-1]: elif "hold" in lines[-1]:
f.write(f"{log_name} STA: Failed (hold)\n") f.write(f"{log_name} STA: Failed (hold)\n")
logging.error(f"{log_name} STA: Failed (hold)")
else: else:
logging.error(f"{log_name} STA: Failed")
f.write(f"{log_name} STA: Failed (" + lines[-1].split(" failed")[0] + ")\n") f.write(f"{log_name} STA: Failed (" + lines[-1].split(" failed")[0] + ")\n")
if antenna: if antenna:
antenna_report = os.path.join(signoff_dir, f"{design}/standalone_pvr/antenna-vios.report") antenna_report = os.path.join(signoff_dir, f"{design}/standalone_pvr/{timestr}/antenna-vios.report")
with open(antenna_report) as rep: xml_report = open(os.path.join(signoff_dir, f"{design}/standalone_pvr/{timestr}/{design}_antenna.lyrdb"))
if "Antenna violation detected" in rep.read(): antenna_count = xml_report.read().count('<item>')
logging.error(f"Antenna checks failed find report at {antenna_report}") antenna_count_log = open(os.path.join(signoff_dir, f"{design}/standalone_pvr/{timestr}/antenna_count.log"), "w")
f.write("Antenna checks: Failed\n") antenna_count_log.write(str(antenna_count))
else: antenna_count_log.close()
logging.info("Antenna checks: Passed") if antenna_count == 0:
f.write("Antenna checks: Passed\n") logging.info("Antenna checks: Passed")
f.write("Antenna checks: Passed\n")
else:
logging.error(f"Antenna checks failed find report at {antenna_report}")
f.write("Antenna checks: Failed\n")
def save_latest_run (lvs, drc, antenna, sta, spef, run_dir):
if spef:
if os.path.exists(f"{run_dir}/../logs"):
shutil.rmtree(f"{run_dir}/../logs")
shutil.copytree(f"{run_dir}/logs", f"{run_dir}/../logs")
spef_files = glob.glob(f"{run_dir}/*.spef")
for spef_f in spef_files:
spef_name =spef_f.split("/")[-1]
shutil.copyfile(spef_f,f"{run_dir}/../{spef_name}")
elif sta:
dirs = ['lib', 'sdf', 'reports', 'logs']
for dir in dirs:
if os.path.exists(f"{run_dir}/../{dir}"):
shutil.rmtree(f"{run_dir}/../{dir}")
shutil.copytree(f"{run_dir}/{dir}", f"{run_dir}/../{dir}")
cmd = f"sed -i -E 's#original_pin :.*##g' {run_dir}/../lib/*/*.lib"
os.system(cmd)
# if lvs or drc or antenna :
# if os.path.exists(f"{run_dir}/../logs"):
# shutil.rmtree(f"{run_dir}/../logs")
# shutil.copytree(f"{run_dir}/logs", f"{run_dir}/../logs")
# files = glob.glob(f"{run_dir}/*")
# for f in files:
# f_name = f.split("/")[-1]
# shutil.copyfile(spef_f,f"{run_dir}/../{f_name}")
if __name__ == "__main__": if __name__ == "__main__":
@ -344,7 +441,19 @@ if __name__ == "__main__":
parser.add_argument( parser.add_argument(
"-sta", "-sta",
"--primetime_sta", "--primetime_sta",
help="run verification using iverilog", help="run sta using primetime",
action="store_true",
)
parser.add_argument(
"-upw",
"--upw",
help="Specify to run STA with non-empty user project wrapper",
action="store_true",
)
parser.add_argument(
"-spef",
"--starRC_extract",
help="run spef extraction using StarRC (gf180)",
action="store_true", action="store_true",
) )
parser.add_argument( parser.add_argument(
@ -407,22 +516,39 @@ if __name__ == "__main__":
iverilog = args.iverilog iverilog = args.iverilog
verification = args.vcs verification = args.vcs
sta = args.primetime_sta sta = args.primetime_sta
if args.upw: upw = True
else: upw = False
spef = args.starRC_extract
if spef and "sky130" in pdk_env:
logging.erro(f"Spef extraction is available for gf180mcu only")
spef = False
design = args.design design = args.design
antenna = args.antenna antenna = args.antenna
log_dir = os.path.join(signoff_dir, f"{design}/standalone_pvr/logs")
if (design == "mgmt_core_wrapper" or design == "RAM128" or design == "RAM256"): if sta:
os.environ["CHIP"] = "caravel"
os.environ["CHIP_CORE"] = "caravel_core"
os.environ["DEBUG"] = "0"
if (design == "mgmt_core_wrapper" or design == "RAM128" or design == "RAM256" or design == "gf180_ram_512x8_wrapper"):
signoff_dir = os.path.join(mcw_root, "signoff") signoff_dir = os.path.join(mcw_root, "signoff")
log_dir = os.path.join(signoff_dir, f"{design}/standalone_pvr/logs") elif (design == "user_project_wrapper" or design == "user_proj_example" or design == "user_project"):
uprj_root = os.getenv("UPRJ_ROOT")
signoff_dir = os.path.join(uprj_root, "signoff")
timestr = time.strftime("%Y_%m_%d_%H_%M_%S")
log_dir = os.path.join(signoff_dir, f"{design}/standalone_pvr/{timestr}/logs")
if not os.path.exists(f"{signoff_dir}/{design}"): if not os.path.exists(f"{signoff_dir}/{design}"):
os.makedirs(f"{signoff_dir}/{design}") os.makedirs(f"{signoff_dir}/{design}")
if not os.path.exists(f"{signoff_dir}/{design}/standalone_pvr"):
os.makedirs(f"{signoff_dir}/{design}/standalone_pvr")
if not os.path.exists(f"{log_dir}"):
os.makedirs(f"{log_dir}")
if lvs or drc or antenna: if lvs or drc or antenna:
if not os.path.exists(f"{signoff_dir}/{design}/standalone_pvr"):
os.makedirs(f"{signoff_dir}/{design}/standalone_pvr")
if not os.path.exists(f"{signoff_dir}/{design}/standalone_pvr/{timestr}"):
os.makedirs(f"{signoff_dir}/{design}/standalone_pvr/{timestr}")
if not os.path.exists(f"{log_dir}"):
os.makedirs(f"{log_dir}")
if glob.glob(f"{caravel_root}/gds/*.gz"): if glob.glob(f"{caravel_root}/gds/*.gz"):
logging.error( logging.error(
f"Compressed gds files in {caravel_root}. Please uncompress first." f"Compressed gds files in {caravel_root}. Please uncompress first."
@ -441,23 +567,26 @@ if __name__ == "__main__":
if not os.path.exists(design_root): if not os.path.exists(design_root):
logging.error(f"can't find {design}.gds file") logging.error(f"can't find {design}.gds file")
if design == "caravel" or design == "caravan": # if design == "caravel" or design == "caravan":
logging.info(f"Building {design} ...") # logging.info(f"Building {design} ...")
build_caravel_caravan(caravel_root, mcw_root, pdk_root, log_dir, pdk_env, design) # build_caravel_caravan(caravel_root, mcw_root, pdk_root, log_dir, pdk_env, design)
else: # else:
logging.info(f"running checks on {design}") # logging.info(f"running checks on {design}")
if args.all: if args.all:
drc = True drc = True
lvs = True lvs = True
verification = True
sta = True sta = True
spef = True
antenna = True
pdk_path = pdk_root + "/" + pdk_env
if drc: if drc:
if (design == "mgmt_core_wrapper" or design == "RAM128" or design == "RAM256"): if (design == "mgmt_core_wrapper" or design == "RAM128" or design == "RAM256" or design == "gf180_ram_512x8_wrapper"):
drc_p1 = run_drc(mcw_root, log_dir, signoff_dir, pdk_root, design) drc_p1 = run_drc(mcw_root, timestr, signoff_dir, pdk_path, design)
else: else:
drc_p1 = run_drc(caravel_root, log_dir, signoff_dir, pdk_root, design) drc_p1 = run_drc(caravel_root, timestr, signoff_dir, pdk_path, design)
logging.info(f"Running klayout DRC on {design}") logging.info(f"Running klayout DRC on {design}")
if lvs: if lvs:
lvs_p1 = run_lvs( lvs_p1 = run_lvs(
@ -472,28 +601,152 @@ if __name__ == "__main__":
) )
logging.info(f"Running LVS on {design}") logging.info(f"Running LVS on {design}")
if sta: if spef:
if not os.path.exists(f"{signoff_dir}/{design}/primetime-signoff"): if not os.path.exists(f"{signoff_dir}/{design}/StarRC"):
os.makedirs(f"{signoff_dir}/{design}/primetime-signoff") os.makedirs(f"{signoff_dir}/{design}/StarRC")
sta_log_dir = os.path.join(signoff_dir, f"{design}/primetime-signoff/logs") if not os.path.exists(f"{signoff_dir}/{design}/StarRC/{timestr}"):
os.makedirs(f"{signoff_dir}/{design}/StarRC/{timestr}")
spef_log_dir = os.path.join(signoff_dir, f"{design}/StarRC/{timestr}/logs")
if not os.path.exists(f"{spef_log_dir}"):
os.makedirs(f"{spef_log_dir}")
if (design == "mgmt_core_wrapper" or design == "RAM128" or design == "RAM256" or design == "gf180_ram_512x8_wrapper"):
spef_p = run_starxt(
mcw_root,
spef_log_dir,
signoff_dir,
design,
timestr,
)
elif (design == "user_project_wrapper" or design == "user_proj_example"):
spef_p = run_starxt(
uprj_root,
spef_log_dir,
signoff_dir,
design,
timestr,
)
else:
spef_p = run_starxt(
caravel_root,
spef_log_dir,
signoff_dir,
design,
timestr,
)
logging.info(f"Running StarRC all corners extraction on {design}")
if sta and spef:
out, err = spef_p.communicate()
spef_log = open(f"{spef_log_dir}/{design}-error.log", "w")
if err:
if "ERROR" in err:
logging.error(err[err.find("ERROR"):].split(')',1)[0]+")")
spef_log.write(err[err.find("ERROR"):].split(')',1)[0]+")")
spef_log.close()
else:
logging.info(f"StarRC spef extraction done")
os.remove(f"{spef_log_dir}/{design}-error.log")
save_latest_run (lvs, drc, antenna, sta, spef, f"{signoff_dir}/{design}/StarRC/{timestr}")
spef = False
if not os.path.exists(f"{signoff_dir}/{design}/primetime"):
os.makedirs(f"{signoff_dir}/{design}/primetime")
if not os.path.exists(f"{signoff_dir}/{design}/primetime/{timestr}"):
os.makedirs(f"{signoff_dir}/{design}/primetime/{timestr}")
sta_log_dir = os.path.join(signoff_dir, f"{design}/primetime/{timestr}/logs")
if not os.path.exists(f"{sta_log_dir}"): if not os.path.exists(f"{sta_log_dir}"):
os.makedirs(f"{sta_log_dir}") os.makedirs(f"{sta_log_dir}")
logging.info(f"Running PrimeTime STA all corners on {design}") logging.info(f"Running PrimeTime STA all corners on {design}")
sta_p = run_sta( if (design == "mgmt_core_wrapper" or design == "RAM128" or design == "RAM256" or design == "gf180_ram_512x8_wrapper"):
caravel_root, sta_p = run_sta(
mcw_root, mcw_root,
f"{caravel_root}/scripts/pt_libs", f"{caravel_root}/scripts/pt_libs",
sta_log_dir, sta_log_dir,
signoff_dir, signoff_dir,
design, design,
) timestr,
upw
)
elif (design == "user_project_wrapper" or design == "user_proj_example" or design == "user_project"):
sta_p = run_sta(
uprj_root,
f"{caravel_root}/scripts/pt_libs",
sta_log_dir,
signoff_dir,
design,
timestr,
upw
)
else:
sta_p = run_sta(
caravel_root,
f"{caravel_root}/scripts/pt_libs",
sta_log_dir,
signoff_dir,
design,
timestr,
upw
)
elif spef:
out, err = spef_p.communicate()
spef_log = open(f"{spef_log_dir}/{design}-error.log", "w")
if err:
if "ERROR" in err:
logging.error(err[err.find("ERROR"):].split(')',1)[0]+")")
spef_log.write(err[err.find("ERROR"):].split(')',1)[0]+")")
spef_log.close()
else:
logging.info(f"StarRC spef extraction done")
os.remove(f"{spef_log_dir}/{design}-error.log")
save_latest_run (lvs, drc, antenna, sta, spef, f"{signoff_dir}/{design}/StarRC/{timestr}")
elif sta:
if not os.path.exists(f"{signoff_dir}/{design}/primetime"):
os.makedirs(f"{signoff_dir}/{design}/primetime")
if not os.path.exists(f"{signoff_dir}/{design}/primetime/{timestr}"):
os.makedirs(f"{signoff_dir}/{design}/primetime/{timestr}")
sta_log_dir = os.path.join(signoff_dir, f"{design}/primetime/{timestr}/logs")
if not os.path.exists(f"{sta_log_dir}"):
os.makedirs(f"{sta_log_dir}")
logging.info(f"Running PrimeTime STA all corners on {design}")
if (design == "mgmt_core_wrapper" or design == "RAM128" or design == "RAM256" or design == "gf180_ram_512x8_wrapper"):
sta_p = run_sta(
mcw_root,
f"{caravel_root}/scripts/pt_libs",
sta_log_dir,
signoff_dir,
design,
timestr,
upw
)
elif (design == "user_project_wrapper" or design == "user_proj_example" or design == "user_project"):
sta_p = run_sta(
uprj_root,
f"{caravel_root}/scripts/pt_libs",
sta_log_dir,
signoff_dir,
design,
timestr,
upw
)
else:
sta_p = run_sta(
caravel_root,
f"{caravel_root}/scripts/pt_libs",
sta_log_dir,
signoff_dir,
design,
timestr,
upw
)
if antenna: if antenna:
logging.info(f"Running antenna checks on {design}") logging.info(f"Running antenna checks on {design}")
ant = run_antenna( if (design == "mgmt_core_wrapper" or design == "RAM128" or design == "RAM256"):
log_dir, design_root, design, pdk_root, pdk_env, caravel_root, mcw_root ant = run_antenna(mcw_root, timestr, signoff_dir, pdk_path, design)
) else:
ant = run_antenna(caravel_root, timestr, signoff_dir, pdk_path, design)
if verification or iverilog: if verification or iverilog:
verify_p = [] verify_p = []
@ -524,15 +777,6 @@ if __name__ == "__main__":
if out: if out:
ver_log.write(out) ver_log.write(out)
# if lvs and drc and sta:
# out, err = sta_p.communicate()
# sta_log = open(f"{log_dir}/PT_STA_{design}.log", "w")
# if err:
# logging.error(err)
# sta_log.write(err)
# drc_p1.wait()
# lvs_p1.wait()
if sta: if sta:
out, err = sta_p.communicate() out, err = sta_p.communicate()
sta_log = open(f"{sta_log_dir}/PT_STA_{design}.log", "w") sta_log = open(f"{sta_log_dir}/PT_STA_{design}.log", "w")
@ -542,20 +786,14 @@ if __name__ == "__main__":
sta_log.close() sta_log.close()
else: else:
os.remove(f"{sta_log_dir}/PT_STA_{design}.log") os.remove(f"{sta_log_dir}/PT_STA_{design}.log")
save_latest_run (lvs, drc, antenna, sta, spef, f"{signoff_dir}/{design}/primetime/{timestr}")
if lvs: if lvs:
lvs_p1.wait() lvs_p1.wait()
if drc: if drc:
drc_p1.wait() drc_p1.wait()
if antenna: if antenna:
out, err = ant.communicate() ant.wait()
ant_rep = open(f"{signoff_dir}/{design}/standalone_pvr/antenna-vios.report", "w")
if err:
logging.error(err.decode())
ant_rep.write(err.decode())
if out:
ant_rep.write(out.decode())
ant_rep.close()
check_errors( check_errors(
caravel_root, log_dir, signoff_dir, drc, lvs, verification, sta, design, antenna caravel_root, log_dir, signoff_dir, drc, lvs, verification, sta, design, antenna

119
scripts/sky130_libs.tcl Normal file
View File

@ -0,0 +1,119 @@
if {$::env(PROC_CORNER) == "t"} {
puts "\nset link_path \"* $::env(PT_LIB_ROOT)/scs130hd_tt_1.80v_25C.lib
$::env(PT_LIB_ROOT)/scs130hvl_tt_3.3v_25C.lib
$::env(PT_LIB_ROOT)/scs130hvl_tt_3.3v_lowhv_3.3v_lv_1.8v_25C.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_gpiov2_tt_tt_025C_1v80_3v30.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_ground_hvc_wpad_tt_025C_1v80_3v30_3v30.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_ground_lvc_wpad_tt_025C_1v80_3v30.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_power_lvc_wpad_tt_025C_1v80_3v30_3v30.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_xres4v2_tt_tt_025C_1v80_3v30.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__gpiov2_pad_tt_tt_025C_1v80_3v30.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped_pad_tt_025C_1v80_3v30_3v30.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vdda_hvc_clamped_pad_tt_025C_1v80_3v30_3v30.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssa_hvc_clamped_pad_tt_025C_1v80_3v30_3v30.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped3_pad_tt_025C_1v80_3v30.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped3_pad_tt_025C_1v80_3v30_3v30.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped_pad_tt_025C_1v80_3v30.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vddio_hvc_clamped_pad_tt_025C_1v80_3v30_3v30.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssio_hvc_clamped_pad_tt_025C_1v80_3v30_3v30.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_sram_macros/lib/sky130_sram_2kbyte_1rw1r_32x512_8_TT_1p8V_25C.lib
\""
set link_path "* $::env(PT_LIB_ROOT)/scs130hd_tt_1.80v_25C.lib \
$::env(PT_LIB_ROOT)/scs130hvl_tt_3.3v_25C.lib \
$::env(PT_LIB_ROOT)/scs130hvl_tt_3.3v_lowhv_3.3v_lv_1.8v_25C.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_gpiov2_tt_tt_025C_1v80_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_ground_hvc_wpad_tt_025C_1v80_3v30_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_ground_lvc_wpad_tt_025C_1v80_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_power_lvc_wpad_tt_025C_1v80_3v30_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_xres4v2_tt_tt_025C_1v80_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__gpiov2_pad_tt_tt_025C_1v80_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped_pad_tt_025C_1v80_3v30_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vdda_hvc_clamped_pad_tt_025C_1v80_3v30_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssa_hvc_clamped_pad_tt_025C_1v80_3v30_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped3_pad_tt_025C_1v80_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped3_pad_tt_025C_1v80_3v30_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped_pad_tt_025C_1v80_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vddio_hvc_clamped_pad_tt_025C_1v80_3v30_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssio_hvc_clamped_pad_tt_025C_1v80_3v30_3v30.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_sram_macros/lib/sky130_sram_2kbyte_1rw1r_32x512_8_TT_1p8V_25C.lib \
"
} elseif {$::env(PROC_CORNER) == "f"} {
puts "\nset link_path \"* $::env(PT_LIB_ROOT)/scs130hd_ff_1.95v_-40C.lib
$::env(PT_LIB_ROOT)/scs130hvl_ff_5.5v_-40C.lib
$::env(PT_LIB_ROOT)/scs130hvl_ff_5.5v_lowhv_5.5v_lv_1.95v_-40C.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_gpiov2_ff_ff_n40C_1v95_5v50.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_ground_hvc_wpad_ff_n40C_1v95_5v50_5v50.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_ground_lvc_wpad_ff_n40C_1v95_5v50.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_power_lvc_wpad_ff_n40C_1v95_5v50_5v50.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_xres4v2_ff_ff_n40C_1v95_5v50.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__gpiov2_pad_wrapped_ff_ff_n40C_1v95_5v50.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped_pad_ff_n40C_1v95_5v50_5v50.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vdda_hvc_clamped_pad_ff_n40C_1v95_5v50_5v50.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssa_hvc_clamped_pad_ff_n40C_1v95_5v50_5v50.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped3_pad_ff_n40C_1v95_5v50.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped3_pad_ff_n40C_1v95_5v50_5v50.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped_pad_ff_n40C_1v95_5v50.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vddio_hvc_clamped_pad_ff_n40C_1v95_5v50_5v50.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssio_hvc_clamped_pad_ff_n40C_1v95_5v50_5v50.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_sram_macros/lib/sky130_sram_2kbyte_1rw1r_32x512_8_TT_1p8V_25C.lib
\""
set link_path "* $::env(PT_LIB_ROOT)/scs130hd_ff_1.95v_-40C.lib \
$::env(PT_LIB_ROOT)/scs130hvl_ff_5.5v_-40C.lib \
$::env(PT_LIB_ROOT)/scs130hvl_ff_5.5v_lowhv_5.5v_lv_1.95v_-40C.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_gpiov2_ff_ff_n40C_1v95_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_ground_hvc_wpad_ff_n40C_1v95_5v50_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_ground_lvc_wpad_ff_n40C_1v95_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_power_lvc_wpad_ff_n40C_1v95_5v50_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_xres4v2_ff_ff_n40C_1v95_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__gpiov2_pad_wrapped_ff_ff_n40C_1v95_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped_pad_ff_n40C_1v95_5v50_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vdda_hvc_clamped_pad_ff_n40C_1v95_5v50_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssa_hvc_clamped_pad_ff_n40C_1v95_5v50_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped3_pad_ff_n40C_1v95_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped3_pad_ff_n40C_1v95_5v50_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped_pad_ff_n40C_1v95_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vddio_hvc_clamped_pad_ff_n40C_1v95_5v50_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssio_hvc_clamped_pad_ff_n40C_1v95_5v50_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_sram_macros/lib/sky130_sram_2kbyte_1rw1r_32x512_8_TT_1p8V_25C.lib \
"
} elseif {$::env(PROC_CORNER) == "s"} {
puts "\nset link_path \"* $::env(PT_LIB_ROOT)/scs130hd_ss_1.60v_100C.lib
$::env(PT_LIB_ROOT)/scs130hvl_ss_3.00v_100C.lib
$::env(PT_LIB_ROOT)/scs130hvl_ss_3.00v_lowhv_1.65v_lv_1.6v_100C.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_gpiov2_ss_ss_100C_1v60_3v00.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_ground_hvc_wpad_ss_100C_1v60_3v00_3v00.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_ground_lvc_wpad_ss_100C_1v60_3v00.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_power_lvc_wpad_ss_100C_1v60_3v00_3v00.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_xres4v2_ss_ss_100C_1v60_3v00.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__gpiov2_pad_wrapped_ss_ss_100C_1v60_3v00.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped_pad_ss_100C_1v60_3v00_3v00.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vdda_hvc_clamped_pad_ss_100C_1v60_3v00_3v00.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssa_hvc_clamped_pad_ss_100C_1v60_3v00_3v00.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped3_pad_ss_100C_1v60_3v00.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped3_pad_ss_100C_1v60_3v00_3v00.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped_pad_ss_100C_1v60_3v00.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vddio_hvc_clamped_pad_ss_100C_1v60_3v00_3v00.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssio_hvc_clamped_pad_ss_100C_1v60_3v00_3v00.lib
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_sram_macros/lib/sky130_sram_2kbyte_1rw1r_32x512_8_TT_1p8V_25C.lib
\""
set link_path "* $::env(PT_LIB_ROOT)/scs130hd_ss_1.60v_100C.lib \
$::env(PT_LIB_ROOT)/scs130hvl_ss_3.00v_100C.lib \
$::env(PT_LIB_ROOT)/scs130hvl_ss_3.00v_lowhv_1.65v_lv_1.6v_100C.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_gpiov2_ss_ss_100C_1v60_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_ground_hvc_wpad_ss_100C_1v60_3v00_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_ground_lvc_wpad_ss_100C_1v60_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_power_lvc_wpad_ss_100C_1v60_3v00_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_xres4v2_ss_ss_100C_1v60_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__gpiov2_pad_wrapped_ss_ss_100C_1v60_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped_pad_ss_100C_1v60_3v00_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vdda_hvc_clamped_pad_ss_100C_1v60_3v00_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssa_hvc_clamped_pad_ss_100C_1v60_3v00_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped3_pad_ss_100C_1v60_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped3_pad_ss_100C_1v60_3v00_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped_pad_ss_100C_1v60_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vddio_hvc_clamped_pad_ss_100C_1v60_3v00_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssio_hvc_clamped_pad_ss_100C_1v60_3v00_3v00.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_sram_macros/lib/sky130_sram_2kbyte_1rw1r_32x512_8_TT_1p8V_25C.lib \
"
}
puts "\[INFO\]: set link_path for PDK: $::env(PDK)"

View File

@ -0,0 +1,237 @@
# mapping instances to a .spef to enable hierarchical parasitic annotation
if {$design == "user_project_wrapper"} {
# add spefs of modules instantiated in user_project_wrapper/user_analog_project_wrapper here
set spef_mapping(mprj) $::env(UPRJ_ROOT)/signoff/user_proj_example/openlane-signoff/spef/user_proj_example.${rc_corner}.spef
} elseif {$design == $::env(CHIP_CORE)} {
if {$::env(UPW)} {
# user_project_wrapper spefs
# update the path to match the spefs path
set spef_mapping(mprj) $::env(UPRJ_ROOT)/signoff/user_project_wrapper/openlane-signoff/spef/user_project_wrapper.${rc_corner}.spef
# add spefs of modules instantiated in user_project_wrapper/user_analog_project_wrapper here
set spef_mapping(mprj/mprj) $::env(UPRJ_ROOT)/signoff/user_proj_example/openlane-signoff/spef/user_proj_example.${rc_corner}.spef
}
#caravel litex macros
set spef_mapping(\soc.core.RAM256.BANK128[0].RAM128) $::env(MCW_ROOT)/signoff/RAM128/openlane-signoff/spef/RAM128.${rc_corner}.spef
set spef_mapping(\soc.core.RAM256.BANK128[1].RAM128) $::env(MCW_ROOT)/signoff/RAM128/openlane-signoff/spef/RAM128.${rc_corner}.spef
set spef_mapping(\soc.core.RAM128) $::env(MCW_ROOT)/signoff/RAM128/openlane-signoff/spef/RAM128.${rc_corner}.spef
set spef_mapping(clock_ctrl) $::env(CARAVEL_ROOT)/signoff/caravel_clocking/openlane-signoff/spef/caravel_clocking.${rc_corner}.spef
set spef_mapping(housekeeping) $::env(CARAVEL_ROOT)/signoff/housekeeping/openlane-signoff/spef/housekeeping.${rc_corner}.spef
set spef_mapping(gpio_buf) $::env(CARAVEL_ROOT)/signoff/mprj_io_buffer/openlane-signoff/spef/mprj_io_buffer.${rc_corner}.spef
set spef_mapping(rstb_level) $::env(CARAVEL_ROOT)/signoff/xres_buf/openlane-signoff/spef/xres_buf.${rc_corner}.spef
set spef_mapping(por) $::env(CARAVEL_ROOT)/signoff/simple_por/openlane-signoff/spef/simple_por.${rc_corner}.spef
set spef_mapping(\spare_logic[0]) $::env(CARAVEL_ROOT)/signoff/spare_logic_block/openlane-signoff/spef/spare_logic_block.${rc_corner}.spef
set spef_mapping(\spare_logic[1]) $::env(CARAVEL_ROOT)/signoff/spare_logic_block/openlane-signoff/spef/spare_logic_block.${rc_corner}.spef
set spef_mapping(\spare_logic[2]) $::env(CARAVEL_ROOT)/signoff/spare_logic_block/openlane-signoff/spef/spare_logic_block.${rc_corner}.spef
set spef_mapping(\spare_logic[3]) $::env(CARAVEL_ROOT)/signoff/spare_logic_block/openlane-signoff/spef/spare_logic_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_0) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_1) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_3) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_10) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_11) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_12) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_13) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_14) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_15) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_16) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_17) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_18) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_19) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_2) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_20) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_21) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_22) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_23) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_24) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_25) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_26) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_27) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_28) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_29) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_30) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_31) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_32) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_33) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_34) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_4) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_5) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_6) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_7) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_8) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_9) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_35) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_36) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(gpio_defaults_block_37) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(\gpio_control_bidir_1[0].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_bidir_1[1].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_bidir_2[0].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_bidir_2[1].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_bidir_2[2].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_1[0].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_1[10].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_1[1].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_1[2].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_1[3].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_1[4].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_1[5].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_1[6].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_1[7].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_1[8].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_1[9].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_1a[0].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_1a[1].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_1a[2].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_1a[3].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_1a[4].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_1a[5].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_2[0].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_2[10].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_2[11].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_2[12].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_2[13].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_2[14].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_2[15].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_2[1].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_2[2].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_2[3].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_2[4].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_2[5].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_2[6].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_2[7].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_2[8].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(\gpio_control_in_2[9].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(mgmt_buffers.powergood_check) $::env(CARAVEL_ROOT)/signoff/mgmt_protect_hv/openlane-signoff/spef/mgmt_protect_hv.${rc_corner}.spef
set spef_mapping(mgmt_buffers.mprj_logic_high_inst) $::env(CARAVEL_ROOT)/signoff/mprj_logic_high/openlane-signoff/spef/mprj_logic_high.${rc_corner}.spef
set spef_mapping(mgmt_buffers.mprj2_logic_high_inst) $::env(CARAVEL_ROOT)/signoff/mprj2_logic_high/openlane-signoff/spef/mprj2_logic_high.${rc_corner}.spef
} elseif {$design == $::env(CHIP)} {
if {$::env(UPW)} {
# user_project_wrapper spefs
# update the path to match the spefs path
set spef_mapping(chip_core/mprj) $::env(UPRJ_ROOT)/signoff/user_project_wrapper/openlane-signoff/spef/user_project_wrapper.${rc_corner}.spef
# add spefs of modules instantiated in user_project_wrapper/user_analog_project_wrapper here
set spef_mapping(chip_core/mprj/mprj) $::env(UPRJ_ROOT)/signoff/user_proj_example/openlane-signoff/spef/user_proj_example.${rc_corner}.spef
}
set spef_mapping(padframe) $::env(CARAVEL_ROOT)/signoff/chip_io/openlane-signoff/spef/chip_io.${rc_corner}.spef
set spef_mapping(padframe/\constant_value_inst[0]) $::env(CARAVEL_ROOT)/signoff/constant_block/openlane-signoff/spef/constant_block.${rc_corner}.spef
set spef_mapping(padframe/\constant_value_inst[1]) $::env(CARAVEL_ROOT)/signoff/constant_block/openlane-signoff/spef/constant_block.${rc_corner}.spef
set spef_mapping(padframe/\constant_value_inst[2]) $::env(CARAVEL_ROOT)/signoff/constant_block/openlane-signoff/spef/constant_block.${rc_corner}.spef
set spef_mapping(padframe/\constant_value_inst[3]) $::env(CARAVEL_ROOT)/signoff/constant_block/openlane-signoff/spef/constant_block.${rc_corner}.spef
set spef_mapping(padframe/\constant_value_inst[4]) $::env(CARAVEL_ROOT)/signoff/constant_block/openlane-signoff/spef/constant_block.${rc_corner}.spef
set spef_mapping(padframe/\constant_value_inst[5]) $::env(CARAVEL_ROOT)/signoff/constant_block/openlane-signoff/spef/constant_block.${rc_corner}.spef
set spef_mapping(padframe/\constant_value_inst[6]) $::env(CARAVEL_ROOT)/signoff/constant_block/openlane-signoff/spef/constant_block.${rc_corner}.spef
set spef_mapping(chip_core) $::env(CARAVEL_ROOT)/signoff/$::env(CHIP_CORE)/openlane-signoff/spef/$::env(CHIP_CORE).${rc_corner}.spef
#caravel litex macros
set spef_mapping(chip_core/\soc.core.RAM256.BANK128[0].RAM128) $::env(MCW_ROOT)/signoff/RAM128/openlane-signoff/spef/RAM128.${rc_corner}.spef
set spef_mapping(chip_core/\soc.core.RAM256.BANK128[1].RAM128) $::env(MCW_ROOT)/signoff/RAM128/openlane-signoff/spef/RAM128.${rc_corner}.spef
set spef_mapping(chip_core/\soc.core.RAM128) $::env(MCW_ROOT)/signoff/RAM128/openlane-signoff/spef/RAM128.${rc_corner}.spef
set spef_mapping(chip_core/clock_ctrl) $::env(CARAVEL_ROOT)/signoff/caravel_clocking/openlane-signoff/spef/caravel_clocking.${rc_corner}.spef
set spef_mapping(chip_core/housekeeping) $::env(CARAVEL_ROOT)/signoff/housekeeping/openlane-signoff/spef/housekeeping.${rc_corner}.spef
set spef_mapping(chip_core/gpio_buf) $::env(CARAVEL_ROOT)/signoff/mprj_io_buffer/openlane-signoff/spef/mprj_io_buffer.${rc_corner}.spef
set spef_mapping(chip_core/rstb_level) $::env(CARAVEL_ROOT)/signoff/xres_buf/openlane-signoff/spef/xres_buf.${rc_corner}.spef
set spef_mapping(chip_core/por) $::env(CARAVEL_ROOT)/signoff/simple_por/openlane-signoff/spef/simple_por.${rc_corner}.spef
set spef_mapping(chip_core/\spare_logic[0]) $::env(CARAVEL_ROOT)/signoff/spare_logic_block/openlane-signoff/spef/spare_logic_block.${rc_corner}.spef
set spef_mapping(chip_core/\spare_logic[1]) $::env(CARAVEL_ROOT)/signoff/spare_logic_block/openlane-signoff/spef/spare_logic_block.${rc_corner}.spef
set spef_mapping(chip_core/\spare_logic[2]) $::env(CARAVEL_ROOT)/signoff/spare_logic_block/openlane-signoff/spef/spare_logic_block.${rc_corner}.spef
set spef_mapping(chip_core/\spare_logic[3]) $::env(CARAVEL_ROOT)/signoff/spare_logic_block/openlane-signoff/spef/spare_logic_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_0) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_1) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_3) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_10) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_11) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_12) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_13) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_14) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_15) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_16) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_17) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_18) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_19) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_2) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_20) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_21) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_22) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_23) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_24) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_25) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_26) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_27) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_28) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_29) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_30) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_31) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_32) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_33) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_34) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_4) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_5) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_6) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_7) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_8) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_9) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_35) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_36) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/gpio_defaults_block_37) $::env(CARAVEL_ROOT)/signoff/gpio_defaults_block/openlane-signoff/spef/gpio_defaults_block.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_bidir_1[0].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_bidir_1[1].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_bidir_2[0].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_bidir_2[1].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_bidir_2[2].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_1[0].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_1[10].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_1[1].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_1[2].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_1[3].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_1[4].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_1[5].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_1[6].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_1[7].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_1[8].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_1[9].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_1a[0].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_1a[1].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_1a[2].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_1a[3].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_1a[4].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_1a[5].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_2[0].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_2[10].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_2[11].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_2[12].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_2[13].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_2[14].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_2[15].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_2[1].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_2[2].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_2[3].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_2[4].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_2[5].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_2[6].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_2[7].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_2[8].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/\gpio_control_in_2[9].gpio_logic_high) $::env(CARAVEL_ROOT)/signoff/gpio_logic_high/openlane-signoff/spef/gpio_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/mgmt_buffers.powergood_check) $::env(CARAVEL_ROOT)/signoff/mgmt_protect_hv/openlane-signoff/spef/mgmt_protect_hv.${rc_corner}.spef
set spef_mapping(chip_core/mgmt_buffers.mprj_logic_high_inst) $::env(CARAVEL_ROOT)/signoff/mprj_logic_high/openlane-signoff/spef/mprj_logic_high.${rc_corner}.spef
set spef_mapping(chip_core/mgmt_buffers.mprj2_logic_high_inst) $::env(CARAVEL_ROOT)/signoff/mprj2_logic_high/openlane-signoff/spef/mprj2_logic_high.${rc_corner}.spef
}
puts "\[INFO\]: Spef mapping done"