257 lines
9.2 KiB
Tcl
257 lines
9.2 KiB
Tcl
# Test verilog writer -remove_cells option and re-read operations.
|
|
# Targets:
|
|
# VerilogWriter.cc: writeChild with remove_cells filtering,
|
|
# findChildNCcount with remove_cells skip, writeChildren sorted output,
|
|
# writeInstBusPin/writeInstBusPinBit, findUnconnectedNetCount,
|
|
# findPortNCcount, writeAssigns
|
|
# VerilogReader.cc: multiple read_verilog calls (deleteModules paths),
|
|
# read with missing cells (black box generation),
|
|
# bus declaration parsing, link_design various paths,
|
|
# VerilogNetConcat, VerilogNetPartSelect, module re-definition
|
|
# VerilogNamespace.cc: cellVerilogName, instanceVerilogName,
|
|
# netVerilogName, portVerilogName for various names
|
|
|
|
source ../../test/helpers.tcl
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 1: Write with -remove_cells option (nangate45 design)
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 1: write with -remove_cells ---"
|
|
read_liberty ../../test/nangate45/Nangate45_typ.lib
|
|
read_verilog verilog_test1.v
|
|
link_design verilog_test1
|
|
|
|
set cells [get_cells *]
|
|
puts "cells: [llength $cells]"
|
|
|
|
# Write without remove
|
|
set out_basic [make_result_file verilog_remove_basic.v]
|
|
write_verilog $out_basic
|
|
puts "PASS: basic write"
|
|
|
|
# Write with empty remove_cells list
|
|
set out_empty [make_result_file verilog_remove_empty.v]
|
|
write_verilog -remove_cells {} $out_empty
|
|
puts "PASS: empty remove_cells"
|
|
|
|
set sz_basic [file size $out_basic]
|
|
set sz_empty [file size $out_empty]
|
|
puts "basic size=$sz_basic empty remove size=$sz_empty"
|
|
|
|
# Write with specific cells to remove (BUF_X1)
|
|
set out_rm_buf [make_result_file verilog_remove_buf.v]
|
|
write_verilog -remove_cells {NangateOpenCellLibrary/BUF_X1} $out_rm_buf
|
|
puts "PASS: remove BUF_X1"
|
|
|
|
set sz_rm_buf [file size $out_rm_buf]
|
|
puts "remove BUF_X1 size=$sz_rm_buf"
|
|
|
|
if { $sz_rm_buf < $sz_basic } {
|
|
puts "PASS: removing cells reduces file size"
|
|
}
|
|
|
|
# Write with DFF_X1 removed
|
|
set out_rm_dff [make_result_file verilog_remove_dff.v]
|
|
write_verilog -remove_cells {NangateOpenCellLibrary/DFF_X1} $out_rm_dff
|
|
puts "PASS: remove DFF_X1"
|
|
|
|
set sz_rm_dff [file size $out_rm_dff]
|
|
puts "remove DFF_X1 size=$sz_rm_dff"
|
|
|
|
# Write with both removed
|
|
set out_rm_both [make_result_file verilog_remove_both.v]
|
|
write_verilog -remove_cells {NangateOpenCellLibrary/BUF_X1 NangateOpenCellLibrary/DFF_X1} $out_rm_both
|
|
puts "PASS: remove BUF_X1+DFF_X1"
|
|
|
|
set sz_rm_both [file size $out_rm_both]
|
|
puts "remove both size=$sz_rm_both"
|
|
|
|
if { $sz_rm_both <= $sz_rm_buf && $sz_rm_both <= $sz_rm_dff } {
|
|
puts "PASS: removing more cells produces smaller/equal file"
|
|
}
|
|
|
|
# Write with pwr_gnd and remove
|
|
set out_rm_pwr [make_result_file verilog_remove_pwr.v]
|
|
write_verilog -include_pwr_gnd -remove_cells {NangateOpenCellLibrary/BUF_X1} $out_rm_pwr
|
|
puts "PASS: remove + pwr_gnd"
|
|
|
|
set sz_rm_pwr [file size $out_rm_pwr]
|
|
puts "remove+pwr size=$sz_rm_pwr"
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 2: Write with remove_cells for multi-gate design
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 2: remove_cells on multi-gate design ---"
|
|
read_liberty ../../test/nangate45/Nangate45_typ.lib
|
|
read_verilog ../../dcalc/test/dcalc_multidriver_test.v
|
|
link_design dcalc_multidriver_test
|
|
|
|
set out_md_basic [make_result_file verilog_remove_md_basic.v]
|
|
write_verilog $out_md_basic
|
|
puts "PASS: multigate basic write"
|
|
|
|
# Remove INV_X1
|
|
set out_md_inv [make_result_file verilog_remove_md_inv.v]
|
|
write_verilog -remove_cells {NangateOpenCellLibrary/INV_X1} $out_md_inv
|
|
puts "PASS: multigate remove INV_X1"
|
|
|
|
# Remove AND2_X1
|
|
set out_md_and [make_result_file verilog_remove_md_and.v]
|
|
write_verilog -remove_cells {NangateOpenCellLibrary/AND2_X1} $out_md_and
|
|
puts "PASS: multigate remove AND2_X1"
|
|
|
|
# Remove NAND2_X1 and NOR2_X1
|
|
set out_md_gates [make_result_file verilog_remove_md_gates.v]
|
|
write_verilog -remove_cells {NangateOpenCellLibrary/NAND2_X1 NangateOpenCellLibrary/NOR2_X1} $out_md_gates
|
|
puts "PASS: multigate remove NAND+NOR"
|
|
|
|
# Compare sizes
|
|
set sz_md [file size $out_md_basic]
|
|
set sz_md_inv [file size $out_md_inv]
|
|
set sz_md_and [file size $out_md_and]
|
|
set sz_md_gates [file size $out_md_gates]
|
|
puts "multigate sizes: basic=$sz_md inv=$sz_md_inv and=$sz_md_and gates=$sz_md_gates"
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 3: Multiple re-reads of same file
|
|
# Exercises: module re-definition paths in VerilogReader
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 3: multiple re-reads ---"
|
|
|
|
# Read same file multiple times
|
|
read_liberty ../../test/nangate45/Nangate45_typ.lib
|
|
read_verilog verilog_test1.v
|
|
read_verilog verilog_test1.v
|
|
link_design verilog_test1
|
|
|
|
set cells_rr [get_cells *]
|
|
puts "re-read cells: [llength $cells_rr]"
|
|
|
|
set nets_rr [get_nets *]
|
|
puts "re-read nets: [llength $nets_rr]"
|
|
|
|
# Read different file then same file
|
|
read_liberty ../../test/nangate45/Nangate45_typ.lib
|
|
read_verilog verilog_bus_test.v
|
|
read_verilog verilog_test1.v
|
|
link_design verilog_test1
|
|
|
|
set cells_rr2 [get_cells *]
|
|
puts "re-read2 cells: [llength $cells_rr2]"
|
|
|
|
# Read same bus file multiple times
|
|
read_liberty ../../test/nangate45/Nangate45_typ.lib
|
|
read_verilog verilog_bus_test.v
|
|
read_verilog verilog_bus_test.v
|
|
read_verilog verilog_bus_test.v
|
|
link_design verilog_bus_test
|
|
|
|
set cells_rr3 [get_cells *]
|
|
puts "re-read3 bus cells: [llength $cells_rr3]"
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 4: Read back written file with removed cells
|
|
# Exercises: link_design with make_black_boxes when cells missing
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 4: read back removed cells ---"
|
|
|
|
read_liberty ../../test/nangate45/Nangate45_typ.lib
|
|
read_verilog $out_rm_buf
|
|
catch {
|
|
link_design verilog_test1
|
|
set rt_cells [get_cells *]
|
|
puts "roundtrip (buf removed) cells: [llength $rt_cells]"
|
|
} msg
|
|
puts "PASS: read back removed BUF_X1"
|
|
|
|
# Read back with all libs (should link normally)
|
|
read_liberty ../../test/nangate45/Nangate45_typ.lib
|
|
read_verilog $out_basic
|
|
link_design verilog_test1
|
|
|
|
set rt2_cells [get_cells *]
|
|
puts "roundtrip basic cells: [llength $rt2_cells]"
|
|
|
|
# Timing on roundtrip
|
|
create_clock -name clk -period 10 [get_ports clk]
|
|
set_input_delay -clock clk 0 [get_ports in1]
|
|
set_output_delay -clock clk 0 [get_ports out1]
|
|
set_input_transition 0.1 [all_inputs]
|
|
report_checks
|
|
puts "PASS: timing after roundtrip"
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 5: Write and re-read complex bus design with removes
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 5: complex bus with removes ---"
|
|
read_liberty ../../test/nangate45/Nangate45_typ.lib
|
|
read_verilog verilog_complex_bus_test.v
|
|
link_design verilog_complex_bus_test
|
|
|
|
set out_cb_rm [make_result_file verilog_remove_complex_buf.v]
|
|
write_verilog -remove_cells {NangateOpenCellLibrary/BUF_X1} $out_cb_rm
|
|
puts "PASS: complex bus remove BUF_X1"
|
|
|
|
set out_cb_rm2 [make_result_file verilog_remove_complex_dff.v]
|
|
write_verilog -remove_cells {NangateOpenCellLibrary/DFF_X1} $out_cb_rm2
|
|
puts "PASS: complex bus remove DFF_X1"
|
|
|
|
set sz_cb_rm1 [file size $out_cb_rm]
|
|
set sz_cb_rm2 [file size $out_cb_rm2]
|
|
puts "complex remove sizes: buf=$sz_cb_rm1 dff=$sz_cb_rm2"
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 6: Write assign/tristate design with removes
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 6: supply/tristate with removes ---"
|
|
read_liberty ../../test/nangate45/Nangate45_typ.lib
|
|
read_verilog verilog_supply_tristate.v
|
|
link_design verilog_supply_tristate
|
|
|
|
set out_st_rm [make_result_file verilog_remove_supply_buf.v]
|
|
write_verilog -remove_cells {NangateOpenCellLibrary/BUF_X1} $out_st_rm
|
|
puts "PASS: supply/tri remove BUF_X1"
|
|
|
|
set out_st_pwr [make_result_file verilog_remove_supply_pwr.v]
|
|
write_verilog -include_pwr_gnd -remove_cells {NangateOpenCellLibrary/INV_X1} $out_st_pwr
|
|
puts "PASS: supply/tri remove INV_X1 + pwr"
|
|
|
|
# Sizes
|
|
set sz_st_rm [file size $out_st_rm]
|
|
set sz_st_pwr [file size $out_st_pwr]
|
|
puts "supply remove sizes: buf=$sz_st_rm inv_pwr=$sz_st_pwr"
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 7: Write hierarchical design with removes
|
|
# Exercises: findHierChildren, writeChild remove path
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 7: hierarchical with removes ---"
|
|
read_liberty ../../test/nangate45/Nangate45_typ.lib
|
|
read_verilog ../../network/test/network_hier_test.v
|
|
link_design network_hier_test
|
|
|
|
set out_h_rm [make_result_file verilog_remove_hier_buf.v]
|
|
write_verilog -remove_cells {NangateOpenCellLibrary/BUF_X1} $out_h_rm
|
|
puts "PASS: hier remove BUF_X1"
|
|
|
|
set out_h_rm2 [make_result_file verilog_remove_hier_and.v]
|
|
write_verilog -remove_cells {NangateOpenCellLibrary/AND2_X1 NangateOpenCellLibrary/INV_X1} $out_h_rm2
|
|
puts "PASS: hier remove AND2+INV"
|
|
|
|
set sz_h_rm [file size $out_h_rm]
|
|
set sz_h_rm2 [file size $out_h_rm2]
|
|
puts "hier remove sizes: buf=$sz_h_rm and_inv=$sz_h_rm2"
|
|
|
|
# Read back hierarchical with removes
|
|
read_liberty ../../test/nangate45/Nangate45_typ.lib
|
|
read_verilog $out_h_rm
|
|
link_design network_hier_test
|
|
|
|
set rt_h_cells [get_cells *]
|
|
puts "hier roundtrip cells: [llength $rt_h_cells]"
|
|
|
|
set rt_h_hier [get_cells -hierarchical *]
|
|
puts "hier roundtrip hier cells: [llength $rt_h_hier]"
|
|
|
|
puts "ALL PASSED"
|