# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

import logging as log
from mako import exceptions
from mako.template import Template
from pkg_resources import resource_filename

from .item import NodeType
from .xbar import Xbar



def generate(xbar):  #xbar: Xbar -> str
    """generate uses elaborated model then creates top level Xbar module
    with prefix.
    """

    xbar_rtl_tpl = Template(
        filename=resource_filename('tlgen', 'xbar.rtl.sv.tpl'))
    xbar_pkg_tpl = Template(
        filename=resource_filename('tlgen', 'xbar.pkg.sv.tpl'))
    #xbar_dv_tpl = Template(
    #    filename=resource_filename('tlgen', 'xbar.dv.sv.tpl'))
    xbar_bind_tpl = Template(
        filename=resource_filename('tlgen', 'xbar.bind.sv.tpl'))

    try:
        out_rtl = xbar_rtl_tpl.render(xbar=xbar, ntype=NodeType)
        out_pkg = xbar_pkg_tpl.render(xbar=xbar)
        out_bind = xbar_bind_tpl.render(xbar=xbar, ntype=NodeType)
    except:
        log.error(exceptions.text_error_template().render())

    return (out_rtl, out_pkg, out_bind)
