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