| #!/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 argparse | |
| import json | |
| from sdf_timing import sdfparse | |
| from prjxray.util import OpenSafeFile | |
| def merge(timings_list, site): | |
| merged_timings = dict() | |
| for timings in timings_list: | |
| divider = '/' | |
| if 'divider' in timings['header']: | |
| divider = timings['header']['divider'] | |
| for cell in timings['cells']: | |
| for cell_instance in timings['cells'][cell]: | |
| if site in cell_instance.split(divider): | |
| if 'cells' not in merged_timings: | |
| merged_timings['cells'] = dict() | |
| if cell not in merged_timings['cells']: | |
| merged_timings['cells'][cell] = dict() | |
| if cell_instance not in merged_timings['cells'][cell]: | |
| merged_timings['cells'][cell][cell_instance] = dict() | |
| if cell_instance in merged_timings['cells'][cell][ | |
| cell_instance]: | |
| assert merged_timings['cells'][cell][cell_instance] == \ | |
| timings['cells'][cell][cell_instance], \ | |
| "Attempting to merge differing cells" | |
| merged_timings['cells'][cell][cell_instance] = timings[ | |
| 'cells'][cell][cell_instance] | |
| return merged_timings | |
| def main(): | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument( | |
| '--sdfs', nargs='+', type=str, help="List of sdf files to merge") | |
| parser.add_argument('--site', type=str, help="Site we want to merge") | |
| parser.add_argument('--json', type=str, help="Debug JSON") | |
| parser.add_argument('--out', type=str, help="Merged sdf name") | |
| args = parser.parse_args() | |
| timings_list = list() | |
| for sdf in args.sdfs: | |
| with OpenSafeFile(sdf, 'r') as fp: | |
| timing = sdfparse.parse(fp.read()) | |
| timings_list.append(timing) | |
| merged_sdf = merge(timings_list, args.site) | |
| with OpenSafeFile(args.out, 'w') as fp: | |
| fp.write(sdfparse.emit(merged_sdf, timescale='1ns')) | |
| if args.json is not None: | |
| with OpenSafeFile(args.json, 'w') as fp: | |
| json.dump(merged_sdf, fp, indent=4, sort_keys=True) | |
| if __name__ == '__main__': | |
| main() |