2020-05-06 06:05:23 +02:00
|
|
|
# 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
|
2020-02-13 22:12:24 +01:00
|
|
|
# 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
|
|
|
|
|
}
|