#!/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
"""
This script loads the pin dump of the desired BEL from Vivado and groups pins into ports.

Ports that are not connected to the PL are not included. These ports are usually test and
debug related ports, which are not useful from a P&R perspective.

Ports are then written to a JSON file.
"""
import argparse
import csv
import json
import re

from collections import defaultdict


def main():

    BUS_REGEX = re.compile("(.*[A-Z_])([0-9]+)$")

    # Parse arguments
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter)

    parser.add_argument("csv", type=str, help="BEL pin dump file")
    parser.add_argument(
        "json",
        type=str,
        help="Output JSON file with BEL pins grouped into ports")

    parser.add_argument(
        "--special-pins",
        default="",
        type=str,
        required=False,
        help="Some pins cannot be decoded with the regex")

    args = parser.parse_args()

    # Load pin dump
    with open(args.csv, "r") as fp:
        pin_dump = list(csv.DictReader(fp))

    # Group pins into ports
    ports = defaultdict(lambda: {"direction": None, "width": 0})

    special_pins = args.special_pins.split(",")

    for pin in list(pin_dump):
        pin_name = pin["name"]

        name = None
        if pin_name in special_pins:
            # Full match
            name = pin_name
        else:
            # Partial match
            for special_pin in special_pins:
                if pin_name.startswith(special_pin):
                    name = special_pin
                    break

        if name is None:
            match = BUS_REGEX.match(pin_name)
            if match:
                name = match.group(1)
            else:
                name = pin_name

        # Get direction
        is_input = int(pin["is_input"])
        is_output = int(pin["is_output"])

        if is_input:
            direction = "input"
        elif is_output:
            direction = "output"
        else:
            assert False, pin

        # Add to port
        port = ports[name]

        if port["direction"] is None:
            port["direction"] = direction
        else:
            assert port["direction"] == direction, (port, direction, name)

        port["width"] += 1

    # Write pin ports to a JSON file
    with open(args.json, "w") as fp:
        json.dump(ports, fp, indent=1, sort_keys=True)


if __name__ == "__main__":
    main()
