OpenSTA/search/test/search_genclk_property_repo...

202 lines
8.4 KiB
Tcl

# Test Property.cc: generated clock properties (is_generated, is_virtual,
# is_propagated, sources, period, waveform), clock pin properties (clocks,
# clock_domains), instance and cell properties for genclk designs,
# ReportPath.cc: reportGenClkSrcAndPath, reportGenClkSrcPath for
# generated clock source path expansion,
# report_checks with various formats for generated clk domain paths,
# PathEnd properties for generated clock paths.
# Targets: Property.cc getProperty(Clock) all branches,
# getProperty(Pin) clocks/clock_domains,
# ReportPath.cc reportSrcClkAndPath, reportGenClkSrcAndPath,
# reportGenClkSrcPath, reportGenClkSrcPath1,
# isGenPropClk, pathFromGenPropClk
source ../../test/helpers.tcl
read_liberty ../../test/nangate45/Nangate45_typ.lib
read_verilog search_genclk.v
link_design search_genclk
create_clock -name clk -period 10 [get_ports clk]
create_generated_clock -name div_clk -source [get_pins clkbuf/Z] -divide_by 2 [get_pins div_reg/Q]
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]
set_output_delay -clock div_clk 1.0 [get_ports out2]
# Run timing
report_checks -path_delay max > /dev/null
############################################################
# Clock properties: master vs generated
############################################################
puts "--- Master clock properties ---"
set mclk [get_clocks clk]
puts "clk name: [get_property $mclk name]"
puts "clk full_name: [get_property $mclk full_name]"
puts "clk period: [get_property $mclk period]"
puts "clk is_generated: [get_property $mclk is_generated]"
puts "clk is_virtual: [get_property $mclk is_virtual]"
puts "clk is_propagated: [get_property $mclk is_propagated]"
set clk_srcs [get_property $mclk sources]
puts "clk sources: [llength $clk_srcs]"
foreach s $clk_srcs { puts " src: [get_full_name $s]" }
puts "--- Generated clock properties ---"
set gclk [get_clocks div_clk]
puts "div_clk name: [get_property $gclk name]"
puts "div_clk full_name: [get_property $gclk full_name]"
puts "div_clk period: [get_property $gclk period]"
puts "div_clk is_generated: [get_property $gclk is_generated]"
puts "div_clk is_virtual: [get_property $gclk is_virtual]"
puts "div_clk is_propagated: [get_property $gclk is_propagated]"
set gsrc [get_property $gclk sources]
puts "div_clk sources: [llength $gsrc]"
foreach s $gsrc { puts " src: [get_full_name $s]" }
############################################################
# Propagated clock property change
############################################################
puts "--- Propagated clock toggle ---"
set_propagated_clock [get_clocks clk]
puts "clk is_propagated (after set): [get_property [get_clocks clk] is_propagated]"
puts "div_clk is_propagated (after set): [get_property [get_clocks div_clk] is_propagated]"
report_checks -path_delay max > /dev/null
unset_propagated_clock [get_clocks clk]
puts "clk is_propagated (after unset): [get_property [get_clocks clk] is_propagated]"
############################################################
# Virtual clock
############################################################
puts "--- Virtual clock ---"
create_clock -name vclk -period 5
set vclk [get_clocks vclk]
puts "vclk is_virtual: [get_property $vclk is_virtual]"
puts "vclk is_generated: [get_property $vclk is_generated]"
puts "vclk period: [get_property $vclk period]"
set vsrc [get_property $vclk sources]
puts "vclk sources: [llength $vsrc]"
############################################################
# Pin clocks / clock_domains
############################################################
puts "--- Pin clocks/clock_domains ---"
set ck_pin_main [get_pins reg1/CK]
set pclks [get_property $ck_pin_main clocks]
puts "reg1/CK clocks: [llength $pclks]"
set pdoms [get_property $ck_pin_main clock_domains]
puts "reg1/CK clock_domains: [llength $pdoms]"
set ck_pin_div [get_pins reg2/CK]
set pclks2 [get_property $ck_pin_div clocks]
puts "reg2/CK clocks: [llength $pclks2]"
set pdoms2 [get_property $ck_pin_div clock_domains]
puts "reg2/CK clock_domains: [llength $pdoms2]"
set d_pin [get_pins reg1/D]
set dclks [get_property $d_pin clocks]
puts "reg1/D clocks: [llength $dclks]"
set q_pin [get_pins reg1/Q]
set qclks [get_property $q_pin clocks]
puts "reg1/Q clocks: [llength $qclks]"
############################################################
# Report with generated clock paths: full_clock_expanded
############################################################
puts "--- GenClk full_clock_expanded max ---"
report_checks -to [get_ports out2] -path_delay max -format full_clock_expanded -fields {capacitance slew fanout input_pin net}
puts "--- GenClk full_clock_expanded min ---"
report_checks -to [get_ports out2] -path_delay min -format full_clock_expanded -fields {capacitance slew fanout input_pin net}
puts "--- GenClk full_clock max ---"
report_checks -to [get_ports out2] -path_delay max -format full_clock -fields {capacitance slew fanout}
puts "--- GenClk full max ---"
report_checks -to [get_ports out2] -path_delay max -format full -fields {capacitance slew fanout}
############################################################
# Report genclk paths in all formats
############################################################
puts "--- GenClk all formats ---"
report_checks -to [get_ports out2] -path_delay max -format short
report_checks -to [get_ports out2] -path_delay max -format end
report_checks -to [get_ports out2] -path_delay max -format summary
report_checks -to [get_ports out2] -path_delay max -format slack_only
report_checks -to [get_ports out2] -path_delay max -format json
############################################################
# GenClk with propagated + full_clock_expanded
############################################################
puts "--- GenClk propagated full_clock_expanded ---"
set_propagated_clock [get_clocks clk]
report_checks -to [get_ports out2] -path_delay max -format full_clock_expanded -fields {capacitance slew fanout input_pin}
report_checks -to [get_ports out2] -path_delay min -format full_clock_expanded -fields {capacitance slew fanout input_pin}
unset_propagated_clock [get_clocks clk]
############################################################
# find_timing_paths for genclk domain
############################################################
puts "--- find_timing_paths genclk domain ---"
set paths_gc [find_timing_paths -to [get_ports out2] -path_delay max -endpoint_count 5]
puts "GenClk max paths: [llength $paths_gc]"
foreach pe $paths_gc {
puts " pin=[get_full_name [$pe pin]] slack=[$pe slack]"
puts " is_check: [$pe is_check] is_output: [$pe is_output_delay]"
puts " target_clk: [get_name [$pe target_clk]]"
puts " startpoint_clock: [get_name [get_property $pe startpoint_clock]]"
puts " endpoint_clock: [get_name [get_property $pe endpoint_clock]]"
set pts [get_property $pe points]
puts " points: [llength $pts]"
}
############################################################
# report_path_cmd with genclk path
############################################################
puts "--- report_path_cmd genclk ---"
foreach pe $paths_gc {
set p [$pe path]
sta::set_report_path_format full_clock_expanded
sta::report_path_cmd $p
sta::set_report_path_format full
break
}
############################################################
# report_path_ends for genclk paths
############################################################
puts "--- report_path_ends genclk ---"
sta::report_path_ends $paths_gc
############################################################
# report_clock_properties
############################################################
puts "--- report_clock_properties ---"
report_clock_properties
############################################################
# report_clock_skew
############################################################
puts "--- report_clock_skew ---"
report_clock_skew -setup
report_clock_skew -hold
############################################################
# All reports with digits
############################################################
puts "--- GenClk digits ---"
report_checks -to [get_ports out2] -path_delay max -format full_clock_expanded -digits 6
report_checks -to [get_ports out2] -path_delay max -format full_clock_expanded -digits 2
############################################################
# report_tns/wns
############################################################
puts "--- tns/wns ---"
report_tns
report_wns
report_worst_slack -max
report_worst_slack -min