# 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 source "$::env(XRAY_DIR)/utils/utils.tcl" proc make_manual_routes {filename} { puts "MANROUTE: Loading routes from $filename" set fp [open $filename r] foreach line [split [read $fp] "\n"] { if {$line eq ""} { continue } puts "MANROUTE: Line: $line" # Parse the line set fields [split $line " "] set net_name [lindex $fields 0] set wire_names [lrange $fields 1 end] # Check if that net exist if {[get_nets $net_name] eq ""} { puts "MANROUTE: net $net_name does not exist" continue } # Make the route set status [route_via $net_name $wire_names 0] # Failure, skip manual routing of this net if { $status != 1 } { puts "MANROUTE: Manual routing failed!" set net [get_nets $net_name] set_property -quiet FIXED_ROUTE "" $net set_property IS_ROUTE_FIXED 0 $net continue } puts "MANROUTE: Success!" } } create_project -force -part $::env(XRAY_PART) design design read_verilog top.v synth_design -top top set_property CFGBVS VCCO [current_design] set_property CONFIG_VOLTAGE 3.3 [current_design] set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design] create_clock -period 10.00 [get_ports clkin1*] create_clock -period 10.00 [get_ports clkin2*] # Disable MMCM frequency etc sanity checks set_property IS_ENABLED 0 [get_drc_checks {PDRC-29}] set_property IS_ENABLED 0 [get_drc_checks {PDRC-30}] set_property IS_ENABLED 0 [get_drc_checks {PDRC-34}] set_property IS_ENABLED 0 [get_drc_checks {AVAL-50}] set_property IS_ENABLED 0 [get_drc_checks {AVAL-53}] set_property IS_ENABLED 0 [get_drc_checks {REQP-123}] set_property IS_ENABLED 0 [get_drc_checks {REQP-119}] # PLL set_property IS_ENABLED 0 [get_drc_checks {PDRC-43}] set_property IS_ENABLED 0 [get_drc_checks {REQP-161}] set_property IS_ENABLED 0 [get_drc_checks {AVAL-78}] set_property IS_ENABLED 0 [get_drc_checks {UCIO-1}] set_property IS_ENABLED 0 [get_drc_checks {NSTD-1}] place_design write_checkpoint -force design_placed.dcp make_manual_routes routes.txt write_checkpoint -force design_pre_route.dcp route_design -directive Quick -preserve set unrouted_nets [get_nets -filter {ROUTE_STATUS!="ROUTED" && ROUTE_STATUS!="INTRASITE"}] if {[llength $unrouted_nets] ne 0} { puts "MANROUTE: Got unrouted nets: $unrouted_nets" puts "MANROUTE: Ripping up and starting again with no fixed routes" route_design -unroute set fixed_nets [get_nets -filter {IS_ROUTE_FIXED==1}] if {[llength $fixed_nets] ne 0} { set_property FIXED_ROUTE "" $fixed_nets set_property IS_ROUTE_FIXED 0 $fixed_nets } route_design -directive Quick } write_checkpoint -force design.dcp write_bitstream -force design.bit set fp [open params.json "w"] puts $fp "\[" set cells [get_cells -hierarchical -filter {REF_NAME == MMCME2_ADV}] set i [llength $cells] foreach cell $cells { puts $fp " {" puts $fp " \"tile\": \"[get_tiles -of [get_sites -of $cell]]\"," puts $fp " \"site\": \"[get_sites -of $cell]\"," puts $fp " \"params\": {" set props [list_property $cell] set j [llength $props] foreach prop $props { set str " \"$prop\": \"[get_property $prop $cell]\"" incr j -1 if {$j != 0} {append str ","} puts $fp $str } puts $fp " }" set str " }" incr i -1 if {$i != 0} {append str ","} puts $fp $str } puts $fp "\]" close $fp