# Test PathEnum.cc deeper: path enumeration with endpoint_path_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_path_count > 1 # (exercises PathEnum deeply: diversions, findNext, etc.) ############################################################ puts "--- find_timing_paths endpoint_path_count 5 ---" set paths [find_timing_paths -path_delay max -endpoint_path_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_path_count 3 group_path_count 10 ---" set paths2 [find_timing_paths -path_delay max -endpoint_path_count 3 -group_path_count 10] puts "epc 3 gpc 10: [llength $paths2]" puts "--- find_timing_paths min endpoint_path_count 5 ---" set paths_min [find_timing_paths -path_delay min -endpoint_path_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_path_count 1 (default) ############################################################ puts "--- find_timing_paths endpoint_path_count 1 ---" set paths3 [find_timing_paths -path_delay max -endpoint_path_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_path_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_path_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_path_count 5 ---" set paths_s [find_timing_paths -path_delay max -endpoint_path_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_path_count 5 -group_path_count 15] puts "grouped epc 5: [llength $paths_g]" ############################################################ # report_checks with endpoint_path_count (text output) ############################################################ puts "--- report_checks epc 3 -fields ---" report_checks -path_delay max -endpoint_path_count 3 -fields {slew cap input_pins nets fanout} puts "--- report_checks epc 3 -format end ---" report_checks -path_delay max -endpoint_path_count 3 -format end puts "--- report_checks epc 3 -format summary ---" report_checks -path_delay max -endpoint_path_count 3 -format summary puts "--- report_checks min epc 3 ---" report_checks -path_delay min -endpoint_path_count 3 -fields {slew cap} ############################################################ # report_checks with -from/-to + endpoint_path_count ############################################################ puts "--- report_checks epc 3 -from -to ---" report_checks -path_delay max -endpoint_path_count 3 -from [get_ports in1] -to [get_pins reg1/D] puts "--- report_checks epc 3 -through ---" report_checks -path_delay max -endpoint_path_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_path_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_path_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_path_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_path_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_path_count 3] puts "min_max paths: [llength $pmm]" ############################################################ # Large endpoint_path_count to exercise limits ############################################################ puts "--- find_timing_paths epc 10 gpc 50 ---" set paths_big [find_timing_paths -path_delay max -endpoint_path_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_path_count 5] puts "slack <= 100: [llength $ps2]" puts "--- slack_min filtering ---" set ps3 [find_timing_paths -path_delay max -slack_min -100.0 -endpoint_path_count 5] puts "slack >= -100: [llength $ps3]"