#!/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 os
import re
import random
random.seed(int(os.getenv("SEED"), 16))
from prjxray import util
from prjxray.db import Database
from prjxray.grid_types import GridLoc

GTP_INT_Y_RE = re.compile("PCIE_INT_INTERFACE.*X[0-9]+Y([0-9]+)")


def get_pcie_int_tiles(grid, pcie_loc):
    def get_site_at_loc(loc):
        gridinfo = grid.gridinfo_at_loc(loc)

        sites = list(gridinfo.sites.keys())

        if len(sites) and sites[0].startswith("SLICE"):
            return sites[0]

        return None

    pcie_int_tiles = list()

    for tile_name in sorted(grid.tiles()):
        if not tile_name.startswith("PCIE_INT_INTERFACE"):
            continue

        m = GTP_INT_Y_RE.match(tile_name)

        assert m

        int_y = int(m.group(1))

        if int_y % 50 == 0:
            loc = grid.loc_of_tilename(tile_name)
            is_left = loc.grid_x < pcie_loc.grid_x

            if is_left:
                for i in range(1, loc.grid_x):
                    loc_grid_x = loc.grid_x - i

                    site = get_site_at_loc(GridLoc(loc_grid_x, loc.grid_y))

                    if site:
                        break
            else:
                _, x_max, _, _ = grid.dims()
                for i in range(1, x_max - loc.grid_x):
                    loc_grid_x = loc.grid_x + i

                    site = get_site_at_loc(GridLoc(loc_grid_x, loc.grid_y))

                    if site:
                        break

            pcie_int_tiles.append((tile_name, is_left, site))

    return pcie_int_tiles


def gen_sites():
    db = Database(util.get_db_root(), util.get_part())
    grid = db.grid()
    for tile_name in sorted(grid.tiles()):
        loc = grid.loc_of_tilename(tile_name)
        gridinfo = grid.gridinfo_at_loc(loc)

        for site_name, site_type in gridinfo.sites.items():
            if site_type in ['PCIE_2_1']:
                pcie_int_tiles = get_pcie_int_tiles(grid, loc)

                yield pcie_int_tiles, site_name


def write_params(params):
    pinstr = 'tile,val,site\n'
    for tile, (site, val) in sorted(params.items()):
        pinstr += '%s,%s,%s\n' % (tile, val, site)
    open('params.csv', 'w').write(pinstr)


def run():
    print('''
module top();
    ''')

    params = {}

    sites = list(gen_sites())
    for pcie_int_tiles, site_name in sites:
        left_side = None
        right_side = None

        for tile, is_left, site in pcie_int_tiles:
            isone = random.randint(0, 1)
            params[tile] = (site_name, isone)

            if is_left:
                left_side = site
            else:
                right_side = site

        assert left_side and right_side

        print(
            '''
wire [1:0] PLDIRECTEDLINKCHANGE;
wire [68:0] MIMTXRDATA;

(* KEEP, DONT_TOUCH, LOC = "{left}" *)
LUT1 left_lut_{left} (.O(MIMTXRDATA[0]));

(* KEEP, DONT_TOUCH, LOC = "{right}" *)
LUT1 right_lut_{right} (.O(PLDIRECTEDLINKCHANGE[0]));

(* KEEP, DONT_TOUCH, LOC = "{site}" *)
PCIE_2_1 pcie_2_1_{site} (
    .PLDIRECTEDLINKCHANGE(PLDIRECTEDLINKCHANGE),
    .MIMTXRDATA(MIMTXRDATA)
);'''.format(site=site_name, right=right_side, left=left_side))

    print("endmodule")
    write_params(params)


if __name__ == '__main__':
    run()
