OpenSTA/search/test/search_spef_parasitics.tcl

221 lines
7.1 KiB
Tcl

# Test SPEF reading, parasitic operations, pi-elmore models,
# connectedCap, reportParasiticAnnotation.
# Targets: Sta.cc readSpef, setParasiticAnalysisPts,
# makeParasiticAnalysisPts, findPiElmore, makePiElmore,
# findElmore, setElmore, connectedCap (Pin and Net variants),
# reportParasiticAnnotation,
# setNetWireCap, setResistance, setPortExtPinCap, portExtCaps,
# Search.cc arrivalInvalid, requiredInvalid via delay invalidation
source ../../test/helpers.tcl
read_liberty ../../test/nangate45/Nangate45_typ.lib
read_verilog search_test1.v
link_design search_test1
create_clock -name clk -period 10 [get_ports clk]
set_input_delay -clock clk 1.0 [get_ports in1]
set_input_delay -clock clk 1.0 [get_ports in2]
set_output_delay -clock clk 2.0 [get_ports out1]
# Baseline timing (no parasitics)
report_checks -path_delay max > /dev/null
puts "--- Baseline timing (no parasitics) ---"
report_checks -path_delay max
report_checks -path_delay min
puts "PASS: baseline timing"
############################################################
# Read SPEF
############################################################
puts "--- read_spef ---"
read_spef search_test1.spef
puts "PASS: read_spef"
puts "--- Timing after SPEF ---"
report_checks -path_delay max
report_checks -path_delay min
puts "PASS: timing after SPEF"
puts "--- report_parasitic_annotation ---"
report_parasitic_annotation
puts "PASS: report_parasitic_annotation"
puts "--- report_parasitic_annotation -report_unannotated ---"
catch {
report_parasitic_annotation -report_unannotated
}
puts "PASS: report_parasitic_annotation unannotated"
############################################################
# connectedCap via report_net (exercises connectedCap)
############################################################
puts "--- report_net after SPEF ---"
report_net n1
report_net n2
report_net n3
puts "PASS: report_net after SPEF"
puts "--- report_net -digits 6 ---"
report_net -digits 6 n1
report_net -digits 6 n2
puts "PASS: report_net digits"
############################################################
# Port ext caps: set_load exercises setPortExtPinCap
############################################################
puts "--- setPortExtPinCap (set_load -pin_load) ---"
set_load -pin_load 0.05 [get_ports out1]
report_checks -path_delay max
puts "PASS: setPortExtPinCap"
puts "--- setPortExtWireCap (set_load -wire_load) ---"
catch {
set_load -wire_load 0.03 [get_ports out1]
report_checks -path_delay max
}
puts "PASS: setPortExtWireCap"
puts "--- setPortExtFanout ---"
set_port_fanout_number 4 [get_ports out1]
report_checks -path_delay max
puts "PASS: setPortExtFanout"
############################################################
# setNetWireCap - exercises Sta::setNetWireCap
############################################################
puts "--- setNetWireCap ---"
catch {
set_load 0.02 [get_nets n1]
report_checks -path_delay max
}
puts "PASS: setNetWireCap"
############################################################
# Pi-elmore model: makePiElmore, findPiElmore, setElmore, findElmore
############################################################
puts "--- set_pi_model (makePiElmore) ---"
catch {
sta::set_pi_model and1/ZN 3.0e-15 1500.0 2.0e-15
puts "Pi model created for and1/ZN"
}
puts "PASS: set_pi_model"
puts "--- set_elmore (setElmore) ---"
catch {
sta::set_elmore and1/ZN buf1/A 5.0e-12
puts "Elmore delay set for and1/ZN -> buf1/A"
}
puts "PASS: set_elmore"
puts "--- find_elmore ---"
catch {
set elm [sta::find_elmore [get_pins and1/ZN] [get_pins buf1/A] "rise" "max"]
puts "Elmore delay and1/ZN->buf1/A rise max: $elm"
set elm2 [sta::find_elmore [get_pins and1/ZN] [get_pins buf1/A] "fall" "max"]
puts "Elmore delay and1/ZN->buf1/A fall max: $elm2"
}
puts "PASS: find_elmore"
puts "--- find_pi_elmore ---"
catch {
set pi [sta::find_pi_elmore [get_pins and1/ZN] "rise" "max"]
puts "Pi-elmore and1/ZN rise max: $pi"
set pi2 [sta::find_pi_elmore [get_pins and1/ZN] "fall" "max"]
puts "Pi-elmore and1/ZN fall max: $pi2"
}
puts "PASS: find_pi_elmore"
puts "--- Timing after manual parasitics ---"
report_checks -path_delay max
report_checks -path_delay min
puts "PASS: timing after manual parasitics"
############################################################
# Re-read SPEF (exercises setParasiticAnalysisPts path)
############################################################
puts "--- re-read SPEF ---"
read_spef search_test1.spef
report_checks -path_delay max
puts "PASS: re-read SPEF"
############################################################
# setResistance on net
############################################################
puts "--- setResistance ---"
catch {
set_resistance 100.0 [get_nets n1]
report_checks -path_delay max
}
puts "PASS: setResistance"
############################################################
# Timing with propagated clock + SPEF
############################################################
puts "--- SPEF with propagated clock ---"
set_propagated_clock [get_clocks clk]
report_checks -path_delay max
report_checks -path_delay min
unset_propagated_clock [get_clocks clk]
puts "PASS: SPEF with propagated clock"
############################################################
# read_spef with -min and -max flags
############################################################
puts "--- read_spef -min ---"
catch {
read_spef -min search_test1.spef
}
puts "PASS: read_spef -min"
puts "--- read_spef -max ---"
catch {
read_spef -max search_test1.spef
}
puts "PASS: read_spef -max"
############################################################
# Report formats after SPEF loading
############################################################
puts "--- Report formats after SPEF ---"
report_checks -path_delay max -format full_clock_expanded
report_checks -path_delay max -format json
report_checks -path_delay max -format summary
report_checks -path_delay max -fields {capacitance slew fanout}
puts "PASS: report formats after SPEF"
############################################################
# worst_slack and tns with parasitics
############################################################
puts "--- worst_slack and tns after SPEF ---"
set ws_max [worst_slack -max]
puts "worst_slack max: $ws_max"
set ws_min [worst_slack -min]
puts "worst_slack min: $ws_min"
set tns_max [total_negative_slack -max]
puts "tns max: $tns_max"
set tns_min [total_negative_slack -min]
puts "tns min: $tns_min"
puts "PASS: worst_slack/tns after SPEF"
############################################################
# set_load with -min/-max flags (exercises setPortExtPinCap with min_max)
############################################################
puts "--- set_load -min/-max ---"
set_load -min 0.02 [get_ports out1]
set_load -max 0.08 [get_ports out1]
report_checks -path_delay max
report_checks -path_delay min
puts "PASS: set_load -min/-max"
############################################################
# report_net with -connections (exercises connectedCap and net printing)
############################################################
puts "--- report_net -connections ---"
catch {
report_net -connections n1
report_net -connections n2
}
puts "PASS: report_net -connections"
puts "ALL PASSED"