245 lines
7.5 KiB
Tcl
245 lines
7.5 KiB
Tcl
|
|
# Test SdcNetwork namespace switching and VerilogNamespace escape handling.
|
||
|
|
# Targets:
|
||
|
|
# SdcNetwork.cc: findPort, findPin, findNet with SdcNetwork name adapter,
|
||
|
|
# escapeDividers, escapeBrackets, portDirection, findInstancesMatching,
|
||
|
|
# findPinsHierMatching, findNetsMatching, findNetsHierMatching,
|
||
|
|
# NetworkNameAdapter port/pin/net/instance delegation methods
|
||
|
|
# VerilogNamespace.cc: staToVerilog, staToVerilog2, verilogToSta,
|
||
|
|
# cellVerilogName, instanceVerilogName, netVerilogName, portVerilogName,
|
||
|
|
# moduleVerilogToSta, instanceVerilogToSta, netVerilogToSta,
|
||
|
|
# portVerilogToSta
|
||
|
|
# Network.cc: setPathDivider, setPathEscape, pathDivider, pathEscape,
|
||
|
|
# findPin(path_name), findNet(path_name), findInstance(path_name)
|
||
|
|
# ParseBus.cc: parseBusName, isBusName, escapeChars
|
||
|
|
|
||
|
|
source ../../test/helpers.tcl
|
||
|
|
|
||
|
|
read_liberty ../../test/nangate45/Nangate45_typ.lib
|
||
|
|
|
||
|
|
#---------------------------------------------------------------
|
||
|
|
# Test 1: SDC namespace operations with flat design
|
||
|
|
#---------------------------------------------------------------
|
||
|
|
puts "--- Test 1: SDC namespace with flat design ---"
|
||
|
|
read_verilog ../../verilog/test/verilog_bus_test.v
|
||
|
|
link_design verilog_bus_test
|
||
|
|
|
||
|
|
create_clock -name clk -period 10 [get_ports clk]
|
||
|
|
set_input_delay -clock clk 0 [get_ports {data_in[*]}]
|
||
|
|
set_output_delay -clock clk 0 [get_ports {data_out[*]}]
|
||
|
|
set_input_delay -clock clk 0 [get_ports {sel enable}]
|
||
|
|
set_input_transition 0.1 [all_inputs]
|
||
|
|
|
||
|
|
# Switch to SDC namespace
|
||
|
|
sta::set_cmd_namespace sdc
|
||
|
|
puts "PASS: set_cmd_namespace sdc"
|
||
|
|
|
||
|
|
# Query in SDC namespace - exercises SdcNetwork name adapter path
|
||
|
|
set sdc_ports [get_ports *]
|
||
|
|
puts "sdc ports: [llength $sdc_ports]"
|
||
|
|
|
||
|
|
set sdc_cells [get_cells *]
|
||
|
|
puts "sdc cells: [llength $sdc_cells]"
|
||
|
|
|
||
|
|
set sdc_nets [get_nets *]
|
||
|
|
puts "sdc nets: [llength $sdc_nets]"
|
||
|
|
|
||
|
|
# Bus port queries in SDC namespace
|
||
|
|
set sdc_bus_in [get_ports {data_in[*]}]
|
||
|
|
puts "sdc data_in[*]: [llength $sdc_bus_in]"
|
||
|
|
|
||
|
|
set sdc_bus_out [get_ports {data_out[*]}]
|
||
|
|
puts "sdc data_out[*]: [llength $sdc_bus_out]"
|
||
|
|
|
||
|
|
# Individual bit queries in SDC namespace
|
||
|
|
foreach i {0 1 2 3} {
|
||
|
|
catch {
|
||
|
|
set p [get_ports "data_in\[$i\]"]
|
||
|
|
set dir [get_property $p direction]
|
||
|
|
puts "sdc data_in\[$i\]: dir=$dir"
|
||
|
|
} msg
|
||
|
|
}
|
||
|
|
|
||
|
|
# Pin queries in SDC namespace
|
||
|
|
set sdc_pins [get_pins */*]
|
||
|
|
puts "sdc flat pins: [llength $sdc_pins]"
|
||
|
|
|
||
|
|
set sdc_hier_pins [get_pins -hierarchical *]
|
||
|
|
puts "sdc hier pins: [llength $sdc_hier_pins]"
|
||
|
|
|
||
|
|
# Net queries in SDC namespace
|
||
|
|
set sdc_n_nets [get_nets n*]
|
||
|
|
puts "sdc n* nets: [llength $sdc_n_nets]"
|
||
|
|
|
||
|
|
set sdc_hier_nets [get_nets -hierarchical *]
|
||
|
|
puts "sdc hier nets: [llength $sdc_hier_nets]"
|
||
|
|
|
||
|
|
# Instance queries in SDC namespace
|
||
|
|
set sdc_buf_cells [get_cells buf*]
|
||
|
|
puts "sdc buf* cells: [llength $sdc_buf_cells]"
|
||
|
|
|
||
|
|
set sdc_and_cells [get_cells and*]
|
||
|
|
puts "sdc and* cells: [llength $sdc_and_cells]"
|
||
|
|
|
||
|
|
set sdc_reg_cells [get_cells reg*]
|
||
|
|
puts "sdc reg* cells: [llength $sdc_reg_cells]"
|
||
|
|
|
||
|
|
# Hierarchical cell queries in SDC namespace
|
||
|
|
set sdc_hier_cells [get_cells -hierarchical *]
|
||
|
|
puts "sdc hier cells: [llength $sdc_hier_cells]"
|
||
|
|
|
||
|
|
# report_checks in SDC namespace
|
||
|
|
report_checks
|
||
|
|
puts "PASS: sdc namespace report_checks"
|
||
|
|
|
||
|
|
report_checks -path_delay min
|
||
|
|
puts "PASS: sdc namespace min path"
|
||
|
|
|
||
|
|
# Switch back to STA namespace
|
||
|
|
sta::set_cmd_namespace sta
|
||
|
|
puts "PASS: sta::set_cmd_namespace sta"
|
||
|
|
|
||
|
|
# Verify queries still work after switching back
|
||
|
|
set sta_ports [get_ports *]
|
||
|
|
puts "sta ports: [llength $sta_ports]"
|
||
|
|
|
||
|
|
set sta_cells [get_cells *]
|
||
|
|
puts "sta cells: [llength $sta_cells]"
|
||
|
|
|
||
|
|
set sta_nets [get_nets *]
|
||
|
|
puts "sta nets: [llength $sta_nets]"
|
||
|
|
|
||
|
|
report_checks
|
||
|
|
puts "PASS: sta namespace report_checks"
|
||
|
|
|
||
|
|
#---------------------------------------------------------------
|
||
|
|
# Test 2: Namespace with hierarchical design
|
||
|
|
#---------------------------------------------------------------
|
||
|
|
puts "--- Test 2: SDC namespace with hierarchical design ---"
|
||
|
|
read_liberty ../../test/nangate45/Nangate45_typ.lib
|
||
|
|
read_verilog network_hier_test.v
|
||
|
|
link_design network_hier_test
|
||
|
|
|
||
|
|
create_clock -name clk -period 10 [get_ports clk]
|
||
|
|
set_input_delay -clock clk 0 [get_ports {in1 in2 in3}]
|
||
|
|
set_output_delay -clock clk 0 [get_ports {out1 out2}]
|
||
|
|
set_input_transition 0.1 [all_inputs]
|
||
|
|
|
||
|
|
# Switch to SDC namespace and query hierarchical objects
|
||
|
|
sta::set_cmd_namespace sdc
|
||
|
|
|
||
|
|
# Hierarchical queries in SDC namespace
|
||
|
|
set sdc_h_cells [get_cells -hierarchical *]
|
||
|
|
puts "sdc hier cells: [llength $sdc_h_cells]"
|
||
|
|
|
||
|
|
set sdc_h_pins [get_pins -hierarchical *]
|
||
|
|
puts "sdc hier pins: [llength $sdc_h_pins]"
|
||
|
|
|
||
|
|
set sdc_h_nets [get_nets -hierarchical *]
|
||
|
|
puts "sdc hier nets: [llength $sdc_h_nets]"
|
||
|
|
|
||
|
|
# Specific patterns in SDC namespace
|
||
|
|
set sdc_sub_cells [get_cells sub*]
|
||
|
|
puts "sdc sub* cells: [llength $sdc_sub_cells]"
|
||
|
|
|
||
|
|
set sdc_h_sub [get_cells -hierarchical sub*]
|
||
|
|
puts "sdc hier sub*: [llength $sdc_h_sub]"
|
||
|
|
|
||
|
|
# Port queries in SDC namespace with hierarchy
|
||
|
|
foreach pname {clk in1 in2 in3 out1 out2} {
|
||
|
|
catch {
|
||
|
|
set p [get_ports $pname]
|
||
|
|
set dir [get_property $p direction]
|
||
|
|
puts "sdc port $pname: dir=$dir"
|
||
|
|
} msg
|
||
|
|
}
|
||
|
|
|
||
|
|
# Timing reports in SDC namespace
|
||
|
|
report_checks
|
||
|
|
puts "PASS: sdc hier report_checks"
|
||
|
|
|
||
|
|
report_checks -from [get_ports in1] -to [get_ports out1]
|
||
|
|
puts "PASS: sdc hier in1->out1"
|
||
|
|
|
||
|
|
# Switch back to STA namespace
|
||
|
|
sta::set_cmd_namespace sta
|
||
|
|
|
||
|
|
# Verify after switching
|
||
|
|
report_checks
|
||
|
|
puts "PASS: sta hier report_checks after switch"
|
||
|
|
|
||
|
|
#---------------------------------------------------------------
|
||
|
|
# Test 3: Path divider operations
|
||
|
|
#---------------------------------------------------------------
|
||
|
|
puts "--- Test 3: path divider ---"
|
||
|
|
read_liberty ../../test/nangate45/Nangate45_typ.lib
|
||
|
|
read_verilog network_hier_test.v
|
||
|
|
link_design network_hier_test
|
||
|
|
|
||
|
|
create_clock -name clk -period 10 [get_ports clk]
|
||
|
|
set_input_delay -clock clk 0 [get_ports {in1 in2 in3}]
|
||
|
|
set_output_delay -clock clk 0 [get_ports {out1 out2}]
|
||
|
|
set_input_transition 0.1 [all_inputs]
|
||
|
|
|
||
|
|
# Query with default divider
|
||
|
|
set pins1 [get_pins sub1/*]
|
||
|
|
puts "sub1/* pins (default divider): [llength $pins1]"
|
||
|
|
|
||
|
|
# Try hierarchical pattern
|
||
|
|
set hier_pins1 [get_pins -hierarchical sub1/*]
|
||
|
|
puts "hier sub1/* pins: [llength $hier_pins1]"
|
||
|
|
|
||
|
|
# Query instances
|
||
|
|
set inst_sub1 [get_cells sub1]
|
||
|
|
puts "sub1 cell ref: [get_property $inst_sub1 ref_name]"
|
||
|
|
|
||
|
|
# Query nets
|
||
|
|
set all_nets [get_nets *]
|
||
|
|
puts "all nets: [llength $all_nets]"
|
||
|
|
|
||
|
|
set hier_all_nets [get_nets -hierarchical *]
|
||
|
|
puts "hier all nets: [llength $hier_all_nets]"
|
||
|
|
|
||
|
|
# Timing through hierarchy
|
||
|
|
report_checks -from [get_ports in1] -to [get_ports out1]
|
||
|
|
puts "PASS: in1->out1"
|
||
|
|
|
||
|
|
report_checks -from [get_ports in2] -to [get_ports out2]
|
||
|
|
puts "PASS: in2->out2"
|
||
|
|
|
||
|
|
report_checks -from [get_ports in3] -to [get_ports out2]
|
||
|
|
puts "PASS: in3->out2"
|
||
|
|
|
||
|
|
# Fanin/fanout queries exercise SdcNetwork delegation
|
||
|
|
set fi [get_fanin -to [get_ports out1] -flat]
|
||
|
|
puts "fanin to out1 flat: [llength $fi]"
|
||
|
|
|
||
|
|
set fo [get_fanout -from [get_ports in1] -flat]
|
||
|
|
puts "fanout from in1 flat: [llength $fo]"
|
||
|
|
|
||
|
|
set fi_cells [get_fanin -to [get_ports out2] -only_cells]
|
||
|
|
puts "fanin to out2 cells: [llength $fi_cells]"
|
||
|
|
|
||
|
|
set fo_ends [get_fanout -from [get_ports in3] -endpoints_only]
|
||
|
|
puts "fanout from in3 endpoints: [llength $fo_ends]"
|
||
|
|
|
||
|
|
#---------------------------------------------------------------
|
||
|
|
# Test 4: register queries through SdcNetwork
|
||
|
|
#---------------------------------------------------------------
|
||
|
|
puts "--- Test 4: register queries ---"
|
||
|
|
set regs [all_registers]
|
||
|
|
puts "all_registers: [llength $regs]"
|
||
|
|
|
||
|
|
set reg_data [all_registers -data_pins]
|
||
|
|
puts "register data_pins: [llength $reg_data]"
|
||
|
|
|
||
|
|
set reg_clk [all_registers -clock_pins]
|
||
|
|
puts "register clock_pins: [llength $reg_clk]"
|
||
|
|
|
||
|
|
set reg_out [all_registers -output_pins]
|
||
|
|
puts "register output_pins: [llength $reg_out]"
|
||
|
|
|
||
|
|
set reg_async [all_registers -async_pins]
|
||
|
|
puts "register async_pins: [llength $reg_async]"
|
||
|
|
|
||
|
|
puts "ALL PASSED"
|