192 lines
5.5 KiB
Tcl
192 lines
5.5 KiB
Tcl
# Test graph modification: add/delete vertices via connect_pin/disconnect_pin,
|
|
# delete_instance, replace_cell, and repeated graph rebuild.
|
|
# Targets:
|
|
# Graph.cc: deleteVertex, deleteInEdge, deleteOutEdge,
|
|
# makePinVertices, makeVertex, makeWireEdgesFromPin (multi-driver),
|
|
# hasFaninOne, makeInstEdges after replace_cell,
|
|
# removeWireEdge, removeInstEdge on disconnect/reconnect,
|
|
# reg_clk_vertices_ insert/erase on add/delete reg
|
|
|
|
source ../../test/helpers.tcl
|
|
|
|
read_liberty ../../test/nangate45/Nangate45_typ.lib
|
|
read_verilog graph_delete_modify.v
|
|
link_design graph_delete_modify
|
|
|
|
create_clock -name clk -period 10 [get_ports clk]
|
|
set_input_delay -clock clk 1.0 [get_ports {d1 d2 d3 rst}]
|
|
set_output_delay -clock clk 1.0 [get_ports {q1 q2 q3 q4}]
|
|
set_input_transition 0.1 [get_ports {d1 d2 d3 rst clk}]
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 1: Baseline timing
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 1: baseline ---"
|
|
report_checks
|
|
|
|
report_checks -path_delay min
|
|
|
|
report_checks -fields {slew cap input_pins nets fanout}
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 2: Add multiple instances and nets, then delete
|
|
# Exercises: makeVertex, makeWireEdgesFromPin, deleteVertex,
|
|
# deleteInEdge, deleteOutEdge
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 2: add/delete multiple instances ---"
|
|
|
|
# Add a buffer chain
|
|
set net_a [make_net test_net_a]
|
|
set net_b [make_net test_net_b]
|
|
set net_c [make_net test_net_c]
|
|
set inst_a [make_instance test_buf_a NangateOpenCellLibrary/BUF_X1]
|
|
set inst_b [make_instance test_buf_b NangateOpenCellLibrary/BUF_X2]
|
|
|
|
connect_pin test_net_a test_buf_a/A
|
|
connect_pin test_net_b test_buf_a/Z
|
|
connect_pin test_net_b test_buf_b/A
|
|
connect_pin test_net_c test_buf_b/Z
|
|
|
|
report_checks
|
|
|
|
# Disconnect middle and verify
|
|
disconnect_pin test_net_b test_buf_b/A
|
|
report_checks
|
|
|
|
# Reconnect
|
|
connect_pin test_net_b test_buf_b/A
|
|
report_checks
|
|
|
|
# Full cleanup
|
|
disconnect_pin test_net_a test_buf_a/A
|
|
disconnect_pin test_net_b test_buf_a/Z
|
|
disconnect_pin test_net_b test_buf_b/A
|
|
disconnect_pin test_net_c test_buf_b/Z
|
|
delete_instance test_buf_a
|
|
delete_instance test_buf_b
|
|
delete_net test_net_a
|
|
delete_net test_net_b
|
|
delete_net test_net_c
|
|
|
|
report_checks
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 3: Replace cell multiple times
|
|
# Exercises: makeInstEdges rebuild, edge arc changes
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 3: replace_cell ---"
|
|
|
|
replace_cell buf1 NangateOpenCellLibrary/BUF_X4
|
|
report_checks
|
|
report_edges -from [get_pins buf1/A] -to [get_pins buf1/Z]
|
|
|
|
replace_cell buf1 NangateOpenCellLibrary/BUF_X2
|
|
report_checks
|
|
|
|
replace_cell buf1 NangateOpenCellLibrary/BUF_X1
|
|
report_checks
|
|
|
|
replace_cell and1 NangateOpenCellLibrary/AND2_X2
|
|
report_checks
|
|
|
|
replace_cell and1 NangateOpenCellLibrary/AND2_X1
|
|
report_checks
|
|
|
|
replace_cell inv1 NangateOpenCellLibrary/INV_X2
|
|
report_checks
|
|
|
|
replace_cell inv1 NangateOpenCellLibrary/INV_X1
|
|
report_checks
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 4: Add and delete register instances
|
|
# Exercises: reg_clk_vertices_ insert/erase in makeVertex/deleteVertex
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 4: add/delete register ---"
|
|
|
|
set reg_net [make_net reg_test_net]
|
|
set reg_qnet [make_net reg_test_qnet]
|
|
set reg_inst [make_instance test_reg NangateOpenCellLibrary/DFF_X1]
|
|
|
|
connect_pin reg_test_net test_reg/D
|
|
connect_pin reg_test_qnet test_reg/Q
|
|
|
|
# Connect clock to new register
|
|
set clk_net_name "clk"
|
|
connect_pin $clk_net_name test_reg/CK
|
|
|
|
report_checks
|
|
|
|
# Remove the register
|
|
disconnect_pin $clk_net_name test_reg/CK
|
|
disconnect_pin reg_test_net test_reg/D
|
|
disconnect_pin reg_test_qnet test_reg/Q
|
|
delete_instance test_reg
|
|
delete_net reg_test_net
|
|
delete_net reg_test_qnet
|
|
|
|
report_checks
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 5: Rapid connect/disconnect on same pin
|
|
# Exercises: edge create/delete cycling
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 5: rapid connect/disconnect ---"
|
|
|
|
set tmp_net [make_net tmp_net]
|
|
set tmp_inst [make_instance tmp_buf NangateOpenCellLibrary/BUF_X1]
|
|
|
|
# Cycle 1
|
|
connect_pin tmp_net tmp_buf/A
|
|
report_checks
|
|
disconnect_pin tmp_net tmp_buf/A
|
|
puts "cycle 1 done"
|
|
|
|
# Cycle 2
|
|
connect_pin tmp_net tmp_buf/A
|
|
report_checks
|
|
disconnect_pin tmp_net tmp_buf/A
|
|
puts "cycle 2 done"
|
|
|
|
# Cycle 3
|
|
connect_pin tmp_net tmp_buf/A
|
|
report_checks
|
|
disconnect_pin tmp_net tmp_buf/A
|
|
puts "cycle 3 done"
|
|
|
|
delete_instance tmp_buf
|
|
delete_net tmp_net
|
|
|
|
report_checks
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 6: Edge queries after all modifications
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 6: edge queries ---"
|
|
|
|
foreach cell_name {buf1 buf2 inv1 and1 or1 nand1 nor1 reg1 reg2 reg3 reg4} {
|
|
set edges [get_timing_edges -of_objects [get_cells $cell_name]]
|
|
puts "$cell_name edges: [llength $edges]"
|
|
}
|
|
|
|
# Slew queries
|
|
report_slews [get_ports d1]
|
|
report_slews [get_ports d2]
|
|
report_slews [get_ports d3]
|
|
report_slews [get_pins buf1/Z]
|
|
report_slews [get_pins and1/ZN]
|
|
report_slews [get_pins reg1/Q]
|
|
|
|
#---------------------------------------------------------------
|
|
# Test 7: Through-pin paths
|
|
#---------------------------------------------------------------
|
|
puts "--- Test 7: through pins ---"
|
|
report_checks -through [get_pins nand1/ZN]
|
|
puts "through nand1: done"
|
|
|
|
report_checks -through [get_pins nor1/ZN]
|
|
puts "through nor1: done"
|
|
|
|
report_checks -through [get_pins and1/ZN]
|
|
puts "through and1: done"
|