#!/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 from prjxray.segmaker import Segmaker import re segmk = Segmaker("design.bits") tiledata = {} pipdata = {} 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('BRAM_'): continue # BRAM_R_X37Y0/BRAM_R.BRAM_IMUX35_1->BRAM_R_IMUX_ADDRBWRADDRL2 pip_prefix, pip = pip.split(".") tile_from_pip, tile_type = pip_prefix.split('/') assert tile == tile_from_pip _, src = src.split("/") _, dst = dst.split("/") pnum = int(pnum) pdir = int(pdir) if tile not in tiledata: tiledata[tile] = { "type": tile_type, "pips": set(), "srcs": set(), "dsts": set() } if tile_type not in pipdata: pipdata[tile_type] = {} if pip in pipdata[tile_type]: assert pipdata[tile_type][pip] == (src, dst) else: pipdata[tile_type][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) if pnum == 1 or pdir == 0: ignpip.add(pip) CASCOUT_RE = re.compile('^BRAM_CASCOUT_ADDR((?:BWR)|(?:ARD))ADDRU([0-9]+)$') for tile, pips_srcs_dsts in tiledata.items(): tile_type = pips_srcs_dsts["type"] pips = pips_srcs_dsts["pips"] srcs = pips_srcs_dsts["srcs"] dsts = pips_srcs_dsts["dsts"] active_cascout = set() for pip, src_dst in pipdata[tile_type].items(): src, dst = src_dst # BRAM_R has some _R_ added to some pips. Because BRAM_L and BRAM_R # appears to shares all bits, overlap the names during fuzzing to avoid # extra work. # # BRAM.BRAM_ADDRARDADDRL0.BRAM_IMUX_R_ADDRARDADDRL0 # # becomes # # BRAM.BRAM_ADDRARDADDRL0.BRAM_IMUX_ADDRARDADDRL0 src_no_r = src.replace('BRAM_R_IMUX_ADDR', 'BRAM_IMUX_ADDR') if pip in ignpip: pass elif pip in pips: segmk.add_tile_tag(tile, "%s.%s" % (dst, src_no_r), 1) elif src_dst[1] not in dsts: segmk.add_tile_tag(tile, "%s.%s" % (dst, src_no_r), 0) m = CASCOUT_RE.match(dst) if m and pip in pips: active_cascout.add(m.group(1)) for group in ['BWR', 'ARD']: segmk.add_tile_tag( tile, 'CASCOUT_{}_ACTIVE'.format(group), group in active_cascout) segmk.compile() segmk.write()