164 lines
5.8 KiB
Tcl
164 lines
5.8 KiB
Tcl
# Test graph delay value comparison and multi-corner graph operations.
|
|
# Targets: DelayFloat.cc (87.8% -> delayLess with min_max, delayGreater,
|
|
# delayGreaterEqual, delayLessEqual, delayRemove, delayRatio, delayZero,
|
|
# delayInf, delayInitValue, delayIsInitValue)
|
|
# Graph.cc (71.2% -> multi-corner vertex/edge access, clock vertices)
|
|
# GraphCmp.cc (90.5% -> sortEdges with multiple edges)
|
|
|
|
source ../../test/helpers.tcl
|
|
|
|
#---------------------------------------------------------------
|
|
# Multi-corner setup for graph coverage
|
|
#---------------------------------------------------------------
|
|
define_corners fast slow
|
|
|
|
read_liberty -corner fast ../../test/nangate45/Nangate45_fast.lib
|
|
read_liberty -corner slow ../../test/nangate45/Nangate45_slow.lib
|
|
|
|
read_verilog graph_test2.v
|
|
link_design graph_test2
|
|
|
|
create_clock -name clk -period 10 [get_ports clk]
|
|
set_input_delay -clock clk 1.0 [get_ports {d1 d2 en}]
|
|
set_output_delay -clock clk 1.0 [get_ports {q1 q2}]
|
|
set_input_transition 0.1 [get_ports {d1 d2 en}]
|
|
|
|
#---------------------------------------------------------------
|
|
# Multi-corner timing reports (exercises delay value comparison
|
|
# across min/max analysis points in Graph)
|
|
#---------------------------------------------------------------
|
|
puts "--- fast corner ---"
|
|
report_checks -corner fast
|
|
|
|
report_checks -corner fast -path_delay min
|
|
|
|
report_checks -corner fast -path_delay max
|
|
|
|
puts "--- slow corner ---"
|
|
report_checks -corner slow
|
|
|
|
report_checks -corner slow -path_delay min
|
|
|
|
report_checks -corner slow -path_delay max
|
|
|
|
#---------------------------------------------------------------
|
|
# Multi-corner report_dcalc (exercises delay subtraction/comparison)
|
|
#---------------------------------------------------------------
|
|
puts "--- report_dcalc per corner ---"
|
|
report_dcalc -corner fast -from [get_pins buf1/A] -to [get_pins buf1/Z]
|
|
puts "fast buf1 dcalc: done"
|
|
|
|
report_dcalc -corner slow -from [get_pins buf1/A] -to [get_pins buf1/Z]
|
|
puts "slow buf1 dcalc: done"
|
|
|
|
report_dcalc -corner fast -from [get_pins inv1/A] -to [get_pins inv1/ZN]
|
|
puts "fast inv1 dcalc: done"
|
|
|
|
report_dcalc -corner slow -from [get_pins inv1/A] -to [get_pins inv1/ZN]
|
|
puts "slow inv1 dcalc: done"
|
|
|
|
report_dcalc -corner fast -from [get_pins and1/A1] -to [get_pins and1/ZN]
|
|
puts "fast and1 A1 dcalc: done"
|
|
|
|
report_dcalc -corner slow -from [get_pins and1/A1] -to [get_pins and1/ZN]
|
|
puts "slow and1 A1 dcalc: done"
|
|
|
|
report_dcalc -corner fast -from [get_pins or1/A1] -to [get_pins or1/ZN]
|
|
puts "fast or1 A1 dcalc: done"
|
|
|
|
report_dcalc -corner slow -from [get_pins or1/A1] -to [get_pins or1/ZN]
|
|
puts "slow or1 A1 dcalc: done"
|
|
|
|
# DFF arcs
|
|
report_dcalc -corner fast -from [get_pins reg1/CK] -to [get_pins reg1/Q] -max
|
|
puts "fast reg1 CK->Q: done"
|
|
|
|
report_dcalc -corner slow -from [get_pins reg1/CK] -to [get_pins reg1/Q] -max
|
|
puts "slow reg1 CK->Q: done"
|
|
|
|
report_dcalc -corner fast -from [get_pins reg1/CK] -to [get_pins reg1/D] -max
|
|
puts "fast reg1 setup: done"
|
|
|
|
report_dcalc -corner slow -from [get_pins reg1/CK] -to [get_pins reg1/D] -min
|
|
puts "slow reg1 hold: done"
|
|
|
|
#---------------------------------------------------------------
|
|
# report_checks with fields across corners (exercises graph slew access)
|
|
#---------------------------------------------------------------
|
|
puts "--- report_checks with fields ---"
|
|
report_checks -corner fast -fields {slew cap input_pins}
|
|
|
|
report_checks -corner slow -fields {slew cap input_pins}
|
|
|
|
report_checks -corner fast -format full_clock
|
|
|
|
report_checks -corner slow -format full_clock
|
|
|
|
#---------------------------------------------------------------
|
|
# Multi-corner paths (different paths in fast vs slow)
|
|
#---------------------------------------------------------------
|
|
puts "--- multi-corner paths ---"
|
|
report_checks -corner fast -from [get_ports d1] -to [get_ports q1]
|
|
|
|
report_checks -corner slow -from [get_ports d1] -to [get_ports q1]
|
|
|
|
report_checks -corner fast -from [get_ports d2] -to [get_ports q2]
|
|
|
|
report_checks -corner slow -from [get_ports d2] -to [get_ports q2]
|
|
|
|
report_checks -corner fast -from [get_ports en] -to [get_ports q1]
|
|
|
|
report_checks -corner slow -from [get_ports en] -to [get_ports q1]
|
|
|
|
#---------------------------------------------------------------
|
|
# Edge queries with multi-corner
|
|
#---------------------------------------------------------------
|
|
puts "--- timing edges multi-corner ---"
|
|
set e1 [get_timing_edges -of_objects [get_cells and1]]
|
|
puts "and1 edges: [llength $e1]"
|
|
|
|
set e2 [get_timing_edges -of_objects [get_cells or1]]
|
|
puts "or1 edges: [llength $e2]"
|
|
|
|
set e3 [get_timing_edges -of_objects [get_cells reg1]]
|
|
puts "reg1 edges: [llength $e3]"
|
|
|
|
report_edges -from [get_pins and1/A1] -to [get_pins and1/ZN]
|
|
report_edges -from [get_pins and1/A2] -to [get_pins and1/ZN]
|
|
report_edges -from [get_pins or1/A1] -to [get_pins or1/ZN]
|
|
report_edges -from [get_pins or1/A2] -to [get_pins or1/ZN]
|
|
|
|
#---------------------------------------------------------------
|
|
# Load changes with multi-corner (exercises delay recomputation)
|
|
#---------------------------------------------------------------
|
|
puts "--- load changes multi-corner ---"
|
|
set_load 0.01 [get_ports q1]
|
|
set_load 0.05 [get_ports q2]
|
|
|
|
report_checks -corner fast
|
|
|
|
report_checks -corner slow
|
|
|
|
set_load 0 [get_ports q1]
|
|
set_load 0 [get_ports q2]
|
|
|
|
#---------------------------------------------------------------
|
|
# report_checks -unconstrained multi-corner
|
|
#---------------------------------------------------------------
|
|
puts "--- unconstrained multi-corner ---"
|
|
report_checks -corner fast -unconstrained
|
|
|
|
report_checks -corner slow -unconstrained
|
|
|
|
#---------------------------------------------------------------
|
|
# Disable/enable with multi-corner
|
|
#---------------------------------------------------------------
|
|
puts "--- disable with multi-corner ---"
|
|
set_disable_timing [get_cells buf1]
|
|
report_checks -corner fast
|
|
report_checks -corner slow
|
|
|
|
unset_disable_timing [get_cells buf1]
|
|
report_checks -corner fast
|
|
report_checks -corner slow
|