OpenSTA/sdc/test/sdc_removal_reset.tcl

266 lines
8.7 KiB
Tcl

# Test SDC constraint creation, removal, and re-creation
# Targets: Sdc.cc (removeClock, deleteMasterClkRefs, removeInputDelay, removeOutputDelay,
# deleteInputDelaysReferencing, deleteOutputDelaysReferencing,
# deleteClockLatency, deleteClockInsertion, deleteInterClockUncertainty,
# deleteClockInsertionsReferencing, deleteMinPulseWidthReferencing,
# deleteLatchBorrowLimitsReferencing, clockGroupsDeleteClkRefs),
# ExceptionPath.cc (exception removal, priority comparison),
# Clock.cc (initClk, deletion, re-creation),
# WriteSdc.cc (writing after removals),
# CycleAccting.cc (cycle accounting with different clock configs)
source ../../test/helpers.tcl
read_liberty ../../test/nangate45/Nangate45_typ.lib
read_verilog sdc_test2.v
link_design sdc_test2
############################################################
# Phase 1: Create comprehensive constraints
############################################################
# Clocks
create_clock -name clk1 -period 10 [get_ports clk1]
create_clock -name clk2 -period 20 -waveform {0 10} [get_ports clk2]
create_clock -name vclk -period 8
puts "PASS: Phase 1 - clocks"
# Generated clocks
create_generated_clock -name gclk1 -source [get_ports clk1] -divide_by 2 [get_pins reg1/Q]
create_generated_clock -name gclk2 -source [get_ports clk2] -multiply_by 2 [get_pins reg3/Q]
puts "PASS: Phase 1 - generated clocks"
# IO delays
set_input_delay -clock clk1 2.0 [get_ports in1]
set_input_delay -clock clk1 -rise -max 2.5 [get_ports in2]
set_input_delay -clock clk1 -fall -min 1.0 [get_ports in2]
set_input_delay -clock clk2 1.8 [get_ports in3]
set_output_delay -clock clk1 3.0 [get_ports out1]
set_output_delay -clock clk2 3.5 [get_ports out2]
puts "PASS: Phase 1 - IO delays"
# Clock latency
set_clock_latency -source 0.5 [get_clocks clk1]
set_clock_latency -source -rise -max 0.6 [get_clocks clk1]
set_clock_latency 0.2 [get_clocks clk2]
puts "PASS: Phase 1 - clock latency"
# Clock uncertainty
set_clock_uncertainty -setup 0.2 [get_clocks clk1]
set_clock_uncertainty -hold 0.1 [get_clocks clk1]
set_clock_uncertainty -from [get_clocks clk1] -to [get_clocks clk2] -setup 0.3
set_clock_uncertainty -from [get_clocks clk1] -to [get_clocks clk2] -hold 0.15
puts "PASS: Phase 1 - clock uncertainty"
# Clock transition
set_clock_transition 0.1 [get_clocks clk1]
set_clock_transition 0.15 [get_clocks clk2]
puts "PASS: Phase 1 - clock transition"
# Source latency with early/late
set_clock_latency -source -early 0.3 [get_clocks clk1]
set_clock_latency -source -late 0.5 [get_clocks clk1]
puts "PASS: Phase 1 - source latency early/late"
# Min pulse width
set_min_pulse_width 1.0 [get_clocks clk1]
set_min_pulse_width -high 0.6 [get_clocks clk2]
puts "PASS: Phase 1 - min pulse width"
# Latch borrow limit
set_max_time_borrow 2.0 [get_clocks clk1]
set_max_time_borrow 1.5 [get_pins reg1/D]
puts "PASS: Phase 1 - latch borrow"
# Clock groups
set_clock_groups -asynchronous -name grp1 \
-group {clk1 gclk1} \
-group {clk2 gclk2}
puts "PASS: Phase 1 - clock groups"
# Exception paths
set_false_path -from [get_clocks clk1] -to [get_clocks clk2]
set_multicycle_path -setup 2 -from [get_ports in1] -to [get_ports out1]
set_multicycle_path -hold 1 -from [get_ports in1] -to [get_ports out1]
set_max_delay -from [get_ports in2] -to [get_ports out1] 8.0
set_min_delay -from [get_ports in2] -to [get_ports out1] 1.0
group_path -name grp_io -from [get_ports {in1 in2}] -to [get_ports out1]
puts "PASS: Phase 1 - exception paths"
# Timing derate
set_timing_derate -early 0.95
set_timing_derate -late 1.05
puts "PASS: Phase 1 - timing derate"
# Disable timing
set_disable_timing [get_cells buf1]
puts "PASS: Phase 1 - disable timing"
# Case analysis
set_case_analysis 0 [get_ports in3]
puts "PASS: Phase 1 - case analysis"
# Design limits
set_max_transition 0.5 [current_design]
set_max_capacitance 0.2 [current_design]
set_max_fanout 20 [current_design]
set_max_area 100.0
puts "PASS: Phase 1 - design limits"
# Write Phase 1
set sdc_phase1 [make_result_file sdc_removal_phase1.sdc]
write_sdc -no_timestamp $sdc_phase1
puts "PASS: Phase 1 - write_sdc"
report_checks
puts "PASS: Phase 1 - report_checks"
############################################################
# Phase 2: Remove constraints systematically
############################################################
# Remove exceptions
unset_path_exceptions -from [get_clocks clk1] -to [get_clocks clk2]
puts "PASS: Phase 2 - remove false path"
unset_path_exceptions -setup -from [get_ports in1] -to [get_ports out1]
unset_path_exceptions -hold -from [get_ports in1] -to [get_ports out1]
puts "PASS: Phase 2 - remove multicycle"
# Remove timing derate
unset_timing_derate
puts "PASS: Phase 2 - remove timing derate"
# Remove disable timing
unset_disable_timing [get_cells buf1]
puts "PASS: Phase 2 - remove disable timing"
# Remove case analysis
unset_case_analysis [get_ports in3]
puts "PASS: Phase 2 - remove case analysis"
# Remove clock groups
unset_clock_groups -asynchronous -name grp1
puts "PASS: Phase 2 - remove clock groups"
# Remove clock latency
unset_clock_latency [get_clocks clk1]
unset_clock_latency -source [get_clocks clk1]
unset_clock_latency [get_clocks clk2]
puts "PASS: Phase 2 - remove clock latency"
# Remove inter-clock uncertainty
unset_clock_uncertainty -from [get_clocks clk1] -to [get_clocks clk2] -setup
unset_clock_uncertainty -from [get_clocks clk1] -to [get_clocks clk2] -hold
puts "PASS: Phase 2 - remove inter-clock uncertainty"
# Remove propagated clock
set_propagated_clock [get_clocks clk1]
unset_propagated_clock [get_clocks clk1]
puts "PASS: Phase 2 - remove propagated clock"
# Write Phase 2 (many constraints removed)
set sdc_phase2 [make_result_file sdc_removal_phase2.sdc]
write_sdc -no_timestamp $sdc_phase2
puts "PASS: Phase 2 - write_sdc"
report_checks
puts "PASS: Phase 2 - report_checks"
############################################################
# Phase 3: Delete and re-create clocks
# (this is the key test - deleting clocks should remove
# all referencing constraints)
############################################################
# Delete generated clocks first
delete_generated_clock [get_clocks gclk1]
puts "PASS: Phase 3 - delete gclk1"
delete_generated_clock [get_clocks gclk2]
puts "PASS: Phase 3 - delete gclk2"
# Delete virtual clock
delete_clock [get_clocks vclk]
puts "PASS: Phase 3 - delete vclk"
report_clock_properties
puts "PASS: Phase 3 - report after clock deletions"
# Write after clock deletions
set sdc_phase3a [make_result_file sdc_removal_phase3a.sdc]
write_sdc -no_timestamp $sdc_phase3a
puts "PASS: Phase 3a - write_sdc"
report_checks
puts "PASS: Phase 3a - report_checks"
############################################################
# Phase 4: Re-create everything fresh
############################################################
# Re-create virtual clock with different period
create_clock -name vclk_new -period 12
puts "PASS: Phase 4 - new virtual clock"
# Re-create generated clocks on new sources
create_generated_clock -name gclk_new1 -source [get_ports clk1] -divide_by 4 [get_pins reg1/Q]
puts "PASS: Phase 4 - new generated clock"
# New clock groups
set_clock_groups -asynchronous -name new_grp \
-group {clk1 gclk_new1} \
-group {clk2}
puts "PASS: Phase 4 - new clock groups"
# New exceptions
set_false_path -from [get_clocks clk1] -to [get_clocks clk2]
set_multicycle_path -setup 3 -from [get_ports in2] -to [get_ports out2]
puts "PASS: Phase 4 - new exceptions"
# New latency
set_clock_latency -source 0.4 [get_clocks clk1]
set_clock_latency 0.15 [get_clocks clk2]
puts "PASS: Phase 4 - new latency"
# New uncertainty
set_clock_uncertainty -setup 0.25 [get_clocks clk1]
set_clock_uncertainty -from [get_clocks clk1] -to [get_clocks clk2] -setup 0.35
puts "PASS: Phase 4 - new uncertainty"
# New derate
set_timing_derate -early 0.96
set_timing_derate -late 1.04
puts "PASS: Phase 4 - new derate"
# New disable
set_disable_timing [get_cells inv1]
puts "PASS: Phase 4 - new disable"
# Write Phase 4
set sdc_phase4 [make_result_file sdc_removal_phase4.sdc]
write_sdc -no_timestamp $sdc_phase4
puts "PASS: Phase 4 - write_sdc"
set sdc_phase4_compat [make_result_file sdc_removal_phase4_compat.sdc]
write_sdc -no_timestamp -compatible $sdc_phase4_compat
puts "PASS: Phase 4 - write_sdc compatible"
report_checks
puts "PASS: Phase 4 - report_checks"
############################################################
# Phase 5: Read back SDC and verify
############################################################
read_sdc $sdc_phase4
puts "PASS: Phase 5 - read_sdc"
report_checks
puts "PASS: Phase 5 - report_checks after read"
set sdc_phase5 [make_result_file sdc_removal_phase5.sdc]
write_sdc -no_timestamp $sdc_phase5
puts "PASS: Phase 5 - write_sdc after read"
puts "ALL PASSED"