Source code for padrick.Generators.FuseSoCGenerator.FuseSoCGenerator

import logging
from pathlib import Path

import click_spinner
from click import UsageError
from mako import exceptions
from mako.template import Template

from padrick.ConfigParser import parse_config
from padrick.Generators.FuseSoCGenerator.FuseSoCGeneratorConfigFileModel import ConfigFileModel, GeneratorKind, \
    RTLGenerateStep, CustomGenerateStep
from padrick.Generators.GeneratorSettings import GeneratorSettings
from padrick.Generators.RTLGenerator.RTLGenerator import generate_rtl
from padrick.Model.Padframe import Padframe
from padrick.Utils.WorkingDir import working_dir

logger = logging.getLogger("padrick.FuseSoCGenerator")


[docs]def generate_core(config_file_path: Path): """Parses the config file supplied by FuseSoC to generate a valid FuseSoC core config file.""" logger.info("Parsing FuseSoC Config File...") with click_spinner.spinner(): # Parse the config file twice, first only partially to figure out the root file path, then a second time with # support include files, relative to the calling core file. config = parse_config(ConfigFileModel, config_file_path) root = config.files_root if not config: raise UsageError("Failed to parse the configuration file") padframe_config = parse_config(Padframe, root/config.parameters.padframe_manifest, include_base_dir=config.files_root) if not padframe_config: raise UsageError("Failed to parse the padframe configuration file.") if config.parameters.generator_settings: generator_settings = parse_config(GeneratorSettings, root/config.parameters.generator_settings, include_base_dir=config.files_root) if not generator_settings: raise UsageError("Failed to parse generator settings file.") else: generator_settings = GeneratorSettings() logger.info("Parsing successful. Proceeding with generate steps...") for step in config.parameters.generate_steps: logger.info(f"Processing {step}") if isinstance(step, RTLGenerateStep): generate_rtl(generator_settings.rtl_templates, padframe_config, header_text="", dir=Path("."), vlnv=config.vlnv) elif isinstance(step, CustomGenerateStep): try: mk_template = Template(Path(config.files_root)/step.template_file) step.output_filename.write_text(mk_template.render(padframe=padframe_config, vlnv=config.vlnv)) except Exception as e: logger.error(f"Error while rendering custom template:\ n{exceptions.text_error_template().render()}")