| # 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 | 
 | open_checkpoint harness_synth.dcp | 
 |  | 
 | create_pblock roi | 
 | add_cells_to_pblock [get_pblocks roi] [get_cells roi] | 
 | resize_pblock [get_pblocks roi] -add "$::env(XRAY_ROI)" | 
 |  | 
 | set_property CFGBVS VCCO [current_design] | 
 | set_property CONFIG_VOLTAGE 3.3 [current_design] | 
 |  | 
 | # Number of package inputs going to ROI | 
 | set DIN_N 8 | 
 | # Number of ROI outputs going to package | 
 | set DOUT_N 8 | 
 |  | 
 | set part $::env(XRAY_PART) | 
 | set pincfg $::env(XRAY_PINCFG) | 
 |  | 
 | # Map of top level net names to IOB pin names | 
 | array set net2pin [list] | 
 |  | 
 | # Create pin assignments based on what we are targetting | 
 | # A50T I/O Bank 16 sequential layout | 
 | if {$part eq "xc7a50tfgg484-1"} { | 
 |     # Partial list, expand as needed | 
 |     set bank_16 "F21 G22 G21 D21 E21 D22 E22 A21 B21 B22 C22 C20 D20 F20 F19 A19 A18" | 
 |     set banki 0 | 
 |  | 
 |     # CLK | 
 |     set pin [lindex $bank_16 $banki] | 
 |     incr banki | 
 |     set net2pin(clk) $pin | 
 |  | 
 |     # DIN | 
 |     for {set i 0} {$i < $DIN_N} {incr i} { | 
 |         set pin [lindex $bank_16 $banki] | 
 |         incr banki | 
 |         set net2pin(din[$i]) $pin | 
 |     } | 
 |  | 
 |     # DOUT | 
 |     for {set i 0} {$i < $DOUT_N} {incr i} { | 
 |         set pin [lindex $bank_16 $banki] | 
 |         incr banki | 
 |         set net2pin(dout[$i]) $pin | 
 |     } | 
 | } elseif {$part eq "xc7a35tcsg324-1"} { | 
 |     # Arty A7 switch, button, and LED | 
 |     if {$pincfg eq "ARTY-A7-SWBUT"} { | 
 |         # https://reference.digilentinc.com/reference/programmable-logic/arty/reference-manual?redirect=1 | 
 |         # 4 switches then 4 buttons | 
 |         set sw_but "A8 C11 C10 A10  D9 C9 B9 B8" | 
 |         # 4 LEDs then 4 RGB LEDs (green only) | 
 |         set leds "H5 J5 T9 T10  F6 J4 J2 H6" | 
 |  | 
 |         # 100 MHz CLK onboard | 
 |         set pin "E3" | 
 |         set net2pin(clk) $pin | 
 |  | 
 |         # DIN | 
 |         for {set i 0} {$i < $DIN_N} {incr i} { | 
 |             set pin [lindex $sw_but $i] | 
 |             set net2pin(din[$i]) $pin | 
 |         } | 
 |  | 
 |         # DOUT | 
 |         for {set i 0} {$i < $DOUT_N} {incr i} { | 
 |             set pin [lindex $leds $i] | 
 |             set net2pin(dout[$i]) $pin | 
 |         } | 
 |         # Arty A7 pmod | 
 |         # Disabled per above | 
 |     } elseif {$pincfg eq "ARTY-A7-PMOD"} { | 
 |         # https://reference.digilentinc.com/reference/programmable-logic/arty/reference-manual?redirect=1 | 
 |         set pmod_ja "G13 B11 A11 D12  D13 B18 A18 K16" | 
 |         set pmod_jb "E15 E16 D15 C15  J17 J18 K15 J15" | 
 |         set pmod_jc "U12 V12 V10 V11  U14 V14 T13 U13" | 
 |  | 
 |         # CLK on Pmod JA | 
 |         set pin [lindex $pmod_ja 0] | 
 |         set net2pin(clk) $pin | 
 |  | 
 |         # DIN on Pmod JB | 
 |         for {set i 0} {$i < $DIN_N} {incr i} { | 
 |             set pin [lindex $pmod_jb $i] | 
 |             set net2pin(din[$i]) $pin | 
 |         } | 
 |  | 
 |         # DOUT on Pmod JC | 
 |         for {set i 0} {$i < $DOUT_N} {incr i} { | 
 |             set pin [lindex $pmod_jc $i] | 
 |             set net2pin(dout[$i]) $pin | 
 |         } | 
 |     } else { | 
 |         error "Unsupported config $pincfg" | 
 |     } | 
 | } elseif {$part eq "xc7a35tcpg236-1"} { | 
 |     if {$pincfg eq "BASYS3-SWBUT"} { | 
 |         # https://raw.githubusercontent.com/Digilent/digilent-xdc/master/Basys-3-Master.xdc | 
 |  | 
 |         # Slide switches | 
 |         set sws "V17 V16 W16 W17 W15 V15 W14 W13 V2 T3 T2 R3 W2 U1 T1 R2" | 
 |         set leds "U16 E19 U19 V19 W18 U15 U14 V14 V13 V3 W3 U3 P3 N3 P1 L1" | 
 |  | 
 |         # 100 MHz CLK onboard | 
 |         set pin "W5" | 
 |         set net2pin(clk) $pin | 
 |  | 
 |         # DIN | 
 |         for {set i 0} {$i < $DIN_N} {incr i} { | 
 |             set pin [lindex $sws $i] | 
 |             set net2pin(din[$i]) $pin | 
 |         } | 
 |  | 
 |         # DOUT | 
 |         for {set i 0} {$i < $DOUT_N} {incr i} { | 
 |             set pin [lindex $leds $i] | 
 |             set net2pin(dout[$i]) $pin | 
 |         } | 
 |     } else { | 
 |         error "Unsupported config $pincfg" | 
 |     } | 
 | } else { | 
 |     error "Pins: unsupported part $part" | 
 | } | 
 |  | 
 | # Now actually apply the pin definitions | 
 | puts "Applying pin definitions" | 
 | foreach {net pin} [array get net2pin] { | 
 |     puts "  Net $net to pin $pin" | 
 |     set_property -dict "PACKAGE_PIN $pin IOSTANDARD LVCMOS33" [get_ports $net] | 
 | } | 
 |  | 
 | set_property HD.RECONFIGURABLE TRUE [get_cells roi] | 
 |  | 
 | read_checkpoint -cell roi inv_synth.dcp | 
 |  | 
 | opt_design | 
 | place_design | 
 | route_design | 
 |  | 
 | # Replace roi cell with a black box and write the rest of the design | 
 | update_design -cell roi -black_box | 
 | lock_design -level routing | 
 | write_checkpoint -force harness_impl.dcp |