| # 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 |