OpenSTA/verilog/test/verilog_bus_partselect.tcl

182 lines
5.9 KiB
Tcl

# Test VerilogReader and VerilogWriter with bus part-select, bit-select,
# concatenation expressions, hierarchical sub-modules with bus ports,
# and write_verilog roundtrip of bus designs.
# Targets: VerilogReader.cc uncovered:
# net_part_select_count_ (part-select parsing, line ~209)
# net_bit_select_count_ (bit-select, line ~207)
# net_port_ref_bit_count_ / net_port_ref_part_count_ (port ref bus)
# concat_count_ (concatenation expression, line ~214)
# makeCellPorts bus port handling
# makeModule with port_dcls (bus declarations)
# linkNetwork with hierarchical bus connections
# Also targets: VerilogWriter.cc:
# writeInstBusPin / writeInstBusPinBit (bus port writing)
# writeWireDcls (bus wire declaration, parseBusName)
# findHierChildren (hierarchical child discovery)
# writeModule for hierarchical modules
source ../../test/helpers.tcl
#---------------------------------------------------------------
# Test 1: Read verilog with bus expressions
#---------------------------------------------------------------
puts "--- Test 1: read bus partselect verilog ---"
read_liberty ../../test/nangate45/Nangate45_typ.lib
read_verilog verilog_bus_partselect.v
link_design verilog_bus_partselect
set cells [get_cells *]
puts "cells: [llength $cells]"
set nets [get_nets *]
puts "nets: [llength $nets]"
set ports [get_ports *]
puts "ports: [llength $ports]"
# Verify hierarchical instances
set hier_cells [get_cells -hierarchical *]
puts "hierarchical cells: [llength $hier_cells]"
puts "PASS: read bus partselect verilog"
#---------------------------------------------------------------
# Test 2: Timing analysis with bus design
#---------------------------------------------------------------
puts "--- Test 2: timing ---"
create_clock -name clk -period 10 [get_ports clk]
set_input_delay -clock clk 0 [get_ports data_in*]
set_input_delay -clock clk 0 [get_ports sel]
set_output_delay -clock clk 0 [get_ports data_out*]
set_output_delay -clock clk 0 [get_ports valid]
set_input_transition 0.1 [all_inputs]
report_checks
puts "PASS: report_checks"
report_checks -path_delay min
puts "PASS: min path"
report_checks -from [get_ports {data_in[0]}] -to [get_ports {data_out[0]}]
puts "PASS: data_in[0]->data_out[0]"
report_checks -from [get_ports {data_in[4]}] -to [get_ports {data_out[4]}]
puts "PASS: data_in[4]->data_out[4]"
report_checks -from [get_ports sel] -to [get_ports valid]
puts "PASS: sel->valid"
report_checks -fields {slew cap input_pins nets fanout}
puts "PASS: report with fields"
#---------------------------------------------------------------
# Test 3: Write verilog with bus nets (exercises bus wire dcls)
#---------------------------------------------------------------
puts "--- Test 3: write verilog ---"
set out1 [make_result_file verilog_bus_ps_basic.v]
write_verilog $out1
set sz1 [file size $out1]
puts "basic write: $sz1 bytes"
puts "PASS: basic write"
# With power/ground
set out2 [make_result_file verilog_bus_ps_pwr.v]
write_verilog -include_pwr_gnd $out2
set sz2 [file size $out2]
puts "pwr_gnd write: $sz2 bytes"
if { $sz2 >= $sz1 } {
puts "PASS: pwr_gnd >= basic"
}
# With remove_cells (empty)
set out3 [make_result_file verilog_bus_ps_remove.v]
write_verilog -remove_cells {} $out3
set sz3 [file size $out3]
puts "remove_cells write: $sz3 bytes"
puts "PASS: remove_cells write"
#---------------------------------------------------------------
# Test 4: Read back written verilog (roundtrip)
# Exercises: VerilogReader re-parsing bus declarations from writer output
#---------------------------------------------------------------
puts "--- Test 4: roundtrip ---"
read_liberty ../../test/nangate45/Nangate45_typ.lib
read_verilog $out1
link_design verilog_bus_partselect
set cells2 [get_cells *]
puts "roundtrip cells: [llength $cells2]"
create_clock -name clk -period 10 [get_ports clk]
set_input_delay -clock clk 0 [all_inputs]
set_output_delay -clock clk 0 [all_outputs]
set_input_transition 0.1 [all_inputs]
report_checks
puts "PASS: roundtrip timing"
# Write again to see if sizes match
set out4 [make_result_file verilog_bus_ps_roundtrip2.v]
write_verilog $out4
set sz4 [file size $out4]
puts "roundtrip2 write: $sz4 bytes"
puts "PASS: roundtrip write"
#---------------------------------------------------------------
# Test 5: Instance and net reports for bus design
#---------------------------------------------------------------
puts "--- Test 5: reports ---"
# Report bus nets
foreach net_name {buf_out[0] buf_out[1] buf_out[7] inv_out[0] inv_out[7] mux_out[0] mux_out[7]} {
catch {report_net $net_name} msg
puts "report_net $net_name: done"
}
# Report instances in hierarchy
foreach inst_name {buf0 buf7 inv0 inv3 reg0 reg7 or01 mux_lo0} {
catch {report_instance $inst_name} msg
puts "report_instance $inst_name: done"
}
puts "PASS: instance/net reports"
#---------------------------------------------------------------
# Test 6: Hierarchical queries
#---------------------------------------------------------------
puts "--- Test 6: hierarchical queries ---"
# Query through hierarchical path
catch {report_checks -through [get_pins buf0/Z]} msg
puts "through buf0/Z: done"
catch {report_checks -through [get_pins inv0/ZN]} msg
puts "through inv0/ZN: done"
catch {report_checks -through [get_pins mux_lo0/ZN]} msg
puts "through mux_lo0/ZN: done"
puts "PASS: hierarchical queries"
#---------------------------------------------------------------
# Test 7: Network modification in bus design
#---------------------------------------------------------------
puts "--- Test 7: modify bus design ---"
# Add an extra buffer on a bus bit
set nn [make_net "extra_bus_wire"]
set ni [make_instance "extra_buf_bus" NangateOpenCellLibrary/BUF_X2]
connect_pin extra_bus_wire extra_buf_bus/A
set out5 [make_result_file verilog_bus_ps_modified.v]
write_verilog $out5
set sz5 [file size $out5]
puts "modified write: $sz5 bytes"
disconnect_pin extra_bus_wire extra_buf_bus/A
delete_instance extra_buf_bus
delete_net extra_bus_wire
puts "PASS: bus design modification"
puts "ALL PASSED"