blob: af8242049e895746af89b480448494cb24a16b82 [file] [log] [blame]
#!/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()