OpenSTA/search/test/search_levelize_loop_disabl...

143 lines
5.5 KiB
Tcl

# Test Levelize.cc: levelization with disabled arcs, loop detection,
# re-levelization after constraint changes, and level query operations.
# Uses search_check_timing.v (has multiple clocks).
# Targets: Levelize.cc levelize, ensureLevelized,
# levelizeFrom, isDisabledLoop, checkLoops, reportLoops,
# relevelize, clearLogicValues, graphChangedAfterLevelize,
# Search.cc levelize, levelizeGraph, reportLoops
source ../../test/helpers.tcl
read_liberty ../../test/nangate45/Nangate45_typ.lib
read_verilog search_check_timing.v
link_design search_check_timing
create_clock -name clk -period 10 [get_ports clk]
create_clock -name clk2 -period 15 [get_ports clk2]
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 1.0 [get_ports in3]
set_input_delay -clock clk 0.5 [get_ports in_unconst]
set_output_delay -clock clk 2.0 [get_ports out1]
set_output_delay -clock clk2 3.0 [get_ports out2]
# Run initial timing (triggers levelize)
puts "--- initial timing ---"
report_checks -path_delay max
report_checks -path_delay min
############################################################
# Disable timing arcs and re-run (triggers re-levelize)
############################################################
puts "--- disable_timing ---"
set_disable_timing [get_cells buf1] -from A -to Z
report_checks -path_delay max
puts "--- enable_timing ---"
unset_disable_timing [get_cells buf1] -from A -to Z
report_checks -path_delay max
############################################################
# set_disable_timing on lib cell arcs
############################################################
puts "--- disable lib cell arcs ---"
set_disable_timing [get_lib_cells Nangate45/AND2_X1] -from A1 -to ZN
report_checks -path_delay max
puts "--- re-enable lib cell arcs ---"
unset_disable_timing [get_lib_cells Nangate45/AND2_X1] -from A1 -to ZN
report_checks -path_delay max
############################################################
# set_case_analysis (can cause logic constant propagation
# which triggers levelize through sim values)
############################################################
puts "--- set_case_analysis ---"
set_case_analysis 1 [get_ports in2]
report_checks -path_delay max
puts "--- remove case_analysis ---"
unset_case_analysis [get_ports in2]
report_checks -path_delay max
############################################################
# check_setup to report unconstrained endpoints
############################################################
puts "--- check_setup ---"
check_setup -verbose
############################################################
# report_disabled_edges
############################################################
puts "--- report_disabled_edges ---"
report_disabled_edges
############################################################
# Timing with different clock uncertainties (triggers
# re-search which exercises levelize + tag operations)
############################################################
puts "--- inter-clock uncertainty ---"
set_clock_uncertainty -setup 0.5 -from [get_clocks clk] -to [get_clocks clk2]
set_clock_uncertainty -hold 0.2 -from [get_clocks clk] -to [get_clocks clk2]
report_checks -path_delay max
report_checks -path_delay min
############################################################
# Disable whole instance (all arcs)
############################################################
puts "--- disable_timing whole instance ---"
set_disable_timing [get_cells and1]
report_checks -path_delay max
puts "--- enable_timing whole instance ---"
unset_disable_timing [get_cells and1]
report_checks -path_delay max
############################################################
# check_setup with loop detection
############################################################
puts "--- check_setup -loops ---"
check_setup -verbose -loops
############################################################
# Multiple timing operations that force re-levelize
############################################################
puts "--- multiple re-levelize triggers ---"
set_false_path -from [get_ports in1] -to [get_pins reg1/D]
report_checks -path_delay max
unset_path_exceptions -from [get_ports in1] -to [get_pins reg1/D]
report_checks -path_delay max
set_multicycle_path 2 -setup -from [get_clocks clk] -to [get_clocks clk2]
report_checks -path_delay max
############################################################
# Disable timing on ports
############################################################
puts "--- disable timing on port ---"
set_disable_timing [get_ports in1]
report_checks -path_delay max
puts "--- enable timing on port ---"
unset_disable_timing [get_ports in1]
report_checks -path_delay max
############################################################
# set_case_analysis 0 (different constant)
############################################################
puts "--- set_case_analysis 0 ---"
set_case_analysis 0 [get_ports in1]
report_checks -path_delay max
puts "--- remove case_analysis 0 ---"
unset_case_analysis [get_ports in1]
report_checks -path_delay max
############################################################
# Multiple clock domains with different constraints
############################################################
puts "--- add constraints and re-analyze ---"
set_clock_latency -source 0.3 [get_clocks clk]
set_clock_latency -source 0.5 [get_clocks clk2]
set_clock_transition 0.1 [get_clocks clk]
report_checks -path_delay max -format full_clock_expanded
report_checks -path_delay min -format full_clock_expanded