diff --git a/Makefile b/Makefile index 9b5078d6..6fef2f15 100644 --- a/Makefile +++ b/Makefile @@ -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 @@ -142,7 +142,7 @@ $(foreach DB,$(DATABASES),$(eval $(call database,$(DB)))) # Targets related to Project X-Ray parts # -------------------------------------- -ARTIX_PARTS=artix50t artix200t +ARTIX_PARTS=artix200t ZYNQ_PARTS=zynq020 KINTEX_PARTS=kintex70t diff --git a/fuzzers/001-part-yaml/Makefile b/fuzzers/001-part-yaml/Makefile index 70b92fe7..efc4320c 100644 --- a/fuzzers/001-part-yaml/Makefile +++ b/fuzzers/001-part-yaml/Makefile @@ -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 diff --git a/fuzzers/005-tilegrid/Makefile b/fuzzers/005-tilegrid/Makefile index 0e4a9717..c12d6ef5 100644 --- a/fuzzers/005-tilegrid/Makefile +++ b/fuzzers/005-tilegrid/Makefile @@ -40,7 +40,7 @@ endif 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 diff --git a/fuzzers/005-tilegrid/bram/top.py b/fuzzers/005-tilegrid/bram/top.py index 20197892..030d7768 100644 --- a/fuzzers/005-tilegrid/bram/top.py +++ b/fuzzers/005-tilegrid/bram/top.py @@ -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) diff --git a/fuzzers/005-tilegrid/bram_block/top.py b/fuzzers/005-tilegrid/bram_block/top.py index 1723904c..40e50a2f 100644 --- a/fuzzers/005-tilegrid/bram_block/top.py +++ b/fuzzers/005-tilegrid/bram_block/top.py @@ -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) diff --git a/fuzzers/005-tilegrid/bram_int/top.py b/fuzzers/005-tilegrid/bram_int/top.py index 43d9c973..8b99e2fb 100644 --- a/fuzzers/005-tilegrid/bram_int/top.py +++ b/fuzzers/005-tilegrid/bram_int/top.py @@ -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) diff --git a/fuzzers/005-tilegrid/cfg/top.py b/fuzzers/005-tilegrid/cfg/top.py index e1d3a3e9..99a12acc 100644 --- a/fuzzers/005-tilegrid/cfg/top.py +++ b/fuzzers/005-tilegrid/cfg/top.py @@ -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) diff --git a/fuzzers/005-tilegrid/cfg_int/top.py b/fuzzers/005-tilegrid/cfg_int/top.py index cccfa898..d726bc16 100644 --- a/fuzzers/005-tilegrid/cfg_int/top.py +++ b/fuzzers/005-tilegrid/cfg_int/top.py @@ -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) diff --git a/fuzzers/005-tilegrid/clb/top.py b/fuzzers/005-tilegrid/clb/top.py index ba040149..f8b24892 100644 --- a/fuzzers/005-tilegrid/clb/top.py +++ b/fuzzers/005-tilegrid/clb/top.py @@ -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) diff --git a/fuzzers/005-tilegrid/clb_int/top.py b/fuzzers/005-tilegrid/clb_int/top.py index dfe9cb33..64671b86 100644 --- a/fuzzers/005-tilegrid/clb_int/top.py +++ b/fuzzers/005-tilegrid/clb_int/top.py @@ -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) diff --git a/fuzzers/005-tilegrid/clk_bufg/top.py b/fuzzers/005-tilegrid/clk_bufg/top.py index 95cdea87..6f821ff8 100644 --- a/fuzzers/005-tilegrid/clk_bufg/top.py +++ b/fuzzers/005-tilegrid/clk_bufg/top.py @@ -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) diff --git a/fuzzers/005-tilegrid/clk_hrow/top.py b/fuzzers/005-tilegrid/clk_hrow/top.py index 268b2112..8a724427 100644 --- a/fuzzers/005-tilegrid/clk_hrow/top.py +++ b/fuzzers/005-tilegrid/clk_hrow/top.py @@ -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) diff --git a/fuzzers/005-tilegrid/dsp/top.py b/fuzzers/005-tilegrid/dsp/top.py index 6208136c..6bd4dbeb 100644 --- a/fuzzers/005-tilegrid/dsp/top.py +++ b/fuzzers/005-tilegrid/dsp/top.py @@ -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) diff --git a/fuzzers/005-tilegrid/dsp_int/top.py b/fuzzers/005-tilegrid/dsp_int/top.py index 5d8f852c..3bf8154d 100644 --- a/fuzzers/005-tilegrid/dsp_int/top.py +++ b/fuzzers/005-tilegrid/dsp_int/top.py @@ -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) diff --git a/fuzzers/005-tilegrid/fifo_int/top.py b/fuzzers/005-tilegrid/fifo_int/top.py index 134fbb70..35c9ff5e 100644 --- a/fuzzers/005-tilegrid/fifo_int/top.py +++ b/fuzzers/005-tilegrid/fifo_int/top.py @@ -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) diff --git a/fuzzers/005-tilegrid/hclk_cmt/top.py b/fuzzers/005-tilegrid/hclk_cmt/top.py index 3fd68bc0..2665828e 100644 --- a/fuzzers/005-tilegrid/hclk_cmt/top.py +++ b/fuzzers/005-tilegrid/hclk_cmt/top.py @@ -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) diff --git a/fuzzers/005-tilegrid/hclk_ioi/top.py b/fuzzers/005-tilegrid/hclk_ioi/top.py index 9d60542c..63e231ce 100644 --- a/fuzzers/005-tilegrid/hclk_ioi/top.py +++ b/fuzzers/005-tilegrid/hclk_ioi/top.py @@ -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) diff --git a/fuzzers/005-tilegrid/iob/top.py b/fuzzers/005-tilegrid/iob/top.py index 46114dae..8656e360 100644 --- a/fuzzers/005-tilegrid/iob/top.py +++ b/fuzzers/005-tilegrid/iob/top.py @@ -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) diff --git a/fuzzers/005-tilegrid/iob_int/top.py b/fuzzers/005-tilegrid/iob_int/top.py index 4ec12e5d..bc3485a9 100644 --- a/fuzzers/005-tilegrid/iob_int/top.py +++ b/fuzzers/005-tilegrid/iob_int/top.py @@ -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) diff --git a/fuzzers/005-tilegrid/ioi/top.py b/fuzzers/005-tilegrid/ioi/top.py index cfd9536e..2009a8be 100644 --- a/fuzzers/005-tilegrid/ioi/top.py +++ b/fuzzers/005-tilegrid/ioi/top.py @@ -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) diff --git a/fuzzers/005-tilegrid/mmcm/top.py b/fuzzers/005-tilegrid/mmcm/top.py index 6b3f1ac0..f92e862d 100644 --- a/fuzzers/005-tilegrid/mmcm/top.py +++ b/fuzzers/005-tilegrid/mmcm/top.py @@ -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) diff --git a/fuzzers/005-tilegrid/monitor/top.py b/fuzzers/005-tilegrid/monitor/top.py index ddcabe1d..e61eaa49 100644 --- a/fuzzers/005-tilegrid/monitor/top.py +++ b/fuzzers/005-tilegrid/monitor/top.py @@ -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) diff --git a/fuzzers/005-tilegrid/monitor_int/top.py b/fuzzers/005-tilegrid/monitor_int/top.py index e2e0c902..6e58123e 100644 --- a/fuzzers/005-tilegrid/monitor_int/top.py +++ b/fuzzers/005-tilegrid/monitor_int/top.py @@ -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) diff --git a/fuzzers/005-tilegrid/orphan_int_column/top.py b/fuzzers/005-tilegrid/orphan_int_column/top.py index ff960e7b..85596a15 100644 --- a/fuzzers/005-tilegrid/orphan_int_column/top.py +++ b/fuzzers/005-tilegrid/orphan_int_column/top.py @@ -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): diff --git a/fuzzers/005-tilegrid/pll/top.py b/fuzzers/005-tilegrid/pll/top.py index e5235d79..a31bc7de 100644 --- a/fuzzers/005-tilegrid/pll/top.py +++ b/fuzzers/005-tilegrid/pll/top.py @@ -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) diff --git a/fuzzers/028-fifo-config/top.py b/fuzzers/028-fifo-config/top.py index bcf91635..dab705f8 100644 --- a/fuzzers/028-fifo-config/top.py +++ b/fuzzers/028-fifo-config/top.py @@ -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) diff --git a/fuzzers/029-bram-fifo-config/top.py b/fuzzers/029-bram-fifo-config/top.py index ee33c4e3..fed507e4 100644 --- a/fuzzers/029-bram-fifo-config/top.py +++ b/fuzzers/029-bram-fifo-config/top.py @@ -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) diff --git a/fuzzers/030-iob/top.py b/fuzzers/030-iob/top.py index 4e027f9f..3eac39e2 100644 --- a/fuzzers/030-iob/top.py +++ b/fuzzers/030-iob/top.py @@ -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) diff --git a/fuzzers/032-cmt-pll/top.py b/fuzzers/032-cmt-pll/top.py index 441028a8..1e9de083 100644 --- a/fuzzers/032-cmt-pll/top.py +++ b/fuzzers/032-cmt-pll/top.py @@ -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) diff --git a/fuzzers/034-cmt-pll-pips/top.py b/fuzzers/034-cmt-pll-pips/top.py index 1727d4bc..25abe1e6 100644 --- a/fuzzers/034-cmt-pll-pips/top.py +++ b/fuzzers/034-cmt-pll-pips/top.py @@ -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) diff --git a/fuzzers/035-iob-ilogic/top.py b/fuzzers/035-iob-ilogic/top.py index 99186546..10076047 100644 --- a/fuzzers/035-iob-ilogic/top.py +++ b/fuzzers/035-iob-ilogic/top.py @@ -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) diff --git a/fuzzers/035a-iob-idelay/top.py b/fuzzers/035a-iob-idelay/top.py index 39f25d88..cc8ae951 100644 --- a/fuzzers/035a-iob-idelay/top.py +++ b/fuzzers/035a-iob-idelay/top.py @@ -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 = [] diff --git a/fuzzers/036-iob-ologic/top.py b/fuzzers/036-iob-ologic/top.py index b55e5054..c6fe2313 100644 --- a/fuzzers/036-iob-ologic/top.py +++ b/fuzzers/036-iob-ologic/top.py @@ -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) diff --git a/fuzzers/037-iob-pips/top.py b/fuzzers/037-iob-pips/top.py index 43207af4..283c5ba3 100644 --- a/fuzzers/037-iob-pips/top.py +++ b/fuzzers/037-iob-pips/top.py @@ -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+') diff --git a/fuzzers/038-cfg/top.py b/fuzzers/038-cfg/top.py index 86e45a48..e8cf4ced 100644 --- a/fuzzers/038-cfg/top.py +++ b/fuzzers/038-cfg/top.py @@ -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) diff --git a/fuzzers/039-hclk-config/top.py b/fuzzers/039-hclk-config/top.py index 77b7ad7e..61d2dc7d 100644 --- a/fuzzers/039-hclk-config/top.py +++ b/fuzzers/039-hclk-config/top.py @@ -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) diff --git a/fuzzers/040-clk-hrow-config/top.py b/fuzzers/040-clk-hrow-config/top.py index 56a0d54f..2306ed80 100644 --- a/fuzzers/040-clk-hrow-config/top.py +++ b/fuzzers/040-clk-hrow-config/top.py @@ -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) diff --git a/fuzzers/041-clk-hrow-pips/top.py b/fuzzers/041-clk-hrow-pips/top.py index 3993fd03..c24cbf61 100644 --- a/fuzzers/041-clk-hrow-pips/top.py +++ b/fuzzers/041-clk-hrow-pips/top.py @@ -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) diff --git a/fuzzers/042-clk-bufg-config/top.py b/fuzzers/042-clk-bufg-config/top.py index ed050c6b..ca22613a 100644 --- a/fuzzers/042-clk-bufg-config/top.py +++ b/fuzzers/042-clk-bufg-config/top.py @@ -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) diff --git a/fuzzers/043-clk-rebuf-pips/generate.py b/fuzzers/043-clk-rebuf-pips/generate.py index d88a2d49..e96b6c2d 100644 --- a/fuzzers/043-clk-rebuf-pips/generate.py +++ b/fuzzers/043-clk-rebuf-pips/generate.py @@ -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 = [] diff --git a/fuzzers/043-clk-rebuf-pips/top.py b/fuzzers/043-clk-rebuf-pips/top.py index 769372e8..8754b84b 100644 --- a/fuzzers/043-clk-rebuf-pips/top.py +++ b/fuzzers/043-clk-rebuf-pips/top.py @@ -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) diff --git a/fuzzers/044-clk-bufg-pips/top.py b/fuzzers/044-clk-bufg-pips/top.py index 5f1a38c1..68e77f56 100644 --- a/fuzzers/044-clk-bufg-pips/top.py +++ b/fuzzers/044-clk-bufg-pips/top.py @@ -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): diff --git a/fuzzers/045-hclk-cmt-pips/top.py b/fuzzers/045-hclk-cmt-pips/top.py index 4f2e8462..e765f3e5 100644 --- a/fuzzers/045-hclk-cmt-pips/top.py +++ b/fuzzers/045-hclk-cmt-pips/top.py @@ -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): diff --git a/fuzzers/046-clk-bufg-muxed-pips/top.py b/fuzzers/046-clk-bufg-muxed-pips/top.py index 5f1a38c1..68e77f56 100644 --- a/fuzzers/046-clk-bufg-muxed-pips/top.py +++ b/fuzzers/046-clk-bufg-muxed-pips/top.py @@ -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): diff --git a/fuzzers/047-hclk-ioi-pips/top.py b/fuzzers/047-hclk-ioi-pips/top.py index 528f90c3..5231a84d 100644 --- a/fuzzers/047-hclk-ioi-pips/top.py +++ b/fuzzers/047-hclk-ioi-pips/top.py @@ -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): diff --git a/fuzzers/047a-hclk-idelayctrl-pips/top.py b/fuzzers/047a-hclk-idelayctrl-pips/top.py index accb9351..fe607497 100644 --- a/fuzzers/047a-hclk-idelayctrl-pips/top.py +++ b/fuzzers/047a-hclk-idelayctrl-pips/top.py @@ -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): diff --git a/fuzzers/049-int-imux-gfan/top.py b/fuzzers/049-int-imux-gfan/top.py index 3b3b7471..6a10a437 100644 --- a/fuzzers/049-int-imux-gfan/top.py +++ b/fuzzers/049-int-imux-gfan/top.py @@ -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(): diff --git a/fuzzers/060-bram-cascades/top.py b/fuzzers/060-bram-cascades/top.py index 4d4c0ad7..61b56ca9 100644 --- a/fuzzers/060-bram-cascades/top.py +++ b/fuzzers/060-bram-cascades/top.py @@ -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 diff --git a/fuzzers/072-ordered_wires/run_fuzzer.py b/fuzzers/072-ordered_wires/run_fuzzer.py index 8bf345ae..98859c49 100644 --- a/fuzzers/072-ordered_wires/run_fuzzer.py +++ b/fuzzers/072-ordered_wires/run_fuzzer.py @@ -12,6 +12,7 @@ import argparse MP_LOCK = Lock() + # Worker function called from threads def start_pips(argList): blockID, start, stop, total = argList @@ -40,6 +41,7 @@ def start_pips(argList): os.remove(uphill_wires) os.remove(downhill_wires) + # Function called once to get the total numbers of pips to list def get_nb_pips(): print("Fetching total number of pips") diff --git a/fuzzers/075-pins/Makefile b/fuzzers/075-pins/Makefile index cedfc7f9..1a076586 100644 --- a/fuzzers/075-pins/Makefile +++ b/fuzzers/075-pins/Makefile @@ -5,7 +5,7 @@ SPECIMENS_OK := $(addsuffix /OK,$(SPECIMENS)) database: $(SPECIMENS_OK) pushdb: - cp build/specimen_001/*_package_pins.csv ${XRAY_DATABASE_DIR}/$(XRAY_DATABASE)/ + cp build/specimen_001/*_package_pins.csv ${XRAY_FAMILY_DIR}/${XRAY_PART}/package_pins.csv $(SPECIMENS_OK): bash generate.sh $(subst /OK,,$@) diff --git a/fuzzers/100-dsp-mskpat/top.py b/fuzzers/100-dsp-mskpat/top.py index a480ebb6..129b01d2 100644 --- a/fuzzers/100-dsp-mskpat/top.py +++ b/fuzzers/100-dsp-mskpat/top.py @@ -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) diff --git a/fuzzers/Makefile b/fuzzers/Makefile index 1a1d4ac7..140ffed0 100644 --- a/fuzzers/Makefile +++ b/fuzzers/Makefile @@ -137,10 +137,7 @@ roi_only: # ----------------- part_only_yaml: - echo ${XRAY_FAMILY_DIR}/${XRAY_PART}/part.yaml +$(MAKE) -C 001-part-yaml run - cp ${XRAY_FAMILY_DIR}/${XRAY_PART}.yaml ${XRAY_FAMILY_DIR}/${XRAY_PART}/part.yaml - cp ${XRAY_FAMILY_DIR}/${XRAY_PART}.json ${XRAY_FAMILY_DIR}/${XRAY_PART}/part.json part_only_tilegrid: +$(MAKE) -C 005-tilegrid run @@ -150,11 +147,9 @@ part_only_tileconn: +$(MAKE) -C 072-ordered_wires run +$(MAKE) -C 073-get_counts run +$(MAKE) -C 074-dump_all run - cp ${XRAY_FAMILY_DIR}/tileconn.json ${XRAY_FAMILY_DIR}/${XRAY_PART}/tileconn.json part_only_pins: +$(MAKE) -C 075-pins run - cp ${XRAY_FAMILY_DIR}/${XRAY_PART}_package_pins.csv ${XRAY_FAMILY_DIR}/${XRAY_PART}/package_pins.csv part_only: # Create PART-specific directory diff --git a/minitests/roi_harness/create_design_json.py b/minitests/roi_harness/create_design_json.py index 7ec273d9..ac336fa5 100644 --- a/minitests/roi_harness/create_design_json.py +++ b/minitests/roi_harness/create_design_json.py @@ -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( diff --git a/minitests/timing/Makefile b/minitests/timing/Makefile index 9bb97724..6595ab39 100644 --- a/minitests/timing/Makefile +++ b/minitests/timing/Makefile @@ -27,7 +27,6 @@ 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} \ --output_xlsx build/timing_$(2)_$(1).xlsx build/$(2)_$(1)/design_$(2)_$(1).fasm: build/$(2)_$(1)/timing_$(2)_$(1).json diff --git a/minitests/timing/create_timing_worksheet_db.py b/minitests/timing/create_timing_worksheet_db.py index e3fde662..3e2ace86 100644 --- a/minitests/timing/create_timing_worksheet_db.py +++ b/minitests/timing/create_timing_worksheet_db.py @@ -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: diff --git a/prjxray/db.py b/prjxray/db.py index bdc85fc3..dfe11730 100644 --- a/prjxray/db.py +++ b/prjxray/db.py @@ -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): diff --git a/prjxray/lms_solver.py b/prjxray/lms_solver.py index 98dcef30..5dacddf6 100755 --- a/prjxray/lms_solver.py +++ b/prjxray/lms_solver.py @@ -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) diff --git a/prjxray/util.py b/prjxray/util.py index ffe6e717..ff2c7bf1 100644 --- a/prjxray/util.py +++ b/prjxray/util.py @@ -15,6 +15,13 @@ def get_db_root(): os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")) +def get_part(): + ret = os.getenv("XRAY_PART", None) + assert ret + + 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 +80,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 +122,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() diff --git a/utils/bit2fasm.py b/utils/bit2fasm.py index 46dba630..dcde86d9 100755 --- a/utils/bit2fasm.py +++ b/utils/bit2fasm.py @@ -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__': diff --git a/utils/checkdb.py b/utils/checkdb.py index 9b939124..988ae7bd 100755 --- a/utils/checkdb.py +++ b/utils/checkdb.py @@ -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 diff --git a/utils/fasm2frames.py b/utils/fasm2frames.py index c73590bb..4b9821ac 100755 --- a/utils/fasm2frames.py +++ b/utils/fasm2frames.py @@ -271,28 +271,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( diff --git a/utils/fasm2pips.py b/utils/fasm2pips.py index 62e4302a..862bb7a0 100755 --- a/utils/fasm2pips.py +++ b/utils/fasm2pips.py @@ -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(): diff --git a/utils/fasm_pprint.py b/utils/fasm_pprint.py index 8c42cd9f..2b3d1d19 100755 --- a/utils/fasm_pprint.py +++ b/utils/fasm_pprint.py @@ -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__': diff --git a/utils/tilegrid_report.py b/utils/tilegrid_report.py index ff622e14..2e04fb09 100755 --- a/utils/tilegrid_report.py +++ b/utils/tilegrid_report.py @@ -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 = {} diff --git a/utils/verify_tile_connections.py b/utils/verify_tile_connections.py index 2ee7bbdd..d8da4555 100755 --- a/utils/verify_tile_connections.py +++ b/utils/verify_tile_connections.py @@ -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): @@ -60,7 +61,8 @@ 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 +90,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 = []