tinyriscv/tools/regtool/reggen/gen_fpv.py

82 lines
2.6 KiB
Python

# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
# # Lint as: python3
#
"""Generate FPV CSR read and write assertions from IpBlock
"""
import logging as log
import os.path
import yaml
from mako import exceptions # type: ignore
from mako.template import Template # type: ignore
from pkg_resources import resource_filename
from .ip_block import IpBlock
def gen_fpv(block: IpBlock, outdir: str) -> int:
# Read Register templates
fpv_csr_tpl = Template(
filename=resource_filename('reggen', 'fpv_csr.sv.tpl'))
# Generate a module with CSR assertions for each device interface. For a
# device interface with no name, we generate <block>_csr_assert_fpv. For a
# named interface, we generate <block>_<ifname>_csr_assert_fpv.
lblock = block.name.lower()
generated = []
for if_name, rb in block.reg_blocks.items():
if not rb.flat_regs:
# No registers to check!
continue
if if_name is None:
mod_base = lblock
else:
mod_base = lblock + '_' + if_name.lower()
mod_name = mod_base + '_csr_assert_fpv'
filename = mod_name + '.sv'
generated.append(filename)
reg_top_path = os.path.join(outdir, filename)
with open(reg_top_path, 'w', encoding='UTF-8') as fout:
try:
fout.write(fpv_csr_tpl.render(block=block,
mod_base=mod_base,
if_name=if_name,
rb=rb))
except: # noqa F722 for template Exception handling
log.error(exceptions.text_error_template().render())
return 1
# Generate a fusesoc core file that points at the files we've just
# generated.
core_data = {
'name': "lowrisc:fpv:{}_csr_assert".format(lblock),
'filesets': {
'files_dv': {
'depend': [
"lowrisc:tlul:headers",
"lowrisc:prim:assert",
],
'files': generated,
'file_type': 'systemVerilogSource'
},
},
'targets': {
'default': {
'filesets': [
'files_dv',
],
},
},
}
core_file_path = os.path.join(outdir, lblock + '_csr_assert_fpv.core')
with open(core_file_path, 'w') as core_file:
core_file.write('CAPI=2:\n')
yaml.dump(core_data, core_file, encoding='utf-8')
return 0