Merge pull request #1627 from dnltz/WIP/dnltz/parts_fixups
Docu fixup and prevent AssertionError
diff --git a/docs/dev_database/common/cell_data.rst b/docs/dev_database/common/cell_data.rst
index 07dbf8d..37b0dcd 100644
--- a/docs/dev_database/common/cell_data.rst
+++ b/docs/dev_database/common/cell_data.rst
@@ -65,7 +65,8 @@
This is a JSON file containing a dictionary of ports, each one with two attributes:
- - Direction: Corresponds to the port directiona and can have the ``input`` or ``output`` values.
+ - Direction: Corresponds to the port directiona and can have the ``input``, ``output``, ``clock`` values.
+ Note that the ``clock`` value is implicitly considered also as an ``input``.
- Width: Indicates the width of the port bus.
As an example of parameter please, refer to the following::
diff --git a/fuzzers/061-pcie-conf/generate_ports.tcl b/fuzzers/061-pcie-conf/generate_ports.tcl
index 603d37e..262fe22 100644
--- a/fuzzers/061-pcie-conf/generate_ports.tcl
+++ b/fuzzers/061-pcie-conf/generate_ports.tcl
@@ -6,28 +6,7 @@
#
# SPDX-License-Identifier: ISC
-proc dump_pins {file_name site_prefix} {
- set fp [open $file_name w]
-
- puts $fp "name,is_input,is_output"
- set site [lindex [get_sites $site_prefix*] 0]
-
- set pins [get_site_pins -of_objects $site]
- foreach pin $pins {
- set connected_pip [get_pips -of_objects [get_nodes -of_objects $pin]]
-
- if { $connected_pip == "" } {
- continue
- }
-
- set pin_name [lindex [split $pin "/"] 1]
- set is_input [get_property IS_INPUT $pin]
- set is_output [get_property IS_OUTPUT $pin]
-
- puts $fp "$pin_name,$is_input,$is_output"
- }
- close $fp
-}
+source "$::env(XRAY_DIR)/utils/utils.tcl"
create_project -force -name design -part $::env(XRAY_PART)
set_property design_mode PinPlanning [current_fileset]
diff --git a/fuzzers/063-gtp-common-conf/generate_ports.tcl b/fuzzers/063-gtp-common-conf/generate_ports.tcl
index 75f7c7f..4dab678 100644
--- a/fuzzers/063-gtp-common-conf/generate_ports.tcl
+++ b/fuzzers/063-gtp-common-conf/generate_ports.tcl
@@ -6,28 +6,7 @@
#
# SPDX-License-Identifier: ISC
-proc dump_pins {file_name site_prefix} {
- set fp [open $file_name w]
-
- puts $fp "name,is_input,is_output"
- set site [lindex [get_sites $site_prefix*] 0]
-
- set pins [get_site_pins -of_objects $site]
- foreach pin $pins {
- set connected_pip [get_pips -of_objects [get_nodes -of_objects $pin]]
-
- if { $connected_pip == "" } {
- continue
- }
-
- set pin_name [lindex [split $pin "/"] 1]
- set is_input [get_property IS_INPUT $pin]
- set is_output [get_property IS_OUTPUT $pin]
-
- puts $fp "$pin_name,$is_input,$is_output"
- }
- close $fp
-}
+source "$::env(XRAY_DIR)/utils/utils.tcl"
create_project -force -name design -part $::env(XRAY_PART)
set_property design_mode PinPlanning [current_fileset]
diff --git a/fuzzers/064-gtp-channel-conf/attrs.json b/fuzzers/064-gtp-channel-conf/attrs.json
index f852a25..6c1e022 100644
--- a/fuzzers/064-gtp-channel-conf/attrs.json
+++ b/fuzzers/064-gtp-channel-conf/attrs.json
@@ -904,13 +904,13 @@
"type": "INT",
"values": [1, 2, 4, 8],
"encoding": [0, 1, 2, 3],
- "digits": 3
+ "digits": 2
},
"RXOUT_DIV": {
"type": "INT",
"values": [1, 2, 4, 8],
"encoding": [0, 1, 2, 3],
- "digits": 3
+ "digits": 2
},
"CFOK_CFG": {
"type": "BIN",
diff --git a/fuzzers/064-gtp-channel-conf/generate_ports.tcl b/fuzzers/064-gtp-channel-conf/generate_ports.tcl
index f847924..2c1d63c 100644
--- a/fuzzers/064-gtp-channel-conf/generate_ports.tcl
+++ b/fuzzers/064-gtp-channel-conf/generate_ports.tcl
@@ -6,28 +6,7 @@
#
# SPDX-License-Identifier: ISC
-proc dump_pins {file_name site_prefix} {
- set fp [open $file_name w]
-
- puts $fp "name,is_input,is_output"
- set site [lindex [get_sites $site_prefix*] 0]
-
- set pins [get_site_pins -of_objects $site]
- foreach pin $pins {
- set connected_pip [get_pips -of_objects [get_nodes -of_objects $pin]]
-
- if { $connected_pip == "" } {
- continue
- }
-
- set pin_name [lindex [split $pin "/"] 1]
- set is_input [get_property IS_INPUT $pin]
- set is_output [get_property IS_OUTPUT $pin]
-
- puts $fp "$pin_name,$is_input,$is_output"
- }
- close $fp
-}
+source "$::env(XRAY_DIR)/utils/utils.tcl"
create_project -force -name design -part $::env(XRAY_PART)
set_property design_mode PinPlanning [current_fileset]
diff --git a/fuzzers/071-ppips/generate.tcl b/fuzzers/071-ppips/generate.tcl
index 1fbad4b..09e713f 100644
--- a/fuzzers/071-ppips/generate.tcl
+++ b/fuzzers/071-ppips/generate.tcl
@@ -246,7 +246,7 @@
set skip_wire false
foreach wire $forbids {
- if {[regexp $wire $dst_wire]} {
+ if {[regexp $wire $src_wire]} {
set skip_wire true
break
}
@@ -257,7 +257,7 @@
set skip_wire true
foreach wire $allows {
- if {[regexp $wire $dst_wire]} {
+ if {[regexp $wire $src_wire]} {
set skip_wire false
break
}
@@ -361,8 +361,8 @@
set tiles [get_tiles -filter "TILE_TYPE == $tile_type"]
if {[llength $tiles] != 0} {
set tile [lindex $tiles 0]
- set allow_wires {"IMUX_OUT" "IMUX_L" "LOGIC_OUTS"}
- set forbid_wires {"DELAY"}
+ set allow_wires {"IMUX_L\[0-9\]+" "IMUX\[0-9\]+" "LOGIC_OUTS"}
+ set forbid_wires {"DELAY\[0-9\]+"}
write_pcie_int_interface_ppips_db "ppips_[string tolower $tile_type].db" $tile $allow_wires $forbid_wires
}
}
diff --git a/utils/make_ports.py b/utils/make_ports.py
index e31600c..27eecda 100644
--- a/utils/make_ports.py
+++ b/utils/make_ports.py
@@ -81,9 +81,12 @@
# Get direction
is_input = int(pin["is_input"])
is_output = int(pin["is_output"])
+ is_clock = int(pin["is_clock"])
if is_input:
direction = "input"
+ if is_clock:
+ direction = "clock"
elif is_output:
direction = "output"
else:
diff --git a/utils/update_resources.py b/utils/update_resources.py
index 275aea6..3b2209d 100755
--- a/utils/update_resources.py
+++ b/utils/update_resources.py
@@ -13,6 +13,8 @@
import subprocess
import os
import re
+import tempfile
+import json
from prjxray import util
@@ -39,23 +41,36 @@
information = {}
parts = util.get_parts(args.db_root)
+ processed_parts = dict()
for part in parts.keys():
+ # Skip parts which differ only in the speedgrade, as they have the same pins
+ fields = part.split("-")
+ common_part = fields[0]
+ if common_part in processed_parts:
+ information[part] = processed_parts[common_part]
+ continue
+
print("Find pins for {}".format(part))
env['XRAY_PART'] = part
+ _, tmp_file = tempfile.mkstemp()
# Asks with get_package_pins and different filters for pins with
# specific properties.
- command = "{} -mode batch -source update_resources.tcl".format(
- env['XRAY_VIVADO'])
+ command = "env TMP_FILE={} {} -mode batch -source update_resources.tcl".format(
+ tmp_file, env['XRAY_VIVADO'])
result = subprocess.run(
command.split(' '),
check=True,
env=env,
cwd=cwd,
stdout=subprocess.PIPE)
- # Formats the output and stores the pins
- output = result.stdout.decode('utf-8').splitlines()
- clk_pins = output[-4].split(' ')
- data_pins = output[-2].strip().split(' ')
+
+ with open(tmp_file, "r") as fp:
+ pins_json = json.load(fp)
+
+ os.remove(tmp_file)
+
+ clk_pins = pins_json["clk_pins"].split()
+ data_pins = pins_json["data_pins"].split()
pins = {
0: clk_pins[0],
1: data_pins[0],
@@ -63,6 +78,7 @@
3: data_pins[-1]
}
information[part] = {'pins': pins}
+ processed_parts[common_part] = {'pins': pins}
# Overwrites the <family>/resources.yaml file completly with new data
util.set_part_resources(resource_path, information)
diff --git a/utils/update_resources.tcl b/utils/update_resources.tcl
index a95f1e0..292041d 100644
--- a/utils/update_resources.tcl
+++ b/utils/update_resources.tcl
@@ -21,5 +21,9 @@
append data_pins " " [get_package_pins -filter "IS_GENERAL_PURPOSE && BANK==$bank"]
}
-puts $clk_pins
-puts $data_pins
+set fp [open $::env(TMP_FILE) w]
+
+puts $fp "{"
+ puts $fp "\t\"clk_pins\": \"$clk_pins\","
+ puts $fp "\t\"data_pins\": \"$data_pins\""
+puts $fp "}"
diff --git a/utils/utils.tcl b/utils/utils.tcl
index 751f884..83c8cba 100644
--- a/utils/utils.tcl
+++ b/utils/utils.tcl
@@ -168,3 +168,37 @@
write_checkpoint -force design.dcp
write_bitstream -force design.bit
}
+
+# Dumps all pins of a site, with the direction info (clock, input, output)
+proc dump_pins {file_name site_prefix} {
+ set fp [open $file_name w]
+
+ puts $fp "name,is_input,is_output,is_clock"
+ set site [lindex [get_sites $site_prefix*] 0]
+ set bel [get_bels -of_objects $site]
+ set bel_pins [get_bel_pins -of_objects $bel]
+
+ set bel_pins_dict [dict create]
+ foreach pin $bel_pins {
+ set pin_name [lindex [split $pin "/"] 2]
+ set is_clock [get_property IS_CLOCK $pin]
+ dict set bel_pins_dict $pin_name $is_clock
+ }
+
+ set site_pins [get_site_pins -of_objects $site]
+ foreach pin $site_pins {
+ set connected_pip [get_pips -of_objects [get_nodes -of_objects $pin]]
+
+ if { $connected_pip == "" } {
+ continue
+ }
+
+ set pin_name [lindex [split $pin "/"] 1]
+ set is_input [get_property IS_INPUT $pin]
+ set is_output [get_property IS_OUTPUT $pin]
+ set is_clock [dict get $bel_pins_dict $pin_name]
+
+ puts $fp "$pin_name,$is_input,$is_output,$is_clock"
+ }
+ close $fp
+}