def ipgen_render(template_name: str, topname: str, params: Dict, out_path: Path): """ Render an IP template for a specific toplevel using ipgen. The generated IP block is placed in the 'ip_autogen' directory of the toplevel. Aborts the program execution in case of an error. """ instance_name = f'top_{topname}_{template_name}' ip_template = IpTemplate.from_template_path( SRCTREE_TOP / 'hw/ip_templates' / template_name) try: ip_config = IpConfig(ip_template.params, instance_name, params) except ValueError as e: log.error(f"Unable to render IP template {template_name!r}: {str(e)}") sys.exit(1) try: renderer = IpBlockRenderer(ip_template, ip_config) renderer.render(out_path / 'ip_autogen' / template_name, overwrite_output_dir=True) except TemplateRenderError as e: log.error(e.verbose_str()) sys.exit(1)
def test_render_simpleparam(rendertest_dirs) -> None: """ Test the IpBlockRenderer when it gets passed simple parameters. """ (template_dir, out_dir) = rendertest_dirs (template_dir / 'test.txt.tpl').write_text('param1=${param1}') # Declare the template parameters. params = TemplateParams() params.add(BaseParam(name='param1', desc=None, param_type='string')) ip_template = IpTemplate('rendertest', params, template_dir) param_values = { 'param1': 'somevalue', } ip_config = IpConfig(ip_template.params, 'inst_rendertest', param_values) # Render into the output directory. renderer = IpBlockRenderer(ip_template, ip_config) renderer.render(out_dir, overwrite_output_dir=False) # Check that the template parameters are rendered correctly. assert (out_dir / 'test.txt').is_file() assert (out_dir / 'test.txt').read_text() == 'param1=somevalue'
def action_generate(ip_template: IpTemplate, args: argparse.Namespace) -> None: """ Handle the 'generate' action/subcommand. """ overwrite_output_dir = args.force output_path = args.outdir # Read the IP configuration file. config_fp = args.config_file config_text = config_fp.read() config_fp.close() ip_config = IpConfig.from_text(config_text, "the file passed to --config") # Render the IP template into an IP block. renderer = IpBlockRenderer(ip_template, ip_config) renderer.render(output_path, overwrite_output_dir) print(f"Wrote IP block {ip_config.instance_name!r} " f"from template {ip_template.name!r} to '{output_path}'.")
def test_render_objectparam(rendertest_dirs) -> None: """ Test the IpBlockRenderer when it gets passed object parameters. """ (template_dir, out_dir) = rendertest_dirs template = """${obj['super']} ${obj['mega']} % for item in obj['list']: ${item} % endfor """ (template_dir / 'test.txt.tpl').write_text(template) # Declare the template parameters. params = TemplateParams() params.add(BaseParam(name='obj', desc=None, param_type='object')) ip_template = IpTemplate('rendertest', params, template_dir) param_values = { 'obj': { 'super': 'duper', 'mega': 1e6, 'list': ['of', 'things'], }, } ip_config = IpConfig(ip_template.params, 'inst_rendertest', param_values) # Render into the output directory. renderer = IpBlockRenderer(ip_template, ip_config) renderer.render(out_dir, overwrite_output_dir=False) # Check that the template parameters are rendered correctly. assert (out_dir / 'test.txt').is_file() assert (out_dir / 'test.txt').read_text() == 'duper\n1000000\nof\nthings\n'