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