srdl2sv/srdl2sv/srdl2sv.py

111 lines
3.5 KiB
Python
Executable File

#!/usr/bin/env python3
# Standard modules
import sys
import time
import importlib.resources as pkg_resources
# Imported modules
from systemrdl import RDLCompiler, RDLCompileError
# Local modules
from srdl2sv.components.addrmap import AddrMap
from srdl2sv.components import widgets
from srdl2sv.cli.cli import CliArguments
from srdl2sv.log.log import create_logger
def main():
# Take start timestamp
start = time.time()
# Construct command line arguments
cli_arguments = CliArguments()
config = cli_arguments.get_config()
# Create logger
logger = create_logger(
__name__,
stdout_log_level=config['stdout_log_level'],
file_log_level=config['file_log_level'],
file_name=config['file_log_location'])
# Compile and elaborate files provided from the command line
rdlc = RDLCompiler()
try:
for input_file in config['input_file']:
rdlc.compile_file(
input_file, incl_search_paths=config['search_paths'])
root = rdlc.elaborate()
except RDLCompileError:
sys.exit(1)
except FileNotFoundError:
logger.fatal("Could not find '%s'", input_file)
sys.exit(1)
addrmaps = AddrMap(root.top, config)
# Determine address width
if config['addrwidth_bus_spec']:
logger.info("Set address width to '%i', according to '%s' specification",
config['addrwidth'], config['bus'])
else:
logger.info("Set address width to '%i'", config['addrwidth'])
# Save RTL to file
for addrmap in addrmaps.get_addrmaps():
out_addrmap_file = f"{config['output_dir']}/{addrmap.name}.sv"
with open(out_addrmap_file, 'w', encoding='UTF-8') as file:
print(
addrmap.get_rtl(
tab_width=config['tab_width'],
real_tabs=config['real_tabs']
),
file=file
)
logger.info("Succesfully created '%s'", out_addrmap_file)
# Start grabbing packages. This returns a dictionary for the main addrmap
# and all it's child regfiles/addrmaps
for key, value in addrmap.get_package_rtl(
tab_width=config['tab_width'],
real_tabs=config['real_tabs']
).items():
if value:
with open(f"{config['output_dir']}/{key}_pkg.sv", 'w', encoding="UTF-8") as file:
print(value, file=file)
# Copy over generic srdl2sv_interface_pkg
widget_if_rtl = pkg_resources.read_text(widgets, "srdl2sv_widget_if.sv")
out_if_file = f"{config['output_dir']}/srdl2sv_widget_if.sv"
with open(out_if_file, 'w', encoding="UTF-8") as file:
print(widget_if_rtl, file=file)
logger.info("Copied 'srdl2sv_widget_if.sv'")
# Copy over widget RTL from widget directory
try:
widget_rtl = pkg_resources.read_text(widgets, f"srdl2sv_{config['bus']}.sv")
out_widget_file = f"{config['output_dir']}/srdl2sv_{config['bus']}.sv"
with open(out_widget_file, 'w', encoding="UTF-8") as file:
print(widget_rtl, file=file)
logger.info("Selected, implemented, and copied '%s' widget", config['bus'])
except FileNotFoundError:
# Bus might not have a corresponding SV file
logger.info("Did not find a seperate SystemVerilog file for '%s' widget", config['bus'])
# Print elapsed time
logger.info("Elapsed time: %f seconds", time.time() - start)
if __name__ == "__main__":
main()