mirror of https://github.com/openXC7/prjxray.git
79 lines
2.5 KiB
Python
79 lines
2.5 KiB
Python
#!/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()
|