#!/usr/bin/env python3

from __future__ import print_function
import sys
import os

import pcf
from f4pga.utils.vpr_io_place import IoPlace

import csv
import argparse

parser = argparse.ArgumentParser(
    description='Convert a PCF file into a VPR io.place file.'
)
parser.add_argument(
    "--pcf",
    '-p',
    "-P",
    type=argparse.FileType('r'),
    required=True,
    help='PCF input file'
)
parser.add_argument(
    "--blif",
    '-b',
    type=argparse.FileType('r'),
    required=True,
    help='BLIF / eBLIF file'
)
parser.add_argument(
    "--map",
    '-m',
    "-M",
    type=argparse.FileType('r'),
    required=True,
    help='Pin map CSV file'
)
parser.add_argument(
    "--net",
    '-n',
    type=argparse.FileType('r'),
    required=True,
    help='VPR Packed netlist file'
)
parser.add_argument(
    "--output",
    '-o',
    "-O",
    type=argparse.FileType('w'),
    default=sys.stdout,
    help='The output io.place file'
)


def main(argv):
    args = parser.parse_args()

    reader = csv.DictReader(args.map)
    pin_map = {}
    for row in reader:
        pin_map[row['name']] = (int(row['x']), int(row['y']), int(row['z']))

    locs = pcf.parse_pcf(args.pcf, pin_map)

    io_place = IoPlace()

    io_place.read_io_list_from_eblif(args.blif)
    io_place.load_net_file_ios(args.net)

    for name, (loc, pcf_line) in locs.items():
        if io_place.is_net_packed(name):
            io_place.constrain_net(net_name=name, loc=loc, comment=pcf_line)

    io_place.output_io_place(args.output)


if __name__ == "__main__":
    sys.exit(main(sys.argv))
