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