blob: 02390ed361f5dbe7ce76005eda375ee87bf8da10 [file] [log] [blame]
source $::env(TIMING_ROOT)/env/common.tcl
source $::env(TIMING_ROOT)/env/caravel_spef_mapping-mpw7.tcl
if { [file exists $::env(CUP_ROOT)/env/spef-mapping.tcl] } {
source $::env(CUP_ROOT)/env/spef-mapping.tcl
} else {
puts "WARNING no user project spef mapping file found"
}
source $::env(TIMING_ROOT)/env/$::env(LIB_CORNER).tcl
set libs [split [regexp -all -inline {\S+} $libs]]
set verilogs [split [regexp -all -inline {\S+} $verilogs]]
foreach liberty $libs {
}
foreach liberty $libs {
run_puts "read_liberty $liberty"
}
foreach verilog $verilogs {
run_puts "read_verilog $verilog"
}
run_puts "link_design caravel"
if { $::env(SPEF_OVERWRITE) ne "" } {
puts "overwriting spef from "
puts "$spef to"
puts "$::env(SPEF_OVERWRITE)"
eval set spef $::env(SPEF_OVERWRITE)
}
set missing_spefs 0
set missing_spefs_list ""
run_puts "read_spef $spef"
foreach key [array names spef_mapping] {
set spef_file $spef_mapping($key)
if { [file exists $spef_file] } {
run_puts "read_spef -path $key $spef_mapping($key)"
} else {
set missing_spefs 1
set missing_spefs_list "$missing_spefs_list $key"
puts "$spef_file not found"
if { $::env(ALLOW_MISSING_SPEF) } {
puts "WARNING ALLOW_MISSING_SPEF set to 1. continuing"
} else {
exit 1
}
}
}
set sdc $::env(CARAVEL_ROOT)/signoff/caravel/caravel.sdc
run_puts "read_sdc -echo $sdc"
set logs_path "$::env(PROJECT_ROOT)/signoff/caravel/openlane-signoff/timing/$::env(RCX_CORNER)/$::env(LIB_CORNER)"
file mkdir [file dirname $logs_path]
run_puts_logs "report_check_types \\
-max_delay \\
-min_delay \\
-max_slew \\
-max_capacitance \\
-clock_gating_setup \\
-clock_gating_hold \\
-format end \\
-violators" \
"${logs_path}-summary.rpt"
set max_delay_result "met"
set min_delay_result "met"
set max_slew_result "met"
set max_cap_result "met"
set missing_spefs_result "incomplete"
set report ${logs_path}-summary.rpt
set max_cap_value "[exec bash -c "grep 'max cap' $report -A 4 | tail -n1 | awk -F ' *' '{print \$4}'"]"
set worst_hold "[exec bash -c "grep 'min_delay\/hold' $report -A 10 | grep VIOLATED | head -n1 | awk -F ' *' '{print \$5}'"]"
set worst_setup "[exec bash -c "grep 'max_delay\/setup' $report -A 10 | grep VIOLATED | head -n1 | awk -F ' *' '{print \$5}'"]"
set max_slew_value "[exec bash -c "grep 'max slew' $report -A 4 | tail -n1 | awk -F ' *' '{print \$4}'"]"
set table_format "%7s| %15s |%15s |%15s |%15s |%15s"
set header [format "$table_format" "corner" "max cap" "max slew" "min delay" "max delay" "spefs"]
if {![catch {exec grep -q {max cap} $report} err]} {
set max_cap_result "vio($max_cap_value)"
}
if {![catch {exec grep -q {max slew} $report} err]} {
set max_slew_result "vio($max_slew_value)"
}
if {![catch {exec grep -q {min_delay\/hold} $report} err]} {
set min_delay_result "vio($worst_hold)"
}
if {![catch {exec grep -q {max_delay\/setup} $report} err]} {
set max_delay_result "vio($worst_setup)"
}
if { !$missing_spefs } {
set missing_spefs_result "complete"
}
set summary [format "$table_format" "$::env(LIB_CORNER)-$::env(RCX_CORNER)"\
"$max_cap_result" \
"$max_slew_result" \
"$min_delay_result"\
"$max_delay_result"\
"$missing_spefs_result"]
exec echo "$header" >> "${logs_path}-summary.rpt"
exec echo "$summary" >> "${logs_path}-summary.rpt"
run_puts_logs "report_checks \\
-path_delay min \\
-format full_clock_expanded \\
-fields {slew cap input_pins nets fanout} \\
-no_line_splits \\
-group_count 10000 \\
-slack_max 10 \\
-digits 4 \\
-endpoint_count 10 \\
-unique_paths_to_endpoint \\
"\
"${logs_path}-min.rpt"
run_puts_logs "report_checks \\
-path_delay max \\
-format full_clock_expanded \\
-fields {slew cap input_pins nets fanout} \\
-no_line_splits \\
-group_count 10000 \\
-slack_max 10 \\
-digits 4 \\
-endpoint_count 10 \\
-unique_paths_to_endpoint \\
"\
"${logs_path}-max.rpt"
run_puts_logs "report_checks \\
-path_delay min \\
-format full_clock_expanded \\
-fields {slew cap input_pins nets fanout} \\
-no_line_splits \\
-path_group hk_serial_clk \\
-group_count 1000 \\
-slack_max 10 \\
-digits 4 \\
-unique_paths_to_endpoint \\
"\
"${logs_path}-hk_serial_clk-min.rpt"
run_puts_logs "report_checks \\
-path_delay max \\
-format full_clock_expanded \\
-fields {slew cap input_pins nets fanout} \\
-no_line_splits \\
-path_group hk_serial_clk \\
-group_count 1000 \\
-slack_max 10 \\
-digits 4 \\
-unique_paths_to_endpoint \\
"\
"${logs_path}-hk_serial_clk-max.rpt"
run_puts_logs "report_checks \\
-path_delay max \\
-format full_clock_expanded \\
-fields {slew cap input_pins nets fanout} \\
-no_line_splits \\
-path_group hkspi_clk \\
-group_count 1000 \\
-slack_max 10 \\
-digits 4 \\
-unique_paths_to_endpoint \\
"\
"${logs_path}-hkspi_clk-max.rpt"
run_puts_logs "report_checks \\
-path_delay min \\
-format full_clock_expanded \\
-fields {slew cap input_pins nets fanout} \\
-no_line_splits \\
-path_group hkspi_clk \\
-group_count 1000 \\
-slack_max 10 \\
-digits 4 \\
-unique_paths_to_endpoint \\
"\
"${logs_path}-hkspi_clk-min.rpt"
run_puts_logs "report_checks \\
-path_delay min \\
-format full_clock_expanded \\
-fields {slew cap input_pins nets fanout} \\
-no_line_splits \\
-path_group clk \\
-group_count 1000 \\
-slack_max 10 \\
-digits 4 \\
-unique_paths_to_endpoint \\
"\
"${logs_path}-clk-min.rpt"
run_puts_logs "report_checks \\
-path_delay max \\
-format full_clock_expanded \\
-fields {slew cap input_pins nets fanout} \\
-no_line_splits \\
-path_group clk \\
-group_count 1000 \\
-slack_max 10 \\
-digits 4 \\
-unique_paths_to_endpoint \\
"\
"${logs_path}-clk-max.rpt"
run_puts_logs "report_checks \\
-path_delay min \\
-through [get_cells soc] \\
-format full_clock_expanded \\
-fields {slew cap input_pins nets fanout} \\
-no_line_splits \\
-group_count 1000 \\
-slack_max 10 \\
-digits 4 \\
-unique_paths_to_endpoint \\
"\
"${logs_path}-soc-min.rpt"
run_puts_logs "report_checks \\
-path_delay max \\
-through [get_cells soc] \\
-format full_clock_expanded \\
-fields {slew cap input_pins nets fanout} \\
-no_line_splits \\
-group_count 1000 \\
-slack_max 10 \\
-digits 4 \\
-unique_paths_to_endpoint \\
"\
"${logs_path}-soc-max.rpt"
run_puts_logs "report_checks \\
-path_delay min \\
-through [get_cells mprj] \\
-format full_clock_expanded \\
-fields {slew cap input_pins nets fanout} \\
-no_line_splits \\
-group_count 1000 \\
-slack_max 40 \\
-digits 4 \\
-unique_paths_to_endpoint \\
"\
"${logs_path}-mprj-min.rpt"
run_puts_logs "report_checks \\
-path_delay max \\
-through [get_cells mprj] \\
-format full_clock_expanded \\
-fields {slew cap input_pins nets fanout} \\
-no_line_splits \\
-group_count 1000 \\
-slack_max 40 \\
-digits 4 \\
-unique_paths_to_endpoint \\
"\
"${logs_path}-mprj-max.rpt"
run_puts "report_parasitic_annotation -report_unannotated > ${logs_path}-unannotated.log"
if { $missing_spefs } {
puts "there are missing spefs. check the log for ALLOW_MISSING_SPEF"
puts "the following macros don't have spefs"
foreach spef $missing_spefs_list {
puts "$spef"
}
}
report_parasitic_annotation
puts "you may want to edit sdc: $sdc to change i/o constraints"
puts "check $logs_path"