mirror of https://github.com/efabless/caravel.git
~ update STA signoff scripts to the latest version used for caravel (4d4129b
)
This commit is contained in:
parent
8afe0b60d1
commit
ded7570bc1
|
@ -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
|
||||
}
|
||||
}
|
|
@ -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 <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()
|
||||
|
||||
output = os.path.abspath(args.output_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:
|
||||
os.makedirs(output)
|
||||
|
@ -241,6 +290,6 @@ if __name__ == "__main__":
|
|||
pass
|
||||
|
||||
if args.all:
|
||||
run_sta_all (args.design, output, log)
|
||||
run_sta_all (args.design, output, log, root)
|
||||
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)
|
||||
|
|
|
@ -8,7 +8,8 @@ import subprocess
|
|||
from sys import stdout
|
||||
import count_lvs
|
||||
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):
|
||||
|
@ -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)
|
||||
|
||||
def run_drc(design_root, log_dir, signoff_dir, pdk_root, design):
|
||||
klayout_drc_cmd = [
|
||||
"python3",
|
||||
"klayout_drc.py",
|
||||
"-g",
|
||||
f"{design_root}/gds/{design}.gds",
|
||||
"-l",
|
||||
f"{log_dir}",
|
||||
"-s",
|
||||
f"{signoff_dir}/{design}/standalone_pvr",
|
||||
"-d",
|
||||
f"{design}",
|
||||
]
|
||||
def run_drc(design_root, timestr, signoff_dir, pdk_path, design):
|
||||
log_dir = f"{signoff_dir}/{design}/standalone_pvr/{timestr}/logs"
|
||||
if "sky130" in os.getenv('PDK'):
|
||||
klayout_drc_cmd = [
|
||||
"python3",
|
||||
"klayout_drc.py",
|
||||
"-g",
|
||||
f"{design_root}/gds/{design}.gds",
|
||||
"-l",
|
||||
f"{log_dir}",
|
||||
"-s",
|
||||
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)
|
||||
return p1
|
||||
|
||||
|
@ -138,21 +150,20 @@ def run_verification(caravel_root, pdk_root, pdk_env, sim, simulator="vcs"):
|
|||
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["CARAVEL_ROOT"] = caravel_root
|
||||
myenv["MCW_ROOT"] = mcw_root
|
||||
myenv["PT_LIB_ROOT"] = pt_lib_root
|
||||
if not os.path.exists(f"{pt_lib_root}"):
|
||||
subprocess.run(
|
||||
[
|
||||
"git",
|
||||
"clone",
|
||||
"git@github.com:efabless/pt_libs.git",
|
||||
],
|
||||
cwd=f"{caravel_root}/scripts",
|
||||
stdout=subprocess.PIPE,
|
||||
)
|
||||
if "sky130" in os.getenv('PDK'):
|
||||
if not os.path.exists(f"{pt_lib_root}"):
|
||||
subprocess.run(
|
||||
[
|
||||
"git",
|
||||
"clone",
|
||||
"git@github.com:efabless/pt_libs.git",
|
||||
],
|
||||
cwd=f"{caravel_root}/scripts",
|
||||
stdout=subprocess.PIPE,
|
||||
)
|
||||
sta_cmd = [
|
||||
"python3",
|
||||
"run_pt_sta.py",
|
||||
|
@ -160,9 +171,13 @@ def run_sta(caravel_root, mcw_root, pt_lib_root, log_dir, signoff_dir, design):
|
|||
"-d",
|
||||
f"{design}",
|
||||
"-o",
|
||||
f"{signoff_dir}/{design}/primetime-signoff",
|
||||
f"{signoff_dir}/{design}/primetime/{timestr}",
|
||||
"-l",
|
||||
f"{log_dir}",
|
||||
"-r",
|
||||
f"{root}",
|
||||
"-upw",
|
||||
f"{upw}",
|
||||
]
|
||||
p1 = subprocess.Popen(
|
||||
sta_cmd,
|
||||
|
@ -174,24 +189,52 @@ def run_sta(caravel_root, mcw_root, pt_lib_root, log_dir, signoff_dir, design):
|
|||
)
|
||||
return p1
|
||||
|
||||
|
||||
def run_antenna(
|
||||
log_dir, design_root, design, pdk_root, pdk_env, caravel_root, mcw_root
|
||||
):
|
||||
os.environ["DESIGN_GDS_ROOT"] = design_root
|
||||
os.environ["DESIGN"] = design
|
||||
os.environ["LOG_DIR"] = log_dir
|
||||
os.environ["CARAVEL_ROOT"] = caravel_root
|
||||
os.environ["MCW_ROOT"] = mcw_root
|
||||
antenna_cmd = [
|
||||
"magic",
|
||||
"-noconsole",
|
||||
"-dnull",
|
||||
"-rcfile",
|
||||
f"{pdk_root}/{pdk_env}/libs.tech/magic/{pdk_env}.magicrc",
|
||||
"tech-files/antenna_check.tcl",
|
||||
def run_starxt (design_root, log_dir, signoff_dir, design, timestr):
|
||||
myenv = os.environ.copy()
|
||||
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
if not os.path.exists(f"{SCRIPT_DIR}/gf180mcu-tech/"):
|
||||
subprocess.run(
|
||||
[
|
||||
"git",
|
||||
"clone",
|
||||
"git@github.com:efabless/gf180mcu-tech.git",
|
||||
],
|
||||
cwd=f"{caravel_root}/scripts",
|
||||
stdout=subprocess.PIPE,
|
||||
)
|
||||
starxt_cmd = [
|
||||
"python3",
|
||||
"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
|
||||
|
||||
|
||||
|
@ -200,14 +243,27 @@ def check_errors(
|
|||
):
|
||||
f = open(os.path.join(signoff_dir, f"{design}/signoff.rpt"), "w")
|
||||
if drc:
|
||||
drc_count_klayout = os.path.join(log_dir, f"{design}_klayout_drc.total")
|
||||
with open(drc_count_klayout) as rep:
|
||||
if rep.readline().strip() != "0":
|
||||
logging.error(f"klayout DRC failed")
|
||||
f.write("Klayout MR DRC: Failed\n")
|
||||
else:
|
||||
logging.info("Klayout MR DRC: Passed")
|
||||
f.write("Klayout MR DRC: Passed\n")
|
||||
if "sky130" in os.getenv('PDK'):
|
||||
drc_count_klayout = os.path.join(log_dir, f"{design}_klayout_drc.total")
|
||||
with open(drc_count_klayout) as rep:
|
||||
if rep.readline().strip() != "0":
|
||||
logging.error(f"klayout DRC failed")
|
||||
f.write("Klayout MR DRC: Failed\n")
|
||||
else:
|
||||
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:
|
||||
lvs_summary_report = open(
|
||||
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:
|
||||
log_name = l.split("/")[-1]
|
||||
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()
|
||||
if "Passed" in lines[-1]:
|
||||
logging.info(f"{log_name} STA: Passed")
|
||||
|
@ -271,25 +331,62 @@ def check_errors(
|
|||
logging.warning(lines[-1])
|
||||
logging.info(f"{log_name} STA: Passed (except: max_cap)")
|
||||
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:
|
||||
logging.error(lines[-1])
|
||||
logging.error(f"{log_name} STA: Failed")
|
||||
if "setup" in lines[-1]:
|
||||
f.write(f"{log_name} STA: Failed (setup)\n")
|
||||
logging.error(f"{log_name} STA: Failed (setup)")
|
||||
elif "hold" in lines[-1]:
|
||||
f.write(f"{log_name} STA: Failed (hold)\n")
|
||||
logging.error(f"{log_name} STA: Failed (hold)")
|
||||
else:
|
||||
logging.error(f"{log_name} STA: Failed")
|
||||
f.write(f"{log_name} STA: Failed (" + lines[-1].split(" failed")[0] + ")\n")
|
||||
|
||||
if antenna:
|
||||
antenna_report = os.path.join(signoff_dir, f"{design}/standalone_pvr/antenna-vios.report")
|
||||
with open(antenna_report) as rep:
|
||||
if "Antenna violation detected" in rep.read():
|
||||
logging.error(f"Antenna checks failed find report at {antenna_report}")
|
||||
f.write("Antenna checks: Failed\n")
|
||||
else:
|
||||
logging.info("Antenna checks: Passed")
|
||||
f.write("Antenna checks: Passed\n")
|
||||
antenna_report = os.path.join(signoff_dir, f"{design}/standalone_pvr/{timestr}/antenna-vios.report")
|
||||
xml_report = open(os.path.join(signoff_dir, f"{design}/standalone_pvr/{timestr}/{design}_antenna.lyrdb"))
|
||||
antenna_count = xml_report.read().count('<item>')
|
||||
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
|
||||
|
|
|
@ -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)"
|
|
@ -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"
|
Loading…
Reference in New Issue