| #!/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 sys | 
 | import re | 
 |  | 
 | from prjxray.segmaker import Segmaker | 
 |  | 
 | tags = dict() | 
 | en_tags = dict() | 
 |  | 
 | print("Preload all tags.") | 
 | for arg in sys.argv[1:]: | 
 |     with open(arg + ".txt", "r") as f: | 
 |         for line in f: | 
 |             tile, pip = line.split() | 
 |             _, pip = pip.split("/") | 
 |             tile_type, pip = pip.split(".") | 
 |             src, dst = pip.split("->>") | 
 |             tag = "%s.%s" % (dst, src) | 
 |             tags[tag] = dst | 
 |             if "HCLK_CK_BUFH" in src: | 
 |                 en_tag = "ENABLE_BUFFER.%s" % src | 
 |                 en_tags[en_tag] = src | 
 |  | 
 | for arg in sys.argv[1:]: | 
 |     print("Processing %s." % arg) | 
 |     segmk = Segmaker(arg + ".bits") | 
 |  | 
 |     tiledata = dict() | 
 |     pipdata = dict() | 
 |     ignpip = set() | 
 |  | 
 |     with open(arg + ".txt", "r") as f: | 
 |         for line in f: | 
 |             tile, pip = line.split() | 
 |             _, pip = pip.split("/") | 
 |             tile_type, pip = pip.split(".") | 
 |             src, dst = pip.split("->>") | 
 |  | 
 |             # FIXME: workaround for https://github.com/SymbiFlow/prjxray/issues/392 | 
 |             if "CLB_IO_CLK" not in segmk.grid[tile]["bits"]: | 
 |                 print("WARNING: dropping tile %s" % tile) | 
 |                 continue | 
 |             tag = "%s.%s" % (dst, src) | 
 |  | 
 |             def add_tile_tag(tag, val): | 
 |                 # Workaround for https://github.com/SymbiFlow/prjxray/issues/396 | 
 |                 # TODO: drop from tcl or make an ignpip | 
 |                 if re.match(r"HCLK_CK_INOUT_.*", tag): | 
 |                     # print("Dropping %s %s" % (tag, val)) | 
 |                     return | 
 |                 segmk.add_tile_tag(tile, tag, val) | 
 |  | 
 |             add_tile_tag(tag, 1) | 
 |             if "HCLK_CK_BUFH" in src: | 
 |                 en_tag = "ENABLE_BUFFER.%s" % src | 
 |                 add_tile_tag(en_tag, 1) | 
 |             for tag, tag_dst in tags.items(): | 
 |                 if tag_dst != dst: | 
 |                     add_tile_tag(tag, 0) | 
 |             for en_tag, en_tag_src in en_tags.items(): | 
 |                 if en_tag_src != src: | 
 |                     add_tile_tag(en_tag, 0) | 
 |  | 
 |     segmk.compile() | 
 |     segmk.write(arg) |