| #!/usr/bin/env python3 |
| # -*- coding: utf-8 -*- |
| # |
| # Copyright (C) 2017-2020 The Project X-Ray Authors. |
| # |
| # Use of this source code is governed by a ISC-style |
| # license that can be found in the LICENSE file or at |
| # https://opensource.org/licenses/ISC |
| # |
| # SPDX-License-Identifier: ISC |
| |
| import os, json, re |
| |
| ################################################# |
| # Loading Raw Source Data |
| |
| grid = None |
| bits = dict() |
| luts = dict() |
| carry = dict() |
| |
| print("Loading grid.") |
| with open("../../../gridinfo/grid-%s-db.json" % os.getenv("XRAY_PART"), |
| "r") as f: |
| grid = json.load(f) |
| |
| print("Loading bits.") |
| with open("design.bits", "r") as f: |
| for line in f: |
| line = line.split("_") |
| bit_frame = int(line[1], 16) |
| bit_wordidx = int(line[2], 16) |
| bit_bitidx = int(line[3], 16) |
| base_frame = bit_frame & ~0x7f |
| |
| if base_frame not in bits: |
| bits[base_frame] = dict() |
| |
| if bit_wordidx not in bits[base_frame]: |
| bits[base_frame][bit_wordidx] = set() |
| |
| bits[base_frame][bit_wordidx].add((bit_frame, bit_wordidx, bit_bitidx)) |
| |
| print("Loading lut data.") |
| with open("lutdata.txt", "r") as f: |
| for line in f: |
| line = line.split() |
| site = line[0] |
| bel = line[1] |
| init = int(line[2][4:], 16) |
| |
| if site not in luts: |
| luts[site] = dict() |
| |
| for i in range(64): |
| bitname = "%s.INIT[%02d]" % (bel, i) |
| luts[site][bitname] = ((init >> i) & 1) != 0 |
| |
| print("Loading carry data.") |
| with open("carrydata.txt", "r") as f: |
| for line in f: |
| line = line.split() |
| assert line[0] not in carry |
| carry[line[0]] = dict() |
| for i, n in enumerate( |
| "CYINIT:ZRO:ONE:AX:CIN DI0:AX:O5 DI1:AX:O5 DI2:AX:O5 DI3:AX:O5" |
| .split()): |
| n = n.split(":") |
| for k in n[1:]: |
| carry[line[0]]["CARRY_%s_MUX_%s" % |
| (n[0], k)] = line[1 + i].upper() == k |
| |
| ################################################# |
| # Group per Segment |
| |
| print("Compile segment data.") |
| |
| segments = dict() |
| |
| for tilename, tiledata in grid["tiles"].items(): |
| found_data = False |
| for site in tiledata["sites"]: |
| if site in luts: |
| found_data = True |
| |
| if not found_data: |
| continue |
| |
| segname = "%s_%02x" % ( |
| tiledata["cfgcol"]["BASE_FRAMEID"][2:], min( |
| tiledata["cfgcol"]["WORDS"])) |
| |
| if not segname in segments: |
| segments[segname] = {"bits": list(), "tags": dict()} |
| |
| for site in tiledata["sites"]: |
| if site not in luts and site not in carry: |
| continue |
| |
| if re.match(r"SLICE_X[0-9]*[02468]Y", site): |
| sitekey = "SLICE_X0" |
| elif re.match(r"SLICE_X[0-9]*[13579]Y", site): |
| sitekey = "SLICE_X1" |
| else: |
| assert 0 |
| |
| if site in luts: |
| for name, value in luts[site].items(): |
| tile_type = tiledata["props"]["TYPE"] |
| |
| # LUT init bits are in the same position for all CLBL[LM]_[LR] tiles |
| if re.match("^CLBL[LM]_[LR]", |
| tile_type) and "LUT.INIT" in name: |
| tile_type = "CLBLX_X" |
| |
| segments[segname]["tags"]["%s.%s.%s" % |
| (tile_type, sitekey, name)] = value |
| |
| if site in carry: |
| for name, value in carry[site].items(): |
| tile_type = tiledata["props"]["TYPE"] |
| segments[segname]["tags"]["%s.%s.%s" % |
| (tile_type, sitekey, name)] = value |
| |
| base_frame = int(tiledata["cfgcol"]["BASE_FRAMEID"][2:], 16) |
| for wordidx in tiledata["cfgcol"]["WORDS"]: |
| if base_frame not in bits: |
| continue |
| if wordidx not in bits[base_frame]: |
| continue |
| for bit_frame, bit_wordidx, bit_bitidx in bits[base_frame][wordidx]: |
| segments[segname]["bits"].append( |
| "%02x_%02x_%02x" % ( |
| bit_frame - base_frame, bit_wordidx - min( |
| tiledata["cfgcol"]["WORDS"]), bit_bitidx)) |
| |
| segments[segname]["bits"].sort() |
| |
| ################################################# |
| # Print |
| |
| print("Write segment data.") |
| |
| with open("segdata.txt", "w") as 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) |