250 lines
7.9 KiB
Tcl
250 lines
7.9 KiB
Tcl
# Test GraphDelayCalc incremental delay tolerance and various invalidation paths.
|
|
# Targets:
|
|
# GraphDelayCalc.cc: setIncrementalDelayTolerance, incrementalDelayTolerance,
|
|
# seedInvalidDelays, delayInvalid(pin), delayInvalid(vertex),
|
|
# findDelays incremental paths, levelChangedBefore, levelsChangedBefore,
|
|
# deleteVertexBefore, findVertexDelay, findCheckEdgeDelays,
|
|
# findLatchEdgeDelays, netCaps, loadDelay, seedRootSlews
|
|
# DmpCeff.cc: incremental recalculation with tolerance changes
|
|
# NetCaps.cc: net capacitance recomputation after changes
|
|
# ArcDelayCalc.cc: arc delay recalculation paths
|
|
|
|
source ../../test/helpers.tcl
|
|
|
|
read_liberty ../../test/nangate45/Nangate45_typ.lib
|
|
read_verilog dcalc_multidriver_test.v
|
|
link_design dcalc_multidriver_test
|
|
|
|
create_clock -name clk -period 10 [get_ports clk]
|
|
set_input_delay -clock clk 0 [get_ports {in1 in2 in3 in4 sel}]
|
|
set_output_delay -clock clk 0 [get_ports {out1 out2 out3}]
|
|
set_input_transition 0.1 [get_ports {in1 in2 in3 in4 sel clk}]
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 1: Baseline timing
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 1: baseline timing ---"
|
|
report_checks
|
|
puts "PASS: baseline"
|
|
|
|
report_checks -path_delay min
|
|
puts "PASS: baseline min"
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 2: Set incremental delay tolerance
|
|
# Exercises: setIncrementalDelayTolerance, incrementalDelayTolerance
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 2: incremental delay tolerance ---"
|
|
|
|
# Set large tolerance (will suppress many incremental updates)
|
|
sta::set_delay_calc_incremental_tolerance 0.5
|
|
puts "PASS: set tolerance 0.5"
|
|
|
|
# Change input transition - large tolerance means less recalc
|
|
set_input_transition 0.2 [get_ports in1]
|
|
report_checks -from [get_ports in1] -to [get_ports out1]
|
|
puts "PASS: after slew change with large tolerance"
|
|
|
|
# Change back
|
|
set_input_transition 0.1 [get_ports in1]
|
|
report_checks -from [get_ports in1] -to [get_ports out1]
|
|
puts "PASS: after slew revert with large tolerance"
|
|
|
|
# Set small tolerance (will recompute more aggressively)
|
|
sta::set_delay_calc_incremental_tolerance 0.001
|
|
puts "PASS: set tolerance 0.001"
|
|
|
|
set_input_transition 0.2 [get_ports in1]
|
|
report_checks -from [get_ports in1] -to [get_ports out1]
|
|
puts "PASS: after slew change with small tolerance"
|
|
|
|
set_input_transition 0.1 [get_ports in1]
|
|
report_checks -from [get_ports in1] -to [get_ports out1]
|
|
puts "PASS: after slew revert with small tolerance"
|
|
|
|
# Zero tolerance
|
|
sta::set_delay_calc_incremental_tolerance 0.0
|
|
puts "PASS: set tolerance 0.0"
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 3: Incremental updates with load changes
|
|
# Exercises: seedInvalidDelays, delayInvalid, net cap recomputation
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 3: incremental load changes ---"
|
|
|
|
# Successively larger loads on out1
|
|
foreach load_val {0.0001 0.001 0.005 0.01 0.05 0.1 0.5} {
|
|
set_load $load_val [get_ports out1]
|
|
report_checks -from [get_ports in1] -to [get_ports out1]
|
|
puts "load=$load_val: done"
|
|
}
|
|
set_load 0 [get_ports out1]
|
|
|
|
# Loads on multiple outputs simultaneously
|
|
set_load 0.01 [get_ports out1]
|
|
set_load 0.01 [get_ports out2]
|
|
set_load 0.01 [get_ports out3]
|
|
report_checks
|
|
puts "PASS: load on all outputs"
|
|
|
|
set_load 0 [get_ports out1]
|
|
set_load 0 [get_ports out2]
|
|
set_load 0 [get_ports out3]
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 4: Incremental updates with transition changes
|
|
# Exercises: seedRootSlews with varying slew values
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 4: incremental slew changes ---"
|
|
|
|
# Very fast transitions
|
|
set_input_transition 0.001 [get_ports {in1 in2 in3 in4 sel}]
|
|
report_checks
|
|
puts "PASS: very fast slew"
|
|
|
|
# Medium transitions
|
|
set_input_transition 0.1 [get_ports {in1 in2 in3 in4 sel}]
|
|
report_checks
|
|
puts "PASS: medium slew"
|
|
|
|
# Very slow transitions
|
|
set_input_transition 2.0 [get_ports {in1 in2 in3 in4 sel}]
|
|
report_checks
|
|
puts "PASS: very slow slew"
|
|
|
|
# Different slews on different inputs
|
|
set_input_transition 0.01 [get_ports in1]
|
|
set_input_transition 0.5 [get_ports in2]
|
|
set_input_transition 0.001 [get_ports in3]
|
|
set_input_transition 1.0 [get_ports in4]
|
|
set_input_transition 0.1 [get_ports sel]
|
|
report_checks
|
|
puts "PASS: mixed slews"
|
|
|
|
# Restore
|
|
set_input_transition 0.1 [get_ports {in1 in2 in3 in4 sel clk}]
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 5: Incremental timing constraint changes
|
|
# Exercises: findDelays with constraint invalidation
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 5: constraint changes ---"
|
|
|
|
# Change clock period
|
|
create_clock -name clk -period 5 [get_ports clk]
|
|
report_checks
|
|
puts "PASS: clock period 5"
|
|
|
|
create_clock -name clk -period 20 [get_ports clk]
|
|
report_checks
|
|
puts "PASS: clock period 20"
|
|
|
|
create_clock -name clk -period 10 [get_ports clk]
|
|
|
|
# Change input delays
|
|
set_input_delay -clock clk 2.0 [get_ports in1]
|
|
report_checks -from [get_ports in1] -to [get_ports out1]
|
|
puts "PASS: input_delay 2.0"
|
|
|
|
set_input_delay -clock clk 0.0 [get_ports in1]
|
|
|
|
# Change output delays
|
|
set_output_delay -clock clk 3.0 [get_ports out1]
|
|
report_checks -to [get_ports out1]
|
|
puts "PASS: output_delay 3.0"
|
|
|
|
set_output_delay -clock clk 0.0 [get_ports out1]
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 6: Network modification triggers delay invalidation
|
|
# Exercises: makeInstance, connectPin, disconnectPin => delayInvalid
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 6: network modification invalidation ---"
|
|
|
|
# Add new instance
|
|
set new_inst [make_instance extra_buf NangateOpenCellLibrary/BUF_X4]
|
|
puts "PASS: make_instance"
|
|
|
|
set new_net [make_net extra_net]
|
|
puts "PASS: make_net"
|
|
|
|
connect_pin extra_net extra_buf/A
|
|
puts "PASS: connect_pin"
|
|
|
|
report_checks
|
|
puts "PASS: report after add"
|
|
|
|
# Disconnect and delete
|
|
disconnect_pin extra_net extra_buf/A
|
|
puts "PASS: disconnect_pin"
|
|
|
|
delete_instance extra_buf
|
|
delete_net extra_net
|
|
puts "PASS: cleanup"
|
|
|
|
report_checks
|
|
puts "PASS: report after cleanup"
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 7: Replace cell triggers delay recalc
|
|
# Exercises: replaceCell => incremental delay update
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 7: replace cell ---"
|
|
|
|
# Replace buf1 with larger buffer
|
|
replace_cell buf1 NangateOpenCellLibrary/BUF_X4
|
|
report_checks -from [get_ports in1] -to [get_ports out1]
|
|
puts "PASS: replace buf1 -> BUF_X4"
|
|
|
|
replace_cell buf1 NangateOpenCellLibrary/BUF_X2
|
|
report_checks -from [get_ports in1] -to [get_ports out1]
|
|
puts "PASS: replace buf1 -> BUF_X2"
|
|
|
|
replace_cell buf1 NangateOpenCellLibrary/BUF_X1
|
|
report_checks -from [get_ports in1] -to [get_ports out1]
|
|
puts "PASS: replace buf1 -> BUF_X1 (restore)"
|
|
|
|
# Replace multiple cells
|
|
replace_cell and1 NangateOpenCellLibrary/AND2_X2
|
|
replace_cell or1 NangateOpenCellLibrary/OR2_X2
|
|
report_checks
|
|
puts "PASS: replace multiple cells"
|
|
|
|
replace_cell and1 NangateOpenCellLibrary/AND2_X1
|
|
replace_cell or1 NangateOpenCellLibrary/OR2_X1
|
|
report_checks
|
|
puts "PASS: restore cells"
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 8: Tolerance with calculator switching
|
|
# Exercises: setIncrementalDelayTolerance persists across calc changes
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 8: tolerance with calculator switching ---"
|
|
|
|
sta::set_delay_calc_incremental_tolerance 0.1
|
|
|
|
set_delay_calculator lumped_cap
|
|
report_checks
|
|
puts "PASS: lumped_cap with tolerance"
|
|
|
|
set_delay_calculator dmp_ceff_elmore
|
|
report_checks
|
|
puts "PASS: dmp_ceff_elmore with tolerance"
|
|
|
|
set_delay_calculator dmp_ceff_two_pole
|
|
report_checks
|
|
puts "PASS: dmp_ceff_two_pole with tolerance"
|
|
|
|
set_delay_calculator unit
|
|
report_checks
|
|
puts "PASS: unit with tolerance"
|
|
|
|
# Restore
|
|
set_delay_calculator dmp_ceff_elmore
|
|
sta::set_delay_calc_incremental_tolerance 0.0
|
|
|
|
report_checks
|
|
puts "PASS: final report"
|
|
|
|
puts "ALL PASSED"
|