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