212 lines
7.3 KiB
Tcl
212 lines
7.3 KiB
Tcl
# Test liberty cell/pin/arc property queries for code coverage
|
|
# Targets: Liberty.cc, TimingArc.cc, InternalPower.cc, FuncExpr.cc, TableModel.cc
|
|
read_liberty ../../test/nangate45/Nangate45_typ.lib
|
|
|
|
############################################################
|
|
# Library-level properties
|
|
############################################################
|
|
|
|
set lib [get_libs NangateOpenCellLibrary]
|
|
puts "PASS: library found"
|
|
|
|
# Library iterator
|
|
set lib_iter [sta::liberty_library_iterator]
|
|
puts "PASS: liberty_library_iterator"
|
|
|
|
# find_liberty
|
|
set found_lib [sta::find_liberty NangateOpenCellLibrary]
|
|
puts "PASS: find_liberty NangateOpenCellLibrary"
|
|
|
|
############################################################
|
|
# Cell property queries on various cell types
|
|
############################################################
|
|
|
|
# Query cell properties using get_property / report_lib_cell
|
|
# Inverter
|
|
set inv [get_lib_cell NangateOpenCellLibrary/INV_X1]
|
|
report_lib_cell NangateOpenCellLibrary/INV_X1
|
|
puts "PASS: report_lib_cell INV_X1"
|
|
|
|
# Buffer
|
|
set buf [get_lib_cell NangateOpenCellLibrary/BUF_X1]
|
|
report_lib_cell NangateOpenCellLibrary/BUF_X1
|
|
puts "PASS: report_lib_cell BUF_X1"
|
|
|
|
# Sequential cells - DFF
|
|
set dff [get_lib_cell NangateOpenCellLibrary/DFF_X1]
|
|
report_lib_cell NangateOpenCellLibrary/DFF_X1
|
|
puts "PASS: report_lib_cell DFF_X1"
|
|
|
|
# DFF with reset
|
|
set dffr [get_lib_cell NangateOpenCellLibrary/DFFR_X1]
|
|
report_lib_cell NangateOpenCellLibrary/DFFR_X1
|
|
puts "PASS: report_lib_cell DFFR_X1"
|
|
|
|
# DFF with set
|
|
set dffs [get_lib_cell NangateOpenCellLibrary/DFFS_X1]
|
|
report_lib_cell NangateOpenCellLibrary/DFFS_X1
|
|
puts "PASS: report_lib_cell DFFS_X1"
|
|
|
|
# DFF with set and reset
|
|
set dffrs [get_lib_cell NangateOpenCellLibrary/DFFRS_X1]
|
|
report_lib_cell NangateOpenCellLibrary/DFFRS_X1
|
|
puts "PASS: report_lib_cell DFFRS_X1"
|
|
|
|
# Latch
|
|
set latch [get_lib_cell NangateOpenCellLibrary/TLAT_X1]
|
|
report_lib_cell NangateOpenCellLibrary/TLAT_X1
|
|
puts "PASS: report_lib_cell TLAT_X1"
|
|
|
|
# Complex cells
|
|
foreach cell_name {AOI21_X1 AOI22_X1 OAI21_X1 OAI22_X1 AOI211_X1 OAI211_X1 \
|
|
HA_X1 FA_X1 XNOR2_X1 XOR2_X1 MUX2_X1 \
|
|
CLKBUF_X1 CLKBUF_X2 CLKBUF_X3 TINV_X1 \
|
|
NAND2_X1 NAND3_X1 NAND4_X1 NOR2_X1 NOR3_X1 NOR4_X1 \
|
|
AND2_X1 AND3_X1 AND4_X1 OR2_X1 OR3_X1 OR4_X1 \
|
|
ANTENNA_X1 FILLCELL_X1 LOGIC0_X1 LOGIC1_X1 \
|
|
CLKGATETST_X1 CLKGATETST_X2 SDFF_X1 SDFFR_X1 SDFFS_X1 SDFFRS_X1} {
|
|
catch {
|
|
report_lib_cell NangateOpenCellLibrary/$cell_name
|
|
}
|
|
}
|
|
puts "PASS: report_lib_cell various complex cells"
|
|
|
|
############################################################
|
|
# Pin direction queries
|
|
############################################################
|
|
|
|
# Test liberty_port_direction on various pin types
|
|
foreach {cell_name pin_name} {
|
|
INV_X1 A INV_X1 ZN
|
|
BUF_X1 A BUF_X1 Z
|
|
DFF_X1 D DFF_X1 CK DFF_X1 Q DFF_X1 QN
|
|
NAND2_X1 A1 NAND2_X1 A2 NAND2_X1 ZN
|
|
DFFR_X1 RN
|
|
DFFS_X1 SN
|
|
CLKGATETST_X1 CK CLKGATETST_X1 E CLKGATETST_X1 SE CLKGATETST_X1 GCK
|
|
} {
|
|
catch {
|
|
set pin [get_lib_pin NangateOpenCellLibrary/$cell_name/$pin_name]
|
|
if { $pin != "" } {
|
|
set dir [sta::liberty_port_direction $pin]
|
|
}
|
|
}
|
|
}
|
|
puts "PASS: liberty_port_direction queries"
|
|
|
|
############################################################
|
|
# get_lib_pins and get_lib_cells with various patterns
|
|
############################################################
|
|
|
|
# Wildcard patterns
|
|
set all_cells [get_lib_cells NangateOpenCellLibrary/*]
|
|
puts "PASS: get_lib_cells * = [llength $all_cells]"
|
|
|
|
set inv_cells [get_lib_cells NangateOpenCellLibrary/INV_*]
|
|
puts "PASS: get_lib_cells INV_* = [llength $inv_cells]"
|
|
|
|
set dff_cells [get_lib_cells NangateOpenCellLibrary/DFF*]
|
|
puts "PASS: get_lib_cells DFF* = [llength $dff_cells]"
|
|
|
|
set sdff_cells [get_lib_cells NangateOpenCellLibrary/SDFF*]
|
|
puts "PASS: get_lib_cells SDFF* = [llength $sdff_cells]"
|
|
|
|
# All pins of a cell
|
|
set inv_pins [get_lib_pins NangateOpenCellLibrary/INV_X1/*]
|
|
puts "PASS: get_lib_pins INV_X1/* = [llength $inv_pins]"
|
|
|
|
set dff_pins [get_lib_pins NangateOpenCellLibrary/DFF_X1/*]
|
|
puts "PASS: get_lib_pins DFF_X1/* = [llength $dff_pins]"
|
|
|
|
set dffr_pins [get_lib_pins NangateOpenCellLibrary/DFFR_X1/*]
|
|
puts "PASS: get_lib_pins DFFR_X1/* = [llength $dffr_pins]"
|
|
|
|
set aoi_pins [get_lib_pins NangateOpenCellLibrary/AOI21_X1/*]
|
|
puts "PASS: get_lib_pins AOI21_X1/* = [llength $aoi_pins]"
|
|
|
|
set fa_pins [get_lib_pins NangateOpenCellLibrary/FA_X1/*]
|
|
puts "PASS: get_lib_pins FA_X1/* = [llength $fa_pins]"
|
|
|
|
set clkgate_pins [get_lib_pins NangateOpenCellLibrary/CLKGATETST_X1/*]
|
|
puts "PASS: get_lib_pins CLKGATETST_X1/* = [llength $clkgate_pins]"
|
|
|
|
############################################################
|
|
# liberty_supply_exists
|
|
############################################################
|
|
|
|
set result [sta::liberty_supply_exists VDD]
|
|
puts "PASS: liberty_supply_exists VDD = $result"
|
|
|
|
set result [sta::liberty_supply_exists VSS]
|
|
puts "PASS: liberty_supply_exists VSS = $result"
|
|
|
|
set result [sta::liberty_supply_exists NONEXISTENT]
|
|
puts "PASS: liberty_supply_exists NONEXISTENT = $result"
|
|
|
|
############################################################
|
|
# Read ASAP7 SEQ library (exercises different liberty features)
|
|
############################################################
|
|
|
|
read_liberty ../../test/asap7/asap7sc7p5t_SEQ_RVT_FF_nldm_220123.lib
|
|
puts "PASS: read ASAP7 SEQ"
|
|
|
|
# Query ASAP7 sequential cells
|
|
set asap7_dff [get_lib_cell asap7sc7p5t_SEQ_RVT_FF_nldm_220123/DFFHQNx1_ASAP7_75t_R]
|
|
report_lib_cell asap7sc7p5t_SEQ_RVT_FF_nldm_220123/DFFHQNx1_ASAP7_75t_R
|
|
puts "PASS: ASAP7 DFF cell"
|
|
|
|
set asap7_dff_pins [get_lib_pins asap7sc7p5t_SEQ_RVT_FF_nldm_220123/DFFHQNx1_ASAP7_75t_R/*]
|
|
puts "PASS: ASAP7 DFF pins ([llength $asap7_dff_pins])"
|
|
|
|
# ICG cell (clock gating)
|
|
set icg [get_lib_cell asap7sc7p5t_SEQ_RVT_FF_nldm_220123/ICGx1_ASAP7_75t_R]
|
|
report_lib_cell asap7sc7p5t_SEQ_RVT_FF_nldm_220123/ICGx1_ASAP7_75t_R
|
|
puts "PASS: ASAP7 ICG cell"
|
|
|
|
############################################################
|
|
# Read IHP library (different vendor, different features)
|
|
############################################################
|
|
|
|
read_liberty ../../test/ihp-sg13g2/sg13g2_stdcell_typ_1p20V_25C.lib
|
|
puts "PASS: read IHP library"
|
|
|
|
# Tristate buffer
|
|
set ebufn [get_lib_cell sg13g2_stdcell_typ_1p20V_25C/sg13g2_ebufn_2]
|
|
report_lib_cell sg13g2_stdcell_typ_1p20V_25C/sg13g2_ebufn_2
|
|
puts "PASS: IHP tristate buffer cell"
|
|
|
|
# Scan DFF
|
|
catch {
|
|
set sdff [get_lib_cell sg13g2_stdcell_typ_1p20V_25C/sg13g2_sdfbbp_1]
|
|
if { $sdff != "" } {
|
|
report_lib_cell sg13g2_stdcell_typ_1p20V_25C/sg13g2_sdfbbp_1
|
|
puts "PASS: IHP scan DFF cell"
|
|
}
|
|
}
|
|
|
|
############################################################
|
|
# Read Sky130 library
|
|
############################################################
|
|
|
|
read_liberty ../../test/sky130hd/sky130hd_tt.lib
|
|
puts "PASS: read Sky130 library"
|
|
|
|
# Query sky130 cells
|
|
report_lib_cell sky130_fd_sc_hd__tt_025C_1v80/sky130_fd_sc_hd__inv_1
|
|
puts "PASS: Sky130 inv cell"
|
|
|
|
# Query all sky130 cells
|
|
set sky_cells [get_lib_cells sky130_fd_sc_hd__tt_025C_1v80/*]
|
|
puts "PASS: Sky130 total cells: [llength $sky_cells]"
|
|
|
|
############################################################
|
|
# Write liberty
|
|
############################################################
|
|
|
|
source ../../test/helpers.tcl
|
|
set outfile [make_result_file liberty_properties_write.lib]
|
|
sta::write_liberty NangateOpenCellLibrary $outfile
|
|
puts "PASS: write_liberty"
|
|
|
|
puts "ALL PASSED"
|