# 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. 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]" #--------------------------------------------------------------- # 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 report_checks -path_delay min report_checks -from [get_ports {data_in[0]}] -to [get_ports {data_out[0]}] report_checks -from [get_ports {data_in[4]}] -to [get_ports {data_out[4]}] report_checks -from [get_ports sel] -to [get_ports valid] report_checks -fields {slew cap input_pins nets fanout} #--------------------------------------------------------------- # 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" # 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" # 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" #--------------------------------------------------------------- # 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 # 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" #--------------------------------------------------------------- # 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]} { report_net $net_name puts "report_net $net_name: done" } # Report instances in hierarchy foreach inst_name {buf0 buf7 inv0 inv3 reg0 reg7 or01 mux_lo0} { report_instance $inst_name puts "report_instance $inst_name: done" } #--------------------------------------------------------------- # Test 6: Hierarchical queries #--------------------------------------------------------------- puts "--- Test 6: hierarchical queries ---" # Query through hierarchical path report_checks -through [get_pins buf0/Z] puts "through buf0/Z: done" report_checks -through [get_pins inv0/ZN] puts "through inv0/ZN: done" report_checks -through [get_pins mux_lo0/ZN] puts "through mux_lo0/ZN: done" #--------------------------------------------------------------- # 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