diff --git a/experiments/clbpips/generate.py b/experiments/clbpips/generate.py index 1a625365..58824df8 100644 --- a/experiments/clbpips/generate.py +++ b/experiments/clbpips/generate.py @@ -1,10 +1,9 @@ #!/usr/bin/env python3 -import sys, re - from prjxray.segmaker import Segmaker +from prjxray import util -segmk = Segmaker("design.bits") +segmk = Segmaker(util.get_db_root(), "design.bits") print("Loading tags from design.txt.") with open("design.txt", "r") as f: diff --git a/experiments/gndvcc/generate.py b/experiments/gndvcc/generate.py index 3f814358..f0200544 100644 --- a/experiments/gndvcc/generate.py +++ b/experiments/gndvcc/generate.py @@ -1,10 +1,11 @@ #!/usr/bin/env python3 -import sys, os, re +import re from prjxray.segmaker import Segmaker +from prjxray import util -segmk = Segmaker("design.bits") +segmk = Segmaker(util.get_db_root(), "design.bits") tiledata = dict() pipdata = dict() diff --git a/experiments/pipsroute/generate.py b/experiments/pipsroute/generate.py index aa131cae..c58c8298 100644 --- a/experiments/pipsroute/generate.py +++ b/experiments/pipsroute/generate.py @@ -3,13 +3,14 @@ import sys, re from prjxray.segmaker import Segmaker +from prjxray import util pipdata = dict() ignpip = set() def handle_design(prefix, second_pass): - segmk = Segmaker(prefix + ".bits") + segmk = Segmaker(util.get_db_root(), prefix + ".bits") tiledata = dict() nlines = 0 diff --git a/fuzzers/010-lutinit/generate.py b/fuzzers/010-lutinit/generate.py index bcf8c3ac..4e53630c 100644 --- a/fuzzers/010-lutinit/generate.py +++ b/fuzzers/010-lutinit/generate.py @@ -1,10 +1,11 @@ #!/usr/bin/env python3 -import sys, re +import sys from prjxray.segmaker import Segmaker +from prjxray import util -segmk = Segmaker("design_%s.bits" % sys.argv[1]) +segmk = Segmaker(util.get_db_root(), "design_%s.bits" % sys.argv[1]) print("Loading tags from design_%s.txt." % sys.argv[1]) with open("design_%s.txt" % sys.argv[1], "r") as f: diff --git a/fuzzers/011-ffconfig/generate.py b/fuzzers/011-ffconfig/generate.py index b16edfca..169a6c1b 100644 --- a/fuzzers/011-ffconfig/generate.py +++ b/fuzzers/011-ffconfig/generate.py @@ -10,11 +10,10 @@ LDPE Primitive: Transparent Data Latch with Asynchronous Preset and Gate Enable from prims import * -import sys, re - from prjxray.segmaker import Segmaker +from prjxray import util -segmk = Segmaker("design.bits") +segmk = Segmaker(util.get_db_root(), "design.bits") def ones(l): diff --git a/fuzzers/011-ffconfig/top.py b/fuzzers/011-ffconfig/top.py index 717f2bbf..3baec636 100644 --- a/fuzzers/011-ffconfig/top.py +++ b/fuzzers/011-ffconfig/top.py @@ -1,7 +1,5 @@ import random random.seed(0) -import os -import re from prjxray import util from prims import * @@ -14,8 +12,10 @@ f.write("i,prim,loc,bel,init\n") def gen_slices(): - for _tile_name, site_name, _site_type in util.gen_sites(['SLICEL', - 'SLICEM']): + for _tile_name, site_name, _site_type in util.get_roi().gen_sites([ + 'SLICEL', + 'SLICEM', + ]): yield site_name diff --git a/fuzzers/012-clbn5ffmux/generate.py b/fuzzers/012-clbn5ffmux/generate.py index b16cc19a..521e4d03 100644 --- a/fuzzers/012-clbn5ffmux/generate.py +++ b/fuzzers/012-clbn5ffmux/generate.py @@ -1,10 +1,9 @@ #!/usr/bin/env python3 -import sys, re - from prjxray.segmaker import Segmaker +from prjxray import util -segmk = Segmaker("design.bits") +segmk = Segmaker(util.get_db_root(), "design.bits") print("Loading tags") ''' diff --git a/fuzzers/012-clbn5ffmux/top.py b/fuzzers/012-clbn5ffmux/top.py index 68013175..efb8079d 100644 --- a/fuzzers/012-clbn5ffmux/top.py +++ b/fuzzers/012-clbn5ffmux/top.py @@ -1,7 +1,5 @@ import random random.seed(0) -import os -import re from prjxray import util CLBN = 40 @@ -9,8 +7,10 @@ print('//Requested CLBs: %s' % str(CLBN)) def gen_slices(): - for _tile_name, site_name, _site_type in util.gen_sites(['SLICEL', - 'SLICEM']): + for _tile_name, site_name, _site_type in util.get_roi().gen_sites([ + 'SLICEL', + 'SLICEM' + ]): yield site_name diff --git a/fuzzers/013-clbncy0/generate.py b/fuzzers/013-clbncy0/generate.py index 8bb35c9a..333c4aa0 100644 --- a/fuzzers/013-clbncy0/generate.py +++ b/fuzzers/013-clbncy0/generate.py @@ -1,10 +1,9 @@ #!/usr/bin/env python3 -import sys, re - from prjxray.segmaker import Segmaker +from prjxray import util -segmk = Segmaker("design.bits") +segmk = Segmaker(util.get_db_root(), "design.bits") print("Loading tags") ''' diff --git a/fuzzers/013-clbncy0/top.py b/fuzzers/013-clbncy0/top.py index 531372c1..af32d952 100644 --- a/fuzzers/013-clbncy0/top.py +++ b/fuzzers/013-clbncy0/top.py @@ -1,7 +1,5 @@ import random random.seed(0) -import os -import re from prjxray import util CLBN = 400 @@ -9,8 +7,10 @@ print('//Requested CLBs: %s' % str(CLBN)) def gen_slices(): - for _tile_name, site_name, _site_type in util.gen_sites(['SLICEL', - 'SLICEM']): + for _tile_name, site_name, _site_type in util.get_roi().gen_sites([ + 'SLICEL', + 'SLICEM' + ]): yield site_name diff --git a/fuzzers/014-ffsrcemux/generate.py b/fuzzers/014-ffsrcemux/generate.py index 2701b854..d3618ff8 100644 --- a/fuzzers/014-ffsrcemux/generate.py +++ b/fuzzers/014-ffsrcemux/generate.py @@ -1,10 +1,9 @@ #!/usr/bin/env python3 -import sys, re - from prjxray.segmaker import Segmaker +from prjxray import util -segmk = Segmaker("design.bits") +segmk = Segmaker(util.get_db_root(), "design.bits") print("Loading tags") ''' diff --git a/fuzzers/015-clbnffmux/generate.py b/fuzzers/015-clbnffmux/generate.py index 2e69102d..f2d60d1d 100644 --- a/fuzzers/015-clbnffmux/generate.py +++ b/fuzzers/015-clbnffmux/generate.py @@ -1,11 +1,9 @@ #!/usr/bin/env python3 -import sys, os, re - from prjxray.segmaker import Segmaker from prjxray import util -segmk = Segmaker("design.bits") +segmk = Segmaker(util.get_db_root(), "design.bits") cache = dict() print("Loading tags") diff --git a/fuzzers/015-clbnffmux/top.py b/fuzzers/015-clbnffmux/top.py index c3a21fda..052e6e24 100644 --- a/fuzzers/015-clbnffmux/top.py +++ b/fuzzers/015-clbnffmux/top.py @@ -1,7 +1,5 @@ import random random.seed(0) -import os -import re from prjxray import util CLBN = 400 @@ -9,8 +7,10 @@ print('//Requested CLBs: %s' % str(CLBN)) def gen_slices(): - for _tile_name, site_name, _site_type in util.gen_sites(['SLICEL', - 'SLICEM']): + for _tile_name, site_name, _site_type in util.get_roi().gen_sites([ + 'SLICEL', + 'SLICEM', + ]): yield site_name diff --git a/fuzzers/016-clbnoutmux/generate.py b/fuzzers/016-clbnoutmux/generate.py index 71af6b2b..d463f64b 100644 --- a/fuzzers/016-clbnoutmux/generate.py +++ b/fuzzers/016-clbnoutmux/generate.py @@ -1,11 +1,9 @@ #!/usr/bin/env python3 -import sys, os, re - from prjxray.segmaker import Segmaker from prjxray import util -segmk = Segmaker("design.bits") +segmk = Segmaker(util.get_db_root(), "design.bits") cache = dict() print("Loading tags") diff --git a/fuzzers/016-clbnoutmux/top.py b/fuzzers/016-clbnoutmux/top.py index bb5bbbe4..72785a1c 100644 --- a/fuzzers/016-clbnoutmux/top.py +++ b/fuzzers/016-clbnoutmux/top.py @@ -1,7 +1,5 @@ import random random.seed(0) -import os -import re from prjxray import util CLBN = 400 @@ -9,8 +7,10 @@ print('//Requested CLBs: %s' % str(CLBN)) def gen_slices(): - for _tile_name, site_name, _site_type in util.gen_sites(['SLICEL', - 'SLICEM']): + for _tile_name, site_name, _site_type in util.get_roi().gen_sites([ + 'SLICEL', + 'SLICEM' + ]): yield site_name diff --git a/fuzzers/017-clbprecyinit/generate.py b/fuzzers/017-clbprecyinit/generate.py index 6e3f46ba..6035d675 100644 --- a/fuzzers/017-clbprecyinit/generate.py +++ b/fuzzers/017-clbprecyinit/generate.py @@ -1,10 +1,9 @@ #!/usr/bin/env python3 -import sys, os, re - from prjxray.segmaker import Segmaker +from prjxray import util -segmk = Segmaker("design.bits") +segmk = Segmaker(util.get_db_root(), "design.bits") print("Loading tags") f = open('params.csv', 'r') diff --git a/fuzzers/018-clbram/generate.py b/fuzzers/018-clbram/generate.py index ec46faa1..74e4154a 100644 --- a/fuzzers/018-clbram/generate.py +++ b/fuzzers/018-clbram/generate.py @@ -1,10 +1,9 @@ #!/usr/bin/env python3 -import sys, re, os - from prjxray.segmaker import Segmaker +from prjxray import util -segmk = Segmaker("design.bits") +segmk = Segmaker(util.get_db_root(), "design.bits") # Can fit 4 per CLB # BELable diff --git a/fuzzers/018-clbram/top.py b/fuzzers/018-clbram/top.py index 1de15ff2..b3c4fe30 100644 --- a/fuzzers/018-clbram/top.py +++ b/fuzzers/018-clbram/top.py @@ -17,8 +17,6 @@ Note: LUT6 was added to try to simplify reduction, although it might not be need import random random.seed(0) -import os -import re from prjxray import util CLBN = 50 @@ -26,7 +24,7 @@ print('//Requested CLBs: %s' % str(CLBN)) def gen_slicems(): - for _tile_name, site_name, _site_type in util.gen_sites(['SLICEM']): + for _tile_name, site_name, _site_type in util.get_roi().gen_sites(['SLICEM']): yield site_name diff --git a/fuzzers/019-ndi1mux/generate.py b/fuzzers/019-ndi1mux/generate.py index ece577a4..03317dd4 100644 --- a/fuzzers/019-ndi1mux/generate.py +++ b/fuzzers/019-ndi1mux/generate.py @@ -5,11 +5,10 @@ # Can we find instance where they are not aliased? WA7USED = 0 -import sys, re, os - from prjxray.segmaker import Segmaker +from prjxray import util -segmk = Segmaker("design.bits") +segmk = Segmaker(util.get_db_root(), "design.bits") print("Loading tags") ''' diff --git a/fuzzers/019-ndi1mux/top.py b/fuzzers/019-ndi1mux/top.py index fbb3a312..47c65f34 100644 --- a/fuzzers/019-ndi1mux/top.py +++ b/fuzzers/019-ndi1mux/top.py @@ -1,7 +1,5 @@ import random random.seed(0) -import os -import re from prjxray import util CLBN = 50 @@ -9,7 +7,7 @@ print('//Requested CLBs: %s' % str(CLBN)) def gen_slicems(): - for _tile_name, site_name, _site_type in util.gen_sites(['SLICEM']): + for _tile_name, site_name, _site_type in util.get_roi().gen_sites(['SLICEM']): yield site_name diff --git a/fuzzers/050-intpips/generate.py b/fuzzers/050-intpips/generate.py index 84353ca0..13573664 100644 --- a/fuzzers/050-intpips/generate.py +++ b/fuzzers/050-intpips/generate.py @@ -1,10 +1,11 @@ #!/usr/bin/env python3 -import sys, re +import re from prjxray.segmaker import Segmaker +from prjxray import util -segmk = Segmaker("design.bits") +segmk = Segmaker(util.get_db_root(), "design.bits") tiledata = dict() pipdata = dict() diff --git a/fuzzers/051-imuxlout/generate.py b/fuzzers/051-imuxlout/generate.py index 9627960b..66c23414 100644 --- a/fuzzers/051-imuxlout/generate.py +++ b/fuzzers/051-imuxlout/generate.py @@ -1,10 +1,11 @@ #!/usr/bin/env python3 -import sys, re, os +import re, os from prjxray.segmaker import Segmaker +from prjxray import util -segmk = Segmaker("design.bits") +segmk = Segmaker(util.get_db_root(), "design.bits") tiledata = dict() pipdata = dict() diff --git a/fuzzers/052-clkin/generate.py b/fuzzers/052-clkin/generate.py index 2aca7188..fa5f9463 100644 --- a/fuzzers/052-clkin/generate.py +++ b/fuzzers/052-clkin/generate.py @@ -1,10 +1,11 @@ #!/usr/bin/env python3 -import sys, os, re +import os, re from prjxray.segmaker import Segmaker +from prjxray import util -segmk = Segmaker("design.bits") +segmk = Segmaker(util.get_db_root(), "design.bits") tiledata = dict() pipdata = dict() diff --git a/fuzzers/053-ctrlin/generate.py b/fuzzers/053-ctrlin/generate.py index bbae2ecc..70d82ad2 100644 --- a/fuzzers/053-ctrlin/generate.py +++ b/fuzzers/053-ctrlin/generate.py @@ -1,10 +1,11 @@ #!/usr/bin/env python3 -import sys, os, re +import os, re from prjxray.segmaker import Segmaker +from prjxray import util -segmk = Segmaker("design.bits") +segmk = Segmaker(util.get_db_root(), "design.bits") tiledata = dict() pipdata = dict() diff --git a/fuzzers/054-gfan/generate.py b/fuzzers/054-gfan/generate.py index 2f09618e..a05df06b 100644 --- a/fuzzers/054-gfan/generate.py +++ b/fuzzers/054-gfan/generate.py @@ -1,10 +1,11 @@ #!/usr/bin/env python3 -import sys, os, re +import re from prjxray.segmaker import Segmaker +from prjxray import util -segmk = Segmaker("design.bits") +segmk = Segmaker(util.get_db_root(), "design.bits") tiledata = dict() pipdata = dict() diff --git a/fuzzers/055-gnd/generate.py b/fuzzers/055-gnd/generate.py index fd1d8d9f..04f38579 100644 --- a/fuzzers/055-gnd/generate.py +++ b/fuzzers/055-gnd/generate.py @@ -1,10 +1,11 @@ #!/usr/bin/env python3 -import sys, os, re +import re from prjxray.segmaker import Segmaker +from prjxray import util -segmk = Segmaker("design.bits") +segmk = Segmaker(util.get_db_root(), "design.bits") tiledata = dict() pipdata = dict() diff --git a/fuzzers/056-rempips/generate.py b/fuzzers/056-rempips/generate.py index 16e2de41..56e761f8 100644 --- a/fuzzers/056-rempips/generate.py +++ b/fuzzers/056-rempips/generate.py @@ -1,10 +1,9 @@ #!/usr/bin/env python3 -import sys, os, re - from prjxray.segmaker import Segmaker +from prjxray import util -segmk = Segmaker("design.bits") +segmk = Segmaker(util.get_db_root(), "design.bits") tiledata = dict() pipdata = dict() diff --git a/fuzzers/057-bipips/generate.py b/fuzzers/057-bipips/generate.py index 11379236..903f2162 100644 --- a/fuzzers/057-bipips/generate.py +++ b/fuzzers/057-bipips/generate.py @@ -1,10 +1,11 @@ #!/usr/bin/env python3 -import sys, os, re +import os from prjxray.segmaker import Segmaker +from prjxray import util -segmk = Segmaker("design.bits") +segmk = Segmaker(util.get_db_root(), "design.bits") tiledata = dict() pipdata = set() diff --git a/fuzzers/058-hclkpips/generate.py b/fuzzers/058-hclkpips/generate.py index fc6f7b6d..72a4dab7 100644 --- a/fuzzers/058-hclkpips/generate.py +++ b/fuzzers/058-hclkpips/generate.py @@ -1,8 +1,9 @@ #!/usr/bin/env python3 -import sys, os, re +import sys from prjxray.segmaker import Segmaker +from prjxray import util tags = dict() en_tags = dict() @@ -23,7 +24,7 @@ for arg in sys.argv[1:]: for arg in sys.argv[1:]: print("Processing %s." % arg) - segmk = Segmaker(arg + ".bits") + segmk = Segmaker(util.get_db_root(), arg + ".bits") tiledata = dict() pipdata = dict() diff --git a/fuzzers/100-dsp-mskpat/generate.py b/fuzzers/100-dsp-mskpat/generate.py index 13606f7b..870daf03 100644 --- a/fuzzers/100-dsp-mskpat/generate.py +++ b/fuzzers/100-dsp-mskpat/generate.py @@ -1,10 +1,11 @@ #!/usr/bin/env python3 -import sys, os, re +import sys from prjxray.segmaker import Segmaker +from prjxray import util -segmk = Segmaker("design_%s.bits" % sys.argv[1]) +segmk = Segmaker(util.get_db_root(), "design_%s.bits" % sys.argv[1]) pipdata = dict() ignpip = set() diff --git a/prjxray/segmaker.py b/prjxray/segmaker.py index 8cd8ee41..887e2951 100644 --- a/prjxray/segmaker.py +++ b/prjxray/segmaker.py @@ -15,9 +15,6 @@ tilegrid.json provides tile addresses import os, json, re -XRAY_DATABASE = os.getenv("XRAY_DATABASE") -XRAY_DIR = os.getenv("XRAY_DIR") - BLOCK_TYPES = set(('CLB_IO_CLK', 'BLOCK_RAM', 'CFG_CLB')) @@ -41,7 +38,8 @@ def json_hex2i(s): class Segmaker: - def __init__(self, bitsfile, verbose=None): + def __init__(self, db_root, bitsfile, verbose=None): + self.db_root = db_root self.verbose = verbose if verbose is not None else os.getenv( 'VERBOSE', 'N') == 'Y' self.load_grid() @@ -60,9 +58,7 @@ class Segmaker: def load_grid(self): '''Load self.grid holding tile addresses''' - print("Loading %s grid." % XRAY_DATABASE) - with open("%s/database/%s/tilegrid.json" % (XRAY_DIR, XRAY_DATABASE), - "r") as f: + with open(os.path.join(db_root, "tilegrid.json"), "r") as f: self.grid = json.load(f) assert "segments" not in self.grid, "Old format tilegrid.json" diff --git a/prjxray/util.py b/prjxray/util.py index c61654db..e08285ce 100644 --- a/prjxray/util.py +++ b/prjxray/util.py @@ -1,11 +1,10 @@ import os import re -import os -import json - -DB_PATH = "%s/%s" % ( - os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")) +from .roi import Roi +def get_db_root(): + return "%s/%s" % ( + os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")) def roi_xy(): x1 = int(os.getenv('XRAY_ROI_GRID_X1')) @@ -15,10 +14,6 @@ def roi_xy(): return (x1, x2), (y1, y2) - -(ROI_X1, ROI_X2), (ROI_Y1, ROI_Y2) = roi_xy() - - def slice_xy(): '''Return (X1, X2), (Y1, Y2) from XRAY_ROI, exclusive end (for xrange)''' # SLICE_X12Y100:SLICE_X27Y149 @@ -29,49 +24,14 @@ def slice_xy(): ms = [int(m.group(i + 1)) for i in range(4)] return ((ms[0], ms[2] + 1), (ms[1], ms[3] + 1)) - -def tile_in_roi(tilej): - x = int(tilej['grid_x']) - y = int(tilej['grid_y']) - return ROI_X1 <= x <= ROI_X2 and ROI_Y1 <= y <= ROI_Y2 - - -def load_tilegrid(): - return json.load(open('%s/tilegrid.json' % DB_PATH)) - - -def gen_tiles(tile_types=None, tilegrid=None): - ''' - tile_types: list of tile types to keep, or None for all - tilegrid: cache the tilegrid database - ''' - tilegrid = tilegrid or load_tilegrid() - - for tile_name, tilej in tilegrid.items(): - if tile_in_roi(tilej) and (tile_types is None - or tilej['type'] in tile_types): - yield (tile_name, tilej) - - -def gen_sites(site_types=None, tilegrid=None): - ''' - site_types: list of site types to keep, or None for all - tilegrid: cache the tilegrid database - ''' - tilegrid = tilegrid or load_tilegrid() - - for tile_name, tilej in tilegrid.items(): - if not tile_in_roi(tilej): - continue - for site_name, site_type in tilej['sites'].items(): - if site_types is None or site_type in site_types: - yield (tile_name, site_name, site_type) - - -#print(list(gen_tiles(['CLBLL_L', 'CLBLL_R', 'CLBLM_L', 'CLBLM_R']))) -#print(list(gen_sites(['SLICEL', 'SLICEM']))) -#print(list(gen_sites(['SLICEM']))) - +def get_roi(): + (x1, x2), (y1, y2) = roi_xy() + return Roi( + tilegrid_file=os.path.join(get_db_root(), 'tilegrid.json'), + x1=x1, + x2=x2, + y1=y1, + y2=y2) # we know that all bits for CLB MUXes are in frames 30 and 31, so filter all other bits def bitfilter_clb_mux(frame_idx, bit_idx): diff --git a/utils/fasm2frames.py b/utils/fasm2frames.py index 361baa8e..db64fe7f 100755 --- a/utils/fasm2frames.py +++ b/utils/fasm2frames.py @@ -5,11 +5,7 @@ import re import sys import json import collections - - -class FASMSyntaxError(Exception): - pass - +import fasm def parsebit(val): '''Return "!012_23" => (12, 23, False)''' @@ -22,7 +18,6 @@ def parsebit(val): seg_word_column, word_bit_n = val.split('_') return int(seg_word_column), int(word_bit_n), isset - # TODO: migrate to library def process_db(tile_type, process): fns = [