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

from ports import ports


def print_site(ports, luts, site, site_type):
    verilog_ports = ""
    verilog_wires = ""

    for port, width in ports:
        verilog_ports += """
    .{port}({port}_{site}),""".format(
            port=port, site=site)
        verilog_wires += "wire [{}:0] {}_{};\n".format(width - 1, port, site)

        for idx in range(0, width):
            rand = random.random()

            if rand < 0.45:
                source = "1'b0"
            elif rand < 0.9:
                source = "1'b1"
            else:
                source = luts.get_next_output_net()

            verilog_wires += "assign {}_{}[{}] = {};\n".format(
                port, site, idx, source)

        verilog_wires += "\n"

    verilog_ports = verilog_ports.rstrip(",")

    print(
        """
{wires}

(* KEEP, DONT_TOUCH, LOC = "{site}" *)
{site_type} #(.AREG(2), .BREG(2)) {site}_instance (
{ports}
);""".format(
            wires=verilog_wires,
            ports=verilog_ports,
            site=site,
            site_type=site_type))


def main():
    db = Database(util.get_db_root(), util.get_part())
    grid = db.grid()

    luts = LutMaker()

    def gen_sites(desired_site_type):
        for tile_name in sorted(grid.tiles()):
            loc = grid.loc_of_tilename(tile_name)
            gridinfo = grid.gridinfo_at_loc(loc)
            for site, site_type in gridinfo.sites.items():
                if site_type == desired_site_type:
                    yield tile_name, site

    print('''
module top();

    (* KEEP, DONT_TOUCH *)
    LUT6 dummy();
''')

    for site_type in ["DSP48E1"]:
        for _, site in gen_sites(site_type):
            print_site(ports[site_type], luts, site, site_type)

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

    print('endmodule')


if __name__ == "__main__":
    main()
