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

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
