OpenSTA/search/test/search_path_enum_groups.tcl

118 lines
4.5 KiB
Tcl

# Test PathEnum.cc, PathGroup.cc deeper code paths: group_path with various
# options, path enumeration with endpoints, group naming, slack filtering.
# Targets: PathGroup.cc makePathEnds, sort, prune, enumPathEnds,
# PathGroups makeGroups, pushGroupPathEnds, makeGroupPathEnds,
# Search.cc findPathEnds, visitPathEnds
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
puts "--- group_path -name with -from and -to ---"
group_path -name input_paths -from [get_ports {in1 in2}]
group_path -name output_paths -to [get_ports {out1 out2 out3}]
group_path -name reg2reg_paths -from [get_pins reg1/CK] -to [get_pins reg2/D]
puts "--- report_checks with groups ---"
report_checks -path_delay max
puts "--- find_timing_paths with large group and endpoint counts ---"
set paths [find_timing_paths -path_delay max -group_path_count 20 -endpoint_path_count 10]
puts "Found [llength $paths] paths (max)"
foreach pe $paths {
puts " [get_full_name [$pe pin]] slack=[$pe slack] role=[$pe check_role]"
}
puts "--- find_timing_paths with min paths ---"
set paths_min [find_timing_paths -path_delay min -group_path_count 20 -endpoint_path_count 10]
puts "Found [llength $paths_min] paths (min)"
foreach pe $paths_min {
puts " [get_full_name [$pe pin]] slack=[$pe slack]"
}
puts "--- find_timing_paths -sort_by_slack ---"
set paths_sorted [find_timing_paths -sort_by_slack -path_delay max -group_path_count 20 -endpoint_path_count 10]
puts "Found [llength $paths_sorted] sorted paths"
set prev_slack 999999
set sorted_ok 1
foreach pe $paths_sorted {
set s [$pe slack]
if { $s > $prev_slack } {
set sorted_ok 0
}
set prev_slack $s
}
puts "Sort order correct: $sorted_ok"
puts "--- find_timing_paths -unique_paths_to_endpoint ---"
set paths_unique [find_timing_paths -unique_paths_to_endpoint -path_delay max -group_path_count 10 -endpoint_path_count 5]
puts "Found [llength $paths_unique] unique paths"
puts "--- find_timing_paths -slack_max filtering ---"
set paths_slack [find_timing_paths -path_delay max -slack_max 0.0]
puts "Paths with slack <= 0: [llength $paths_slack]"
set paths_slack2 [find_timing_paths -path_delay max -slack_max 100.0]
puts "Paths with slack <= 100: [llength $paths_slack2]"
puts "--- find_timing_paths -slack_min filtering ---"
set paths_slack3 [find_timing_paths -path_delay max -slack_min -100.0]
puts "Paths with slack >= -100: [llength $paths_slack3]"
puts "--- path_group_names ---"
set group_names [sta::path_group_names]
puts "Path group names: $group_names"
puts "--- is_path_group_name ---"
puts "clk is group: [sta::is_path_group_name clk]"
puts "input_paths is group: [sta::is_path_group_name input_paths]"
puts "nonexistent is group: [sta::is_path_group_name nonexistent_group]"
puts "--- group_path -default ---"
# group_path -name and -default are mutually exclusive; removed
puts "--- report_path_ends ---"
set pe_list [find_timing_paths -path_delay max -endpoint_path_count 5]
sta::report_path_end_header
foreach pe $pe_list {
sta::report_path_end $pe
}
sta::report_path_end_footer
puts "--- PathEnd type queries on all paths ---"
foreach pe $pe_list {
puts " type: check=[$pe is_check] out=[$pe is_output_delay] unconst=[$pe is_unconstrained] pd=[$pe is_path_delay] latch=[$pe is_latch_check] data=[$pe is_data_check] gated=[$pe is_gated_clock]"
}
puts "--- report_checks -format end with groups ---"
report_checks -format end -path_delay max
report_checks -format end -path_delay min
puts "--- report_checks -format summary with groups ---"
report_checks -format summary -path_delay max
report_checks -format summary -path_delay min
puts "--- report_checks -format slack_only with groups ---"
report_checks -format slack_only -path_delay max
report_checks -format slack_only -path_delay min
puts "--- endpoint_violation_count ---"
puts "max violations: [sta::endpoint_violation_count max]"
puts "min violations: [sta::endpoint_violation_count min]"
puts "--- startpoints / endpoints ---"
set starts [sta::startpoints]
puts "Startpoints: [llength $starts]"
set ends [sta::endpoints]
puts "Endpoints: [llength $ends]"