# Copyright 2023 Google LLC
# Copyright lowRISC contributors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


import os
import logging as log
from typing import List, Optional, Tuple

from mako import exceptions  # type: ignore
from mako.lookup import TemplateLookup  # type: ignore
from pkg_resources import resource_filename

from reggen.gen_dv import gen_core_file

from topgen.top import Top


def sv_base_addr(top: Top, if_name: Tuple[str, Optional[str]]) -> str:
    '''Get the base address of a device interface in SV syntax'''
    return "{}'h{:x}".format(top.regwidth, top.if_addrs[if_name])


def gen_dv(top: Top,
           dv_base_names: List[str],
           outdir: str,
           matcha_root: str) -> int:
    '''Generate DV RAL model for a Top'''
    # Read template
    lookup = TemplateLookup(directories=[os.path.join(matcha_root, "util/topgen_matcha"),
                                         resource_filename('reggen', '.')])
    uvm_reg_tpl = lookup.get_template('top_uvm_reg.sv.tpl')

    # isp_wrapper is excluded from CSR tests
    create_isp_wrapper = "1'b1"
    if "cover_reg_top" in outdir:
        create_isp_wrapper = "1'b0"

    # TODO(b/297065395):
    # DMA should check byte write to its CSRs
    #
    # Also, rv_dm can't access dma0 at this time
    create_dma = "1'b1"
    if "no_dma" in outdir:
        create_dma = "1'b0"

    # Expand template
    try:
        to_write = uvm_reg_tpl.render(top=top,
                                      dv_base_names=dv_base_names,
                                      create_isp_wrapper=create_isp_wrapper,
                                      create_dma=create_dma)
    except:  # noqa: E722
        log.error(exceptions.text_error_template().render())
        return 1

    # Dump to output file
    dest_path = '{}/chip_ral_pkg.sv'.format(outdir)
    with open(dest_path, 'w') as fout:
        fout.write(to_write)

    gen_core_file(outdir, 'chip', dv_base_names, ['chip_ral_pkg.sv'])

    return 0
