From 726a64a961f336506135d7e56e9e9c76086630f7 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Fri, 20 Feb 2026 15:39:36 +0900 Subject: [PATCH] test: Add explanatory comments to all catch blocks in Tcl tests Document why each catch block is needed across 48 test files, covering liberty, search, sdc, spice, network, parasitics, util, and verilog modules. Co-Authored-By: Claude Opus 4.6 --- liberty/test/liberty_busport_mem_iter.tcl | 1 + liberty/test/liberty_cell_classify_pgpin.tcl | 2 ++ liberty/test/liberty_cell_deep.tcl | 2 ++ liberty/test/liberty_clkgate_lvlshift.tcl | 5 +++++ liberty/test/liberty_equiv_cross_lib.tcl | 8 ++++++++ liberty/test/liberty_leakage_power_deep.tcl | 6 ++++++ liberty/test/liberty_pgpin_voltage.tcl | 4 ++++ liberty/test/liberty_power.tcl | 9 +++++++++ liberty/test/liberty_scan_signal_types.tcl | 9 +++++++++ liberty/test/liberty_seq_scan_bus.tcl | 6 ++++++ liberty/test/liberty_writer_roundtrip.tcl | 7 ++++++- network/test/network_modify.tcl | 1 + parasitics/test/parasitics_annotation_query.tcl | 3 +++ parasitics/test/parasitics_pi_pole_residue.tcl | 5 +++++ sdc/test/sdc_clock_operations.tcl | 1 + sdc/test/sdc_delay_borrow_group.tcl | 1 + sdc/test/sdc_design_rules_limits.tcl | 1 + sdc/test/sdc_genclk_advanced.tcl | 2 ++ sdc/test/sdc_port_delay_advanced.tcl | 1 + sdc/test/sdc_variables.tcl | 1 + search/test/search_limits_verbose.tcl | 3 +++ search/test/search_multiclock.tcl | 1 + search/test/search_multicorner_analysis.tcl | 1 + search/test/search_network_edit_deep.tcl | 1 + search/test/search_path_enum_groups.tcl | 1 + search/test/search_port_pin_properties.tcl | 7 ++++++- search/test/search_power_activity.tcl | 4 ++++ search/test/search_property_extra.tcl | 4 ++++ search/test/search_property_libport_deep.tcl | 9 +++++++++ search/test/search_pvt_analysis.tcl | 1 + search/test/search_report_path_detail.tcl | 1 + search/test/search_sim_const_prop.tcl | 1 + search/test/search_sim_logic_clk_network.tcl | 4 ++++ search/test/search_worst_slack_sta.tcl | 1 + spice/test/spice_gate_advanced.tcl | 4 ++++ spice/test/spice_gate_cells.tcl | 11 +++++++++++ spice/test/spice_gcd_gate.tcl | 4 ++++ spice/test/spice_gcd_path.tcl | 5 +++++ spice/test/spice_multipath.tcl | 9 +++++++++ spice/test/spice_path_min.tcl | 1 + spice/test/spice_subckt_file.tcl | 2 ++ spice/test/spice_write_options.tcl | 2 ++ util/test/util_log_redirect.tcl | 1 + util/test/util_parallel_misc.tcl | 4 ++++ util/test/util_pattern_string.tcl | 4 ++++ util/test/util_report_format.tcl | 2 ++ util/test/util_report_string_log.tcl | 3 +++ verilog/test/verilog_gcd_writer.tcl | 1 + 48 files changed, 165 insertions(+), 2 deletions(-) diff --git a/liberty/test/liberty_busport_mem_iter.tcl b/liberty/test/liberty_busport_mem_iter.tcl index 6538b5b4..7b17d2b0 100644 --- a/liberty/test/liberty_busport_mem_iter.tcl +++ b/liberty/test/liberty_busport_mem_iter.tcl @@ -242,6 +242,7 @@ set outfile [make_result_file liberty_busport_mem_iter_write.lib] sta::write_liberty fakeram45_64x7 $outfile # Read back +# catch: roundtrip read-back of written liberty may produce parser warnings catch { read_liberty $outfile } msg diff --git a/liberty/test/liberty_cell_classify_pgpin.tcl b/liberty/test/liberty_cell_classify_pgpin.tcl index c99f3375..57772bc6 100644 --- a/liberty/test/liberty_cell_classify_pgpin.tcl +++ b/liberty/test/liberty_cell_classify_pgpin.tcl @@ -124,10 +124,12 @@ foreach cell_name {INV_X1 INV_X4 INV_X16 BUF_X1 BUF_X8 NAND2_X1 DFF_X1} { set port [$port_iter next] set dir [sta::liberty_port_direction $port] if {$dir == "input"} { + # catch: capacitance method argument format may differ across port types catch { set cap [$port capacitance [sta::cmd_corner] [sta::find_min_max "max"]] puts "$cell_name/[$port bus_name] cap(max)=$cap" } + # catch: capacitance method argument format may differ across port types catch { set cap [$port capacitance [sta::cmd_corner] [sta::find_min_max "min"]] puts "$cell_name/[$port bus_name] cap(min)=$cap" diff --git a/liberty/test/liberty_cell_deep.tcl b/liberty/test/liberty_cell_deep.tcl index e70d4306..7be52ff1 100644 --- a/liberty/test/liberty_cell_deep.tcl +++ b/liberty/test/liberty_cell_deep.tcl @@ -70,6 +70,7 @@ foreach cell_name {INV_X1 BUF_X1 DFF_X1 ANTENNA_X1 FILLCELL_X1} { # Leakage power queries ############################################################ foreach cell_name {INV_X1 BUF_X1 DFF_X1 NAND2_X1 NOR2_X1 AOI21_X1} { + # catch: cell_leakage_power is not a supported get_property property catch { set cell [get_lib_cell NangateOpenCellLibrary/$cell_name] set lp [get_property $cell cell_leakage_power] @@ -165,6 +166,7 @@ set outfile [make_result_file liberty_cell_deep_write.lib] sta::write_liberty NangateOpenCellLibrary $outfile # Read back and verify roundtrip (may have minor syntax issues) +# catch: roundtrip read-back of written liberty may produce parser warnings catch { read_liberty $outfile } msg diff --git a/liberty/test/liberty_clkgate_lvlshift.tcl b/liberty/test/liberty_clkgate_lvlshift.tcl index 87f9751d..96fe7bf7 100644 --- a/liberty/test/liberty_clkgate_lvlshift.tcl +++ b/liberty/test/liberty_clkgate_lvlshift.tcl @@ -51,6 +51,7 @@ puts "--- clock gate cell queries ---" foreach cell_name {sky130_fd_sc_hd__dlclkp_1 sky130_fd_sc_hd__dlclkp_2 sky130_fd_sc_hd__dlclkp_4} { + # catch: clock gate cell variant may not exist in loaded library catch { set cell [get_lib_cell sky130_fd_sc_hd__tt_025C_1v80/$cell_name] if {$cell != "NULL" && $cell ne ""} { @@ -97,6 +98,7 @@ foreach cell_name {sky130_fd_sc_hd__lpflow_lsbuf_lh_hl_isowell_tap_1 sky130_fd_sc_hd__lpflow_lsbuf_lh_isowell_tap_1 sky130_fd_sc_hd__lpflow_lsbuf_lh_isowell_tap_2 sky130_fd_sc_hd__lpflow_lsbuf_lh_isowell_tap_4} { + # catch: level shifter cell variant may not exist in loaded library catch { set cell [get_lib_cell sky130_fd_sc_hd__tt_025C_1v80/$cell_name] if {$cell != "NULL" && $cell ne ""} { @@ -153,6 +155,7 @@ foreach cell_name {sky130_fd_sc_hd__inv_1 sky130_fd_sc_hd__buf_1 ############################################################ puts "--- clock gate timing arcs ---" +# catch: dlclkp_1 cell may not exist in library catch { set cell [get_lib_cell sky130_fd_sc_hd__tt_025C_1v80/sky130_fd_sc_hd__dlclkp_1] if {$cell != "NULL" && $cell ne ""} { @@ -168,6 +171,7 @@ catch { } } +# catch: sdlclkp_1 cell may not exist in library catch { set cell [get_lib_cell sky130_fd_sc_hd__tt_025C_1v80/sky130_fd_sc_hd__sdlclkp_1] if {$cell != "NULL" && $cell ne ""} { @@ -185,6 +189,7 @@ catch { ############################################################ puts "--- level shifter timing arcs ---" +# catch: lsbuf level shifter cell may not exist in library catch { set cell [get_lib_cell sky130_fd_sc_hd__tt_025C_1v80/sky130_fd_sc_hd__lpflow_lsbuf_lh_hl_isowell_tap_1] if {$cell != "NULL" && $cell ne ""} { diff --git a/liberty/test/liberty_equiv_cross_lib.tcl b/liberty/test/liberty_equiv_cross_lib.tcl index 25588594..64f9fcc4 100644 --- a/liberty/test/liberty_equiv_cross_lib.tcl +++ b/liberty/test/liberty_equiv_cross_lib.tcl @@ -20,6 +20,7 @@ sta::make_equiv_cells $rvt_lib # Find equiv cells in ASAP7 RVT foreach cell_prefix {INVx BUFx} { foreach size {1 2 3 4 5 8 11 13 16} { + # catch: cell with specific size variant may not exist in library catch { set cell_name "${cell_prefix}${size}_ASAP7_75t_R" set cell [get_lib_cell asap7sc7p5t_INVBUF_RVT_FF_nldm_211120/$cell_name] @@ -46,6 +47,7 @@ sta::make_equiv_cells $lvt_lib foreach cell_prefix {INVx BUFx} { foreach size {1 2 4 8} { + # catch: cell with specific size variant may not exist in library catch { set cell_name "${cell_prefix}${size}_ASAP7_75t_L" set cell [get_lib_cell asap7sc7p5t_INVBUF_LVT_FF_nldm_211120/$cell_name] @@ -96,6 +98,7 @@ set seq_rvt_lib [lindex [get_libs asap7sc7p5t_SEQ_RVT_FF_nldm_220123] 0] sta::make_equiv_cells $seq_rvt_lib # Find equiv cells for DFF cells +# catch: ASAP7 DFFHQNx1 cell may not exist catch { set dff [get_lib_cell asap7sc7p5t_SEQ_RVT_FF_nldm_220123/DFFHQNx1_ASAP7_75t_R] set equivs [sta::find_equiv_cells $dff] @@ -110,6 +113,7 @@ catch { } # ICG equiv cells +# catch: ASAP7 ICGx1 cell may not exist catch { set icg [get_lib_cell asap7sc7p5t_SEQ_RVT_FF_nldm_220123/ICGx1_ASAP7_75t_R] set equivs [sta::find_equiv_cells $icg] @@ -121,6 +125,7 @@ catch { } # Latch equiv cells +# catch: ASAP7 DLLx1 cell may not exist catch { set dll [get_lib_cell asap7sc7p5t_SEQ_RVT_FF_nldm_220123/DLLx1_ASAP7_75t_R] set equivs [sta::find_equiv_cells $dll] @@ -132,6 +137,7 @@ catch { } # SDFF equiv cells +# catch: ASAP7 SDFHQNx1 cell may not exist catch { set sdff [get_lib_cell asap7sc7p5t_SEQ_RVT_FF_nldm_220123/SDFHQNx1_ASAP7_75t_R] set equivs [sta::find_equiv_cells $sdff] @@ -161,6 +167,7 @@ set sky_lib [lindex [get_libs sky130_fd_sc_hd__tt_025C_1v80] 0] sta::make_equiv_cells $sky_lib # Find equiv cells for Sky130 inverters +# catch: find_equiv_cells may fail if equivalence mapping is not configured catch { set sky_inv [get_lib_cell sky130_fd_sc_hd__tt_025C_1v80/sky130_fd_sc_hd__inv_1] set equivs [sta::find_equiv_cells $sky_inv] @@ -175,6 +182,7 @@ catch { } # Find equiv for Sky130 DFF +# catch: find_equiv_cells may fail if equivalence mapping is not configured catch { set sky_dff [get_lib_cell sky130_fd_sc_hd__tt_025C_1v80/sky130_fd_sc_hd__dfxtp_1] set equivs [sta::find_equiv_cells $sky_dff] diff --git a/liberty/test/liberty_leakage_power_deep.tcl b/liberty/test/liberty_leakage_power_deep.tcl index e5005938..e7e4d60f 100644 --- a/liberty/test/liberty_leakage_power_deep.tcl +++ b/liberty/test/liberty_leakage_power_deep.tcl @@ -23,6 +23,7 @@ foreach cell_name {sky130_fd_sc_hd__inv_1 sky130_fd_sc_hd__inv_2 sky130_fd_sc_hd__a21o_1 sky130_fd_sc_hd__a21oi_1 sky130_fd_sc_hd__o21a_1 sky130_fd_sc_hd__o21ai_0 sky130_fd_sc_hd__mux2_1 sky130_fd_sc_hd__mux2i_1} { + # catch: cell may not exist or cell_leakage_power property is not supported catch { set cell [get_lib_cell sky130_fd_sc_hd__tt_025C_1v80/$cell_name] if {$cell != "NULL" && $cell ne ""} { @@ -38,6 +39,7 @@ foreach cell_name {sky130_fd_sc_hd__dfxtp_1 sky130_fd_sc_hd__dfxtp_2 sky130_fd_sc_hd__dlxtp_1 sky130_fd_sc_hd__dlxtn_1 sky130_fd_sc_hd__sdfxtp_1 sky130_fd_sc_hd__sdfrtp_1 sky130_fd_sc_hd__sdfstp_1 sky130_fd_sc_hd__dfbbp_1} { + # catch: cell may not exist or cell_leakage_power property is not supported catch { set cell [get_lib_cell sky130_fd_sc_hd__tt_025C_1v80/$cell_name] if {$cell != "NULL" && $cell ne ""} { @@ -51,6 +53,7 @@ foreach cell_name {sky130_fd_sc_hd__dfxtp_1 sky130_fd_sc_hd__dfxtp_2 # Tristate cells foreach cell_name {sky130_fd_sc_hd__ebufn_1 sky130_fd_sc_hd__ebufn_2 sky130_fd_sc_hd__ebufn_4 sky130_fd_sc_hd__ebufn_8} { + # catch: cell may not exist or cell_leakage_power property is not supported catch { set cell [get_lib_cell sky130_fd_sc_hd__tt_025C_1v80/$cell_name] if {$cell != "NULL" && $cell ne ""} { @@ -63,6 +66,7 @@ foreach cell_name {sky130_fd_sc_hd__ebufn_1 sky130_fd_sc_hd__ebufn_2 # Clock gate cells foreach cell_name {sky130_fd_sc_hd__dlclkp_1 sky130_fd_sc_hd__dlclkp_2 sky130_fd_sc_hd__sdlclkp_1} { + # catch: cell may not exist or cell_leakage_power property is not supported catch { set cell [get_lib_cell sky130_fd_sc_hd__tt_025C_1v80/$cell_name] if {$cell != "NULL" && $cell ne ""} { @@ -95,6 +99,7 @@ foreach cell_name {INV_X1 INV_X2 INV_X4 BUF_X1 BUF_X2 BUF_X4 DFF_X1 DFF_X2 DFFR_X1 DFFS_X1 DFFRS_X1 SDFF_X1 SDFFR_X1 SDFFRS_X1 TINV_X1 TLAT_X1 CLKGATETST_X1} { + # catch: cell_leakage_power property is not supported via get_property catch { set cell [get_lib_cell NangateOpenCellLibrary/$cell_name] if {$cell != "NULL" && $cell ne ""} { @@ -133,6 +138,7 @@ read_liberty ../../test/ihp-sg13g2/sg13g2_stdcell_typ_1p20V_25C.lib foreach cell_name {sg13g2_inv_1 sg13g2_buf_1 sg13g2_nand2_1 sg13g2_nor2_1 sg13g2_and2_1 sg13g2_or2_1} { + # catch: IHP cell may not exist or may not have leakage data catch { set cell [get_lib_cell sg13g2_stdcell_typ_1p20V_25C/$cell_name] if {$cell != "NULL" && $cell ne ""} { diff --git a/liberty/test/liberty_pgpin_voltage.tcl b/liberty/test/liberty_pgpin_voltage.tcl index 1c0e6761..096dfc6a 100644 --- a/liberty/test/liberty_pgpin_voltage.tcl +++ b/liberty/test/liberty_pgpin_voltage.tcl @@ -89,6 +89,7 @@ foreach cell_name {sky130_fd_sc_hd__inv_1 sky130_fd_sc_hd__inv_2 sky130_fd_sc_hd__mux2_1 sky130_fd_sc_hd__mux2i_1 sky130_fd_sc_hd__mux4_1 sky130_fd_sc_hd__ha_1 sky130_fd_sc_hd__fa_1} { + # catch: cell may not exist or cell_leakage_power is not supported catch { set cell [get_lib_cell sky130_fd_sc_hd__tt_025C_1v80/$cell_name] if {$cell != "NULL" && $cell ne ""} { @@ -109,6 +110,7 @@ foreach cell_name {sky130_fd_sc_hd__dfxtp_1 sky130_fd_sc_hd__dfxtp_2 sky130_fd_sc_hd__sdfxtp_1 sky130_fd_sc_hd__sdfxtp_2 sky130_fd_sc_hd__sdfrtp_1 sky130_fd_sc_hd__sdfstp_1 sky130_fd_sc_hd__sdlclkp_1 sky130_fd_sc_hd__dlclkp_1} { + # catch: cell may not exist or cell_leakage_power is not supported catch { set cell [get_lib_cell sky130_fd_sc_hd__tt_025C_1v80/$cell_name] if {$cell != "NULL" && $cell ne ""} { @@ -138,6 +140,7 @@ read_liberty ../../test/ihp-sg13g2/sg13g2_stdcell_typ_1p20V_25C.lib foreach cell_name {sg13g2_inv_1 sg13g2_buf_1 sg13g2_nand2_1 sg13g2_nor2_1 sg13g2_and2_1 sg13g2_or2_1 sg13g2_dfrbp_1 sg13g2_dlhq_1} { + # catch: IHP cell may not exist in loaded library catch { set cell [get_lib_cell sg13g2_stdcell_typ_1p20V_25C/$cell_name] if {$cell != "NULL" && $cell ne ""} { @@ -188,6 +191,7 @@ set outfile [make_result_file liberty_pgpin_voltage_write.lib] sta::write_liberty sky130_fd_sc_hd__tt_025C_1v80 $outfile # Read back the written library to verify +# catch: roundtrip read-back of written liberty may produce parser warnings catch { read_liberty $outfile } msg diff --git a/liberty/test/liberty_power.tcl b/liberty/test/liberty_power.tcl index 31b924b8..1773efa2 100644 --- a/liberty/test/liberty_power.tcl +++ b/liberty/test/liberty_power.tcl @@ -51,15 +51,19 @@ report_power -instances [get_cells {buf1 inv1 and1 or1 nand1 nor1 reg1 reg2 reg3 ############################################################ set inv_cell [get_lib_cell NangateOpenCellLibrary/INV_X1] +# catch: cell_leakage_power is not a supported get_property property catch { puts "INV_X1 leakage_power: [get_property $inv_cell cell_leakage_power]" } set buf_cell [get_lib_cell NangateOpenCellLibrary/BUF_X1] +# catch: cell_leakage_power is not a supported get_property property catch { puts "BUF_X1 leakage_power: [get_property $buf_cell cell_leakage_power]" } set dff_cell [get_lib_cell NangateOpenCellLibrary/DFF_X1] +# catch: cell_leakage_power is not a supported get_property property catch { puts "DFF_X1 leakage_power: [get_property $dff_cell cell_leakage_power]" } set nand_cell [get_lib_cell NangateOpenCellLibrary/NAND2_X1] +# catch: cell_leakage_power is not a supported get_property property catch { puts "NAND2_X1 leakage_power: [get_property $nand_cell cell_leakage_power]" } # Area property @@ -76,6 +80,7 @@ puts "INV_X1 is_buffer: [get_property $inv_cell is_buffer]" puts "BUF_X1 is_buffer: [get_property $buf_cell is_buffer]" puts "BUF_X1 is_inverter: [get_property $buf_cell is_inverter]" puts "DFF_X1 is_buffer: [get_property $dff_cell is_buffer]" +# catch: is_register is not a supported get_property property for LibertyCell catch { puts "DFF_X1 is_register: [get_property $dff_cell is_register]" } ############################################################ @@ -93,6 +98,7 @@ read_liberty ../../test/sky130hd/sky130hd_tt.lib # Query sky130 cell leakage powers set sky_inv [get_lib_cell sky130_fd_sc_hd__tt_025C_1v80/sky130_fd_sc_hd__inv_1] +# catch: cell_leakage_power is not a supported get_property property catch { puts "sky130 inv leakage: [get_property $sky_inv cell_leakage_power]" } puts "sky130 inv area: [get_property $sky_inv area]" @@ -107,6 +113,7 @@ sta::write_liberty sky130_fd_sc_hd__tt_025C_1v80 $outfile2 read_liberty ../../test/ihp-sg13g2/sg13g2_stdcell_typ_1p20V_25C.lib set ihp_inv [get_lib_cell sg13g2_stdcell_typ_1p20V_25C/sg13g2_inv_1] +# catch: cell_leakage_power is not a supported get_property property catch { puts "IHP inv leakage: [get_property $ihp_inv cell_leakage_power]" } puts "IHP inv area: [get_property $ihp_inv area]" @@ -117,6 +124,7 @@ puts "IHP inv area: [get_property $ihp_inv area]" read_liberty ../../test/asap7_ccsn.lib.gz set outfile3 [make_result_file liberty_power_write_ccsn.lib] +# catch: CCSN library name may not match after loading catch { sta::write_liberty asap7_ccsn $outfile3 } @@ -128,5 +136,6 @@ catch { read_liberty ../../test/asap7/asap7sc7p5t_SEQ_RVT_FF_nldm_220123.lib set asap7_dff [get_lib_cell asap7sc7p5t_SEQ_RVT_FF_nldm_220123/DFFHQNx1_ASAP7_75t_R] +# catch: cell_leakage_power is not a supported get_property property catch { puts "ASAP7 DFF leakage: [get_property $asap7_dff cell_leakage_power]" } puts "ASAP7 DFF area: [get_property $asap7_dff area]" diff --git a/liberty/test/liberty_scan_signal_types.tcl b/liberty/test/liberty_scan_signal_types.tcl index d8658e73..2f7e5507 100644 --- a/liberty/test/liberty_scan_signal_types.tcl +++ b/liberty/test/liberty_scan_signal_types.tcl @@ -15,6 +15,7 @@ puts "--- scan DFF cell queries ---" # sdfxtp cells are scan DFFs foreach cell_name {sky130_fd_sc_hd__sdfxtp_1 sky130_fd_sc_hd__sdfxtp_2 sky130_fd_sc_hd__sdfxtp_4} { + # catch: scan cell variant may not exist in this library version catch { set cell [get_lib_cell sky130_fd_sc_hd__tt_025C_1v80/$cell_name] if {$cell != "NULL" && $cell ne ""} { @@ -49,6 +50,7 @@ foreach cell_name {sky130_fd_sc_hd__sdfxtp_1 sky130_fd_sc_hd__sdfxtp_2 # sdfxbp cells are scan DFFs with complementary outputs foreach cell_name {sky130_fd_sc_hd__sdfxbp_1 sky130_fd_sc_hd__sdfxbp_2} { + # catch: scan cell variant may not exist in this library version catch { set cell [get_lib_cell sky130_fd_sc_hd__tt_025C_1v80/$cell_name] if {$cell != "NULL" && $cell ne ""} { @@ -80,6 +82,7 @@ foreach cell_name {sky130_fd_sc_hd__sdfxbp_1 sky130_fd_sc_hd__sdfxbp_2} { # sdfrtp cells are scan DFFs with async reset foreach cell_name {sky130_fd_sc_hd__sdfrtp_1 sky130_fd_sc_hd__sdfrtp_2 sky130_fd_sc_hd__sdfrtp_4} { + # catch: scan cell variant may not exist in this library version catch { set cell [get_lib_cell sky130_fd_sc_hd__tt_025C_1v80/$cell_name] if {$cell != "NULL" && $cell ne ""} { @@ -111,6 +114,7 @@ foreach cell_name {sky130_fd_sc_hd__sdfrtp_1 sky130_fd_sc_hd__sdfrtp_2 # sdfstp cells are scan DFFs with async set foreach cell_name {sky130_fd_sc_hd__sdfstp_1 sky130_fd_sc_hd__sdfstp_2 sky130_fd_sc_hd__sdfstp_4} { + # catch: scan cell variant may not exist in this library version catch { set cell [get_lib_cell sky130_fd_sc_hd__tt_025C_1v80/$cell_name] if {$cell != "NULL" && $cell ne ""} { @@ -139,6 +143,7 @@ puts "--- scan DFF timing arcs ---" foreach cell_name {sky130_fd_sc_hd__sdfxtp_1 sky130_fd_sc_hd__sdfrtp_1 sky130_fd_sc_hd__sdfstp_1} { + # catch: cell may not exist; timing arc iteration may fail catch { set cell [get_lib_cell sky130_fd_sc_hd__tt_025C_1v80/$cell_name] if {$cell != "NULL" && $cell ne ""} { @@ -160,6 +165,7 @@ read_liberty ../../test/nangate45/Nangate45_typ.lib # Nangate SDFF cells foreach cell_name {SDFF_X1 SDFF_X2 SDFFR_X1 SDFFS_X1 SDFFRS_X1} { + # catch: SDFF cell variant may not exist in NangateOpenCellLibrary catch { set cell [get_lib_cell NangateOpenCellLibrary/$cell_name] if {$cell != "NULL" && $cell ne ""} { @@ -181,6 +187,7 @@ foreach cell_name {SDFF_X1 SDFF_X2 SDFFR_X1 SDFFS_X1 SDFFRS_X1} { } # Nangate CLKGATETST cell (clock gate test) +# catch: CLKGATETST_X1 may not have test_cell attribute catch { set cell [get_lib_cell NangateOpenCellLibrary/CLKGATETST_X1] if {$cell != "NULL" && $cell ne ""} { @@ -201,6 +208,7 @@ catch { read_liberty ../../test/asap7/asap7sc7p5t_SEQ_RVT_FF_nldm_220123.lib # ASAP7 ICG cell has statetable (exercises clock gate paths) +# catch: ASAP7 ICG cell may not exist in loaded library catch { set cell [get_lib_cell asap7sc7p5t_SEQ_RVT_FF_nldm_220123/ICGx1_ASAP7_75t_R] if {$cell != "NULL" && $cell ne ""} { @@ -215,6 +223,7 @@ catch { # ASAP7 DFFs with scan foreach cell_name {DFFHQNx1_ASAP7_75t_R DFFHQx1_ASAP7_75t_R DFFHQNx2_ASAP7_75t_R DFFHQx2_ASAP7_75t_R} { + # catch: ASAP7 DFF cell name variant may not match catch { set cell [get_lib_cell asap7sc7p5t_SEQ_RVT_FF_nldm_220123/$cell_name] if {$cell != "NULL" && $cell ne ""} { diff --git a/liberty/test/liberty_seq_scan_bus.tcl b/liberty/test/liberty_seq_scan_bus.tcl index 69ed4fb2..129d40be 100644 --- a/liberty/test/liberty_seq_scan_bus.tcl +++ b/liberty/test/liberty_seq_scan_bus.tcl @@ -41,6 +41,7 @@ puts "sdfxbp_1 area = $area2" ############################################################ foreach cell_name {sky130_fd_sc_hd__ebufn_1 sky130_fd_sc_hd__ebufn_2 sky130_fd_sc_hd__ebufn_4 sky130_fd_sc_hd__ebufn_8} { + # catch: sky130 tristate cell may not exist or tristate_enable may be unsupported catch { set cell [get_lib_cell sky130_fd_sc_hd__tt_025C_1v80/$cell_name] set area [get_property $cell area] @@ -86,6 +87,7 @@ foreach cell_name {sky130_fd_sc_hd__dfrtp_1 sky130_fd_sc_hd__dfstp_1 foreach cell_name {sky130_fd_sc_hd__inv_1 sky130_fd_sc_hd__buf_1 sky130_fd_sc_hd__nand2_1 sky130_fd_sc_hd__nor2_1 sky130_fd_sc_hd__dfxtp_1} { + # catch: cell_leakage_power is not a supported get_property property catch { set cell [get_lib_cell sky130_fd_sc_hd__tt_025C_1v80/$cell_name] if {$cell != "NULL" && $cell ne ""} { @@ -143,6 +145,7 @@ foreach cell_name {INV_X1 INV_X2 INV_X4 BUF_X1 BUF_X2 BUF_X4 # Timing arc set queries (exercises makeTimingArcMap paths) ############################################################ foreach cell_name {DFF_X1 DFFR_X1 DFFS_X1 DFFRS_X1} { + # catch: cell may not exist in this library version catch { set cell [get_lib_cell NangateOpenCellLibrary/$cell_name] if {$cell != "NULL" && $cell ne ""} { @@ -165,6 +168,7 @@ foreach cell_name {DFF_X1 DFFR_X1 DFFS_X1 DFFRS_X1} { read_liberty ../../test/nangate45/fakeram45_64x7.lib # Query bus ports +# catch: bus port iteration format may differ across library versions catch { set cell [get_lib_cell fakeram45_64x7/fakeram45_64x7] if {$cell != "NULL" && $cell ne ""} { @@ -198,6 +202,7 @@ catch { read_liberty ../../test/asap7/asap7sc7p5t_SEQ_RVT_FF_nldm_220123.lib # Query ASAP7 latch cells +# catch: ASAP7 DLLx1 latch cell may not exist catch { set cell [get_lib_cell asap7sc7p5t_SEQ_RVT_FF_nldm_220123/DLLx1_ASAP7_75t_R] if {$cell != "NULL" && $cell ne ""} { @@ -211,6 +216,7 @@ catch { } # Query ICG (Integrated Clock Gate) cell with statetable +# catch: ASAP7 ICGx1 clock gate cell may not exist catch { set cell [get_lib_cell asap7sc7p5t_SEQ_RVT_FF_nldm_220123/ICGx1_ASAP7_75t_R] if {$cell != "NULL" && $cell ne ""} { diff --git a/liberty/test/liberty_writer_roundtrip.tcl b/liberty/test/liberty_writer_roundtrip.tcl index 044df57b..b0e0126d 100644 --- a/liberty/test/liberty_writer_roundtrip.tcl +++ b/liberty/test/liberty_writer_roundtrip.tcl @@ -16,6 +16,7 @@ set outfile1 [make_result_file liberty_writer_rt1.lib] sta::write_liberty $lib $outfile1 # Read back the written liberty (may have warnings/errors - that's ok) +# catch: roundtrip read-back of written liberty may produce parser warnings catch { read_liberty $outfile1 } msg @@ -29,13 +30,14 @@ if {$msg ne ""} { ############################################################ read_liberty ../../test/sky130hd/sky130hd_tt.lib +# catch: library name may not match exactly after loading catch { set sky_lib [sta::find_liberty "sky130_fd_sc_hd__tt_025C_1v80"] if {$sky_lib ne ""} { set outfile3 [make_result_file liberty_writer_rt_sky.lib] sta::write_liberty $sky_lib $outfile3 - # Read back Sky130 written liberty + # catch: roundtrip read-back of written liberty may produce parser warnings catch { read_liberty $outfile3 } @@ -47,6 +49,7 @@ catch { ############################################################ read_liberty ../../test/ihp-sg13g2/sg13g2_stdcell_typ_1p20V_25C.lib +# catch: IHP library name may not match exactly catch { set ihp_lib [sta::find_liberty "sg13g2_stdcell"] if {$ihp_lib ne ""} { @@ -65,6 +68,7 @@ catch { foreach cell_name {INV_X1 BUF_X1 NAND2_X1 NOR2_X1 AND2_X1 OR2_X1 XOR2_X1 XNOR2_X1 AOI21_X1 OAI21_X1 MUX2_X1 FA_X1 HA_X1} { + # catch: some cells (e.g. FA_X1, HA_X1) may not exist in all library versions catch { set cell [get_lib_cell NangateOpenCellLibrary/$cell_name] set arc_sets [$cell timing_arc_sets] @@ -132,6 +136,7 @@ foreach cell_name {TLAT_X1} { ############################################################ read_liberty ../../test/asap7/asap7sc7p5t_SEQ_RVT_FF_nldm_220123.lib +# catch: ASAP7 library name may not match exactly catch { set asap7_lib [sta::find_liberty "asap7sc7p5t_SEQ_RVT_FF_nldm_220123"] if {$asap7_lib ne ""} { diff --git a/network/test/network_modify.tcl b/network/test/network_modify.tcl index 18c73a1a..c6b2da44 100644 --- a/network/test/network_modify.tcl +++ b/network/test/network_modify.tcl @@ -79,6 +79,7 @@ puts "--- delete_instance new_buf ---" delete_instance new_buf puts "--- verify new_buf removed ---" +# catch: intentionally verifying get_cells fails after instance deletion set rc5 [catch {get_cells new_buf} msg] puts "get_cells new_buf after delete: $msg" diff --git a/parasitics/test/parasitics_annotation_query.tcl b/parasitics/test/parasitics_annotation_query.tcl index 1feb496a..41bf9e1a 100644 --- a/parasitics/test/parasitics_annotation_query.tcl +++ b/parasitics/test/parasitics_annotation_query.tcl @@ -102,12 +102,14 @@ puts "elmore r1/Q -> u1/A fall max: $elm_r1f" set elm_r2 [sta::find_elmore [get_pins r2/Q] [get_pins u2/B] "rise" "max"] puts "elmore r2/Q -> u2/B rise max: $elm_r2" +# catch: sta::find_elmore with port name 'out' via get_pins may fail (use get_port_pin for ports) catch { set elm_r3 [sta::find_elmore [get_pins r3/Q] [get_pins out] "rise" "max"] puts "elmore r3/Q -> out rise max: $elm_r3" } msg # Query min as well +# catch: sta::find_elmore with port name 'out' via get_pins may fail (use get_port_pin for ports) catch { set elm_r3_min [sta::find_elmore [get_pins r3/Q] [get_pins out] "rise" "min"] puts "elmore r3/Q -> out rise min: $elm_r3_min" @@ -201,6 +203,7 @@ puts "elmore u1/Y->u2/A after SPEF: $elm_u1_spef" set elm_r1_spef [sta::find_elmore [get_pins r1/Q] [get_pins u1/A] "rise" "max"] puts "elmore r1/Q->u1/A after SPEF: $elm_r1_spef" +# catch: sta::find_elmore with port name 'out' via get_pins may fail (use get_port_pin for ports) catch { set elm_r3_spef [sta::find_elmore [get_pins r3/Q] [get_pins out] "rise" "max"] puts "elmore r3/Q->out after SPEF: $elm_r3_spef" diff --git a/parasitics/test/parasitics_pi_pole_residue.tcl b/parasitics/test/parasitics_pi_pole_residue.tcl index 367500ad..3a02d446 100644 --- a/parasitics/test/parasitics_pi_pole_residue.tcl +++ b/parasitics/test/parasitics_pi_pole_residue.tcl @@ -43,30 +43,35 @@ report_checks -fields {slew cap input_pins nets fanout} #--------------------------------------------------------------- puts "--- Test 2: query pi_pole_residue ---" +# catch: sta::find_pi_pole_residue is not exposed as Tcl command catch { set ppr [sta::find_pi_pole_residue [get_pins u1/Y] "rise" "max"] puts "u1/Y rise max pi_pole_residue: $ppr" } msg puts "find_pi_pole_residue u1/Y rise max: done ($msg)" +# catch: sta::find_pi_pole_residue is not exposed as Tcl command catch { set ppr [sta::find_pi_pole_residue [get_pins u1/Y] "fall" "max"] puts "u1/Y fall max pi_pole_residue: $ppr" } msg puts "find_pi_pole_residue u1/Y fall max: done ($msg)" +# catch: sta::find_pi_pole_residue is not exposed as Tcl command catch { set ppr [sta::find_pi_pole_residue [get_pins u2/Y] "rise" "max"] puts "u2/Y rise max pi_pole_residue: $ppr" } msg puts "find_pi_pole_residue u2/Y rise max: done ($msg)" +# catch: sta::find_pi_pole_residue is not exposed as Tcl command catch { set ppr [sta::find_pi_pole_residue [get_pins r1/Q] "rise" "max"] puts "r1/Q rise max pi_pole_residue: $ppr" } msg puts "find_pi_pole_residue r1/Q rise max: done ($msg)" +# catch: sta::find_pi_pole_residue is not exposed as Tcl command catch { set ppr [sta::find_pi_pole_residue [get_pins r2/Q] "fall" "min"] puts "r2/Q fall min pi_pole_residue: $ppr" diff --git a/sdc/test/sdc_clock_operations.tcl b/sdc/test/sdc_clock_operations.tcl index 25abb53f..d17ca6cd 100644 --- a/sdc/test/sdc_clock_operations.tcl +++ b/sdc/test/sdc_clock_operations.tcl @@ -55,6 +55,7 @@ create_generated_clock -name gclk_edge -source [get_ports clk1] -edges {1 3 5} [ report_checks puts "--- generated clock invert ---" +# catch: -invert with -divide_by 1 and -add may conflict with existing clock on this pin catch { create_generated_clock -name gclk_inv -source [get_ports clk1] -divide_by 1 -invert [get_pins reg1/Q] -add report_checks diff --git a/sdc/test/sdc_delay_borrow_group.tcl b/sdc/test/sdc_delay_borrow_group.tcl index 5baefae1..e7f91b59 100644 --- a/sdc/test/sdc_delay_borrow_group.tcl +++ b/sdc/test/sdc_delay_borrow_group.tcl @@ -159,6 +159,7 @@ set_min_delay -from [get_ports in3] -to [get_ports out2] 0.5 ############################################################ # Min fanout limit (covers setMinFanout through set_min_fanout if available) ############################################################ +# catch: set_min_fanout is not a valid SDC command in OpenSTA catch { set_min_fanout 2 [current_design] } diff --git a/sdc/test/sdc_design_rules_limits.tcl b/sdc/test/sdc_design_rules_limits.tcl index b04750b2..b34e600c 100644 --- a/sdc/test/sdc_design_rules_limits.tcl +++ b/sdc/test/sdc_design_rules_limits.tcl @@ -68,6 +68,7 @@ set_max_fanout 20 [current_design] set_max_fanout 10 [get_ports in1] set_max_fanout 15 [get_ports in2] +# catch: set_max_fanout on a liberty cell object is not supported catch { # Cell-level fanout limit set_max_fanout 8 [get_lib_cells NangateOpenCellLibrary/INV_X1] diff --git a/sdc/test/sdc_genclk_advanced.tcl b/sdc/test/sdc_genclk_advanced.tcl index 72842fba..8c5dca39 100644 --- a/sdc/test/sdc_genclk_advanced.tcl +++ b/sdc/test/sdc_genclk_advanced.tcl @@ -47,6 +47,7 @@ create_generated_clock -name gclk_mul2 -source [get_ports clk1] -multiply_by 2 [ ############################################################ # Edge-based generated clock +# catch: -edges with -add may conflict with existing generated clock on this pin catch { create_generated_clock -name gclk_edge -source [get_ports clk1] -edges {1 3 5} [get_pins reg1/Q] -add } @@ -55,6 +56,7 @@ catch { # Generated clock - edge shift ############################################################ +# catch: -edge_shift with -edges and -add is an unsupported option combination catch { create_generated_clock -name gclk_shift -source [get_ports clk2] -edges {1 3 5} -edge_shift {0.0 0.5 1.0} [get_pins reg3/Q] -add } diff --git a/sdc/test/sdc_port_delay_advanced.tcl b/sdc/test/sdc_port_delay_advanced.tcl index 21997ada..73718e0b 100644 --- a/sdc/test/sdc_port_delay_advanced.tcl +++ b/sdc/test/sdc_port_delay_advanced.tcl @@ -134,6 +134,7 @@ set_data_check -from [get_pins reg1/Q] -to [get_pins reg2/D] -setup 0.5 set_data_check -from [get_pins reg1/Q] -to [get_pins reg2/D] -hold 0.3 +# catch: -clock_fall is not a valid option for set_data_check catch { set_data_check -from [get_pins reg1/Q] -to [get_pins reg2/D] -setup 0.6 -clock_fall } diff --git a/sdc/test/sdc_variables.tcl b/sdc/test/sdc_variables.tcl index 663cd074..1f3d0c1f 100644 --- a/sdc/test/sdc_variables.tcl +++ b/sdc/test/sdc_variables.tcl @@ -144,6 +144,7 @@ set val $::sta_propagate_gated_clock_enable # POCV enabled (may require SSTA compilation, use catch) ############################################################ +# catch: POCV variables may not exist if SSTA is not compiled in catch { set ::sta_pocv_enabled 1 set ::sta_pocv_enabled 0 diff --git a/search/test/search_limits_verbose.tcl b/search/test/search_limits_verbose.tcl index a3e83d25..7564fb67 100644 --- a/search/test/search_limits_verbose.tcl +++ b/search/test/search_limits_verbose.tcl @@ -211,14 +211,17 @@ check_setup -verbose -loops # max_slew_check_slack_limit / max_cap_check_slack_limit / etc. ############################################################ puts "--- slack/limit ratios ---" +# catch: max_slew_check_slack_limit is not exposed as Tcl command catch { set sr [max_slew_check_slack_limit] puts "slew slack/limit: $sr" } +# catch: max_capacitance_check_slack_limit is not exposed as Tcl command catch { set cr [max_capacitance_check_slack_limit] puts "cap slack/limit: $cr" } +# catch: max_fanout_check_slack_limit is not exposed as Tcl command catch { set fr [max_fanout_check_slack_limit] puts "fanout slack/limit: $fr" diff --git a/search/test/search_multiclock.tcl b/search/test/search_multiclock.tcl index 25da8f3b..b0ff22dc 100644 --- a/search/test/search_multiclock.tcl +++ b/search/test/search_multiclock.tcl @@ -41,6 +41,7 @@ puts "--- group_path with -weight ---" group_path -name weighted_group -from [get_ports in1] -weight 2.0 puts "--- group_path with -default ---" +# catch: group_path -name and -default are mutually exclusive; -default also requires path args catch { group_path -name default_group -default } puts "--- report_checks with -group filter ---" diff --git a/search/test/search_multicorner_analysis.tcl b/search/test/search_multicorner_analysis.tcl index 0734d6d9..8062753e 100644 --- a/search/test/search_multicorner_analysis.tcl +++ b/search/test/search_multicorner_analysis.tcl @@ -124,6 +124,7 @@ puts "--- set_max_area ---" set_max_area 1000 puts "--- isClock / isPropagatedClock queries ---" +# catch: sta::is_clock_pin is not exposed as Tcl command catch { set clk_pin [get_pins ckbuf/Z] puts "isClock ckbuf/Z: [sta::is_clock_pin $clk_pin]" diff --git a/search/test/search_network_edit_deep.tcl b/search/test/search_network_edit_deep.tcl index 04edc534..c01d5a8e 100644 --- a/search/test/search_network_edit_deep.tcl +++ b/search/test/search_network_edit_deep.tcl @@ -50,6 +50,7 @@ puts "--- slow_drivers 5 ---" set slow5 [sta::slow_drivers 5] puts "slow_drivers(5): [llength $slow5]" foreach s $slow5 { + # catch: slow_drivers may return objects that don't support get_full_name catch { puts " [get_full_name $s]" } } diff --git a/search/test/search_path_enum_groups.tcl b/search/test/search_path_enum_groups.tcl index 8c88d865..bde0a8ab 100644 --- a/search/test/search_path_enum_groups.tcl +++ b/search/test/search_path_enum_groups.tcl @@ -79,6 +79,7 @@ puts "input_paths is group: [sta::is_path_group_name input_paths]" puts "nonexistent is group: [sta::is_path_group_name nonexistent_group]" puts "--- group_path -default ---" +# catch: group_path -name and -default are mutually exclusive; -default also requires path args catch { group_path -name default_group -default report_checks -path_delay max diff --git a/search/test/search_port_pin_properties.tcl b/search/test/search_port_pin_properties.tcl index 4fb34d84..a173046a 100644 --- a/search/test/search_port_pin_properties.tcl +++ b/search/test/search_port_pin_properties.tcl @@ -102,7 +102,7 @@ puts "--- Net properties ---" set net1 [get_nets n1] puts "n1 name: [get_property $net1 name]" puts "n1 full_name: [get_property $net1 full_name]" -# Test unknown property error for net +# catch: intentionally testing error for nonexistent net property catch { get_property $net1 nonexistent_net_property } net_err @@ -137,6 +137,7 @@ puts "DFF_X1 is_buffer: [get_property $dff_cell is_buffer]" set dff_lib [get_property $dff_cell library] puts "DFF_X1 library: [get_name $dff_lib]" puts "DFF_X1 area: [get_property $dff_cell area]" +# catch: 'cell_leakage_power' is not a supported get_property property catch { puts "DFF_X1 leakage: [get_property $dff_cell cell_leakage_power]" } puts "--- LibertyPort properties ---" @@ -146,9 +147,11 @@ puts "DFF_X1/D full_name: [get_property $lp_d full_name]" puts "DFF_X1/D direction: [get_property $lp_d direction]" puts "DFF_X1/D capacitance: [get_property $lp_d capacitance]" puts "DFF_X1/D is_clock: [get_property $lp_d is_clock]" +# catch: 'is_register_clock' property may not be valid for data pins catch { puts "DFF_X1/D is_register_clock: [get_property $lp_d is_register_clock]" } set lp_ck [get_lib_pins NangateOpenCellLibrary/DFF_X1/CK] puts "DFF_X1/CK is_clock: [get_property $lp_ck is_clock]" +# catch: 'is_register_clock' property may not be valid for clock pins catch { puts "DFF_X1/CK is_register_clock: [get_property $lp_ck is_register_clock]" } puts "--- Library properties ---" @@ -213,10 +216,12 @@ foreach pe $path_ends2 { } puts "--- Unknown property error handling ---" +# catch: intentionally testing error for nonexistent port property catch { get_property $in_port nonexistent_property } result puts "Unknown port property caught: [string range $result 0 30]" +# catch: intentionally testing error for nonexistent pin property catch { get_property $dpin nonexistent_property } result2 diff --git a/search/test/search_power_activity.tcl b/search/test/search_power_activity.tcl index 436ce250..bd1e3c25 100644 --- a/search/test/search_power_activity.tcl +++ b/search/test/search_power_activity.tcl @@ -27,14 +27,17 @@ puts "--- report_power -digits 6 ---" report_power -digits 6 puts "--- Pin activity ---" +# catch: sta::pin_activity is not exposed as Tcl command catch { set act1 [sta::pin_activity [get_pins and1/ZN]] puts "and1/ZN activity: $act1" } +# catch: sta::pin_activity is not exposed as Tcl command catch { set act2 [sta::pin_activity [get_pins reg1/Q]] puts "reg1/Q activity: $act2" } +# catch: sta::pin_activity is not exposed as Tcl command catch { set act3 [sta::pin_activity [get_pins buf1/Z]] puts "buf1/Z activity: $act3" @@ -59,6 +62,7 @@ set_propagated_clock [get_clocks clk] report_power puts "--- isClock queries ---" +# catch: ckbuf instance may not exist in this design catch { puts "ckbuf/A is_clock: [sta::is_clock_pin [get_pins ckbuf/A]]" puts "ckbuf/Z is_clock: [sta::is_clock_pin [get_pins ckbuf/Z]]" diff --git a/search/test/search_property_extra.tcl b/search/test/search_property_extra.tcl index 10f1459f..7b8feabe 100644 --- a/search/test/search_property_extra.tcl +++ b/search/test/search_property_extra.tcl @@ -46,9 +46,12 @@ set lport [get_lib_pins NangateOpenCellLibrary/AND2_X1/ZN] puts "lport name: [get_property $lport name]" puts "lport full_name: [get_property $lport full_name]" puts "lport direction: [get_property $lport direction]" +# catch: 'function' is not a get_property property (use $port function method instead) catch { puts "lport function: [get_property $lport function]" } puts "lport capacitance: [get_property $lport capacitance]" +# catch: 'max_capacitance' is not a supported get_property property catch { puts "lport max_capacitance: [get_property $lport max_capacitance]" } +# catch: 'max_transition' is not a supported get_property property catch { puts "lport max_transition: [get_property $lport max_transition]" } puts "lport is_register_clock: [get_property $lport is_register_clock]" puts "lport is_clock: [get_property $lport is_clock]" @@ -61,6 +64,7 @@ puts "and is_buffer: [get_property $and_cell is_buffer]" set dff_cell [get_lib_cells NangateOpenCellLibrary/DFF_X1] puts "dff is_buffer: [get_property $dff_cell is_buffer]" puts "dff area: [get_property $dff_cell area]" +# catch: 'cell_leakage_power' is not a supported get_property property catch { puts "dff cell_leakage_power: [get_property $dff_cell cell_leakage_power]" } puts "--- LibertyLibrary properties ---" diff --git a/search/test/search_property_libport_deep.tcl b/search/test/search_property_libport_deep.tcl index ef01cdfd..fa86fc69 100644 --- a/search/test/search_property_libport_deep.tcl +++ b/search/test/search_property_libport_deep.tcl @@ -129,9 +129,11 @@ puts "reg1 is_memory: [get_property $reg_inst is_memory]" puts "--- LibertyCell area and leakage ---" set dff_cell [get_lib_cells NangateOpenCellLibrary/DFF_X1] puts "DFF_X1 area: [get_property $dff_cell area]" +# catch: 'cell_leakage_power' is not a supported get_property property catch { puts "DFF_X1 cell_leakage_power: [get_property $dff_cell cell_leakage_power]" } set buf_cell [get_lib_cells NangateOpenCellLibrary/BUF_X1] puts "BUF_X1 area: [get_property $buf_cell area]" +# catch: 'cell_leakage_power' is not a supported get_property property catch { puts "BUF_X1 cell_leakage_power: [get_property $buf_cell cell_leakage_power]" } set inv_cell [get_lib_cells NangateOpenCellLibrary/INV_X1] puts "INV_X1 area: [get_property $inv_cell area]" @@ -155,6 +157,7 @@ puts "--- find_timing_paths with group_path ---" set paths [find_timing_paths -path_delay max -group_path_count 20 -endpoint_path_count 10] puts "Found [llength $paths] paths with groups" foreach pe $paths { + # catch: PathEnd does not have a path_group method catch { set pg [$pe path_group] puts " [get_full_name [$pe pin]] group=[$pg name] slack=[$pe slack]" @@ -165,6 +168,7 @@ puts "--- find_timing_paths with min paths and groups ---" set paths_min [find_timing_paths -path_delay min -group_path_count 20 -endpoint_path_count 10] puts "Found [llength $paths_min] min paths with groups" foreach pe $paths_min { + # catch: PathEnd does not have a path_group method catch { set pg [$pe path_group] puts " [get_full_name [$pe pin]] group=[$pg name] slack=[$pe slack]" @@ -232,13 +236,18 @@ puts "DFF_X1/CK direction: [get_property $dff_ck_lp direction]" # Unknown property error handling for various types ############################################################ puts "--- Unknown property errors ---" +# catch: intentionally testing error for nonexistent property on LibertyPort catch { get_property [get_lib_pins NangateOpenCellLibrary/BUF_X1/Z] nonexistent_prop } err1 puts "LibertyPort unknown: [string range $err1 0 40]" +# catch: intentionally testing error for nonexistent property on Instance catch { get_property [get_cells reg1] nonexistent_prop } err2 puts "Instance unknown: [string range $err2 0 40]" +# catch: intentionally testing error for nonexistent property on Clock catch { get_property [get_clocks clk] nonexistent_prop } err3 puts "Clock unknown: [string range $err3 0 40]" +# catch: intentionally testing error for nonexistent property on LibertyCell catch { get_property [get_lib_cells NangateOpenCellLibrary/BUF_X1] nonexistent_prop } err4 puts "LibertyCell unknown: [string range $err4 0 40]" +# catch: intentionally testing error for nonexistent property on Library catch { get_property [get_libs NangateOpenCellLibrary] nonexistent_prop } err5 puts "Library unknown: [string range $err5 0 40]" diff --git a/search/test/search_pvt_analysis.tcl b/search/test/search_pvt_analysis.tcl index e4ecf454..eece9a8d 100644 --- a/search/test/search_pvt_analysis.tcl +++ b/search/test/search_pvt_analysis.tcl @@ -143,6 +143,7 @@ report_checks -path_delay max # Min pulse width on pins/instances ############################################################ puts "--- set_min_pulse_width on pins ---" +# catch: set_min_pulse_width does not accept port objects catch { set_min_pulse_width 0.5 [get_ports clk1] report_pulse_width_checks diff --git a/search/test/search_report_path_detail.tcl b/search/test/search_report_path_detail.tcl index edd9b756..518aa937 100644 --- a/search/test/search_report_path_detail.tcl +++ b/search/test/search_report_path_detail.tcl @@ -141,6 +141,7 @@ puts "Path group names: $group_names" puts "--- Endpoint slack ---" set pin [get_pins reg1/D] +# catch: sta::endpoint_slack may fail if path group "reg_to_reg" does not exist catch { set eslack [sta::endpoint_slack $pin "reg_to_reg" max] puts "Endpoint slack: $eslack" diff --git a/search/test/search_sim_const_prop.tcl b/search/test/search_sim_const_prop.tcl index 3f6bef95..7e3e8105 100644 --- a/search/test/search_sim_const_prop.tcl +++ b/search/test/search_sim_const_prop.tcl @@ -190,6 +190,7 @@ report_checks -path_delay max # Min pulse width ############################################################ puts "--- set_min_pulse_width ---" +# catch: set_min_pulse_width does not accept [all_inputs] as argument catch { set_min_pulse_width 0.5 [all_inputs] } diff --git a/search/test/search_sim_logic_clk_network.tcl b/search/test/search_sim_logic_clk_network.tcl index 0beedb1b..495b3770 100644 --- a/search/test/search_sim_logic_clk_network.tcl +++ b/search/test/search_sim_logic_clk_network.tcl @@ -101,9 +101,11 @@ report_checks -path_delay max # findLogicConstants / clearLogicConstants ############################################################ puts "--- findLogicConstants ---" +# catch: sta::find_logic_constants is not exposed as Tcl command catch { sta::find_logic_constants } puts "--- clearLogicConstants ---" +# catch: sta::clear_logic_constants is not exposed as Tcl command catch { sta::clear_logic_constants } ############################################################ @@ -113,12 +115,14 @@ puts "--- levelize ---" sta::levelize puts "--- graphLoops ---" +# catch: sta::graph_loop_count is not exposed as Tcl command catch { set loops [sta::graph_loop_count] puts "Graph loops: $loops" } puts "--- max_path_count_vertex ---" +# catch: sta::max_path_count_vertex is not exposed as Tcl command catch { set maxv [sta::max_path_count_vertex] if { $maxv != "NULL" } { diff --git a/search/test/search_worst_slack_sta.tcl b/search/test/search_worst_slack_sta.tcl index 865f42a4..47c4e4d6 100644 --- a/search/test/search_worst_slack_sta.tcl +++ b/search/test/search_worst_slack_sta.tcl @@ -157,6 +157,7 @@ report_checks -path_delay max > /dev/null sta::set_report_path_no_split 0 puts "--- graph loops ---" +# catch: sta::graph_loop_count is not exposed as Tcl command catch { set loops [sta::graph_loop_count] puts "graph_loop_count: $loops" diff --git a/spice/test/spice_gate_advanced.tcl b/spice/test/spice_gate_advanced.tcl index 410ac3e0..3192c747 100644 --- a/spice/test/spice_gate_advanced.tcl +++ b/spice/test/spice_gate_advanced.tcl @@ -51,6 +51,7 @@ close $subckt_fh #--------------------------------------------------------------- puts "--- write_gate_spice ngspice ---" set gate_file1 [file join $spice_dir gate_ng.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc1 [catch { write_gate_spice \ -gates {{buf1 A Z rise}} \ @@ -70,6 +71,7 @@ if { $rc1 == 0 } { #--------------------------------------------------------------- puts "--- write_gate_spice fall ---" set gate_file2 [file join $spice_dir gate_fall.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc2 [catch { write_gate_spice \ -gates {{buf1 A Z fall}} \ @@ -90,6 +92,7 @@ if { $rc2 == 0 } { #--------------------------------------------------------------- puts "--- write_gate_spice xyce ---" set gate_file3 [file join $spice_dir gate_xyce.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc3 [catch { write_gate_spice \ -gates {{buf1 A Z rise}} \ @@ -110,6 +113,7 @@ if { $rc3 == 0 } { #--------------------------------------------------------------- puts "--- write_gate_spice hspice ---" set gate_file4 [file join $spice_dir gate_hspice.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc4 [catch { write_gate_spice \ -gates {{buf1 A Z rise}} \ diff --git a/spice/test/spice_gate_cells.tcl b/spice/test/spice_gate_cells.tcl index f758ffe6..c9c53185 100644 --- a/spice/test/spice_gate_cells.tcl +++ b/spice/test/spice_gate_cells.tcl @@ -65,6 +65,7 @@ close $subckt_fh #--------------------------------------------------------------- puts "--- write_gate_spice BUF_X1 rise ngspice ---" set gate_f1 [file join $spice_dir gate_buf_rise.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc1 [catch { write_gate_spice \ -gates {{buf1 A Z rise}} \ @@ -84,6 +85,7 @@ if { $rc1 == 0 } { #--------------------------------------------------------------- puts "--- write_gate_spice BUF_X1 fall ---" set gate_f2 [file join $spice_dir gate_buf_fall.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc2 [catch { write_gate_spice \ -gates {{buf1 A Z fall}} \ @@ -103,6 +105,7 @@ if { $rc2 == 0 } { #--------------------------------------------------------------- puts "--- write_gate_spice INV_X1 rise ---" set gate_f3 [file join $spice_dir gate_inv_rise.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc3 [catch { write_gate_spice \ -gates {{inv1 A ZN rise}} \ @@ -122,6 +125,7 @@ if { $rc3 == 0 } { #--------------------------------------------------------------- puts "--- write_gate_spice INV_X1 fall ---" set gate_f4 [file join $spice_dir gate_inv_fall.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc4 [catch { write_gate_spice \ -gates {{inv1 A ZN fall}} \ @@ -141,6 +145,7 @@ if { $rc4 == 0 } { #--------------------------------------------------------------- puts "--- write_gate_spice AND2_X1 rise ---" set gate_f5 [file join $spice_dir gate_and_rise.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc5 [catch { write_gate_spice \ -gates {{and1 A1 ZN rise}} \ @@ -160,6 +165,7 @@ if { $rc5 == 0 } { #--------------------------------------------------------------- puts "--- write_gate_spice AND2_X1 A2 ---" set gate_f5b [file join $spice_dir gate_and_a2.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc5b [catch { write_gate_spice \ -gates {{and1 A2 ZN rise}} \ @@ -179,6 +185,7 @@ if { $rc5b == 0 } { #--------------------------------------------------------------- puts "--- write_gate_spice OR2_X1 rise ---" set gate_f6 [file join $spice_dir gate_or_rise.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc6 [catch { write_gate_spice \ -gates {{or1 A1 ZN rise}} \ @@ -198,6 +205,7 @@ if { $rc6 == 0 } { #--------------------------------------------------------------- puts "--- write_gate_spice hspice ---" set gate_f7 [file join $spice_dir gate_hspice.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc7 [catch { write_gate_spice \ -gates {{buf1 A Z rise}} \ @@ -218,6 +226,7 @@ if { $rc7 == 0 } { #--------------------------------------------------------------- puts "--- write_gate_spice xyce ---" set gate_f8 [file join $spice_dir gate_xyce.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc8 [catch { write_gate_spice \ -gates {{buf1 A Z rise}} \ @@ -238,6 +247,7 @@ if { $rc8 == 0 } { #--------------------------------------------------------------- puts "--- write_gate_spice xyce INV ---" set gate_f9 [file join $spice_dir gate_xyce_inv.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc9 [catch { write_gate_spice \ -gates {{inv1 A ZN fall}} \ @@ -258,6 +268,7 @@ if { $rc9 == 0 } { #--------------------------------------------------------------- puts "--- write_gate_spice hspice AND ---" set gate_f10 [file join $spice_dir gate_hspice_and.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc10 [catch { write_gate_spice \ -gates {{and1 A1 ZN fall}} \ diff --git a/spice/test/spice_gcd_gate.tcl b/spice/test/spice_gcd_gate.tcl index f185ceed..8248f7c0 100644 --- a/spice/test/spice_gcd_gate.tcl +++ b/spice/test/spice_gcd_gate.tcl @@ -65,6 +65,7 @@ close $sfh # Helper proc to test write_gate_spice proc test_gate_spice {label gates filename subckt model sim} { puts "--- write_gate_spice $label ---" + # catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc [catch { write_gate_spice \ -gates $gates \ @@ -111,6 +112,7 @@ puts "--- write_path_spice tests ---" # Max path with ngspice set pdir1 [make_result_file spice_gcd_path_ng] file mkdir $pdir1 +# catch: write_path_spice may fail if subckt is missing for cells on path set rc1 [catch { write_path_spice \ -path_args {-sort_by_slack -path_delay max} \ @@ -129,6 +131,7 @@ if { $rc1 == 0 } { # Min path with hspice set pdir2 [make_result_file spice_gcd_path_hs] file mkdir $pdir2 +# catch: write_path_spice may fail if subckt is missing for cells on path set rc2 [catch { write_path_spice \ -path_args {-path_delay min} \ @@ -147,6 +150,7 @@ if { $rc2 == 0 } { # Path with xyce set pdir3 [make_result_file spice_gcd_path_xy] file mkdir $pdir3 +# catch: write_path_spice may fail if subckt is missing for cells on path set rc3 [catch { write_path_spice \ -path_args {-sort_by_slack} \ diff --git a/spice/test/spice_gcd_path.tcl b/spice/test/spice_gcd_path.tcl index af781a3d..83857c95 100644 --- a/spice/test/spice_gcd_path.tcl +++ b/spice/test/spice_gcd_path.tcl @@ -43,6 +43,7 @@ puts "unique cells: [llength $cell_names]" # Write generic subckts for each cell type foreach cell_name $cell_names { + # catch: get_lib_pins may fail for some cell types set rc [catch { set lib_pins [get_lib_pins */${cell_name}/*] if { [llength $lib_pins] == 0 } { continue } @@ -130,6 +131,7 @@ write_path_spice \ puts "--- write_path_spice specific endpoints ---" set dir5 [make_result_file spice_gcd_specific] file mkdir $dir5 +# catch: write_path_spice may fail if subckt is missing for cells on path set rc [catch { write_path_spice \ -path_args {-from req_msg[0] -to resp_msg[0]} \ @@ -153,6 +155,7 @@ puts "--- write_gate_spice sky130hd cells ---" # Find some instances for gate spice using known patterns set gate_test_insts [list] foreach pat {_197_ _205_ _206_ _300_} { + # catch: cell pattern may not match any instances set rc [catch { set c [get_cells $pat] } msg] if { $rc == 0 && [llength $c] > 0 } { lappend gate_test_insts [lindex $c 0] @@ -167,6 +170,7 @@ foreach inst $gate_test_insts { # Get input/output pins from the lib cell set in_pin "" set out_pin "" + # catch: get_lib_pins may fail for some cell types set rc [catch { set cell_pins [get_lib_pins */${cell_ref}/*] foreach lp $cell_pins { @@ -183,6 +187,7 @@ foreach inst $gate_test_insts { if { $in_pin ne "" && $out_pin ne "" } { set gf [file join $spice_dir "gate_${inst_name}.sp"] + # catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc [catch { write_gate_spice \ -gates [list [list $inst_name $in_pin $out_pin rise]] \ diff --git a/spice/test/spice_multipath.tcl b/spice/test/spice_multipath.tcl index c15b52d6..5d2d934b 100644 --- a/spice/test/spice_multipath.tcl +++ b/spice/test/spice_multipath.tcl @@ -132,6 +132,7 @@ write_path_spice \ puts "--- write_path_spice specific path ---" set spice_dir3 [make_result_file spice_mp_specific] file mkdir $spice_dir3 +# catch: write_path_spice may fail if subckt is missing for cells on path set rc3 [catch { write_path_spice \ -path_args {-from in1 -to out1} \ @@ -183,6 +184,7 @@ puts "--- write_gate_spice multiple cells ---" # BUF rise set gf1 [file join $spice_dir gate_buf_rise.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc [catch { write_gate_spice -gates {{buf1 A Z rise}} -spice_filename $gf1 \ -lib_subckt_file $subckt_file -model_file $model_file \ @@ -192,6 +194,7 @@ if { $rc == 0 } { puts "gate BUF rise" } else { puts "INFO: gate BUF rise: $msg" # BUF fall set gf2 [file join $spice_dir gate_buf_fall.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc [catch { write_gate_spice -gates {{buf1 A Z fall}} -spice_filename $gf2 \ -lib_subckt_file $subckt_file -model_file $model_file \ @@ -201,6 +204,7 @@ if { $rc == 0 } { puts "gate BUF fall" } else { puts "INFO: gate BUF fall: $msg" # INV rise set gf3 [file join $spice_dir gate_inv_rise.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc [catch { write_gate_spice -gates {{inv1 A ZN rise}} -spice_filename $gf3 \ -lib_subckt_file $subckt_file -model_file $model_file \ @@ -210,6 +214,7 @@ if { $rc == 0 } { puts "gate INV rise" } else { puts "INFO: gate INV rise: $msg" # AND rise from A1 set gf4 [file join $spice_dir gate_and_a1_rise.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc [catch { write_gate_spice -gates {{and1 A1 ZN rise}} -spice_filename $gf4 \ -lib_subckt_file $subckt_file -model_file $model_file \ @@ -219,6 +224,7 @@ if { $rc == 0 } { puts "gate AND A1 rise" } else { puts "INFO: gate AND A1 rise: # AND fall from A2 set gf5 [file join $spice_dir gate_and_a2_fall.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc [catch { write_gate_spice -gates {{and1 A2 ZN fall}} -spice_filename $gf5 \ -lib_subckt_file $subckt_file -model_file $model_file \ @@ -228,6 +234,7 @@ if { $rc == 0 } { puts "gate AND A2 fall" } else { puts "INFO: gate AND A2 fall: # OR rise set gf6 [file join $spice_dir gate_or_rise.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc [catch { write_gate_spice -gates {{or1 A1 ZN rise}} -spice_filename $gf6 \ -lib_subckt_file $subckt_file -model_file $model_file \ @@ -237,6 +244,7 @@ if { $rc == 0 } { puts "gate OR rise" } else { puts "INFO: gate OR rise: $msg" } # Hspice simulator variants set gf7 [file join $spice_dir gate_inv_hspice.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc [catch { write_gate_spice -gates {{inv1 A ZN fall}} -spice_filename $gf7 \ -lib_subckt_file $subckt_file -model_file $model_file \ @@ -246,6 +254,7 @@ if { $rc == 0 } { puts "gate INV hspice" } else { puts "INFO: gate INV hspice: $ # Xyce simulator variants set gf8 [file join $spice_dir gate_or_xyce.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc [catch { write_gate_spice -gates {{or1 A2 ZN rise}} -spice_filename $gf8 \ -lib_subckt_file $subckt_file -model_file $model_file \ diff --git a/spice/test/spice_path_min.tcl b/spice/test/spice_path_min.tcl index bc991fc6..7cf8218f 100644 --- a/spice/test/spice_path_min.tcl +++ b/spice/test/spice_path_min.tcl @@ -135,6 +135,7 @@ write_path_spice \ puts "--- write_path_spice specific path ---" set spice_dir_sp [make_result_file spice_specific_out] file mkdir $spice_dir_sp +# catch: write_path_spice may fail if subckt is missing for cells on path set rc5 [catch { write_path_spice \ -path_args {-from in1 -to out2} \ diff --git a/spice/test/spice_subckt_file.tcl b/spice/test/spice_subckt_file.tcl index b150c5f8..71adc17c 100644 --- a/spice/test/spice_subckt_file.tcl +++ b/spice/test/spice_subckt_file.tcl @@ -67,6 +67,7 @@ close $subckt_fh #--------------------------------------------------------------- puts "--- write_gate_spice multiple gates ---" set gate_file [file join $spice_dir gates_multi.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc [catch { write_gate_spice \ -gates {{buf1 A Z rise} {inv1 A ZN fall}} \ @@ -86,6 +87,7 @@ if { $rc == 0 } { #--------------------------------------------------------------- puts "--- write_gate_spice AND gate ---" set gate_file2 [file join $spice_dir gate_and.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc [catch { write_gate_spice \ -gates {{and1 A1 ZN rise}} \ diff --git a/spice/test/spice_write_options.tcl b/spice/test/spice_write_options.tcl index 7759f524..87d24e8d 100644 --- a/spice/test/spice_write_options.tcl +++ b/spice/test/spice_write_options.tcl @@ -73,6 +73,7 @@ write_path_spice \ puts "--- write_gate_spice ---" set gate_spice_file [file join $spice_dir gate_test.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc4 [catch { write_gate_spice \ -gates {{buf1 A Z rise}} \ @@ -89,6 +90,7 @@ if { $rc4 == 0 } { puts "--- write_gate_spice with -simulator hspice ---" set gate_spice_file2 [file join $spice_dir gate_test2.sp] +# catch: write_gate_spice may fail if subckt pin mapping doesn't match liberty cell set rc5 [catch { write_gate_spice \ -gates {{buf1 A Z rise}} \ diff --git a/util/test/util_log_redirect.tcl b/util/test/util_log_redirect.tcl index 2ed12962..a4e2637f 100644 --- a/util/test/util_log_redirect.tcl +++ b/util/test/util_log_redirect.tcl @@ -165,6 +165,7 @@ puts "--- Test 6: message suppression ---" suppress_msg 100 200 300 # Trigger some warnings by reading nonexistent files +# catch: intentionally testing error handling for nonexistent file path set rc [catch { read_liberty "/nonexistent/path.lib" } msg] if { $rc != 0 } { } diff --git a/util/test/util_parallel_misc.tcl b/util/test/util_parallel_misc.tcl index eb61d323..c38d051c 100644 --- a/util/test/util_parallel_misc.tcl +++ b/util/test/util_parallel_misc.tcl @@ -218,18 +218,22 @@ if { [file exists $lfile] } { # Error paths (run last since they may affect design state) #--------------------------------------------------------------- puts "--- error paths ---" +# catch: intentionally testing error for nonexistent liberty file set rc [catch { read_liberty "/nonexistent/path/file.lib" } msg] if { $rc != 0 } { } +# catch: intentionally testing error for nonexistent verilog file set rc [catch { read_verilog "/nonexistent/path/file.v" } msg] if { $rc != 0 } { } +# catch: intentionally testing error for nonexistent SPEF file set rc [catch { read_spef "/nonexistent/path/file.spef" } msg] if { $rc != 0 } { } +# catch: intentionally testing error for nonexistent SDF file set rc [catch { read_sdf "/nonexistent/path/file.sdf" } msg] if { $rc != 0 } { } diff --git a/util/test/util_pattern_string.tcl b/util/test/util_pattern_string.tcl index 79b8fa20..c5bcf29d 100644 --- a/util/test/util_pattern_string.tcl +++ b/util/test/util_pattern_string.tcl @@ -67,9 +67,11 @@ puts "n* nets: [llength $nets_star]" # Pattern that matches nothing puts "--- non-matching patterns ---" +# catch: intentionally testing pattern match for nonexistent cell set rc [catch {get_cells zzz_nonexistent} msg] puts "get_cells nonexistent: rc=$rc" +# catch: intentionally testing pattern match for nonexistent pin set rc [catch {get_pins zzz_nonexistent/*} msg] puts "get_pins nonexistent: rc=$rc" @@ -106,6 +108,7 @@ sta::set_debug "delay_calc" 0 # Error.cc: FileNotWritable path #--------------------------------------------------------------- puts "--- FileNotWritable error path ---" +# catch: intentionally testing FileNotWritable error for nonexistent directory set rc [catch { write_sdf "/nonexistent_dir/no_write.sdf" } msg] if { $rc != 0 } { } else { @@ -113,6 +116,7 @@ if { $rc != 0 } { } # Try write to read-only path +# catch: intentionally testing FileNotWritable error for /proc path set rc [catch { log_begin "/proc/nonexistent_log" } msg] if { $rc != 0 } { } else { diff --git a/util/test/util_report_format.tcl b/util/test/util_report_format.tcl index 363d173e..c9bc5265 100644 --- a/util/test/util_report_format.tcl +++ b/util/test/util_report_format.tcl @@ -144,10 +144,12 @@ if { [file exists $rf] } { # Error handling paths #--------------------------------------------------------------- puts "--- error handling ---" +# catch: intentionally testing error for nonexistent liberty file set rc [catch { read_liberty "/nonexistent/path/test.lib" } msg] if { $rc != 0 } { } +# catch: intentionally testing error for nonexistent verilog file set rc [catch { read_verilog "/nonexistent/path/test.v" } msg] if { $rc != 0 } { } diff --git a/util/test/util_report_string_log.tcl b/util/test/util_report_string_log.tcl index 39ffeec7..9cef2cf3 100644 --- a/util/test/util_report_string_log.tcl +++ b/util/test/util_report_string_log.tcl @@ -155,11 +155,13 @@ if { $sz_after > $sz_before } { puts "--- Test 6: error paths ---" # FileNotReadable +# catch: intentionally testing FileNotReadable error for nonexistent liberty file set rc1 [catch { read_liberty "/nonexistent/path/xyz.lib" } err1] if { $rc1 != 0 } { } # FileNotWritable (try writing to /dev/null/impossible) +# catch: intentionally testing FileNotWritable error for nonexistent directory set rc2 [catch { write_verilog "/nonexistent/dir/xyz.v" } err2] if { $rc2 != 0 } { } @@ -171,6 +173,7 @@ puts $fh "module bad_design (input a, output b);" puts $fh " NONEXISTENT_CELL u1 (.A(a), .Z(b));" puts $fh "endmodule" close $fh +# catch: intentionally testing error with bad verilog containing nonexistent cell set rc3 [catch { read_verilog $bad_v link_design bad_design diff --git a/verilog/test/verilog_gcd_writer.tcl b/verilog/test/verilog_gcd_writer.tcl index 71ada642..590e7f15 100644 --- a/verilog/test/verilog_gcd_writer.tcl +++ b/verilog/test/verilog_gcd_writer.tcl @@ -36,6 +36,7 @@ if { $sz2 >= $sz1 } { # Write with -remove_cells (remove buffer cells) set out3 [make_result_file verilog_gcd_remove.v] +# catch: write_verilog -remove_cells option may not be supported catch { set bufs [get_lib_cells sky130_fd_sc_hd__tt_025C_1v80/sky130_fd_sc_hd__buf_1] write_verilog -remove_cells $bufs $out3