| #!/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 re |
| import os |
| |
| from prjxray.segmaker import Segmaker |
| from prjxray.bitfilter import get_bitfilter |
| |
| segmk = Segmaker("design.bits") |
| |
| tiledata = dict() |
| pipdata = dict() |
| ignpip = set() |
| |
| print("Loading tags from design.txt.") |
| with open("design.txt", "r") as f: |
| for line in f: |
| tile, pip, src, dst, pnum, pdir = line.split() |
| |
| if not tile.startswith('INT_'): |
| continue |
| |
| _, pip = pip.split(".") |
| _, src = src.split("/") |
| _, dst = dst.split("/") |
| pnum = int(pnum) |
| pdir = int(pdir) |
| |
| if tile not in tiledata: |
| tiledata[tile] = {"pips": set(), "srcs": set(), "dsts": set()} |
| |
| if pip in pipdata: |
| assert pipdata[pip] == (src, dst) |
| else: |
| pipdata[pip] = (src, dst) |
| |
| tiledata[tile]["pips"].add(pip) |
| tiledata[tile]["srcs"].add(src) |
| tiledata[tile]["dsts"].add(dst) |
| |
| if pdir == 0: |
| tiledata[tile]["srcs"].add(dst) |
| tiledata[tile]["dsts"].add(src) |
| |
| gfan_src = re.match('^GFAN', src) is not None |
| fan_alt_byp_bounce = re.match('^FAN_ALT[0-9]', |
| dst) is not None and re.match( |
| '^BYP_BOUNCE.*', src) is not None |
| byp_alt_imux_dst = re.match( |
| '^(BYP_ALT[0-9]+|IMUX_?L?[0-9]+)', dst) is not None |
| logic_out_src = re.match('^LOGIC_OUTS_?L?[0-9]+', src) is not None |
| |
| # Okay: BYP_ALT0.VCC_WIRE |
| # Skip: INT.IMUX13.VCC_WIRE, INT.IMUX_L43.VCC_WIRE |
| # Skip: INT.BYP_ALT[0-9].LOGIC_OUTS_ and INT.IMUX_?L?. LOGIC_OUTS_ |
| if pnum == 1 or pdir == 0 or \ |
| src == "VCC_WIRE" or \ |
| re.match(r"^(L[HV]B?|G?CLK)(_L)?(_B)?[0-9]", src) or \ |
| re.match(r"^(L[HV]B?|G?CLK)(_L)?(_B)?[0-9]", dst) or \ |
| gfan_src or \ |
| fan_alt_byp_bounce or \ |
| (logic_out_src and byp_alt_imux_dst) or \ |
| re.match(r"^(CTRL|GFAN)(_L)?[0-9]", dst): |
| ignpip.add(pip) |
| |
| for tile, pips_srcs_dsts in tiledata.items(): |
| pips = pips_srcs_dsts["pips"] |
| srcs = pips_srcs_dsts["srcs"] |
| dsts = pips_srcs_dsts["dsts"] |
| |
| for pip, src_dst in pipdata.items(): |
| src, dst = src_dst |
| if pip in ignpip: |
| pass |
| elif pip in pips: |
| segmk.add_tile_tag(tile, "%s.%s" % (dst, src), 1) |
| elif src_dst[1] not in dsts: |
| segmk.add_tile_tag(tile, "%s.%s" % (dst, src), 0) |
| |
| segmk.compile(bitfilter=get_bitfilter(os.getenv('XRAY_DATABASE'), 'INT')) |
| segmk.write() |