|  | #!/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 | 
|  | from prjxray import util | 
|  |  | 
|  | segmk = Segmaker("design.bits") | 
|  | cache = dict() | 
|  |  | 
|  | print("Loading tags") | 
|  | ''' | 
|  | module,loc,n | 
|  | clb_NFFMUX_O5,SLICE_X12Y100,3 | 
|  | clb_NFFMUX_AX,SLICE_X13Y100,2 | 
|  | clb_NFFMUX_O6,SLICE_X14Y100,3 | 
|  | ''' | 
|  | f = open('params.csv', 'r') | 
|  | f.readline() | 
|  | for l in f: | 
|  | module, loc, n = l.split(',') | 
|  | n = int(n) | 
|  | which = chr(ord('A') + n) | 
|  | # clb_NFFMUX_AX => AX | 
|  | src = module.replace('clb_NFFMUX_', '') | 
|  | ''' | 
|  | AFFMUX | 
|  | 30_00   30_01   30_02   30_03 | 
|  | F78     1       1 | 
|  | CY      1               1 | 
|  | O5      1                       1 | 
|  | AX              1 | 
|  | XOR                     1 | 
|  | O6                              1 | 
|  | ''' | 
|  |  | 
|  | # if location not included in cache yet: start with assuming all four MUXes are unused. | 
|  | if loc not in cache: | 
|  | cache[loc] = set("ABCD") | 
|  |  | 
|  | # rewrite name of F78 source net: MUXes A and C have an F7 input, MUX B has an F8 input | 
|  | if src == "F78": | 
|  | if which in "AC": | 
|  | src = "F7" | 
|  | elif which == "B": | 
|  | src = "F8" | 
|  | else: | 
|  | assert 0 | 
|  |  | 
|  | # rewrite name of AX source net: It's actually AX, BX, CX, or DX | 
|  | if src == "AX": | 
|  | src = which + "X" | 
|  |  | 
|  | # add the 1-tag for this connection | 
|  | tag = "%sFFMUX.%s" % (which, src) | 
|  | segmk.add_site_tag(loc, tag, 1) | 
|  |  | 
|  | # remove this MUX from the cache, preventing generation of 0-tags for this MUX | 
|  | cache[loc].remove(which) | 
|  |  | 
|  | # create 0-tags for all sources on the remaining (unused) MUXes | 
|  | for loc, muxes in cache.items(): | 
|  | for which in muxes: | 
|  | for src in "F7 F8 CY O5 AX XOR O6 MC31".split(): | 
|  | if src == "MC31" and which is not "D": continue | 
|  | if src == "F7" and which not in "AC": continue | 
|  | if src == "F8" and which not in "B": continue | 
|  | if src == "AX": src = which + "X" | 
|  | tag = "%sFFMUX.%s" % (which, src) | 
|  | segmk.add_site_tag(loc, tag, 0) | 
|  |  | 
|  |  | 
|  | def bitfilter(frame_idx, bit_idx): | 
|  |  | 
|  | # Since the SRL32 is enabled along with DFFMUX.MC31, bits related to | 
|  | # SRL32 features are masked out. | 
|  | if (frame_idx, bit_idx) in [ | 
|  | (30, 16),  # ALUT.SRL | 
|  | (1, 23),  # WEMUX.CE | 
|  | ]: | 
|  | return False | 
|  |  | 
|  | return util.bitfilter_clb_mux(frame_idx, bit_idx) | 
|  |  | 
|  |  | 
|  | segmk.compile(bitfilter=bitfilter) | 
|  | segmk.write() |