OpenSTA/search/test/search_path_enum_deep.tcl

157 lines
6.6 KiB
Tcl

# Test PathEnum.cc deeper: path enumeration with endpoint_count > 1,
# diversion queue, unique_pins pruning, and path comparison.
# Also exercises Search.cc visitPathEnds dispatching and PathGroup
# path end sorting/pruning with multiple groups.
# Targets: PathEnum.cc insert, findNext, makeDiversions,
# pruneDiversionQueue, hasNext, next, DiversionGreater,
# PathEnumFaninVisitor,
# Search.cc findPathEnds, visitPathEnds (multiple path groups),
# PathGroup.cc sort, prune, enumPathEnds
source ../../test/helpers.tcl
read_liberty ../../test/nangate45/Nangate45_typ.lib
read_verilog search_path_end_types.v
link_design search_path_end_types
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_input_delay -clock clk 0.5 [get_ports rst]
set_output_delay -clock clk 2.0 [get_ports out1]
set_output_delay -clock clk 2.0 [get_ports out2]
set_output_delay -clock clk 2.0 [get_ports out3]
report_checks > /dev/null
############################################################
# Path enumeration with endpoint_count > 1
# (exercises PathEnum deeply: diversions, findNext, etc.)
############################################################
puts "--- find_timing_paths endpoint_count 5 ---"
set paths [find_timing_paths -path_delay max -endpoint_count 5 -group_path_count 20]
puts "epc 5 paths: [llength $paths]"
foreach pe $paths {
puts " [get_full_name [$pe pin]] slack=[$pe slack]"
}
puts "--- find_timing_paths endpoint_count 3 group_path_count 10 ---"
set paths2 [find_timing_paths -path_delay max -endpoint_count 3 -group_path_count 10]
puts "epc 3 gpc 10: [llength $paths2]"
puts "--- find_timing_paths min endpoint_count 5 ---"
set paths_min [find_timing_paths -path_delay min -endpoint_count 5 -group_path_count 20]
puts "min epc 5: [llength $paths_min]"
foreach pe $paths_min {
puts " [get_full_name [$pe pin]] slack=[$pe slack]"
}
############################################################
# Path enumeration with endpoint_count 1 (default)
############################################################
puts "--- find_timing_paths endpoint_count 1 ---"
set paths3 [find_timing_paths -path_delay max -endpoint_count 1 -group_path_count 20]
puts "epc 1: [llength $paths3]"
############################################################
# Unique paths to endpoint with multiple paths
############################################################
puts "--- -unique_paths_to_endpoint epc 3 ---"
set paths_u [find_timing_paths -path_delay max -endpoint_count 3 -group_path_count 15 -unique_paths_to_endpoint]
puts "unique epc 3: [llength $paths_u]"
puts "--- -unique_edges_to_endpoint epc 3 ---"
set paths_ue [find_timing_paths -path_delay max -endpoint_count 3 -group_path_count 15 -unique_edges_to_endpoint]
puts "unique_edges epc 3: [llength $paths_ue]"
############################################################
# Sort by slack with multiple paths
############################################################
puts "--- -sort_by_slack endpoint_count 5 ---"
set paths_s [find_timing_paths -path_delay max -endpoint_count 5 -group_path_count 20 -sort_by_slack]
puts "sorted epc 5: [llength $paths_s]"
set prev_slack 999999
set ok 1
foreach pe $paths_s {
set s [$pe slack]
if { $s > $prev_slack } { set ok 0 }
set prev_slack $s
}
puts "Sorted correctly: $ok"
############################################################
# Group paths + enumeration
############################################################
group_path -name in_grp -from [get_ports {in1 in2}]
group_path -name out_grp -to [get_ports {out1 out2 out3}]
puts "--- find_timing_paths grouped epc 5 ---"
set paths_g [find_timing_paths -path_delay max -endpoint_count 5 -group_path_count 15]
puts "grouped epc 5: [llength $paths_g]"
############################################################
# report_checks with endpoint_count (text output)
############################################################
puts "--- report_checks epc 3 -fields ---"
report_checks -path_delay max -endpoint_count 3 -fields {slew cap input_pins nets fanout}
puts "--- report_checks epc 3 -format end ---"
report_checks -path_delay max -endpoint_count 3 -format end
puts "--- report_checks epc 3 -format summary ---"
report_checks -path_delay max -endpoint_count 3 -format summary
puts "--- report_checks min epc 3 ---"
report_checks -path_delay min -endpoint_count 3 -fields {slew cap}
############################################################
# report_checks with -from/-to + endpoint_count
############################################################
puts "--- report_checks epc 3 -from -to ---"
report_checks -path_delay max -endpoint_count 3 -from [get_ports in1] -to [get_pins reg1/D]
puts "--- report_checks epc 3 -through ---"
report_checks -path_delay max -endpoint_count 3 -through [get_pins and1/ZN]
############################################################
# Path delay variants: max_rise, max_fall, min_rise, min_fall
############################################################
puts "--- find_timing_paths -path_delay max_rise ---"
set pr [find_timing_paths -path_delay max_rise -endpoint_count 3]
puts "max_rise paths: [llength $pr]"
puts "--- find_timing_paths -path_delay max_fall ---"
set pf [find_timing_paths -path_delay max_fall -endpoint_count 3]
puts "max_fall paths: [llength $pf]"
puts "--- find_timing_paths -path_delay min_rise ---"
set pmr [find_timing_paths -path_delay min_rise -endpoint_count 3]
puts "min_rise paths: [llength $pmr]"
puts "--- find_timing_paths -path_delay min_fall ---"
set pmf [find_timing_paths -path_delay min_fall -endpoint_count 3]
puts "min_fall paths: [llength $pmf]"
puts "--- find_timing_paths -path_delay min_max ---"
set pmm [find_timing_paths -path_delay min_max -endpoint_count 3]
puts "min_max paths: [llength $pmm]"
############################################################
# Large endpoint_count to exercise limits
############################################################
puts "--- find_timing_paths epc 10 gpc 50 ---"
set paths_big [find_timing_paths -path_delay max -endpoint_count 10 -group_path_count 50]
puts "big epc: [llength $paths_big]"
############################################################
# Slack filtering
############################################################
puts "--- slack_max filtering ---"
set ps1 [find_timing_paths -path_delay max -slack_max 0.0]
puts "slack <= 0: [llength $ps1]"
set ps2 [find_timing_paths -path_delay max -slack_max 100.0 -endpoint_count 5]
puts "slack <= 100: [llength $ps2]"
puts "--- slack_min filtering ---"
set ps3 [find_timing_paths -path_delay max -slack_min -100.0 -endpoint_count 5]
puts "slack >= -100: [llength $ps3]"