diff --git a/scripts/pt_sta.tcl b/scripts/pt_sta.tcl index 70be651f..2df5eaca 100644 --- a/scripts/pt_sta.tcl +++ b/scripts/pt_sta.tcl @@ -1,58 +1,52 @@ if {\ [catch { ##PT script - # Adding SCL and IO link libraries based on the process corner specified - if {$::env(PROC_CORNER) == "t"} { - 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_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 \ - " + # Adding SCL and IO link libraries based on the PDK and process corner specified + if {[string match gf180* $::env(PDK)]} { + source ./gf180_libs.tcl + } elseif {[string match sky130* $::env(PDK)]} { + source ./sky130_libs.tcl } # 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:" - 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 read_verilog $verilog } @@ -61,114 +55,115 @@ if {\ link # Reading constraints (signoff) - if {$::env(DESIGN) == "mgmt_core_wrapper" | $::env(DESIGN) == "RAM256" | $::env(DESIGN) == "RAM128"} { - read_sdc $::env(MCW_ROOT)/signoff/$::env(DESIGN)/$::env(DESIGN).sdc - } else { - read_sdc $::env(CARAVEL_ROOT)/signoff/$::env(DESIGN)/$::env(DESIGN).sdc + read_sdc $::env(ROOT)/signoff/$::env(DESIGN)/$::env(DESIGN).sdc + + # debug interface input for swift + 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 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] { 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 - if {$design == "mgmt_core_wrapper" | $design == "RAM128" | $design == "RAM256"} { - read_parasitics -keep_capacitive_coupling -verbose $::env(MCW_ROOT)/signoff/${design}/openlane-signoff/spef/${design}.${rc_corner}.spef -complete_with wlm -pin_cap_included - } 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 + read_parasitics -keep_capacitive_coupling $::env(ROOT)/signoff/${design}/openlane-signoff/spef/${design}.${rc_corner}.spef -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 } - - 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 \ - -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 \ - -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 \ - -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 \ - -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 \ - -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 \ - -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 - - 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 + -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_case_analysis -nosplit > $::env(OUT_DIR)/reports/${design}.case_analysis.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 - set extract_model_clock_transition_limit 0.75 - set extract_model_data_transition_limit 0.75 - set_app_var extract_model_capacitance_limit 1.0 - set extract_model_num_capacitance_points 7 - set extract_model_num_clock_transition_points 7 - set extract_model_num_data_transition_points 7 - set extract_model_use_conservative_current_slew true - set extract_model_enable_report_delay_calculation 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} + # Extract timing model + set extract_model_clock_transition_limit 0.75 + set extract_model_data_transition_limit 0.75 + set_app_var extract_model_capacitance_limit 1.0 + set extract_model_num_capacitance_points 7 + set extract_model_num_clock_transition_points 7 + set extract_model_num_data_transition_points 7 + set extract_model_use_conservative_current_slew true + set extract_model_enable_report_delay_calculation true + set extract_model_with_clock_latency_arcs true + + # 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 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 FALSE set sh_message_limit 1500 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 report_results $::env(DESIGN) $::env(RC_CORNER) $::env(PROC_CORNER) - exit } err] } { puts stderr $err exit 1 -} +} \ No newline at end of file diff --git a/scripts/run_pt_sta.py b/scripts/run_pt_sta.py index 4ed39cec..3904a69e 100644 --- a/scripts/run_pt_sta.py +++ b/scripts/run_pt_sta.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 # This script runs PrimeTime STA -# Rev 1 -# 6/10/2022 + import argparse import os @@ -9,29 +8,31 @@ import os def run_sta_all ( design: str, output_dir: str, - log_dir: str + log_dir: str, + root_dir: str, ): proc_corners = ["t", "s", "f"] rc_corners = ["nom", "max", "min"] for proc in proc_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 ( design: str, proc_corner: str, rc_corner: 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}") - + # Output directory structure sub_dirs = ['reports', 'sdf', 'lib'] for item in sub_dirs: path=os.path.join(output_dir,item) try: - os.makedirs(os.path.join(path,rc_corner)) + os.makedirs(os.path.join(path,f"{proc_corner}{proc_corner}")) except FileExistsError: # directory already exists pass @@ -41,11 +42,13 @@ def run_sta ( check_env_vars() os.environ["PDK_ROOT"] = os.getenv('PDK_ROOT') 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["UPRJ_ROOT"] = os.getenv('UPRJ_ROOT') os.environ["MCW_ROOT"] = os.getenv('MCW_ROOT') os.environ["OUT_DIR"] = output_dir + os.environ["ROOT"] = root_dir SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) os.environ["DESIGN"] = design os.environ["PROC_CORNER"] = proc_corner @@ -53,58 +56,73 @@ def run_sta ( # PrimeTime command 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) + + 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 - sta_pass=search_viol(f"{output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-global.rpt") - log = open(f"{log_dir}/{design}-{rc_corner}-{proc_corner}-sta.log", "a") + 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") if sta_pass == "pass": print (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: if sta_pass == "max_tran_cap": print (f"STA run Passed!") 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") - 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") + 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/{proc_corner}{proc_corner}/{design}.{rc_corner}-all_viol.rpt") elif sta_pass == "max_tran": print (f"STA run Passed!") 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") - log.write(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/{proc_corner}{proc_corner}/{design}.{rc_corner}-all_viol.rpt") elif sta_pass == "max_cap": print (f"STA run Passed!") 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") - log.write(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/{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: print (f"STA run Failed!") log.write(f"STA run Failed!\n") if sta_pass == "setup": - print(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/{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/{proc_corner}{proc_corner}/{design}.{rc_corner}-global.rpt") elif sta_pass == "hold": - print(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/{rc_corner}/{design}.{proc_corner}{proc_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") + 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/{proc_corner}{proc_corner}/{design}.{rc_corner}-global.rpt") elif sta_pass == "no cons": - print(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}-{rc_corner}-{proc_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") + 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}-{proc_corner}-{rc_corner}-sta.log") log.close() # Check the required env variables def check_env_vars(): pdk_root = os.getenv('PDK_ROOT') 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') uprj_root = os.getenv('UPRJ_ROOT') mcw_root = os.getenv('MCW_ROOT') @@ -116,10 +134,6 @@ def check_env_vars(): raise FileNotFoundError( "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: raise FileNotFoundError( "Please export CARAVEL_ROOT to the Caravel repo path" @@ -135,23 +149,15 @@ def check_env_vars(): # Analyze the STA all violators output report 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: data = report.read() if "Could not auto-link design" in data: return "no link" elif "Error: Errors reading SDC file:" in data: 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: data = report.read() if "Hold violations" in data: @@ -172,6 +178,24 @@ def search_viol( else: 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__": parser = argparse.ArgumentParser( description="Run STA using PrimeTime" @@ -194,6 +218,12 @@ if __name__ == "__main__": help="log directory", required=True ) + parser.add_argument( + "-r", + "--root_dir", + help="design root directory", + required=True + ) parser.add_argument( "-rc", "--rc_corner", @@ -214,11 +244,30 @@ if __name__ == "__main__": help="Specify to run all the process corners and rc corners combinations for the design", action='store_true' ) + parser.add_argument( + "-upw", + "--upw", + help="Specify to run with non-empty user project wrapper ') + antenna_count_log = open(os.path.join(signoff_dir, f"{design}/standalone_pvr/{timestr}/antenna_count.log"), "w") + antenna_count_log.write(str(antenna_count)) + antenna_count_log.close() + if antenna_count == 0: + 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__": @@ -344,7 +441,19 @@ if __name__ == "__main__": parser.add_argument( "-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", ) parser.add_argument( @@ -407,22 +516,39 @@ if __name__ == "__main__": iverilog = args.iverilog verification = args.vcs 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 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") - 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}"): 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 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"): logging.error( f"Compressed gds files in {caravel_root}. Please uncompress first." @@ -441,23 +567,26 @@ if __name__ == "__main__": if not os.path.exists(design_root): logging.error(f"can't find {design}.gds file") - if design == "caravel" or design == "caravan": - logging.info(f"Building {design} ...") - build_caravel_caravan(caravel_root, mcw_root, pdk_root, log_dir, pdk_env, design) - else: - logging.info(f"running checks on {design}") + # if design == "caravel" or design == "caravan": + # logging.info(f"Building {design} ...") + # build_caravel_caravan(caravel_root, mcw_root, pdk_root, log_dir, pdk_env, design) + # else: + # logging.info(f"running checks on {design}") if args.all: drc = True lvs = True - verification = True sta = True + spef = True + antenna = True + + pdk_path = pdk_root + "/" + pdk_env if drc: - if (design == "mgmt_core_wrapper" or design == "RAM128" or design == "RAM256"): - drc_p1 = run_drc(mcw_root, log_dir, signoff_dir, pdk_root, design) + if (design == "mgmt_core_wrapper" or design == "RAM128" or design == "RAM256" or design == "gf180_ram_512x8_wrapper"): + drc_p1 = run_drc(mcw_root, timestr, signoff_dir, pdk_path, design) 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}") if lvs: lvs_p1 = run_lvs( @@ -472,28 +601,152 @@ if __name__ == "__main__": ) logging.info(f"Running LVS on {design}") - if sta: - if not os.path.exists(f"{signoff_dir}/{design}/primetime-signoff"): - os.makedirs(f"{signoff_dir}/{design}/primetime-signoff") - sta_log_dir = os.path.join(signoff_dir, f"{design}/primetime-signoff/logs") + if spef: + if not os.path.exists(f"{signoff_dir}/{design}/StarRC"): + os.makedirs(f"{signoff_dir}/{design}/StarRC") + 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}"): os.makedirs(f"{sta_log_dir}") logging.info(f"Running PrimeTime STA all corners on {design}") - sta_p = run_sta( - caravel_root, - mcw_root, - f"{caravel_root}/scripts/pt_libs", - sta_log_dir, - signoff_dir, - 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 + ) + 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: logging.info(f"Running antenna checks on {design}") - ant = run_antenna( - log_dir, design_root, design, pdk_root, pdk_env, caravel_root, mcw_root - ) + if (design == "mgmt_core_wrapper" or design == "RAM128" or design == "RAM256"): + 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: verify_p = [] @@ -524,15 +777,6 @@ if __name__ == "__main__": if 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: out, err = sta_p.communicate() sta_log = open(f"{sta_log_dir}/PT_STA_{design}.log", "w") @@ -542,20 +786,14 @@ if __name__ == "__main__": sta_log.close() else: 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: lvs_p1.wait() if drc: drc_p1.wait() - if antenna: - out, err = ant.communicate() - 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() + ant.wait() check_errors( caravel_root, log_dir, signoff_dir, drc, lvs, verification, sta, design, antenna diff --git a/scripts/sky130_libs.tcl b/scripts/sky130_libs.tcl new file mode 100644 index 00000000..fe591e22 --- /dev/null +++ b/scripts/sky130_libs.tcl @@ -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)" \ No newline at end of file diff --git a/scripts/sky130_spef_mapping.tcl b/scripts/sky130_spef_mapping.tcl new file mode 100644 index 00000000..ebe10eb5 --- /dev/null +++ b/scripts/sky130_spef_mapping.tcl @@ -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" \ No newline at end of file