Added forced routing through IMUX PIPs. Changed some stimulus.

Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
This commit is contained in:
Maciej Kurc 2020-04-28 12:11:20 +02:00
parent 906bae2b31
commit 28ddeb2feb
2 changed files with 83 additions and 17 deletions

View File

@ -23,6 +23,51 @@ proc write_pip_txtdata {filename} {
close $fp close $fp
} }
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_name [lindex $fields 1]
# Check if that net exist
if {[get_nets $net_name] eq ""} {
puts "MANROUTE: net $net_name does not exist"
continue
}
set net [get_nets $net_name]
# Rip it up
set_property -quiet FIXED_ROUTE "" $net
set_property IS_ROUTE_FIXED 0 $net
route_design -unroute -nets $net
# Make the route
set nodes [get_nodes -of_objects [get_wires $wire_name]]
set status [route_via $net_name [list $nodes] 0]
# Failure, skip manual routing of this net
if { $status != 1 } {
puts "MANROUTE: Manual routing failed!"
set_property -quiet FIXED_ROUTE "" $net
set_property IS_ROUTE_FIXED 0 $net
continue
}
puts "MANROUTE: Success!"
}
}
proc run {} { proc run {} {
create_project -force -part $::env(XRAY_PART) design design create_project -force -part $::env(XRAY_PART) design design
read_verilog top.v read_verilog top.v
@ -46,7 +91,8 @@ proc run {} {
place_design -directive Quick place_design -directive Quick
write_checkpoint -force design_before_route.dcp write_checkpoint -force design_before_route.dcp
route_design -directive Quick make_manual_routes routes.txt
route_design -directive Quick -preserve
write_checkpoint -force design.dcp write_checkpoint -force design.dcp
write_bitstream -force design.bit write_bitstream -force design.bit

View File

@ -186,6 +186,7 @@ def run():
""" """
output = [] output = []
route_file = open("routes.txt", "w")
for tile in gen_sites(): for tile in gen_sites():
if tile['tile_type'] in NOT_INCLUDED_TILES: if tile['tile_type'] in NOT_INCLUDED_TILES:
@ -222,29 +223,48 @@ def run():
oclkb = random.randint(0, 1) oclkb = random.randint(0, 1)
DATA_RATE = random.choice(['DDR', 'SDR']) DATA_RATE = random.choice(['DDR', 'SDR'])
clk, is_lut = clocks.get_clock( clk, clk_is_lut = clocks.get_clock(
ilogic_site, ilogic_site,
allow_ioclks=True, allow_ioclks=True,
allow_rclks=True, allow_rclks=True,
allow_empty=DATA_RATE == 'SDR') allow_empty=DATA_RATE == 'SDR')
if False:
clkb = clk clkb = clk
else:
clkb = clk
if random.randint(0, 1):
while clkb == clk: while clkb == clk:
clkb, _ = clocks.get_clock( clkb, clkb_is_lut = clocks.get_clock(
ilogic_site, ilogic_site,
allow_ioclks=True, allow_ioclks=True,
allow_rclks=True, allow_rclks=True,
allow_empty=False) allow_empty=False)
else:
# Explicitly provide IMUX stimulus to resolve IMUX pips imux_available = {
clk = random.randint(0, 1) 0: set(("IOI_IMUX20_0", "IOI_IMUX22_0")),
clkb = random.randint(0, 1) 1: set(("IOI_IMUX20_1", "IOI_IMUX22_1")),
}
# Force CLK route through IMUX when connected to a LUT
if clk_is_lut:
y = (xy[1] + 1) % 2
route = random.choice(list(imux_available[y]))
imux_available[y].remove(route)
route = "{}/{}".format(tile["tile"], route)
route_file.write("{} {}\n".format(clk, route))
# Force CLKB route through IMUX when connected to a LUT
if clkb_is_lut:
y = (xy[1] + 1) % 2
route = random.choice(list(imux_available[y]))
imux_available[y].remove(route)
route = "{}/{}".format(tile["tile"], route)
route_file.write("{} {}\n".format(clkb, route))
if ilogic_site_type is None: if ilogic_site_type is None:
pass pass
elif ilogic_site_type == 'ISERDESE2': elif ilogic_site_type == 'ISERDESE2':
INTERFACE_TYPE = random.choice( INTERFACE_TYPE = random.choice(
[ [