OpenSTA/search/test/search_timing_model_readbac...

147 lines
5.3 KiB
Tcl

# Test MakeTimingModel.cc: generate timing model, read it back, and run STA
# on it. Exercises makeTimingModel with clock setup, findTimingFromInputs,
# findClkedOutputPaths, findClkTreeDelays, makeGateModelScalar,
# makeEndTimingArcs, saveSdc/restoreSdc, makeLibrary, makeCell, makePorts.
# Also exercises model output with different designs (latch, CRPR).
# Targets: MakeTimingModel.cc all major functions,
# Sta.cc writeTimingModel
source ../../test/helpers.tcl
proc rename_timing_model_library {lib_file new_lib_name} {
set in [open $lib_file r]
set lib_text [read $in]
close $in
regsub {library[[:space:]]*\([^)]+\)} $lib_text "library ($new_lib_name)" lib_text
set out [open $lib_file w]
puts -nonewline $out $lib_text
close $out
}
############################################################
# Part 1: Model from search_path_end_types (flops with async reset)
############################################################
read_liberty ../../test/nangate45/Nangate45_typ.lib
read_verilog search_path_end_types.v
link_design search_path_end_types
create_clock -name clk -period 10 [get_ports clk]
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 0.5 [get_ports rst]
set_output_delay -clock clk 2.0 [get_ports out1]
set_output_delay -clock clk 2.0 [get_ports out2]
set_output_delay -clock clk 2.0 [get_ports out3]
set_input_transition 0.1 [all_inputs]
report_checks -path_delay max > /dev/null
puts "--- write_timing_model for search_path_end_types ---"
set model1 [make_result_file "model_pet.lib"]
write_timing_model -library_name model_pet_lib -cell_name model_pet $model1
rename_timing_model_library $model1 model_pet_lib_readback
# Read model back
puts "--- read back model ---"
read_liberty $model1
############################################################
# Part 2: Model from search_crpr (clock tree reconvergence)
############################################################
read_verilog search_crpr.v
link_design search_crpr
create_clock -name clk -period 10 [get_ports clk]
set_propagated_clock [get_clocks clk]
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_input_transition 0.1 [all_inputs]
report_checks -path_delay max > /dev/null
puts "--- write_timing_model for crpr design ---"
set model2 [make_result_file "model_crpr.lib"]
write_timing_model -library_name model_crpr_lib -cell_name model_crpr $model2
rename_timing_model_library $model2 model_crpr_lib_readback
puts "--- read back crpr model ---"
read_liberty $model2
############################################################
# Part 3: Model from search_latch (latch design)
############################################################
read_verilog search_latch.v
link_design search_latch
create_clock -name clk -period 10 [get_ports clk]
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 clk 2.0 [get_ports out2]
set_input_transition 0.1 [all_inputs]
report_checks -path_delay max > /dev/null
puts "--- write_timing_model for latch design ---"
set model3 [make_result_file "model_latch.lib"]
write_timing_model $model3
rename_timing_model_library $model3 model_latch_readback
puts "--- read back latch model ---"
read_liberty $model3
############################################################
# Part 4: Model from search_test1 (simple flop design)
############################################################
read_verilog search_test1.v
link_design search_test1
create_clock -name clk -period 10 [get_ports clk]
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_input_transition 0.1 [all_inputs]
report_checks -path_delay max > /dev/null
puts "--- write_timing_model default ---"
set model4 [make_result_file "model_simple.lib"]
write_timing_model $model4
rename_timing_model_library $model4 model_simple_readback
puts "--- write_timing_model with scene ---"
set corner [sta::cmd_scene]
set model5 [make_result_file "model_simple_corner.lib"]
write_timing_model -scene $corner $model5
rename_timing_model_library $model5 model_simple_corner_readback
# Read model back and use it as a block
puts "--- read back and use as block ---"
read_liberty $model4
############################################################
# Part 5: write_timing_model on multicorner design
############################################################
read_verilog search_multicorner_analysis.v
link_design search_multicorner_analysis
create_clock -name clk -period 10 [get_ports clk]
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_output_delay -clock clk 2.0 [get_ports out1]
set_output_delay -clock clk 2.0 [get_ports out2]
set_input_transition 0.1 [all_inputs]
report_checks -path_delay max > /dev/null
puts "--- write_timing_model for multicorner analysis ---"
set model6 [make_result_file "model_multicorner.lib"]
write_timing_model -library_name mc_lib -cell_name mc_cell $model6
rename_timing_model_library $model6 model_multicorner_readback
puts "--- read back multicorner model ---"
read_liberty $model6