| #!/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() |