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


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)
        if gridinfo.tile_type.endswith("_SING"):
            continue
        # Y9 tiles have frame address 1 frame higher than the rest
        # Need to investigate what is so special about them
        if tile_name.endswith("Y9"):
            continue

        sites = []
        for site_name, site_type in gridinfo.sites.items():
            if site_type == 'IDELAYE2':
                yield tile_name, site_name


def write_params(params):
    pinstr = 'tile,isone,site\n'
    for vals in params:
        pinstr += ','.join(map(str, vals)) + '\n'

    open('params.csv', 'w').write(pinstr)


def use_idelay(p, luts, connects):
    print(
        '''
    wire idelay_{site};

    (* KEEP, DONT_TOUCH, LOC = "{site}" *)
    IDELAYE2 #(
        .HIGH_PERFORMANCE_MODE("{param}"),
        .DELAY_SRC("DATAIN")
    ) idelay_site_{site} (
        .DATAIN({onet}),
        .DATAOUT(idelay_{site})
        );
    assign {net} = idelay_{site};
       '''.format(
            onet=luts.get_next_output_net(),
            net=luts.get_next_input_net(),
            param="TRUE" if p['isone'] else "FALSE",
            **p),
        file=connects)


def run():
    luts = lut_maker.LutMaker()
    connects = io.StringIO()

    tile_params = []
    params = []
    sites = sorted(list(gen_sites()))
    for idx, ((tile, site), isone) in enumerate(zip(
            sites, util.gen_fuzz_states(len(sites)))):

        p = {}
        p['tile'] = tile
        p['site'] = site
        p['isone'] = isone
        params.append(p)
        tile_params.append((tile, p['isone'], site))

    write_params(tile_params)

    print('''
module top();
    ''')

    # Always output a LUT6 to make placer happy.
    print('''
     (* KEEP, DONT_TOUCH *)
     LUT6 dummy_lut();
     ''')

    # Need IDELAYCTRL for IDEALAYs
    print('''
     (* KEEP, DONT_TOUCH *)
     IDELAYCTRL();
     ''')

    for p in params:
        use_idelay(p, luts, connects)

    for l in luts.create_wires_and_luts():
        print(l)

    print(connects.getvalue())

    print("endmodule")


if __name__ == '__main__':
    run()
