#!/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()