# Test MakeTimingModel.cc deeper: write_timing_model with various options, # then read back the generated liberty. Also test min_period, max_skew checks, # and clock latency/skew report functions. # Targets: MakeTimingModel.cc makeTimingModel, makeGateModelScalar, # checkClock, OutputDelays, MakeEndTimingArcs, # Sta.cc writeTimingModel, reportCheck(MinPeriod/MaxSkew), # ReportPath.cc reportCheck(MinPeriodCheck), reportCheck(MaxSkewCheck), # reportPeriodHeaderShort, reportMaxSkewHeaderShort, # reportShort/Verbose for MinPeriod and MaxSkew, # ClkSkew.cc ClkSkew copy, findClkSkew source ../../test/helpers.tcl 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] # Run timing first report_checks -path_delay max > /dev/null ############################################################ # write_timing_model with various options ############################################################ puts "--- write_timing_model default ---" set model_file1 [make_result_file "timing_model_deep1.lib"] write_timing_model $model_file1 puts "PASS: write_timing_model default" puts "--- write_timing_model -cell_name ---" set model_file2 [make_result_file "timing_model_deep2.lib"] write_timing_model -cell_name custom_cell $model_file2 puts "PASS: write_timing_model cell_name" puts "--- write_timing_model -library_name -cell_name ---" set model_file3 [make_result_file "timing_model_deep3.lib"] write_timing_model -library_name custom_lib -cell_name custom_cell $model_file3 puts "PASS: write_timing_model lib_name+cell_name" puts "--- write_timing_model -corner ---" set corner [sta::cmd_corner] set model_file4 [make_result_file "timing_model_deep4.lib"] write_timing_model -corner [$corner name] $model_file4 puts "PASS: write_timing_model corner" ############################################################ # Read back the generated timing model ############################################################ puts "--- Read back generated model ---" read_liberty $model_file1 puts "PASS: read back model" ############################################################ # Min period checks ############################################################ puts "--- min_period_violations ---" set mpv [sta::min_period_violations] puts "min_period violations: [llength $mpv]" puts "PASS: min_period_violations" puts "--- min_period_check_slack ---" set mpc [sta::min_period_check_slack] if { $mpc != "NULL" } { sta::report_min_period_check $mpc 0 sta::report_min_period_check $mpc 1 puts "PASS: min_period_check_slack reported" } else { puts "PASS: min_period_check_slack (no check)" } puts "--- report_min_period_checks ---" set mpc_all [sta::min_period_violations] sta::report_min_period_checks $mpc_all 0 sta::report_min_period_checks $mpc_all 1 puts "PASS: report_min_period_checks" ############################################################ # Max skew checks ############################################################ puts "--- max_skew_violations ---" set msv [sta::max_skew_violations] puts "max_skew violations: [llength $msv]" puts "PASS: max_skew_violations" puts "--- max_skew_check_slack ---" set msc [sta::max_skew_check_slack] if { $msc != "NULL" } { sta::report_max_skew_check $msc 0 sta::report_max_skew_check $msc 1 puts "PASS: max_skew_check_slack reported" } else { puts "PASS: max_skew_check_slack (no check)" } ############################################################ # Clock skew with various options ############################################################ puts "--- report_clock_skew -setup ---" report_clock_skew -setup puts "PASS: clock_skew setup" puts "--- report_clock_skew -hold ---" report_clock_skew -hold puts "PASS: clock_skew hold" puts "--- report_clock_skew -digits 6 ---" report_clock_skew -setup -digits 6 puts "PASS: clock_skew digits" puts "--- report_clock_skew -clock clk ---" report_clock_skew -setup -clock clk puts "PASS: clock_skew named" puts "--- report_clock_skew -include_internal_latency ---" report_clock_skew -setup -include_internal_latency puts "PASS: clock_skew internal_latency" ############################################################ # Clock latency ############################################################ puts "--- report_clock_latency ---" report_clock_latency puts "PASS: clock_latency" puts "--- report_clock_latency -include_internal_latency ---" report_clock_latency -include_internal_latency puts "PASS: clock_latency internal" puts "--- report_clock_latency -clock clk ---" report_clock_latency -clock clk puts "PASS: clock_latency named" puts "--- report_clock_latency -digits 6 ---" report_clock_latency -digits 6 puts "PASS: clock_latency digits" ############################################################ # Clock min period ############################################################ puts "--- report_clock_min_period ---" report_clock_min_period puts "PASS: clock_min_period" puts "--- report_clock_min_period -include_port_paths ---" report_clock_min_period -include_port_paths puts "PASS: clock_min_period port_paths" puts "--- report_clock_min_period -clocks ---" report_clock_min_period -clocks clk puts "PASS: clock_min_period named" ############################################################ # find_clk_min_period ############################################################ puts "--- find_clk_min_period ---" set clk_obj [lindex [all_clocks] 0] set mp [sta::find_clk_min_period $clk_obj 0] puts "clk min_period: $mp" set mp2 [sta::find_clk_min_period $clk_obj 1] puts "clk min_period (with port): $mp2" puts "PASS: find_clk_min_period" ############################################################ # Pulse width checks ############################################################ puts "--- report_pulse_width_checks ---" report_pulse_width_checks puts "PASS: pulse_width_checks" puts "--- report_pulse_width_checks -verbose ---" report_pulse_width_checks -verbose puts "PASS: pulse_width_checks verbose" puts "--- min_pulse_width_checks ---" set mpwc [sta::min_pulse_width_checks "NULL"] puts "mpw checks: [llength $mpwc]" puts "PASS: min_pulse_width_checks" puts "--- min_pulse_width_violations ---" set mpwv [sta::min_pulse_width_violations "NULL"] puts "mpw violations: [llength $mpwv]" puts "PASS: min_pulse_width_violations" puts "--- min_pulse_width_check_slack ---" set mpws [sta::min_pulse_width_check_slack "NULL"] if { $mpws != "NULL" } { sta::report_mpw_check $mpws 0 sta::report_mpw_check $mpws 1 puts "PASS: mpw slack reported" } else { puts "PASS: mpw slack (no check)" } ############################################################ # Violation counts ############################################################ puts "--- max_slew_violation_count ---" set slew_vc [sta::max_slew_violation_count] puts "max slew violations: $slew_vc" puts "PASS: slew violation count" puts "--- max_fanout_violation_count ---" set fan_vc [sta::max_fanout_violation_count] puts "max fanout violations: $fan_vc" puts "PASS: fanout violation count" puts "--- max_capacitance_violation_count ---" set cap_vc [sta::max_capacitance_violation_count] puts "max cap violations: $cap_vc" puts "PASS: cap violation count" ############################################################ # Slew/fanout/cap check slack and limit ############################################################ puts "--- max_slew_check_slack ---" catch { set ss [sta::max_slew_check_slack] set sl [sta::max_slew_check_limit] puts "max slew slack: $ss limit: $sl" } puts "PASS: slew check slack/limit" puts "--- max_fanout_check_slack ---" catch { set fs [sta::max_fanout_check_slack] set fl [sta::max_fanout_check_limit] puts "max fanout slack: $fs limit: $fl" } puts "PASS: fanout check slack/limit" puts "--- max_capacitance_check_slack ---" catch { set cs [sta::max_capacitance_check_slack] set cl [sta::max_capacitance_check_limit] puts "max cap slack: $cs limit: $cl" } puts "PASS: cap check slack/limit" puts "ALL PASSED"