Merge pull request #1196 from antmicro/allow-multiple-parts

Allow generation of multiple-part db
This commit is contained in:
litghost 2020-01-24 07:30:36 -08:00 committed by GitHub
commit 8486f10a19
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
99 changed files with 2046 additions and 249 deletions

View File

@ -86,14 +86,20 @@ echo "----------------------------------------"
)
echo "----------------------------------------"
# Check the database
#make checkdb-${XRAY_SETTINGS} || true
# Generate extra files (additional part yaml's, harness, etc).
# Generate extra harness files (additional part yaml's, harness).
set +e
# Attempt to generate extras here, but don't check until after diff reporting.
make db-extras-${XRAY_SETTINGS}
EXTRAS_RET=$?
# Attempt to generate extra harnesses here, but don't check until after diff reporting.
make db-extras-${XRAY_SETTINGS}-harness
EXTRAS_HARNESS_RET=$?
set -e
# Generate extra parts file (tilegrid, tileconn, part yaml, part json and package_pin)
# TODO: Disabled for now as for big parts it takes a huge amount of time
#set +e
#make db-extras-${XRAY_SETTINGS}-parts -j $CORES
EXTRAS_PARTS_RET=0
#set -e
# Format the database
make db-format-${XRAY_SETTINGS}
# Update the database/Info.md file
@ -187,9 +193,15 @@ echo "----------------------------------------"
# Check the database and fail if it is broken.
make db-check-${XRAY_SETTINGS}
if [[ $EXTRAS_RET != 0 ]] ; then
echo "A failure occurred during extras generation."
exit $EXTRAS_RET
if [[ $EXTRAS_HARNESS_RET != 0 ]] ; then
echo "A failure occurred during extra harnesses generation."
exit $EXTRAS_HARNESS_RET
fi
if [[ $EXTRAS_PARTS_RET != 0 ]] ; then
echo "A failure occurred during extra parts generation."
exit $EXTRAS_PARTS_RET
fi
# If we get here, then all the fuzzers completed fine. Hence we are

View File

@ -118,7 +118,7 @@ db-check-$(1):
@echo
@echo "Checking $(1) database"
@echo "============================"
@$(IN_ENV) python3 utils/checkdb.py --db-root database/$(1)
@$(IN_ENV) python3 utils/checkdb.py
db-format-$(1):
@echo
@ -139,16 +139,38 @@ $(foreach DB,$(DATABASES),$(eval $(call database,$(DB))))
.PHONY: db-extras-artix7 db-extras-kintex7 db-extras-zynq7
db-extras-artix7:
+source minitests/roi_harness/basys3-swbut.sh && $(MAKE) -C fuzzers part_only
+source minitests/roi_harness/arty-uart.sh && $(MAKE) -C fuzzers part_only
# Targets related to Project X-Ray parts
# --------------------------------------
ARTIX_PARTS=artix200t
ZYNQ_PARTS=zynq020
KINTEX_PARTS=kintex70t
XRAY_PARTS=${ARTIX_PARTS} ${ZYNQ_PARTS} ${KINTEX_PARTS}
define multiple-parts
# $(1): PART to be used
db-part-only-$(1):
+source settings/$(1).sh && $$(MAKE) -C fuzzers part_only
endef
$(foreach PART,$(XRAY_PARTS),$(eval $(call multiple-parts,$(PART))))
db-extras-artix7-parts: $(addprefix db-part-only-,$(ARTIX_PARTS))
db-extras-artix7-harness:
+source minitests/roi_harness/basys3-swbut.sh && $(MAKE) -C fuzzers roi_only
+source minitests/roi_harness/arty-uart.sh && $(MAKE) -C fuzzers roi_only
+source minitests/roi_harness/basys3-swbut.sh && \
$(MAKE) -C minitests/roi_harness \
HARNESS_DIR=$(XRAY_DATABASE_DIR)/artix7/harness/basys3/swbut run copy
+source minitests/roi_harness/basys3-swbut.sh && \
$(MAKE) -C minitests/roi_harness \
XRAY_ROIV=../roi_base_div2.v \
HARNESS_DIR=$(XRAY_DATABASE_DIR)/artix7/harness/basys3/swbut_50 run copy
HARNESS_DIR=$(XRAY_DATABASE_DIR)/artix7/harness/basys3/swbut_50 copy
+source minitests/roi_harness/arty-uart.sh && \
$(MAKE) -C minitests/roi_harness \
HARNESS_DIR=$(XRAY_DATABASE_DIR)/artix7/harness/arty-a7/uart run copy
@ -159,14 +181,19 @@ db-extras-artix7:
$(MAKE) -C minitests/roi_harness \
HARNESS_DIR=$(XRAY_DATABASE_DIR)/artix7/harness/arty-a7/swbut run copy
db-extras-kintex7:
db-extras-kintex7-parts:
@true
db-extras-zynq7:
+source minitests/roi_harness/zybo-swbut.sh && $(MAKE) -C fuzzers part_only
db-extras-kintex7-harness:
@true
db-extras-zynq7-parts:
@true
db-extras-zynq7-harness:
+source minitests/roi_harness/zybo-swbut.sh && \
$(MAKE) -C minitests/roi_harness \
HARNESS_DIR=$(XRAY_DATABASE_DIR)/zynq7/harness/zybo/swbut run
HARNESS_DIR=$(XRAY_DATABASE_DIR)/zynq7/harness/zybo/swbut run copy
db-check:
@true

View File

@ -13,9 +13,10 @@ $(SPECIMENS): Makefile.specimen
$(MAKE) -C $@ -f ../../Makefile.specimen
pushdb:
cp build/part.yaml ${XRAY_DATABASE_DIR}/$(XRAY_DATABASE)/${XRAY_PART}.yaml
cp build/part.json ${XRAY_DATABASE_DIR}/$(XRAY_DATABASE)/${XRAY_PART}.json
cp build/${XRAY_PART}_required_features.fasm ${XRAY_DATABASE_DIR}/$(XRAY_DATABASE)/${XRAY_PART}_required_features.fasm 2>/dev/null || true
mkdir -p ${XRAY_FAMILY_DIR}/${XRAY_PART}
cp build/part.json $(XRAY_FAMILY_DIR)/${XRAY_PART}/part.json
cp build/part.yaml $(XRAY_FAMILY_DIR)/${XRAY_PART}/part.yaml
cp build/${XRAY_PART}_required_features.fasm ${XRAY_FAMILY_DIR}/${XRAY_PART}/required_features.fasm 2>/dev/null || true
run:
$(MAKE) clean

View File

@ -37,93 +37,95 @@ else
TILEGRID_TDB_DEPENDENCIES += dsp_int/build/segbits_tilegrid.tdb
endif
BASICDB_TILEGRID=build/basicdb/${XRAY_PART}/tilegrid.json
database: build/tilegrid.json
pushdb: build/tilegrid.json
cp build/tilegrid.json ${XRAY_DATABASE_DIR}/$(XRAY_DATABASE)/tilegrid.json
cp build/tilegrid.json ${XRAY_FAMILY_DIR}/${XRAY_PART}/tilegrid.json
build/tiles/tiles.txt:
bash generate.sh build/tiles tiles
build/basicdb/tilegrid.json: generate.py build/tiles/tiles.txt
mkdir -p build/basicdb
${BASICDB_TILEGRID}: generate.py build/tiles/tiles.txt
mkdir -p build/basicdb/${XRAY_PART}
cd build && python3 ${FUZDIR}/generate.py \
--tiles $(FUZDIR)/build/tiles/tiles.txt \
--pin_func $(FUZDIR)/build/tiles/pin_func.txt \
--out ${BUILD_DIR}/basicdb/tilegrid.json
--out ${BUILD_DIR}/basicdb/${XRAY_PART}/tilegrid.json
clb/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
clb/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd clb && $(MAKE)
clb_int/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
clb_int/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd clb_int && $(MAKE)
cfg/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
cfg/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd cfg && $(MAKE)
iob/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
iob/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd iob && $(MAKE)
iob_int/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
iob_int/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd iob_int && $(MAKE)
ioi/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
ioi/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd ioi && $(MAKE)
mmcm/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
mmcm/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd mmcm && $(MAKE)
pll/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
pll/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd pll && $(MAKE)
ps7_int/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
ps7_int/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd ps7_int && $(MAKE)
monitor/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
monitor/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd monitor && $(MAKE)
monitor_int/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
monitor_int/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd monitor_int && $(MAKE)
bram/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
bram/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd bram && $(MAKE)
bram_block/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
bram_block/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd bram_block && $(MAKE)
bram_int/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
bram_int/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd bram_int && $(MAKE)
dsp/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
dsp/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd dsp && $(MAKE)
dsp_int/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
dsp_int/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd dsp_int && $(MAKE)
fifo_int/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
fifo_int/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd fifo_int && $(MAKE)
cfg_int/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
cfg_int/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd cfg_int && $(MAKE)
orphan_int_column/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
orphan_int_column/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd orphan_int_column && $(MAKE)
clk_hrow/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
clk_hrow/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd clk_hrow && $(MAKE)
clk_bufg/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
clk_bufg/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd clk_bufg && $(MAKE)
hclk_cmt/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
hclk_cmt/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd hclk_cmt && $(MAKE)
hclk_ioi/build/segbits_tilegrid.tdb: build/basicdb/tilegrid.json
hclk_ioi/build/segbits_tilegrid.tdb: ${BASICDB_TILEGRID}
cd hclk_ioi && $(MAKE)
build/tilegrid_tdb.json: add_tdb.py $(TILEGRID_TDB_DEPENDENCIES)
python3 add_tdb.py \
--fn-in build/basicdb/tilegrid.json \
--fn-in ${BASICDB_TILEGRID} \
--fn-out build/tilegrid_tdb.json
build/tilegrid.json: generate_full.py build/tilegrid_tdb.json

View File

@ -19,6 +19,21 @@ Finally, generate.py calculates the segment word offsets based on known segment
This environment variable must be set with a valid ROI.
See database for example values
### XRAY_EXCLUDE_ROI_TILEGRID
This environment variable must be set in case the part selected does not allow some tiles to be
locked.
Error example (when using the artix 200T part):
`ERROR: [Place 30-25] Component carry4_SLICE_X82Y249 has been locked to a prohibited site SLICE_X82Y249.`
To avoid this error, the `XRAY_EXCLUDE_ROI_TILEGRID` defines an ROI that is not taken into account
when building the tilegrid, therefore excluding the problematic un-lockable sites.
As the resulting output file, `tilegrid.json`, is going to be checked against the one produced in
the `074-dump_all` fuzzer, also the latter one needs to produce a reduced tilegrid, with the excluded
tiles specified with the environment variable.
### XRAY_ROI_FRAMES
This can be set to a specific value to speed up processing and reduce disk space
If you don't know where your ROI is, just set to to include all values (0x00000000:0xfffffff)

View File

@ -6,7 +6,7 @@ from prjxray.db import Database
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -6,7 +6,7 @@ from prjxray.db import Database
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -7,7 +7,7 @@ from prjxray.db import Database
def gen_brams():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -6,7 +6,7 @@ from prjxray.db import Database
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -6,7 +6,7 @@ from prjxray.db import Database
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -6,7 +6,7 @@ from prjxray.db import Database
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -6,7 +6,7 @@ from prjxray.db import Database
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -6,7 +6,7 @@ from prjxray.db import Database
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in grid.tiles():
loc = grid.loc_of_tilename(tile_name)

View File

@ -6,7 +6,7 @@ from prjxray.db import Database
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -6,7 +6,7 @@ from prjxray.db import Database
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -7,7 +7,7 @@ from prjxray.db import Database
def gen_dsps():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -7,7 +7,7 @@ from prjxray.db import Database
def gen_fifos():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -395,15 +395,10 @@ def propagate_IOI_Y9(database, tiles_by_grid):
higher than the rest, just like for some of the SING tiles.
"""
arch = os.getenv('XRAY_DATABASE')
if arch in 'artix7':
tiles = ['RIOI3_X43Y9', 'LIOI3_X0Y9']
elif arch in 'kintex7':
tiles = ['LIOI3_X0Y9']
elif arch in 'zynq7':
tiles = ['RIOI3_X31Y9']
else:
assert False, "Unsupported architecture"
ioi_tiles = os.getenv('XRAY_IOI3_TILES')
assert ioi_tiles is not None, "XRAY_IOI3_TILES env variable not set"
tiles = ioi_tiles.split(" ")
for tile in tiles:
prev_tile = tiles_by_grid[(

View File

@ -3,6 +3,7 @@ source "$::env(FUZDIR)/util.tcl"
proc write_tiles_txt {} {
# Get all tiles, ie not just the selected LUTs
set tiles [get_tiles]
set not_allowed_sites [get_sites -of_objects [get_pblocks exclude_roi]]
# Write tiles.txt with site metadata
set fp [open "tiles.txt" w]
@ -12,6 +13,23 @@ proc write_tiles_txt {} {
set grid_x [get_property GRID_POINT_X $tile]
set grid_y [get_property GRID_POINT_Y $tile]
set sites [get_sites -quiet -of_objects $tile]
# There are some sites which are not allowed to be placed.
# This check excludes tiles in the EXCLUDE_ROI pblock
# be added to tilegrid.json
set skip_tile 0
foreach site $sites {
set res [lsearch $not_allowed_sites $site]
if { $res != -1 } {
set skip_tile 1
break
}
}
if { $skip_tile == 1 } {
continue
}
set typed_sites {}
set clock_region "NA"
@ -41,7 +59,7 @@ proc write_tiles_txt {} {
proc run {} {
# Generate grid of entire part
make_project_roi XRAY_ROI_TILEGRID
make_project_roi XRAY_ROI_TILEGRID XRAY_EXCLUDE_ROI_TILEGRID
place_design
route_design

View File

@ -1,4 +1,4 @@
N ?= 5
N ?= 6
GENERATE_ARGS?="--oneval 1 --design params.csv --dword 5 --dframe 1C"
include ../fuzzaddr/common.mk

View File

@ -6,7 +6,7 @@ from prjxray.db import Database
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -1,4 +1,4 @@
N ?= 5
N ?= 6
GENERATE_ARGS?="--oneval 1 --design params.csv --dword 0 --dframe 21"
include ../fuzzaddr/common.mk

View File

@ -6,7 +6,7 @@ from prjxray.db import Database
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -12,7 +12,7 @@ def gen_sites():
IOB33: not a diff pair. Relatively rare (at least in ROI...2 of them?)
Focus on IOB33S to start
'''
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -18,7 +18,7 @@ def gen_sites():
IOB33: not a diff pair. Relatively rare (at least in ROI...2 of them?)
Focus on IOB33S to start
'''
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -11,7 +11,7 @@ from prjxray.db import Database
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -1,4 +1,4 @@
N ?= 5
N ?= 6
# Was expecting oneval 3, but bits might be inverted
# FIXME: dword
# Ex: 0002009D_029_15

View File

@ -7,7 +7,7 @@ from prjxray.db import Database
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
gridinfo = grid.gridinfo_at_tilename(tile_name)

View File

@ -6,7 +6,7 @@ from prjxray.db import Database
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -6,7 +6,7 @@ from prjxray.db import Database
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -321,7 +321,7 @@ module top();
int_tiles = []
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
params = {}
for int_l_column, int_r_column in gen_orphan_ints(grid):

View File

@ -1,3 +1,3 @@
N ?= 5
N ?= 6
GENERATE_ARGS?="--oneval 1 --design params.csv --dframe 1C --dword 23"
include ../fuzzaddr/common.mk

View File

@ -7,7 +7,7 @@ from prjxray.db import Database
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
gridinfo = grid.gridinfo_at_tilename(tile_name)

View File

@ -138,10 +138,10 @@ proc assign_iobs {} {
proc make_project {} {
# Generate .bit only over ROI
make_project_roi XRAY_ROI_TILEGRID
make_project_roi XRAY_ROI_TILEGRID XRAY_EXCLUDE_ROI_TILEGRID
}
proc make_project_roi { roi_var } {
proc make_project_roi { roi_var exclude_roi_var } {
# 6 CMTs in our reference part
# What is the largest?
set n_di 16
@ -160,6 +160,13 @@ proc make_project_roi { roi_var } {
resize_pblock [get_pblocks roi] -add "$roi"
}
create_pblock exclude_roi
add_cells_to_pblock [get_pblocks roi] [get_cells roi]
foreach roi "$::env($exclude_roi_var)" {
puts "ROI: $roi"
resize_pblock [get_pblocks exclude_roi] -add "$roi"
}
set_property CFGBVS VCCO [current_design]
set_property CONFIG_VOLTAGE 3.3 [current_design]
set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design]

View File

@ -11,7 +11,7 @@ from prjxray.db import Database
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -11,7 +11,7 @@ WRITE_MODES = ("WRITE_FIRST", "NO_CHANGE", "READ_FIRST")
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -16,7 +16,7 @@ def gen_sites():
IOB33: not a diff pair. Relatively rare (at least in ROI...2 of them?)
Focus on IOB33S to start
'''
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -8,7 +8,7 @@ import json
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -73,7 +73,7 @@ def find_phasers_for_pll(grid, loc):
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -16,7 +16,7 @@ def gen_sites():
IOB33: not a diff pair. Relatively rare (at least in ROI...2 of them?)
Focus on IOB33S to start
'''
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -13,7 +13,7 @@ from prjxray.db import Database
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
tile_list = []

View File

@ -16,7 +16,7 @@ def gen_sites():
IOB33: not a diff pair. Relatively rare (at least in ROI...2 of them?)
Focus on IOB33S to start
'''
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -23,7 +23,7 @@ def read_site_to_cmt():
def gen_sites():
''' Return dict of ISERDES/OSERDES locations. '''
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
xy_fun = util.create_xy_fun('\S+')

View File

@ -11,7 +11,7 @@ from prjxray.db import Database
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -9,7 +9,7 @@ from prjxray.lut_maker import LutMaker
def gen_sites():
xy_fun = util.create_xy_fun('BUFR_')
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -9,7 +9,7 @@ from prjxray.db import Database
def gen_sites():
get_xy = util.create_xy_fun('BUFHCE_')
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -22,7 +22,7 @@ def eprint(*args, **kwargs):
def gen_sites(desired_site_type):
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
@ -34,7 +34,7 @@ def gen_sites(desired_site_type):
def gen_bufhce_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)
@ -50,7 +50,7 @@ def gen_bufhce_sites():
def get_cmt_loc(cmt_tile_name):
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
return grid.loc_of_tilename(cmt_tile_name)

View File

@ -9,7 +9,7 @@ from prjxray.state_gen import StateGen
def gen_sites():
xy_fun = util.create_xy_fun('BUFGCTRL_')
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -2,7 +2,7 @@
from prjxray.segmaker import Segmaker
from prjxray.db import Database
from prjxray.util import get_db_root
from prjxray.util import get_db_root, get_part
import re
REBUF_GCLK = re.compile('^CLK_BUFG_REBUF_R_CK_GCLK([0-9]+)_BOT$')
@ -17,8 +17,8 @@ def gclk_of_wire(wire):
class ClockColumn(object):
def __init__(self, db_root):
db = Database(db_root)
def __init__(self, db_root, part):
db = Database(db_root, part)
grid = db.grid()
tiles_in_gclk_columns = []
@ -72,8 +72,9 @@ class ClockColumn(object):
def main():
db_root = get_db_root()
part = get_part()
clock_column = ClockColumn(db_root)
clock_column = ClockColumn(db_root, part)
segmk = Segmaker("design.bits")

View File

@ -26,7 +26,7 @@ def get_xy(s):
def gen_sites(desired_site_type):
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
@ -38,7 +38,7 @@ def gen_sites(desired_site_type):
def gen_bufhce_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile_name)

View File

@ -118,7 +118,7 @@ module top();
clock_sources = ClockSources()
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
def gen_sites(desired_site_type):

View File

@ -178,7 +178,7 @@ def main():
adv_clock_sources = ClockSources()
site_to_cmt = dict(read_site_to_cmt())
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
def gen_sites(desired_site_type):

View File

@ -118,7 +118,7 @@ module top();
clock_sources = ClockSources()
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
def gen_sites(desired_site_type):

View File

@ -101,7 +101,7 @@ def main():
clock_region_limit = dict()
clock_region_serdes_location = dict()
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
def gen_sites(desired_site_type):

View File

@ -101,7 +101,7 @@ def main():
clock_region_limit = dict()
clock_region_serdes_location = dict()
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
def gen_sites(desired_site_type):

View File

@ -7,7 +7,7 @@ random.seed(int(os.getenv("SEED"), 16))
def gen_sites(lr):
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile_name in grid.tiles():

View File

@ -9,7 +9,7 @@ random.seed(int(os.getenv("SEED"), 16))
def bram_count():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
count = 0

View File

@ -3,7 +3,7 @@ import shutil
import sys
import subprocess
import signal
from multiprocessing import Pool
from multiprocessing import Pool, Lock
from itertools import chain
import argparse
@ -11,7 +11,11 @@ import argparse
# stdout=DEVNULL in subprocess.check_call
# Worker function called from threads
# Worker function called from threads.
# Once the worker completes the job, the temporary files
# get merged with the final outputs in a thread-safe way
# and deleted to save disk usage.
# To do so, a global Lock is provided at the Pool initialization.
def start_pips(argList):
blockID, start, stop, total = argList
print("Running instance :" + str(blockID) + " / " + str(total))
@ -20,6 +24,25 @@ def start_pips(argList):
str(blockID) + " " + str(start) + " " + str(stop),
shell=True)
uphill_wires = "wires/uphill_wires_{}.txt".format(blockID)
downhill_wires = "wires/downhill_wires_{}.txt".format(blockID)
# Locking to write on final file and remove the temporary one
Lock.acquire()
with open("uphill_wires.txt", "a") as wfd:
f = uphill_wires
with open(f, "r") as fd:
shutil.copyfileobj(fd, wfd)
with open("downhill_wires.txt", "a") as wfd:
f = downhill_wires
with open(f, "r") as fd:
shutil.copyfileobj(fd, wfd)
Lock.release()
os.remove(uphill_wires)
os.remove(downhill_wires)
# Function called once to get the total numbers of pips to list
def get_nb_pips():
@ -31,6 +54,11 @@ def get_nb_pips():
return int(countfile.readline())
def pool_init(lock):
global Lock
Lock = lock
def run_pool(itemcount, nbBlocks, blocksize, nbParBlock, workFunc):
# We handle the case of not integer multiple of pips
intitemcount = blocksize * nbBlocks
@ -57,9 +85,12 @@ def run_pool(itemcount, nbBlocks, blocksize, nbParBlock, workFunc):
startI = chain(startI, [intitemcount])
stopI = chain(stopI, [itemcount])
mpLock = Lock()
argList = zip(blockId, startI, stopI, totalBlock)
with Pool(processes=nbParBlock) as pool:
with Pool(processes=nbParBlock, initializer=pool_init,
initargs=(mpLock, )) as pool:
pool.map(workFunc, argList)
return nbBlocks
@ -116,20 +147,6 @@ def main(argv):
pipsFileCount = run_pool(
pipscount, nbPipsBlock, blockPipsSize, nbParBlock, start_pips)
print("Generating final files")
with open("uphill_wires.txt", "w") as wfd:
for j in range(0, pipsFileCount):
f = "wires/uphill_wires_" + str(j) + ".txt"
with open(f, "r") as fd:
shutil.copyfileobj(fd, wfd)
with open("downhill_wires.txt", "w") as wed:
for j in range(0, pipsFileCount):
e = "wires/downhill_wires_" + str(j) + ".txt"
with open(e, "r") as ed:
shutil.copyfileobj(ed, wed)
print("Work done !")
return 0

View File

@ -10,10 +10,10 @@ database: $(SPECIMENS_OK)
true
pushdb:
cp build/output/tile_type_*.json ${XRAY_DATABASE_DIR}/$(XRAY_DATABASE)/
rm ${XRAY_DATABASE_DIR}/$(XRAY_DATABASE)/tile_type_*_site_type_*.json
cp build/output/site_type_*.json ${XRAY_DATABASE_DIR}/$(XRAY_DATABASE)/
cp build/output/tileconn.json ${XRAY_DATABASE_DIR}/$(XRAY_DATABASE)/
cp build/output/tile_type_*.json ${XRAY_FAMILY_DIR}/
rm ${XRAY_FAMILY_DIR}/tile_type_*_site_type_*.json
cp build/output/site_type_*.json ${XRAY_FAMILY_DIR}/
cp build/output/tileconn.json ${XRAY_FAMILY_DIR}/$(XRAY_PART)/
$(SPECIMENS_OK):
bash generate.sh $(subst /OK,,$@) -p=$(MAX_VIVADO_PROCESS) -t=$(MAX_TILES_INSTANCE) -n=$(MAX_NODES_INSTANCE)

View File

@ -11,4 +11,4 @@ python3 create_node_tree.py \
--output_dir build/output
python3 reduce_site_types.py --output_dir build/output
python3 generate_grid.py --root_dir build/specimen_001/ --output_dir build/output \
--ignored_wires ${XRAY_DATABASE}_ignored_wires.txt
--ignored_wires ignored_wires/${XRAY_DATABASE}/${XRAY_PART}_ignored_wires.txt

View File

@ -2,8 +2,6 @@
from __future__ import print_function
import argparse
import prjxray.lib
import prjxray.util
import pyjson5 as json5
import multiprocessing
import progressbar
@ -14,6 +12,7 @@ import pickle
import sys
from utils import xjson
from prjxray import util, lib
def get_tile_grid_info(fname):
@ -563,7 +562,7 @@ def main():
args = parser.parse_args()
tiles, nodes = prjxray.lib.read_root_csv(args.root_dir)
tiles, nodes = lib.read_root_csv(args.root_dir)
processes = min(multiprocessing.cpu_count(), 10)
print('{} Running {} processes'.format(datetime.datetime.now(), processes))
@ -575,7 +574,8 @@ def main():
wire_map_file = os.path.join(args.output_dir, 'wiremap.pickle')
print('{} Reading tilegrid'.format(datetime.datetime.now()))
with open(os.path.join(prjxray.util.get_db_root(), 'tilegrid.json')) as f:
with open(os.path.join(util.get_db_root(), util.get_part(),
'tilegrid.json')) as f:
grid = json.load(f)
if not args.verify_only:
@ -643,7 +643,7 @@ def main():
print('{} Verifing tileconn'.format(datetime.datetime.now()))
error_nodes = []
prjxray.lib.verify_nodes(
lib.verify_nodes(
[
(node['node'], tuple(wire['wire']
for wire in node['wires']))
@ -661,7 +661,7 @@ def main():
with open(ignored_wires_file) as f:
ignored_wires = set(l.strip() for l in f)
if not prjxray.lib.check_errors(error_nodes, ignored_wires):
if not lib.check_errors(error_nodes, ignored_wires):
print(
'{} errors detected, see {} for details.'.format(
len(error_nodes), error_nodes_file))

File diff suppressed because it is too large Load Diff

View File

@ -13,10 +13,24 @@ set root_fp [open "root_node_${blocknb}.csv" w]
set nodes [get_nodes]
for {set j $start } { $j < $stop } { incr j } {
create_pblock exclude_roi
foreach roi "$::env(XRAY_EXCLUDE_ROI_TILEGRID)" {
puts "ROI: $roi"
resize_pblock [get_pblocks exclude_roi] -add "$roi"
}
set not_allowed_sites [get_sites -of_objects [get_pblocks exclude_roi]]
set not_allowed_nodes [get_nodes -of_objects [get_tiles -of_objects $not_allowed_sites]]
for {set j $start } { $j < $stop } { incr j } {
set node [lindex $nodes $j]
# If node is not allowed, skip it
set res [lsearch $not_allowed_nodes $node]
if { $res != -1 } {
continue
}
file mkdir [file dirname "${node}"]
set fname $node.json5
puts $root_fp "node,,$fname"

View File

@ -13,6 +13,16 @@ set root_fp [open "root_${blocknb}.csv" w]
#puts $root_fp "filetype,subtype,filename"
set tiles [get_tiles]
create_pblock exclude_roi
foreach roi "$::env(XRAY_EXCLUDE_ROI_TILEGRID)" {
puts "ROI: $roi"
resize_pblock [get_pblocks exclude_roi] -add "$roi"
}
set not_allowed_sites [get_sites -of_objects [get_pblocks exclude_roi]]
set not_allowed_tiles [get_tiles -of_objects $not_allowed_sites]
# Convert DRIVE from ??? units to 10^(-3 to -6) Ohms
set MAGIC 0.6875
@ -42,6 +52,12 @@ for {set j $start } { $j < $stop } { incr j } {
set tile [lindex $tiles $j]
# If tile is not allowed, skip it
set res [lsearch $not_allowed_tiles $tile]
if { $res != -1 } {
continue
}
set fname tile_$tile.json5
set tile_type [get_property TYPE $tile]
puts $root_fp "tile,$tile_type,$fname"

View File

@ -5,7 +5,8 @@ SPECIMENS_OK := $(addsuffix /OK,$(SPECIMENS))
database: $(SPECIMENS_OK)
pushdb:
cp build/specimen_001/*_package_pins.csv ${XRAY_DATABASE_DIR}/$(XRAY_DATABASE)/
mkdir -p ${XRAY_FAMILY_DIR}/${XRAY_PART}/
cp build/specimen_001/*_package_pins.csv ${XRAY_FAMILY_DIR}/${XRAY_PART}/package_pins.csv
$(SPECIMENS_OK):
bash generate.sh $(subst /OK,,$@)

View File

@ -8,7 +8,7 @@ from prjxray.db import Database
def gen_sites():
db = Database(util.get_db_root())
db = Database(util.get_db_root(), util.get_part())
grid = db.grid()
for tile in sorted(grid.tiles()):
loc = grid.loc_of_tilename(tile)

View File

@ -127,11 +127,52 @@ $(eval $(call fuzzer,100-dsp-mskpat,005-tilegrid))
quick:
$(MAKE) QUICK=Y
# part_only runs the fuzzers required for supporting additional parts.
# Note: In theory this includes 005-tilegrid, but there isn't support for
# multiple tilegrid's per family at this time.
part_only:
+$(MAKE) -C 001-part-yaml run
+$(MAKE) -C 075-pins run
# Part only targets
# -----------------
.PHONY: all clean clean_fuzzers clean_logs quick part_only
$(addprefix ${XRAY_FAMILY_DIR}/${XRAY_PART}/part.,yaml json):
$(MAKE) -C 001-part-yaml run
${XRAY_FAMILY_DIR}/${XRAY_PART}/package_pins.csv:
$(MAKE) -C 075-pins run
${XRAY_FAMILY_DIR}/${XRAY_PART}/tilegrid.json:
$(MAKE) -C 005-tilegrid run
${XRAY_FAMILY_DIR}/${XRAY_PART}/tileconn.json:
$(MAKE) -C 072-ordered_wires run
$(MAKE) -C 073-get_counts run
$(MAKE) -C 074-dump_all run
part_only_yaml: $(addprefix ${XRAY_FAMILY_DIR}/${XRAY_PART}/part.,yaml json)
part_only_tilegrid: ${XRAY_FAMILY_DIR}/${XRAY_PART}/tilegrid.json
part_only_tileconn: ${XRAY_FAMILY_DIR}/${XRAY_PART}/tileconn.json
part_only_pins: ${XRAY_FAMILY_DIR}/${XRAY_PART}/package_pins.csv
# part_only runs the fuzzers required to support additional parts
part_only:
# Create PART-specific directory
mkdir -p ${XRAY_FAMILY_DIR}/${XRAY_PART}
# Generate YAML
+$(MAKE) part_only_yaml
# Generate Tile grid
+$(MAKE) part_only_tilegrid
# Generate Tile connections
+$(MAKE) part_only_tileconn
# Generate package pins
+$(MAKE) part_only_pins
# roi_only runs the fuzzers required for supporting additional parts when building
# a roi harness.
roi_only:
# Create PART-specific directory
mkdir -p ${XRAY_FAMILY_DIR}/${XRAY_PART}
# Generate YAML
+$(MAKE) part_only_yaml
# Generate package pins
+$(MAKE) part_only_pins
# Copy tilegrid and tileconn
cp ${XRAY_FAMILY_DIR}/${XRAY_EQUIV_PART}/tilegrid.json ${XRAY_FAMILY_DIR}/${XRAY_PART}/tilegrid.json
cp ${XRAY_FAMILY_DIR}/${XRAY_EQUIV_PART}/tileconn.json ${XRAY_FAMILY_DIR}/${XRAY_PART}/tileconn.json
.PHONY: all clean clean_fuzzers clean_logs quick part_only roi_only

View File

@ -1,5 +1,6 @@
# XC7A35TICSG324-1L
export XRAY_PART=xc7a35tcsg324-1
export XRAY_EQUIV_PART=xc7a50tfgg484-1
if [ -z "$XRAY_PINCFG" ]; then
echo "XRAY_PINCFG not set"

View File

@ -1,5 +1,6 @@
# XC7A35T-1CPG236C
export XRAY_PART=xc7a35tcpg236-1
export XRAY_EQUIV_PART=xc7a50tfgg484-1
if [ -z "$XRAY_PINCFG" ]; then
echo "XRAY_PINCFG not set"
return 1

View File

@ -5,7 +5,7 @@ import sys
import fasm
from prjxray.db import Database
from prjxray.roi import Roi
from prjxray.util import get_db_root
from prjxray.util import get_db_root, get_part
def set_port_wires(ports, name, pin, wires_outside_roi):
@ -42,7 +42,7 @@ def main():
design_json['info'][name] = int(value)
db = Database(get_db_root())
db = Database(get_db_root(), get_part())
grid = db.grid()
roi = Roi(

View File

@ -21,7 +21,7 @@ make pushdb
popd
popd
EOF
stat ${XRAY_DIR}/database/${XRAY_DATABASE}/${XRAY_PART}.yaml >/dev/null
stat ${XRAY_PART_YAML} >/dev/null
# 6x by 18y CLBs (108)
if [ "$SMALL" = Y ] ; then

View File

@ -1,5 +1,6 @@
# XC7010-1CLG400C
export XRAY_PART=xc7z010clg400-1
export XRAY_EQUIV_PART=xc7z010clg400-1
if [ -z "$XRAY_PINCFG" ]; then
echo "XRAY_PINCFG not set"

View File

@ -27,7 +27,8 @@ build/$(2)_$(1)/timing_$(2)_$(1).json5: build/.touch runme.tcl $(3)
build/timing_$(2)_$(1).xlsx: build/$(2)_$(1)/timing_$(2)_$(1).json create_timing_worksheet_db.py
python3 create_timing_worksheet_db.py \
--timing_json build/$(2)_$(1)/timing_$(2)_$(1).json \
--db_root ${XRAY_DATABASE_DIR}/${XRAY_DATABASE} \
--db_root ${XRAY_FAMILY_DIR} \
--part ${XRAY_PART} \
--output_xlsx build/timing_$(2)_$(1).xlsx
build/$(2)_$(1)/design_$(2)_$(1).fasm: build/$(2)_$(1)/timing_$(2)_$(1).json

View File

@ -6,6 +6,7 @@ from prjxray.timing import Outpin, Inpin, Wire, Buffer, \
PassTransistor, IntristicDelay, RcElement, PvtCorner
from prjxray.math_models import ExcelMathModel
from prjxray.db import Database
from prjxray import util
FAST = PvtCorner.FAST
SLOW = PvtCorner.SLOW
@ -443,8 +444,9 @@ def main():
parser = argparse.ArgumentParser(
description="Create timing worksheet for 7-series timing analysis.")
util.db_root_arg(parser)
util.part_arg(parser)
parser.add_argument('--timing_json', required=True)
parser.add_argument('--db_root', required=True)
parser.add_argument('--output_xlsx', required=True)
args = parser.parse_args()
@ -452,7 +454,7 @@ def main():
with open(args.timing_json) as f:
timing = json.load(f)
db = Database(args.db_root)
db = Database(args.db_root, args.part)
nodes = {}
for net in timing:

View File

@ -25,7 +25,7 @@ def get_available_databases(prjxray_root):
class Database(object):
def __init__(self, db_root):
def __init__(self, db_root, part):
""" Create project x-ray Database at given db_root.
db_root: Path to directory containing settings.sh, *.db, tilegrid.json and
@ -33,6 +33,7 @@ class Database(object):
"""
self.db_root = db_root
self.part = part
# tilegrid.json JSON object
self.tilegrid = None
self.tileconn = None
@ -87,17 +88,17 @@ class Database(object):
self.site_types[site_type_name] = os.path.join(self.db_root, f)
if f.endswith('_required_features.fasm'):
part = f[:-len('_required_features.fasm')]
required_features_path = os.path.join(
self.db_root, self.part, "required_features.fasm")
if os.path.isfile(required_features_path):
with open(required_features_path, "r") as fp:
features = []
for line in fp:
line = line.strip()
if len(line) > 0:
features.append(line)
with open(os.path.join(self.db_root, f), "r") as fp:
features = []
for line in fp:
line = line.strip()
if len(line) > 0:
features.append(line)
self.required_features[part] = set(features)
self.required_features[self.part] = set(features)
self.tile_types_obj = {}
@ -116,13 +117,15 @@ class Database(object):
def _read_tilegrid(self):
""" Read tilegrid database if not already read. """
if not self.tilegrid:
with open(os.path.join(self.db_root, 'tilegrid.json')) as f:
with open(os.path.join(self.db_root, self.part,
'tilegrid.json')) as f:
self.tilegrid = json.load(f)
def _read_tileconn(self):
""" Read tileconn database if not already read. """
if not self.tileconn:
with open(os.path.join(self.db_root, 'tileconn.json')) as f:
with open(os.path.join(self.db_root, self.part,
'tileconn.json')) as f:
self.tileconn = json.load(f)
def grid(self):

View File

@ -824,7 +824,8 @@ def main():
# Build (baseaddr, offset) -> tile name map
database_dir = os.path.join(
os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"))
os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"),
os.getenv("XRAY_PART"))
tilegrid_file = os.path.join(database_dir, "tilegrid.json")
address_map = build_address_map(tilegrid_file)

View File

@ -72,11 +72,16 @@ def add_site_group_zero(segmk, site, prefix, vals, zero_val, val):
class Segmaker:
def __init__(self, bitsfile, verbose=None, db_root=None):
def __init__(self, bitsfile, verbose=None, db_root=None, part=None):
self.db_root = db_root
if self.db_root is None:
self.db_root = util.get_db_root()
self.part = part
if self.part is None:
self.part = util.get_part()
assert self.part, "No part specified."
self.verbose = verbose if verbose is not None else os.getenv(
'VERBOSE', 'N') == 'Y'
self.load_grid()
@ -113,7 +118,8 @@ class Segmaker:
def load_grid(self):
'''Load self.grid holding tile addresses'''
with open(os.path.join(self.db_root, "tilegrid.json"), "r") as f:
with open(os.path.join(self.db_root, self.part, "tilegrid.json"),
"r") as f:
self.grid = json.load(f)
assert "segments" not in self.grid, "Old format tilegrid.json"

View File

@ -15,6 +15,12 @@ def get_db_root():
os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"))
def get_part():
ret = os.getenv("XRAY_PART", None)
return ret
def roi_xy():
x1 = int(os.getenv('XRAY_ROI_GRID_X1', 0))
x2 = int(os.getenv('XRAY_ROI_GRID_X2', 58))
@ -73,7 +79,7 @@ def slice_xy():
def get_roi():
from .db import Database
(x1, x2), (y1, y2) = roi_xy()
db = Database(get_db_root())
db = Database(get_db_root(), get_part())
return Roi(db=db, x1=x1, x2=x2, y1=y1, y2=y2)
@ -115,6 +121,20 @@ def db_root_arg(parser):
parser.add_argument('--db-root', help="Database root.", **db_root_kwargs)
def part_arg(parser):
part = os.getenv("XRAY_PART")
part_kwargs = {}
if part is None:
part_kwargs['required'] = True
else:
part_kwargs['required'] = False
part_kwargs['default'] = part
parser.add_argument(
'--part',
help="Part name. When not given defaults to XRAY_PART env. var.",
**part_kwargs)
def parse_db_line(line):
'''Return tag name, bit values (if any), mode (if any)'''
parts = line.split()

21
settings/artix200t.sh Normal file
View File

@ -0,0 +1,21 @@
export XRAY_DATABASE="artix7"
export XRAY_PART="xc7a200tffg1156-1"
export XRAY_ROI_FRAMES="0x00000000:0xffffffff"
# All CLB's in part, all BRAM's in part, all DSP's in part.
# tcl queries IOB => don't bother adding
export XRAY_ROI_TILEGRID="SLICE_X0Y0:SLICE_X163Y249 RAMB18_X0Y0:RAMB18_X8Y99 RAMB36_X0Y0:RAMB36_X8Y49 DSP48_X0Y0:DSP48_X8Y99 IOB_X0Y0:IOB_X1Y249"
export XRAY_EXCLUDE_ROI_TILEGRID="SLICE_X82Y200:SLICE_X83Y249 SLICE_X82Y0:SLICE_X83Y49"
export XRAY_IOI3_TILES="RIOI3_X105Y9 LIOI3_X0Y9"
export XRAY_PIN_00="R26"
export XRAY_PIN_01="P26"
export XRAY_PIN_02="N26"
export XRAY_PIN_03="M27"
export XRAY_PIN_04="U25"
export XRAY_PIN_05="T25"
export XRAY_PIN_06="P24"
source $(dirname ${BASH_SOURCE[0]})/../utils/environment.sh

View File

@ -6,6 +6,10 @@ export XRAY_ROI_FRAMES="0x00000000:0xffffffff"
# tcl queries IOB => don't bother adding
export XRAY_ROI_TILEGRID="SLICE_X0Y0:SLICE_X65Y99 SLICE_X0Y100:SLICE_X57Y149 RAMB18_X0Y0:RAMB18_X1Y59 RAMB36_X0Y0:RAMB36_X1Y29 RAMB18_X2Y0:RAMB18_X2Y39 RAMB36_X2Y0:RAMB36_X2Y19 DSP48_X0Y0:DSP48_X1Y59"
export XRAY_EXCLUDE_ROI_TILEGRID=""
export XRAY_IOI3_TILES="LIOI3_X0Y9 RIOI3_X43Y9"
# These settings must remain in sync
export XRAY_ROI="SLICE_X0Y100:SLICE_X35Y149 RAMB18_X0Y40:RAMB18_X0Y59 RAMB36_X0Y20:RAMB36_X0Y29 DSP48_X0Y40:DSP48_X0Y59 IOB_X0Y100:IOB_X0Y149"
# Most of CMT X0Y2.

View File

@ -5,6 +5,10 @@ export XRAY_ROI_FRAMES="0x00000000:0xffffffff"
# FIXME: make entire part
export XRAY_ROI_TILEGRID="SLICE_X0Y50:SLICE_X19Y99 DSP48_X0Y20:DSP48_X0Y39 RAMB18_X0Y20:RAMB18_X0Y39 RAMB36_X0Y10:RAMB36_X0Y19"
export XRAY_EXCLUDE_ROI_TILEGRID=""
export XRAY_IOI3_TILES="LIOI3_X0Y9"
# These settings must remain in sync
export XRAY_ROI="SLICE_X0Y50:SLICE_X19Y99 DSP48_X0Y20:DSP48_X0Y39 RAMB18_X0Y20:RAMB18_X0Y39 RAMB36_X0Y10:RAMB36_X0Y19 IOB_X0Y50:IOB_X0Y99"
# Part of CMT X0Y1

View File

@ -5,6 +5,10 @@ export XRAY_ROI_FRAMES="0x00000000:0xffffffff"
# All CLB's in part, all BRAM's in part, all DSP's in part.
export XRAY_ROI_TILEGRID="SLICE_X0Y0:SLICE_X43Y99 RAMB18_X0Y0:RAMB18_X2Y39 RAMB36_X0Y0:RAMB36_X2Y19 DSP48_X0Y0:DSP48_X1Y39"
export XRAY_EXCLUDE_ROI_TILEGRID=""
export XRAY_IOI3_TILES="RIOI3_X31Y9"
# These settings must remain in sync
export XRAY_ROI="SLICE_X00Y50:SLICE_X43Y99 RAMB18_X0Y20:RAMB18_X2Y39 RAMB36_X0Y10:RAMB36_X2Y19 IOB_X0Y50:IOB_X0Y99"

View File

@ -10,6 +10,7 @@ from unittest import TestCase, main
# in the current subdirectory, which will be a temporary one, to allow concurent
# testing.
environ['XRAY_DATABASE_ROOT'] = '.'
environ['XRAY_PART'] = './'
from prjxray.util import get_roi

View File

@ -27,8 +27,8 @@ def bit_to_bits(bitread, part_yaml, bit_file, bits_file, frame_range=None):
shell=True)
def bits_to_fasm(db_root, bits_file, verbose, canonical):
db = Database(db_root)
def bits_to_fasm(db_root, part, bits_file, verbose, canonical):
db = Database(db_root, part)
grid = db.grid()
disassembler = fasm_disassembler.FasmDisassembler(db)
@ -102,14 +102,15 @@ def main():
bit_to_bits(
bitread=args.bitread,
part_yaml=os.path.join(args.db_root, '{}.yaml'.format(args.part)),
part_yaml=os.path.join(args.db_root, args.part, "part.yaml"),
bit_file=args.bit_file,
bits_file=bits_file.name,
frame_range=args.frame_range,
)
bits_to_fasm(
args.db_root, bits_file.name, args.verbose, args.canonical)
args.db_root, args.part, bits_file.name, args.verbose,
args.canonical)
if __name__ == '__main__':

View File

@ -142,13 +142,13 @@ def check_tile_overlap(db, verbose=False):
print("Checked %s tiles, %s bits" % (tiles_checked, len(mall)))
def run(db_root, verbose=False):
def run(db_root, part, verbose=False):
# Start by running a basic check on db files
print("Checking individual .db...")
parsedb_all(db_root, verbose=verbose)
# Now load and verify tile consistency
db = prjxraydb.Database(db_root)
db = prjxraydb.Database(db_root, part)
db._read_tilegrid()
'''
these don't load properly without .json files
@ -170,10 +170,11 @@ def main():
description="Parse a db repository, checking for consistency")
util.db_root_arg(parser)
util.part_arg(parser)
parser.add_argument('--verbose', action='store_true', help='')
args = parser.parse_args()
run(args.db_root, verbose=args.verbose)
run(args.db_root, args.part, verbose=args.verbose)
if __name__ == '__main__':

View File

@ -10,13 +10,14 @@ export XRAY_DIR="$( dirname "$XRAY_UTILS_DIR" )"
export XRAY_DATABASE_DIR="${XRAY_DIR}/database"
export XRAY_TOOLS_DIR="${XRAY_DIR}/build/tools"
export XRAY_FUZZERS_DIR="${XRAY_DIR}/fuzzers"
export XRAY_FAMILY_DIR="${XRAY_DATABASE_DIR}/${XRAY_DATABASE}"
if [ -e "${XRAY_DIR}/env/bin/activate" ]; then
source "${XRAY_DIR}/env/bin/activate"
fi
# misc
export XRAY_PART_YAML="${XRAY_DATABASE_DIR}/${XRAY_DATABASE}/${XRAY_PART}.yaml"
export XRAY_PART_YAML="${XRAY_DATABASE_DIR}/${XRAY_DATABASE}/${XRAY_PART}/part.yaml"
export PYTHONPATH="${XRAY_DIR}:${XRAY_DIR}/third_party/fasm:$PYTHONPATH"
# tools

View File

@ -11,7 +11,7 @@ import csv
from collections import defaultdict
from prjxray import fasm_assembler
from prjxray import fasm_assembler, util
from prjxray.db import Database
from prjxray.roi import Roi
@ -109,7 +109,7 @@ def run(
roi=None,
debug=False,
emit_pudc_b_pullup=False):
db = Database(db_root)
db = Database(db_root, part)
assembler = fasm_assembler.FasmAssembler(db)
set_features = set()
@ -124,12 +124,11 @@ def run(
bank_to_tile = defaultdict(lambda: set())
if part is not None:
with open(os.path.join(db_root, part + "_package_pins.csv"),
"r") as fp:
with open(os.path.join(db_root, part, "package_pins.csv"), "r") as fp:
reader = csv.DictReader(fp)
package_pins = [l for l in reader]
with open(os.path.join(db_root, part + ".json"), "r") as fp:
with open(os.path.join(db_root, part, "part.json"), "r") as fp:
part_data = json.load(fp)
for bank, loc in part_data["iobanks"].items():
@ -271,28 +270,8 @@ def main():
'Convert FPGA configuration description ("FPGA assembly") into binary frame equivalent'
)
database_dir = os.getenv("XRAY_DATABASE_DIR")
database = os.getenv("XRAY_DATABASE")
db_root_kwargs = {}
if database_dir is None or database is None:
db_root_kwargs['required'] = True
else:
db_root_kwargs['required'] = False
db_root_kwargs['default'] = os.path.join(database_dir, database)
db_part = os.getenv("XRAY_PART")
db_part_kwargs = {}
if db_part is None:
db_part_kwargs['required'] = True
else:
db_part_kwargs['required'] = False
db_part_kwargs['default'] = db_part
parser.add_argument('--db-root', help="Database root.", **db_root_kwargs)
parser.add_argument(
'--part',
help="Part name. When not given defaults to XRAY_PART env. var.",
**db_part_kwargs)
util.db_root_arg(parser)
util.part_arg(parser)
parser.add_argument(
'--sparse', action='store_true', help="Don't zero fill all frames")
parser.add_argument(

View File

@ -8,6 +8,7 @@ from __future__ import print_function
import os.path
import fasm
from prjxray import db
from prjxray import util
def main():
@ -17,20 +18,12 @@ def main():
description=
'Outputs a Vivavo highlight_objects command from a FASM file.')
database_dir = os.getenv("XRAY_DATABASE_DIR")
database = os.getenv("XRAY_DATABASE")
db_root_kwargs = {}
if database_dir is None or database is None:
db_root_kwargs['required'] = True
else:
db_root_kwargs['required'] = False
db_root_kwargs['default'] = os.path.join(database_dir, database)
parser.add_argument('--db-root', help="Database root.", **db_root_kwargs)
util.db_root_arg(parser)
util.part_arg(parser)
parser.add_argument('fn_in', help='Input FPGA assembly (.fasm) file')
args = parser.parse_args()
database = db.Database(args.db_root)
database = db.Database(args.db_root, args.part)
grid = database.grid()
def inner():

View File

@ -13,8 +13,8 @@ import fasm
from prjxray import db
def process_fasm(db_root, fasm_file, canonical):
database = db.Database(db_root)
def process_fasm(db_root, part, fasm_file, canonical):
database = db.Database(db_root, part)
grid = database.grid()
for fasm_line in fasm.parse_fasm_filename(fasm_file):
@ -56,10 +56,11 @@ def process_fasm(db_root, fasm_file, canonical):
yield fasm_line
def run(db_root, fasm_file, canonical):
def run(db_root, part, fasm_file, canonical):
print(
fasm.fasm_tuple_to_string(
process_fasm(db_root, fasm_file, canonical), canonical=canonical))
process_fasm(db_root, part, fasm_file, canonical),
canonical=canonical))
def main():
@ -67,22 +68,14 @@ def main():
parser = argparse.ArgumentParser(description='Pretty print a FASM file.')
database_dir = os.getenv("XRAY_DATABASE_DIR")
database = os.getenv("XRAY_DATABASE")
db_root_kwargs = {}
if database_dir is None or database is None:
db_root_kwargs['required'] = True
else:
db_root_kwargs['required'] = False
db_root_kwargs['default'] = os.path.join(database_dir, database)
parser.add_argument('--db-root', help="Database root.", **db_root_kwargs)
util.db_root_arg(parser)
util.part_arg(parser)
parser.add_argument('fasm_file', help='Input FASM file')
parser.add_argument(
'--canonical', help='Output canonical bitstream.', action='store_true')
args = parser.parse_args()
run(args.db_root, args.fasm_file, args.canonical)
run(args.db_root, args.part, args.fasm_file, args.canonical)
if __name__ == '__main__':

View File

@ -1,10 +1,11 @@
from __future__ import print_function
import prjxray.db
import prjxray.util
import argparse
def quick_test(db_root):
db = prjxray.db.Database(db_root)
def quick_test(db_root, part):
db = prjxray.db.Database(db_root, part)
g = db.grid()
# Verify that we have some tile information for every tile in grid.
@ -47,11 +48,13 @@ def quick_test(db_root):
def main():
parser = argparse.ArgumentParser(
description="Runs a sanity check on a prjxray database.")
parser.add_argument('--db-root', required=True)
util.db_root_arg(parser)
util.part_arg(parser)
args = parser.parse_args()
quick_test(args.db_root)
quick_test(args.db_root, args.part)
if __name__ == '__main__':

View File

@ -428,6 +428,7 @@ def load_tiles(db_root):
def run(
db_root,
part,
bits_file,
segnames,
omit_empty_segs=False,
@ -436,7 +437,7 @@ def run(
flag_decode_omit=False,
bit_only=False,
verbose=False):
db = prjxraydb.Database(db_root)
db = prjxraydb.Database(db_root, part)
tiles = load_tiles(db_root)
segments = mk_segments(tiles)
bitdata = bitstream.load_bitdata2(open(bits_file, "r"))
@ -477,6 +478,7 @@ def main():
description="Decode bits within a tile's address space")
util.db_root_arg(parser)
util.part_arg(parser)
parser.add_argument('--verbose', action='store_true', help='')
parser.add_argument(
'-z',
@ -503,6 +505,7 @@ def main():
run(
args.db_root,
args.part,
args.bits_file,
args.segnames,
args.z,

View File

@ -2,18 +2,21 @@
import argparse
from prjxray.db import Database
from prjxray.grid import BlockType
from prjxray import util
def main():
parser = argparse.ArgumentParser(
description="Tool for checking which tiles have bits defined.")
parser.add_argument('db_root')
util.db_root_arg(parser)
util.part_arg(parser)
parser.add_argument('--show-only-missing', action='store_true')
parser.add_argument('--verbose', action='store_true')
args = parser.parse_args()
db = Database(args.db_root)
db = Database(args.db_root, args.part)
grid = db.grid()
tile_types = {}

View File

@ -8,6 +8,7 @@ import multiprocessing
import pyjson5 as json5
import json
import sys
from prjxray import util
def full_wire_name(wire_in_grid):
@ -36,8 +37,8 @@ def make_connection(wires, connection):
wires[wire] = wire_a_set
def make_connections(db_root):
db = prjxray.db.Database(db_root)
def make_connections(db_root, part):
db = prjxray.db.Database(db_root, part)
c = db.connections()
wires = {}
@ -60,7 +61,9 @@ def read_json5(fname):
def main():
parser = argparse.ArgumentParser(
description="Tests database against raw node list.")
parser.add_argument('--db-root', required=True)
util.db_root_arg(parser)
util.part_arg(parser)
parser.add_argument('--raw_node_root', required=True)
parser.add_argument('--error_nodes', default="error_nodes.json")
parser.add_argument('--ignored_wires')
@ -88,7 +91,7 @@ def main():
bar.update(idx + 1)
print('{} Creating connections'.format(datetime.datetime.now()))
generated_nodes = make_connections(args.db_root)
generated_nodes = make_connections(args.db_root, args.part)
print('{} Verifying connections'.format(datetime.datetime.now()))
error_nodes = []