blob: 5ed41aedcd08a1d640d3072093e46811110bd685 [file] [log] [blame]
# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
# Not overly pretty approach to find ipgen dependencies in the right directory.
# Remove once we are properly packaging our Python code.
import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), '../../'))
import pytest
from ipgen import IpBlockRenderer, IpConfig, IpTemplate
from ipgen.lib import TemplateParams
from reggen.params import BaseParam
@pytest.fixture
def rendertest_dirs(tmp_path) -> None:
""" Produce a simple IP template for render testing.
Returns a tuple (template_directory, output_directory), expects the template
to be rendered into output_directory, and checks that the minimal expected
directory contents are present there.
"""
template_dir = tmp_path / 'template'
template_dir.mkdir()
data_dir = template_dir / 'data'
data_dir.mkdir()
RENDERTEST_HJSON = """
{
name: "rendertest"
clocking: [
{clock: "clk_i", reset: "rst_ni", idle: "idle_o", primary: true},
]
bus_interfaces: [
{ protocol: "tlul", direction: "device" }
],
registers: []
}
"""
(data_dir / 'rendertest.hjson').write_text(RENDERTEST_HJSON)
out_dir = tmp_path / 'out'
yield (template_dir, out_dir)
# Check that the basic structure of the IP template directory is retained.
actual = set(str(p.relative_to(out_dir)) for p in out_dir.rglob('*'))
exp = set([
'rtl',
'rtl/rendertest_reg_top.sv',
'rtl/rendertest_reg_pkg.sv',
'data',
'data/inst_rendertest.ipconfig.hjson',
'data/rendertest.hjson',
])
assert exp.issubset(actual)
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 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'