OpenSTA/verilog/test/verilog_hier_write.tcl

109 lines
3.8 KiB
Tcl

# Test verilog writer with larger GCD design (sky130hd)
# Targets: VerilogWriter.cc (writeModules, findHierChildren, writeChildren,
# writeChild, writeInstPin, writeWireDcls, writePorts, writePortDcls,
# verilogPortDir for various directions, findUnconnectedNetCount)
# Also targets: VerilogReader.cc (bus port reading, large netlist parsing,
# makeModuleInst, linkNetwork, various cell types, declaration handling)
source ../../test/helpers.tcl
suppress_msg 1140
#---------------------------------------------------------------
# Test 1: Read and write GCD sky130hd design (large design)
#---------------------------------------------------------------
puts "--- Test 1: read GCD sky130hd ---"
read_liberty ../../test/sky130hd/sky130_fd_sc_hd__tt_025C_1v80.lib
read_verilog ../../examples/gcd_sky130hd.v
link_design gcd
set cells [get_cells *]
puts "cells: [llength $cells]"
set nets [get_nets *]
puts "nets: [llength $nets]"
set ports [get_ports *]
puts "ports: [llength $ports]"
# Check bus ports exist
set req_msg_ports [get_ports req_msg*]
puts "req_msg* ports: [llength $req_msg_ports]"
set resp_msg_ports [get_ports resp_msg*]
puts "resp_msg* ports: [llength $resp_msg_ports]"
# Query specific ports
foreach pname {clk reset req_val req_rdy resp_val resp_rdy} {
set p [get_ports $pname]
puts "$pname dir=[get_property $p direction]"
}
#---------------------------------------------------------------
# Test 2: Write verilog - basic
#---------------------------------------------------------------
puts "--- Test 2: write_verilog basic ---"
set out1 [make_result_file verilog_hier_basic.v]
write_verilog $out1
#---------------------------------------------------------------
# Test 3: Write verilog with -include_pwr_gnd
#---------------------------------------------------------------
puts "--- Test 3: write_verilog -include_pwr_gnd ---"
set out2 [make_result_file verilog_hier_pwr.v]
write_verilog -include_pwr_gnd $out2
diff_files verilog_hier_basic.vok $out1
diff_files verilog_hier_pwr.vok $out2
#---------------------------------------------------------------
# Test 4: Write verilog with -remove_cells
#---------------------------------------------------------------
puts "--- Test 4: write_verilog -remove_cells ---"
set out3 [make_result_file verilog_hier_remove.v]
write_verilog -remove_cells {} $out3
#---------------------------------------------------------------
# Test 5: Read back the written verilog (roundtrip)
#---------------------------------------------------------------
puts "--- Test 5: read back written verilog ---"
read_liberty ../../test/sky130hd/sky130_fd_sc_hd__tt_025C_1v80.lib
read_verilog $out1
link_design gcd
set cells2 [get_cells *]
puts "roundtrip cells: [llength $cells2]"
set nets2 [get_nets *]
puts "roundtrip nets: [llength $nets2]"
set ports2 [get_ports *]
puts "roundtrip ports: [llength $ports2]"
# Write again after roundtrip
set out4 [make_result_file verilog_hier_roundtrip.v]
write_verilog $out4
#---------------------------------------------------------------
# Test 6: Set up timing and report with bus ports
#---------------------------------------------------------------
puts "--- Test 6: timing with bus ports ---"
create_clock -name clk -period 10 [get_ports clk]
set_input_delay -clock clk 0 [get_ports {reset req_val req_msg* resp_rdy}]
set_output_delay -clock clk 0 [all_outputs]
report_checks
report_checks -path_delay min
report_checks -fields {slew cap input_pins fanout}
#---------------------------------------------------------------
# Test 7: Write verilog after timing setup (tests more writer paths)
#---------------------------------------------------------------
puts "--- Test 7: write after timing setup ---"
set out5 [make_result_file verilog_hier_post_timing.v]
write_verilog $out5
set out6 [make_result_file verilog_hier_post_timing_pwr.v]
write_verilog -include_pwr_gnd $out6