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