| # Copyright (C) 2017-2020 The Project X-Ray Authors | |
| # | |
| # Use of this source code is governed by a ISC-style | |
| # license that can be found in the LICENSE file or at | |
| # https://opensource.org/licenses/ISC | |
| # | |
| # SPDX-License-Identifier: ISC | |
| # Writes a JSON5 to filename containing timing for current design. | |
| # This can be used with create_timing_worksheet_db.py to compare prjxray model | |
| # with Vivado timing model outputs. | |
| proc write_timing_info {filename} { | |
| set fp [open $filename w] | |
| puts $fp "\[" | |
| set nets [get_nets] | |
| set idx 0 | |
| foreach net $nets { | |
| puts "net: $net ($idx / [llength $nets])" | |
| incr idx | |
| if { $net == "<const0>" || $net == "<const1>" } { | |
| continue | |
| } | |
| if { [get_property TYPE [get_nets $net]] == "GROUND" } { | |
| continue | |
| } | |
| if { [get_property TYPE [get_nets $net]] == "POWER" } { | |
| continue | |
| } | |
| if { [get_property ROUTE_STATUS [get_nets $net]] == "INTRASITE" } { | |
| continue | |
| } | |
| if { [get_property ROUTE_STATUS [get_nets $net]] == "NOLOADS" } { | |
| continue | |
| } | |
| puts $fp "{" | |
| puts $fp "\"net\":\"$net\"," | |
| set route [get_property ROUTE $net] | |
| puts $fp "\"route\":\"$route\"," | |
| set pips [get_pips -of_objects $net] | |
| puts $fp "\"pips\":\[" | |
| foreach pip $pips { | |
| puts $fp "{" | |
| puts $fp "\"name\":\"$pip\"," | |
| puts $fp "\"src_wire\":\"[get_wires -uphill -of_objects $pip]\"," | |
| puts $fp "\"dst_wire\":\"[get_wires -downhill -of_objects $pip]\"," | |
| puts $fp "\"speed_index\":\"[get_property SPEED_INDEX $pip]\"," | |
| puts $fp "\"is_directional\":\"[get_property IS_DIRECTIONAL $pip]\"," | |
| puts $fp "}," | |
| } | |
| puts $fp "\]," | |
| puts $fp "\"nodes\":\[" | |
| set nodes [get_nodes -of_objects $net] | |
| foreach node $nodes { | |
| puts $fp "{" | |
| puts $fp "\"name\":\"$node\"," | |
| puts $fp "\"cost_code\":\"[get_property COST_CODE $node]\"," | |
| puts $fp "\"cost_code_name\":\"[get_property COST_CODE_NAME $node]\"," | |
| puts $fp "\"speed_class\":\"[get_property SPEED_CLASS $node]\"," | |
| puts $fp "\"wires\":\[" | |
| set wires [get_wires -of_objects $node] | |
| foreach wire $wires { | |
| puts $fp "{" | |
| puts $fp "\"name\":\"$wire\"," | |
| puts $fp "\"cost_code\":\"[get_property COST_CODE $wire]\"," | |
| puts $fp "\"speed_index\":\"[get_property SPEED_INDEX $wire]\"," | |
| puts $fp "}," | |
| } | |
| puts $fp "\]," | |
| puts $fp "}," | |
| } | |
| puts $fp "\]," | |
| set opin [get_pins -leaf -of_objects [get_nets $net] -filter {DIRECTION == OUT}] | |
| puts $fp "\"opin\": {" | |
| puts $fp "\"name\":\"$opin\"," | |
| set opin_site_pin [get_site_pins -of_objects $opin] | |
| puts $fp "\"site_pin\":\"$opin_site_pin\"," | |
| puts $fp "\"site_pin_speed_index\":\"[get_property SPEED_INDEX $opin_site_pin]\"," | |
| puts $fp "\"node\":\"[get_nodes -of_objects $opin_site_pin]\"," | |
| puts $fp "\"wire\":\"[get_wires -of_objects [get_nodes -of_objects $opin_site_pin]]\"," | |
| puts $fp "}," | |
| set ipins [get_pins -of_objects [get_nets $net] -filter {DIRECTION == IN} -leaf] | |
| puts $fp "\"ipins\":\[" | |
| foreach ipin $ipins { | |
| set ipin_site_pin [get_site_pins -of_objects $ipin -quiet] | |
| if { $ipin_site_pin == "" } { | |
| # This connection is internal! | |
| continue | |
| } | |
| puts $fp "{" | |
| set delay [get_net_delays -interconnect_only -of_objects $net -to $ipin] | |
| puts $fp "\"name\":\"$ipin\"," | |
| puts $fp "\"ic_delays\":{" | |
| foreach prop {"FAST_MAX" "FAST_MIN" "SLOW_MAX" "SLOW_MIN"} { | |
| puts $fp "\"$prop\":\"[get_property $prop $delay]\"," | |
| } | |
| puts $fp "}," | |
| puts $fp "\"site_pin\":\"$ipin_site_pin\"," | |
| puts $fp "\"site_pin_speed_index\":\"[get_property SPEED_INDEX $ipin_site_pin]\"," | |
| puts $fp "\"node\":\"[get_nodes -of_objects $ipin_site_pin]\"," | |
| puts $fp "\"wire\":\"[get_wires -of_objects [get_nodes -of_objects $ipin_site_pin]]\"," | |
| puts $fp "}," | |
| } | |
| puts $fp "\]," | |
| puts $fp "}," | |
| } | |
| puts $fp "\]" | |
| close $fp | |
| } |