| #!/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 |
| """ Tool for building zero db file for BUFG pips. |
| This requires that the rdb files be good enough to identify all the 0 candidate |
| features, which may take multiple manual iterations. Manual iterations can |
| be running like: |
| |
| make ITER=<N> -j<J> database |
| |
| And then invoking: |
| python3 build_zdb.py build/segbits_clk_bufg_bot_r.rdb build/segbits_clk_bufg_top_r.rdb > bits.dbf |
| |
| will successed if and only if the rdb is complete enough. |
| |
| bits.dbf is committed, so this utility should only be needed to document the |
| process. |
| |
| """ |
| import argparse |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser("Form ZDB groups for BUFG.") |
| |
| parser.add_argument('bot_r') |
| parser.add_argument('top_r') |
| |
| args = parser.parse_args() |
| |
| groups = {} |
| |
| with open(args.bot_r) as f: |
| for l in f: |
| parts = l.strip().split(' ') |
| feature = parts[0] |
| bits = parts[1:] |
| tile_type, dst, src = feature.split('.') |
| |
| assert tile_type == "CLK_BUFG" |
| |
| if dst not in groups: |
| groups[dst] = {} |
| |
| groups[dst][src] = bits |
| |
| print('# Generated from build_zdb.py') |
| |
| for dst in groups: |
| if len(groups[dst]) == 1: |
| continue |
| |
| bits = set() |
| zero_feature = None |
| for src in groups[dst]: |
| if groups[dst][src][0] == '<0': |
| assert zero_feature is None |
| zero_feature = src |
| else: |
| bits |= set(groups[dst][src]) |
| |
| assert zero_feature is not None, dst |
| |
| print( |
| '{bits},{type}.{dst}.{src}'.format( |
| bits=' '.join(sorted(bits)), |
| type='CLK_BUFG', |
| dst=dst, |
| src=zero_feature)) |
| |
| |
| if __name__ == "__main__": |
| main() |