From 7cfd30483fdce0b404694fe42cb72be8843d6785 Mon Sep 17 00:00:00 2001 From: John McMaster Date: Mon, 15 Oct 2018 18:39:06 -0700 Subject: [PATCH] segmaker: split site / tile tags Signed-off-by: John McMaster --- fuzzers/010-lutinit/generate.py | 2 +- utils/segmaker.py | 90 +++++++++++++++++---------------- 2 files changed, 48 insertions(+), 44 deletions(-) diff --git a/fuzzers/010-lutinit/generate.py b/fuzzers/010-lutinit/generate.py index b023af44..4b92c86d 100644 --- a/fuzzers/010-lutinit/generate.py +++ b/fuzzers/010-lutinit/generate.py @@ -18,7 +18,7 @@ with open("design_%s.txt" % sys.argv[1], "r") as f: for i in range(64): bitname = "%s.INIT[%02d]" % (bel, i) bitname = bitname.replace("6LUT", "LUT") - segmk.addtag(site, bitname, ((init >> i) & 1) != 0) + segmk.add_site_tag(site, bitname, ((init >> i) & 1) != 0) segmk.compile() segmk.write(sys.argv[1]) diff --git a/utils/segmaker.py b/utils/segmaker.py index 3d43dec2..b1a7339b 100644 --- a/utils/segmaker.py +++ b/utils/segmaker.py @@ -15,6 +15,8 @@ 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')) + def recurse_sum(x): '''Count number of nested iterable occurances''' @@ -46,7 +48,8 @@ class segmaker: -site: ex 'SLICE_X13Y101' -name: ex 'CLB.SLICE_X0.AFF.DMUX.CY' ''' - self.tags = dict() + self.site_tags = dict() + self.tile_tags = dict() # output after compiling self.segments_by_type = None @@ -94,7 +97,7 @@ class segmaker: 'Loaded bits: %u bits in %u base frames' % (recurse_sum(self.bits), len(self.bits))) - def addtag(self, site_tile, name, value): + def add_site_tag(self, site, name, value): ''' XXX: can add tags in two ways: -By site name @@ -107,7 +110,10 @@ class segmaker: self.addtag('SLICE_X13Y101', 'CLB.SLICE_X0.AFF.DMUX.CY', 1) Indicates that the SLICE_X13Y101 site has an element called 'CLB.SLICE_X0.AFF.DMUX.CY' ''' - self.tags.setdefault(site_tile, dict())[name] = value + self.site_tags.setdefault(site, dict())[name] = value + + def add_site_tag(self, tile, name, value): + self.tile_tags.setdefault(tile, dict())[name] = value def compile(self, bitfilter=None): print("Compiling segment data.") @@ -131,26 +137,34 @@ class segmaker: tiledata: tilegrid info for this tile ''' assert segname not in segments - segments[segname] = {"bits": set(), "tags": dict()} + segment = segments.setdefault( + segment, { + "bits": {}, + "tags": dict() + }) - base_frame = json_hex2i(tiledata["baseaddr"]) - for wordidx in range(tiledata["offset"], - tiledata["offset"] + tiledata["height"]): - if base_frame not in self.bits: - continue - if wordidx not in self.bits[base_frame]: - continue - for bit_frame, bit_wordidx, bit_bitidx in self.bits[ - base_frame][wordidx]: - bitname_frame = bit_frame - base_frame - bitname_bit = 32 * ( - bit_wordidx - tiledata["offset"]) + bit_bitidx - # some bits are hard to de-correlate - # allow force dropping some bits from search space for practicality - if bitfilter is None or bitfilter(bitname_frame, - bitname_bit): - bitname = "%02d_%02d" % (bitname_frame, bitname_bit) - segments[segname]["bits"].add(bitname) + for block_type, bitj in segment['bits'].items(): + segment["bits"][block_type] = set() + + base_frame = json_hex2i(bitj["baseaddr"]) + for wordidx in range(bitj["offset"], + bitj["offset"] + bitj["height"]): + if base_frame not in self.bits: + continue + if wordidx not in self.bits[base_frame]: + continue + for bit_frame, bit_wordidx, bit_bitidx in self.bits[ + base_frame][wordidx]: + bitname_frame = bit_frame - base_frame + bitname_bit = 32 * ( + bit_wordidx - bitj["offset"]) + bit_bitidx + # some bits are hard to de-correlate + # allow force dropping some bits from search space for practicality + if bitfilter is None or bitfilter(bitname_frame, + bitname_bit): + bitname = "%02d_%02d" % ( + bitname_frame, bitname_bit) + segment["bits"][block_type].add(bitname) ''' XXX: wouldn't it be better to iterate over tags? Easy to drop tags @@ -163,7 +177,7 @@ class segmaker: add_segbits( segments, segname, tiledata, bitfilter=bitfilter) - for name, value in self.tags[tilename].items(): + for name, value in self.tile_tags[tilename].items(): tags_used.add((tilename, name)) tag = "%s.%s" % (tile_type_norm, name) segments[segname]["tags"][tag] = value @@ -188,7 +202,7 @@ class segmaker: else: assert 0, 'Unhandled site type' - for name, value in self.tags[site].items(): + for name, value in self.site_tags[site].items(): tags_used.add((site, name)) tag = "%s.%s.%s" % (tile_type_norm, sitekey, name) # XXX: does this come from name? @@ -197,7 +211,7 @@ class segmaker: segments[segname]["tags"][tag] = value # ignore dummy tiles (ex: VBRK) - if "baseaddr" not in tiledata: + if "bits" not in tiledata: continue tile_type = tiledata["type"] @@ -216,12 +230,12 @@ class segmaker: tiledata["offset"]) # process tile name tags - if tilename in self.tags: + if tilename in self.tile_tags: add_tilename_tags() # process site name tags for site in tiledata["sites"]: - if site not in self.tags: + if site not in self.site_tags: continue add_site_tags() @@ -244,19 +258,9 @@ class segmaker: with open(filename, "w") as f: segments = self.segments_by_type[segtype] - if True: - for segname, segdata in sorted(segments.items()): - print("seg %s" % segname, file=f) - for bitname in sorted(segdata["bits"]): - print("bit %s" % bitname, file=f) - for tagname, tagval in sorted(segdata["tags"].items()): - print("tag %s %d" % (tagname, tagval), file=f) - else: - print("seg roi", file=f) - for segname, segdata in sorted(segments.items()): - for bitname in sorted(segdata["bits"]): - print("bit %s_%s" % (segname, bitname), file=f) - for tagname, tagval in sorted(segdata["tags"].items()): - print( - "tag %s_%s %d" % (segname, tagname, tagval), - file=f) + for segname, segdata in sorted(segments.items()): + print("seg %s" % segname, file=f) + for bitname in sorted(segdata["bits"]): + print("bit %s" % bitname, file=f) + for tagname, tagval in sorted(segdata["tags"].items()): + print("tag %s %d" % (tagname, tagval), file=f)