OpenSTA/search/test/search_network_sta_deep.tcl

293 lines
9.2 KiB
Tcl

# Test network editing, slow_drivers, replace_cell, connect/disconnect,
# parasitic-related functions, annotated delay/slew, and misc Sta.cc paths.
# Targets: Sta.cc makeInstance, deleteInstance, replaceCell, makeNet,
# deleteNet, connectPin, disconnectPin, makePortPin,
# slowDrivers, reportParasiticAnnotation,
# removeDelaySlewAnnotations, setArcDelay, setAnnotatedSlew,
# setPortExtPinCap, setPortExtWireCap, setPortExtFanout,
# setNetWireCap, connectedCap, setResistance,
# networkChanged, delaysInvalidFrom, replaceEquivCellBefore/After,
# Search.cc reportArrivals, reportTags, reportClkInfos,
# reportTagGroups, reportPathCountHistogram
source ../../test/helpers.tcl
read_liberty ../../test/nangate45/Nangate45_typ.lib
read_verilog search_test1.v
link_design search_test1
create_clock -name clk -period 10 [get_ports clk]
set_input_delay -clock clk 1.0 [get_ports in1]
set_input_delay -clock clk 1.0 [get_ports in2]
set_output_delay -clock clk 2.0 [get_ports out1]
# Baseline
report_checks -path_delay max > /dev/null
############################################################
# slow_drivers
############################################################
puts "--- slow_drivers ---"
set slow [sta::slow_drivers 3]
puts "slow drivers count: [llength $slow]"
foreach s $slow {
catch { puts " [get_full_name $s]" }
}
puts "PASS: slow_drivers"
############################################################
# Port external pin cap / wire cap / fanout
############################################################
puts "--- set_load (port ext pin cap) ---"
set_load -pin_load 0.01 [get_ports out1]
report_checks -path_delay max
puts "PASS: port ext pin cap"
puts "--- set_load -wire_load ---"
set_load -wire_load 0.005 [get_ports out1]
report_checks -path_delay max
puts "PASS: port ext wire cap"
puts "--- set_fanout_load ---"
set_fanout_load 4 [get_ports out1]
report_checks -path_delay max
puts "PASS: port ext fanout"
############################################################
# Input drive / slew
############################################################
puts "--- set_input_transition ---"
set_input_transition 0.1 [get_ports in1]
report_checks -path_delay max
puts "PASS: input_transition"
puts "--- set_drive ---"
catch {
set_drive 100 [get_ports in1]
report_checks -path_delay max
}
puts "PASS: set_drive"
puts "--- set_driving_cell ---"
set_driving_cell -lib_cell BUF_X1 -pin Z [get_ports in1]
report_checks -path_delay max
puts "PASS: driving_cell"
############################################################
# set_net_wire_cap (if net wire delay mode)
############################################################
puts "--- set_wire_load_mode ---"
catch {
set_wire_load_mode enclosed
report_checks -path_delay max
}
puts "PASS: wire_load_mode"
############################################################
# Tag, group, info reporting
############################################################
puts "--- report_tags ---"
catch { sta::report_tags }
puts "PASS: report_tags"
puts "--- report_clk_infos ---"
catch { sta::report_clk_infos }
puts "PASS: report_clk_infos"
puts "--- report_tag_groups ---"
catch { sta::report_tag_groups }
puts "PASS: report_tag_groups"
puts "--- report_path_count_histogram ---"
catch { sta::report_path_count_histogram }
puts "PASS: report_path_count_histogram"
puts "--- tag/group/path counts ---"
puts "tags: [sta::tag_count]"
puts "tag_groups: [sta::tag_group_count]"
puts "clk_infos: [sta::clk_info_count]"
puts "paths: [sta::path_count]"
puts "PASS: counts"
############################################################
# report_tag_arrivals for a vertex
############################################################
puts "--- report_tag_arrivals ---"
set v [sta::worst_slack_vertex max]
if { $v != "NULL" } {
catch { sta::report_tag_arrivals_cmd $v 1 }
catch { sta::report_tag_arrivals_cmd $v 0 }
}
puts "PASS: report_tag_arrivals"
############################################################
# report_arrival_entries / report_required_entries
############################################################
puts "--- report_arrival_entries ---"
catch { sta::report_arrival_entries }
puts "PASS: report_arrival_entries"
puts "--- report_required_entries ---"
catch { sta::report_required_entries }
puts "PASS: report_required_entries"
############################################################
# find_requireds
############################################################
puts "--- find_requireds ---"
sta::find_requireds
puts "PASS: find_requireds"
############################################################
# report_annotated_delay / report_annotated_check
############################################################
puts "--- report_annotated_delay ---"
catch { report_annotated_delay }
puts "PASS: report_annotated_delay"
puts "--- report_annotated_check ---"
catch { report_annotated_check }
puts "PASS: report_annotated_check"
############################################################
# report_disabled_edges
############################################################
puts "--- report_disabled_edges ---"
report_disabled_edges
puts "PASS: report_disabled_edges"
############################################################
# Network editing: make_instance, connect, disconnect
############################################################
puts "--- network editing ---"
set edit_net [make_net new_net]
puts "new_net: [get_full_name $edit_net]"
puts "PASS: make_net"
puts "--- make_instance ---"
set new_inst [make_instance new_buf BUF_X1]
puts "new_inst: [get_full_name $new_inst]"
puts "PASS: make_instance"
puts "--- connect_pin ---"
connect_pin $edit_net new_buf/A
puts "PASS: connect_pin A"
connect_pin $edit_net new_buf/Z
puts "PASS: connect_pin Z"
puts "--- disconnect_pin ---"
disconnect_pin $edit_net new_buf/Z
puts "PASS: disconnect_pin"
puts "--- disconnect_pin A ---"
disconnect_pin $edit_net new_buf/A
puts "PASS: disconnect_pin A"
puts "--- delete_instance ---"
delete_instance $new_inst
puts "PASS: delete_instance"
puts "--- delete_net ---"
delete_net $edit_net
puts "PASS: delete_net"
############################################################
# replace_cell
############################################################
puts "--- replace_cell ---"
set old_inst [get_cells buf1]
replace_cell $old_inst BUF_X2
report_checks -path_delay max
puts "PASS: replace_cell"
puts "--- replace_cell back ---"
replace_cell $old_inst BUF_X1
report_checks -path_delay max
puts "PASS: replace_cell back"
############################################################
# write_verilog
############################################################
puts "--- write_verilog ---"
set verilog_out [make_result_file "search_test1_edited.v"]
write_verilog $verilog_out
puts "PASS: write_verilog"
############################################################
# write_sdc
############################################################
puts "--- write_sdc ---"
set sdc_out [make_result_file "search_test1_edited.sdc"]
write_sdc $sdc_out
puts "PASS: write_sdc"
############################################################
# Vertex arrival/required/slack queries
############################################################
puts "--- vertex queries ---"
set wv [sta::worst_slack_vertex max]
if { $wv != "NULL" } {
catch {
set warr [sta::vertex_worst_arrival_path $wv max]
if { $warr != "NULL" } {
puts "worst_arrival pin: [get_full_name [$warr pin]]"
puts "worst_arrival arrival: [$warr arrival]"
}
}
catch {
set wslk [sta::vertex_worst_slack_path $wv max]
if { $wslk != "NULL" } {
puts "worst_slack pin: [get_full_name [$wslk pin]]"
puts "worst_slack slack: [$wslk slack]"
}
}
}
puts "PASS: vertex queries"
############################################################
# report_path_end_header/footer
############################################################
puts "--- report_path_end header/footer ---"
sta::report_path_end_header
set pes [find_timing_paths -path_delay max -endpoint_path_count 3]
set prev ""
set last 0
set idx 0
foreach pe $pes {
incr idx
if { $idx == [llength $pes] } { set last 1 }
if { $prev != "" } {
catch { sta::report_path_end2 $pe $prev $last }
} else {
sta::report_path_end $pe
}
set prev $pe
}
sta::report_path_end_footer
puts "PASS: report_path_end header/footer"
############################################################
# report_checks -format json
############################################################
puts "--- json format ---"
report_checks -path_delay max -format json
puts "PASS: json format"
############################################################
# set_report_path_field_properties (ReportPath.cc)
############################################################
puts "--- set_report_path_field_properties ---"
catch { sta::set_report_path_field_properties "total" "Total" 12 0 }
catch { sta::set_report_path_field_width "total" 14 }
report_checks -path_delay max
puts "PASS: field properties"
############################################################
# Report checks min_max variants
############################################################
puts "--- report_checks -path_delay min_max ---"
report_checks -path_delay min_max
puts "PASS: min_max"
puts "ALL PASSED"