#!/usr/bin/env python3
import argparse
import pickle

# =============================================================================


def generate_pinmap_csv(package_pinmap):
    """
    Generates content of the package pins CSV file.
    """
    csv_lines = []

    is_header = True
    for pkg_pin_name, pkg_pins in package_pinmap.items():
        for pkg_pin in pkg_pins:
            if pkg_pin.alias is not None:
                if is_header:
                    csv_lines.append("name,x,y,z,type,alias\n")
                    is_header = False

                line = "{},{},{},0,{},{}".format(
                    pkg_pin.name, pkg_pin.loc.x, pkg_pin.loc.y,
                    pkg_pin.cell.type, pkg_pin.alias
                )
                csv_lines.append(line)
            else:
                if is_header:
                    csv_lines.append("name,x,y,z,type\n")
                    is_header = False

                line = "{},{},{},0,{}".format(
                    pkg_pin.name, pkg_pin.loc.x, pkg_pin.loc.y,
                    pkg_pin.cell.type
                )
                csv_lines.append(line)

    return csv_lines


# =============================================================================


def main():

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

    parser.add_argument(
        "--db",
        type=argparse.FileType("rb"),
        required=True,
        help="Input VPR database file of the device"
    )
    parser.add_argument(
        "--package",
        type=str,
        default="PD64",
        help="Package name to generate the pinmap for"
    )
    parser.add_argument(
        "-o",
        type=argparse.FileType("w"),
        default="pinmap.csv",
        help="Output pinmap CSV file"
    )

    args = parser.parse_args()

    # Load data from the database
    db = pickle.load(args.db)
    package_pinmaps = db["vpr_package_pinmaps"]

    # Generate the CSV data
    csv_lines = generate_pinmap_csv(package_pinmaps[args.package])

    # Write the pinmap CSV file
    args.o.write("\n".join(csv_lines) + "\n")


# =============================================================================

if __name__ == "__main__":
    main()
