mirror of https://github.com/openXC7/prjxray.git
154 lines
6.0 KiB
Tcl
154 lines
6.0 KiB
Tcl
# 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
|
|
set filename [lindex $argv 0]
|
|
|
|
create_project -force -part $::env(XRAY_PART) -name $filename
|
|
set_property design_mode PinPlanning [current_fileset]
|
|
open_io_design -name io_1
|
|
|
|
set_param messaging.disableStorage 1
|
|
set fp [open $filename r]
|
|
set file_data [read $fp]
|
|
close $fp
|
|
|
|
set fp [open $filename w]
|
|
|
|
set indices [split $file_data "\n"]
|
|
|
|
# Convert DRIVE from ??? units to 10^(-3 to -6) Ohms
|
|
set MAGIC 0.6875
|
|
|
|
proc get_speed_model_name {name} {
|
|
# For BSW_INT_LONG_MUX, use the model from BSW_INT_HLONG_MUX.
|
|
# This isn't exactly correct, but it is a better model to use.
|
|
# BSW_INT_LONG_MUX is a tl_buffer (which we don't really understand), and
|
|
# BSW_INT_HLONG_MUX is not. This subsitution appears good enough for now.
|
|
if { $name == "_BSW_INT_LONG_MUX" } {
|
|
set name "_BSW_INT_HLONG_MUX"
|
|
}
|
|
|
|
# Same here!
|
|
if { $name == "_BSW_LONG_TLREVERSE" } {
|
|
set name "_BSW_LONG_NONTLFORWARD"
|
|
}
|
|
|
|
return [get_speed_models -filter "NAME == $name"]
|
|
}
|
|
|
|
puts $fp "\{"
|
|
|
|
|
|
foreach index $indices {
|
|
if {$index == ""} {
|
|
continue
|
|
}
|
|
|
|
set split_index [split $index ","]
|
|
set resource [lindex $split_index 0]
|
|
set resource_index [lindex $split_index 1]
|
|
|
|
puts $fp "\t\"$resource_index\":"
|
|
puts $fp "\t\t\{"
|
|
|
|
if {$resource == "site_pin"} {
|
|
# Getting all site_pin information
|
|
set speed_model [get_speed_models -filter "SPEED_INDEX == $resource_index"]
|
|
|
|
puts $fp "\t\t\t\"resource_name\": \"$resource\","
|
|
|
|
set driver_speed_model_name [get_property DRIVER $speed_model]
|
|
if {$driver_speed_model_name != ""} {
|
|
set driver_speed_model [get_speed_model_name [get_property DRIVER $speed_model]]
|
|
set RES [expr $MAGIC * [get_property DRIVE $driver_speed_model]]
|
|
|
|
puts $fp "\t\t\t\"cap\":\"null\","
|
|
puts $fp "\t\t\t\"res\":\"$RES\","
|
|
|
|
set FAST_MIN [get_property FAST_MIN $driver_speed_model]
|
|
set FAST_MAX [get_property FAST_MAX $driver_speed_model]
|
|
set SLOW_MIN [get_property SLOW_MIN $driver_speed_model]
|
|
set SLOW_MAX [get_property SLOW_MAX $driver_speed_model]
|
|
} else {
|
|
set CAP [get_property CAP $speed_model]
|
|
puts $fp "\t\t\t\"cap\":\"$CAP\","
|
|
puts $fp "\t\t\t\"res\":\"null\","
|
|
|
|
set FAST_MIN [get_property FAST_MIN $speed_model]
|
|
set FAST_MAX [get_property FAST_MAX $speed_model]
|
|
set SLOW_MIN [get_property SLOW_MIN $speed_model]
|
|
set SLOW_MAX [get_property SLOW_MAX $speed_model]
|
|
}
|
|
|
|
puts $fp "\t\t\t\"delay\": \["
|
|
puts $fp "\t\t\t\t\"$FAST_MIN\","
|
|
puts $fp "\t\t\t\t\"$FAST_MAX\","
|
|
puts $fp "\t\t\t\t\"$SLOW_MIN\","
|
|
puts $fp "\t\t\t\t\"$SLOW_MAX\""
|
|
puts $fp "\t\t\t\],"
|
|
} elseif {$resource == "pip"} {
|
|
# Getting all site_pin information
|
|
set speed_model [get_speed_models -filter "SPEED_INDEX == $resource_index"]
|
|
|
|
puts $fp "\t\t\t\"resource_name\": \"$resource\","
|
|
|
|
set forward_speed_model [get_speed_model_name [get_property FORWARD $speed_model]]
|
|
set reverse_speed_model [get_speed_model_name [get_property REVERSE $speed_model]]
|
|
|
|
set forward_speed_model_type [get_property TYPE $forward_speed_model]
|
|
set reverse_speed_model_type [get_property TYPE $reverse_speed_model]
|
|
set is_pass_transistor [expr {"$forward_speed_model_type" == "pass_transistor"}]
|
|
puts $fp "\t\t\t\"is_pass_transistor\":$is_pass_transistor,"
|
|
if { !$is_pass_transistor } {
|
|
puts $fp "\t\t\t\"forward_delay\":\["
|
|
puts $fp "\t\t\t\t\"[get_property FAST_MIN $forward_speed_model]\","
|
|
puts $fp "\t\t\t\t\"[get_property FAST_MAX $forward_speed_model]\","
|
|
puts $fp "\t\t\t\t\"[get_property SLOW_MIN $forward_speed_model]\","
|
|
puts $fp "\t\t\t\t\"[get_property SLOW_MAX $forward_speed_model]\","
|
|
puts $fp "\t\t\t\],"
|
|
if {$forward_speed_model_type == "buffer_switch" || $forward_speed_model_type == "buffer"} {
|
|
puts $fp "\t\t\t\"forward_res\": \"[expr $MAGIC * [get_property DRIVE $forward_speed_model]]\","
|
|
}
|
|
if {$forward_speed_model_type == "buffer_switch"} {
|
|
puts $fp "\t\t\t\"forward_in_cap\": \"[get_property IN_CAP $forward_speed_model]\","
|
|
}
|
|
|
|
puts $fp "\t\t\t\"reverse_delay\":\["
|
|
puts $fp "\t\t\t\t\"[get_property FAST_MIN $reverse_speed_model]\","
|
|
puts $fp "\t\t\t\t\"[get_property FAST_MAX $reverse_speed_model]\","
|
|
puts $fp "\t\t\t\t\"[get_property SLOW_MIN $reverse_speed_model]\","
|
|
puts $fp "\t\t\t\t\"[get_property SLOW_MAX $reverse_speed_model]\","
|
|
puts $fp "\t\t\t\],"
|
|
if {$reverse_speed_model_type == "buffer_switch" || $reverse_speed_model_type == "buffer"} {
|
|
puts $fp "\t\t\t\"reverse_res\": \"[expr $MAGIC * [get_property DRIVE $reverse_speed_model]]\","
|
|
}
|
|
if {$reverse_speed_model_type == "buffer_switch"} {
|
|
puts $fp "\t\t\t\"reverse_in_cap\": \"[get_property IN_CAP $reverse_speed_model]\","
|
|
}
|
|
} else {
|
|
puts $fp "\t\t\t\"forward_res\": \"[get_property RES $forward_speed_model]\","
|
|
puts $fp "\t\t\t\"reverse_res\": \"[get_property RES $reverse_speed_model]\","
|
|
}
|
|
} elseif {$resource == "wire"} {
|
|
# Getting all wire information
|
|
set speed_model [get_speed_models -filter "SPEED_INDEX == $resource_index"]
|
|
|
|
puts $fp "\t\t\t\"resource_name\": \"$resource\","
|
|
puts $fp "\t\t\t\"res\":\"[get_property WIRE_RES $speed_model]\","
|
|
puts $fp "\t\t\t\"cap\":\"[get_property WIRE_CAP $speed_model]\","
|
|
} else {
|
|
puts "STUFF TO READ $index $resource"
|
|
exit 2
|
|
}
|
|
|
|
puts $fp "\t\t\},"
|
|
}
|
|
|
|
puts $fp "\}"
|
|
|
|
close $fp
|