| # 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 | 
 | } |