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