OpenSTA/search/test/search_property_deep.tcl

280 lines
12 KiB
Tcl

# Test Property.cc deeper: more property queries, PathEnd properties,
# Clock generated properties, net_slack, endpoint properties,
# pin arrival/required/slack variants, edge properties deep.
# Also test report_path format variants and field customization.
# Targets: Property.cc getProperty for PathEnd, Path, Edge, Clock (gen),
# TimingArcSet properties, resistancePropertyValue,
# capacitancePropertyValue, Port properties deeper,
# ReportPath.cc reportPath, reportPathFull, reportPath3,
# setReportFieldOrder, setReportPathFields, reportGenClkSrcAndPath,
# reportJson, reportShort(PathEndUnconstrained)
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
############################################################
# Generated clock properties
############################################################
puts "--- Generated clock properties ---"
set gclk [get_clocks div_clk]
puts "gen clock name: [get_property $gclk name]"
puts "gen clock period: [get_property $gclk period]"
puts "gen clock is_generated: [get_property $gclk is_generated]"
puts "gen clock is_virtual: [get_property $gclk is_virtual]"
set gsrc [get_property $gclk sources]
puts "gen clock sources: [llength $gsrc]"
############################################################
# Pin properties on clock pins
############################################################
puts "--- Clock pin properties ---"
set ck_pin [get_pins div_reg/CK]
puts "div_reg/CK is_clock: [get_property $ck_pin is_clock]"
puts "div_reg/CK is_register_clock: [get_property $ck_pin is_register_clock]"
set cks [get_property $ck_pin clocks]
puts "div_reg/CK clocks: [llength $cks]"
set cdoms [get_property $ck_pin clock_domains]
puts "div_reg/CK clock_domains: [llength $cdoms]"
############################################################
# Pin timing properties - arrival, slew, slack variants
############################################################
puts "--- Pin timing properties deep ---"
set dpin [get_pins reg1/D]
puts "arrival_max_rise: [get_property $dpin arrival_max_rise]"
puts "arrival_max_fall: [get_property $dpin arrival_max_fall]"
puts "arrival_min_rise: [get_property $dpin arrival_min_rise]"
puts "arrival_min_fall: [get_property $dpin arrival_min_fall]"
puts "slack_max: [get_property $dpin slack_max]"
puts "slack_max_rise: [get_property $dpin slack_max_rise]"
puts "slack_max_fall: [get_property $dpin slack_max_fall]"
puts "slack_min: [get_property $dpin slack_min]"
puts "slack_min_rise: [get_property $dpin slack_min_rise]"
puts "slack_min_fall: [get_property $dpin slack_min_fall]"
puts "slew_max: [get_property $dpin slew_max]"
puts "slew_max_rise: [get_property $dpin slew_max_rise]"
puts "slew_max_fall: [get_property $dpin slew_max_fall]"
puts "slew_min: [get_property $dpin slew_min]"
puts "slew_min_rise: [get_property $dpin slew_min_rise]"
puts "slew_min_fall: [get_property $dpin slew_min_fall]"
############################################################
# Port properties
############################################################
puts "--- Port properties deep ---"
set in_port [get_ports in1]
puts "port name: [get_property $in_port name]"
puts "port direction: [get_property $in_port direction]"
set out_port [get_ports out1]
puts "out port direction: [get_property $out_port direction]"
set clk_port [get_ports clk]
puts "clk port direction: [get_property $clk_port direction]"
############################################################
# Net properties
############################################################
puts "--- Net properties ---"
set net1 [get_nets n1]
puts "net name: [get_property $net1 name]"
puts "net full_name: [get_property $net1 full_name]"
############################################################
# Instance properties
############################################################
puts "--- Instance properties deep ---"
set inst1 [get_cells reg1]
puts "inst name: [get_property $inst1 name]"
puts "inst full_name: [get_property $inst1 full_name]"
puts "inst ref_name: [get_property $inst1 ref_name]"
set icell [get_property $inst1 cell]
puts "inst cell: [get_name $icell]"
############################################################
# LibertyCell properties
############################################################
puts "--- LibertyCell properties ---"
set lc [get_lib_cells NangateOpenCellLibrary/AND2_X1]
puts "lib_cell name: [get_property $lc name]"
puts "lib_cell full_name: [get_property $lc full_name]"
puts "lib_cell base_name: [get_property $lc base_name]"
puts "lib_cell filename: [get_property $lc filename]"
puts "lib_cell is_buffer: [get_property $lc is_buffer]"
set lib_ref [get_property $lc library]
puts "lib_cell library: [get_name $lib_ref]"
############################################################
# LibertyPort properties
############################################################
puts "--- LibertyPort properties ---"
set lp [get_lib_pins NangateOpenCellLibrary/AND2_X1/ZN]
puts "lib_port name: [get_property $lp name]"
puts "lib_port full_name: [get_property $lp full_name]"
puts "lib_port direction: [get_property $lp direction]"
############################################################
# Library properties
############################################################
puts "--- Library properties ---"
set lib [get_libs NangateOpenCellLibrary]
puts "lib name: [get_property $lib name]"
puts "lib full_name: [get_property $lib full_name]"
############################################################
# Edge properties with timing arc details
############################################################
puts "--- Edge properties deep ---"
set edges [get_timing_edges -from [get_pins and1/A1] -to [get_pins and1/ZN]]
foreach edge $edges {
puts "edge full_name: [get_property $edge full_name]"
puts "edge delay_min_fall: [get_property $edge delay_min_fall]"
puts "edge delay_max_fall: [get_property $edge delay_max_fall]"
puts "edge delay_min_rise: [get_property $edge delay_min_rise]"
puts "edge delay_max_rise: [get_property $edge delay_max_rise]"
puts "edge sense: [get_property $edge sense]"
set efp [get_property $edge from_pin]
puts "edge from_pin: [get_full_name $efp]"
set etp [get_property $edge to_pin]
puts "edge to_pin: [get_full_name $etp]"
break
}
############################################################
# PathEnd properties deep
############################################################
puts "--- PathEnd properties deep ---"
set paths [find_timing_paths -path_delay max -endpoint_count 5]
foreach pe $paths {
set sp [get_property $pe startpoint]
puts "startpoint: [get_full_name $sp]"
set ep [get_property $pe endpoint]
puts "endpoint: [get_full_name $ep]"
puts "slack: [get_property $pe slack]"
set sc [get_property $pe startpoint_clock]
puts "startpoint_clock: [get_name $sc]"
set ec [get_property $pe endpoint_clock]
puts "endpoint_clock: [get_name $ec]"
if { [$pe is_check] } {
set ecp [get_property $pe endpoint_clock_pin]
puts "endpoint_clock_pin: [get_full_name $ecp]"
}
# PathEnd methods
puts " is_check: [$pe is_check]"
puts " is_output_delay: [$pe is_output_delay]"
puts " is_unconstrained: [$pe is_unconstrained]"
puts " is_path_delay: [$pe is_path_delay]"
puts " is_latch_check: [$pe is_latch_check]"
puts " is_data_check: [$pe is_data_check]"
puts " is_gated_clock: [$pe is_gated_clock]"
puts " margin: [$pe margin]"
puts " data_required_time: [$pe data_required_time]"
puts " data_arrival_time: [$pe data_arrival_time]"
puts " source_clk_latency: [$pe source_clk_latency]"
puts " target_clk: [get_name [$pe target_clk]]"
puts " target_clk_delay: [$pe target_clk_delay]"
puts " clk_skew: [$pe clk_skew]"
puts " min_max: [$pe min_max]"
puts " end_transition: [$pe end_transition]"
puts " check_role: [$pe check_role]"
break
}
############################################################
# Path properties
############################################################
puts "--- Path properties deep ---"
foreach pe $paths {
set p [$pe path]
puts "path pin: [get_full_name [$p pin]]"
puts "path arrival: [$p arrival]"
puts "path required: [$p required]"
puts "path slack: [$p slack]"
puts "path edge: [$p edge]"
set ppins [$p pins]
puts "path pins count: [llength $ppins]"
break
}
############################################################
# Report checks in all format variants
############################################################
puts "--- report_checks -format full ---"
report_checks -path_delay max -format full
puts "--- report_checks -format full_clock ---"
report_checks -path_delay max -format full_clock
puts "--- report_checks -format full_clock_expanded ---"
report_checks -path_delay max -format full_clock_expanded
puts "--- report_checks -format short ---"
report_checks -path_delay max -format short
puts "--- report_checks -format end ---"
report_checks -path_delay max -format end
puts "--- report_checks -format slack_only ---"
report_checks -path_delay max -format slack_only
puts "--- report_checks -format summary ---"
report_checks -path_delay max -format summary
puts "--- report_checks -format json ---"
report_checks -path_delay max -format json
############################################################
# Report checks with different -fields
############################################################
puts "--- report_checks with -fields combinations ---"
report_checks -path_delay max -fields {capacitance slew fanout}
report_checks -path_delay max -fields {input_pin net}
report_checks -path_delay max -fields {capacitance slew fanout input_pin net src_attr}
############################################################
# report_checks with -digits
############################################################
puts "--- report_checks -digits 6 ---"
report_checks -path_delay max -digits 6
############################################################
# report_checks -no_line_splits
############################################################
puts "--- report_checks -no_line_splits ---"
report_checks -path_delay max -no_line_splits
############################################################
# report_checks to generated clock domain
############################################################
puts "--- report_checks to div_clk domain ---"
report_checks -to [get_ports out2] -format full_clock_expanded
############################################################
# report_checks -unconstrained
############################################################
puts "--- report_checks -unconstrained ---"
report_checks -path_delay max -unconstrained
############################################################
# get_property -object_type
############################################################
puts "--- get_property -object_type ---"
puts "inst: [get_property -object_type instance reg1 name]"
puts "pin: [get_property -object_type pin reg1/D name]"
puts "net: [get_property -object_type net n1 name]"
puts "port: [get_property -object_type port in1 name]"
puts "clock: [get_property -object_type clock clk name]"
puts "lib_cell: [get_property -object_type liberty_cell NangateOpenCellLibrary/AND2_X1 name]"
puts "lib_pin: [get_property -object_type liberty_port NangateOpenCellLibrary/AND2_X1/ZN name]"
puts "library: [get_property -object_type library NangateOpenCellLibrary name]"