#!/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 __future__ import print_function import os from prjxray.segmaker import Segmaker from prjxray.bitfilter import get_bitfilter import argparse parser = argparse.ArgumentParser(description="Generate int segfiles") parser.add_argument( '--todo', action='store', default='../../todo.txt', help='todo file path') parser.add_argument( '--design', action='store', default='design.txt', help='design description file path') parser.add_argument('--verbose', action='store_true', help='') parser.add_argument( '--bits', action='store', default='design.bits', help='bits file path') args = parser.parse_args() segmk = Segmaker(args.bits) verbose = args.verbose tiledata = dict() pipdata = dict() ignpip = set() todo = set() print("Loading todo from %s." % args.todo) with open(args.todo, "r") as f: for line in f: line = tuple(line.strip().split(".")) verbose and print('todo', line) todo.add(line) print("Loading tags from %s." % args.design) with open(args.design, "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()} tile_lr = ("_".join(tile.split("_")[0:2])) if (tile_lr, pip) in pipdata: assert pipdata[(tile_lr, pip)] == (src, dst) else: pipdata[(tile_lr, 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) t = ("_".join(tile.split("_")[0:2]), dst, src) if pnum == 1 or pdir == 0: verbose and print('ignore pnum == 1 or pdir == 0: ', pip) ignpip.add(t) if t not in todo: verbose and print('ignore not todo: ', t) ignpip.add(t) for tile, pips_srcs_dsts in tiledata.items(): pips = pips_srcs_dsts["pips"] srcs = pips_srcs_dsts["srcs"] dsts = pips_srcs_dsts["dsts"] for (tile_lr, pip), src_dst in pipdata.items(): src, dst = src_dst t = (tile_lr, dst, src) if t 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()