blob: 83852a3c9e393011164c0b944c4b362872f05518 [file] [log] [blame]
#!/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
def fix_line(line, site, filetype):
"""
Squashes the entries for multiple sites into one.
This is required when entries are defined for a different
site than they are reported.
Such situation happend e.g.
for BRAM_[LR]. All the entries are defined for RAMBFIFO36E1,
while they are reported for RAMB18E1 or FIFO18E1
Parameters
----------
line: str
raw dump file line
site: str
site to which all the entries will be squashed
filetype: str
entries type. One of [timings, pins, properties]
Returns
-------
str
line with squashed entries
"""
assert filetype in [
"timings", "pins", "properties"
], "Unsupported filetype"
line = line.split()
newline = list()
sites_count = int(line[1])
newline.append(line[0])
# we'll emit only one site
newline.append("1")
newline.append(site)
newline.append("1")
newline.append(site)
entries = list()
all_entries = 0
loc = 2
for site in range(0, sites_count):
bels_count = int(line[loc + 1])
loc += 2
for bel in range(0, bels_count):
entries_count = int(line[loc + 1])
loc += 2
all_entries += entries_count
for entry in range(0, entries_count):
if filetype == 'timings':
for delay_word in range(0, 6):
entries.append(line[loc])
loc += 1
elif filetype == 'pins':
for pin_word in range(0, 4):
entries.append(line[loc])
loc += 1
elif filetype == 'properties':
entries.append(line[loc])
loc += 1
values_count = int(line[loc])
entries.append(line[loc])
loc += 1
for value in range(0, values_count):
entries.append(line[loc])
loc += 1
newline.append(str(all_entries))
newline.extend(entries)
return " ".join(newline) + "\n"
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--txtin', type=str, help='Input text file')
parser.add_argument('--txtout', type=str, help='Output text file')
parser.add_argument(
'--site',
type=str,
help='Site to which the entries should be squashed')
parser.add_argument(
'--slice', type=str, help='Slice for which the entries shall be fixed')
parser.add_argument(
'--type', type=str, choices=['timings', 'pins', 'properties'])
args = parser.parse_args()
lines = list()
with open(args.txtin, 'r') as fp:
for line in fp:
if line.startswith(args.slice):
line = fix_line(line, args.site, args.type)
lines.append(line)
with open(args.txtout, 'w') as fp:
for line in lines:
fp.write(line)
if __name__ == "__main__":
main()