soc/integration/export: Prepare split of C header generation in sections.

This commit is contained in:
Florent Kermarrec 2024-05-21 09:15:21 +02:00
parent 10083f4d87
commit 4502edd33e
2 changed files with 32 additions and 12 deletions

View File

@ -114,9 +114,15 @@ def get_litex_git_revision():
os.chdir(d)
return r
def generated_banner(line_comment="//"):
def generated_separator(line_comment="//", msg=""):
r = line_comment + "-"*80 + "\n"
r += line_comment + " Auto-generated by LiteX ({}) on ".format(get_litex_git_revision())
r += "{}\n".format(datetime.datetime.fromtimestamp(time.time()).strftime("%Y-%m-%d %H:%M:%S"))
r += line_comment + " " + msg + "\n"
r += line_comment + "-"*80 + "\n"
return r
def generated_banner(line_comment="//"):
msg = "Auto-generated by LiteX ({}) on {}".format(
get_litex_git_revision(),
datetime.datetime.fromtimestamp(time.time()).strftime("%Y-%m-%d %H:%M:%S"),
)
return generated_separator(line_comment, msg)

View File

@ -31,7 +31,7 @@ from migen import *
from litex.soc.interconnect.csr import CSRStatus
from litex.soc.integration.soc import SoCRegion
from litex.build.tools import generated_banner
from litex.build.tools import generated_separator, generated_banner
from litex.soc.doc.rst import reflow
from litex.soc.doc.module import gather_submodules, ModuleNotDocumented, DocumentedModule, DocumentedInterrupts
@ -261,7 +261,7 @@ def _get_rw_functions_c(reg_name, reg_base, nwords, busword, alignment, read_onl
Generate C code for CSR read/write functions and definitions.
"""
result = _generate_csr_definitions_c(reg_name, reg_base, nwords, csr_base, with_csr_base_define)
size = nwords * busword // 8
size = nwords * busword // 8
ctype, stride = _determine_ctype_and_stride_c(size, alignment)
if ctype is None:
@ -295,9 +295,13 @@ def _generate_csr_base_define_c(csr_base, with_csr_base_define):
"""
Generate the CSR base address define directive.
"""
includes = ""
if with_csr_base_define:
return f"\n#ifndef CSR_BASE\n#define CSR_BASE {hex(csr_base)}L\n#endif\n"
return ""
includes += "\n"
includes += "#ifndef CSR_BASE\n"
includes += f"#define CSR_BASE {hex(csr_base)}L\n"
includes += "#endif /* ! CSR_BASE */\n"
return includes
def _generate_field_definitions_c(csr, name, with_fields_access_functions):
"""
@ -344,7 +348,7 @@ def _generate_csr_region_definitions_c(name, region, origin, alignment, csr_base
Generate CSR address and size definitions for a region.
"""
base_define = with_csr_base_define and not isinstance(region, MockCSRRegion)
region_defs = f"\n/* {name} */\n"
region_defs = f"\n/* {name.upper()} */\n"
region_defs += f"#define CSR_{name.upper()}_BASE {_get_csr_addr(csr_base, origin, base_define)}\n"
if not isinstance(region.obj, Memory):
@ -373,18 +377,28 @@ def get_csr_header(regions, constants, csr_base=None, with_csr_base_define=True,
alignment = constants.get("CONFIG_CSR_ALIGNMENT", 32)
r = generated_banner("//")
r += "\n"
r += generated_separator("//", "CSR Includes.")
r += "\n"
r += _generate_csr_header_includes_c(with_access_functions)
_csr_base = regions[next(iter(regions))].origin
csr_base = csr_base if csr_base is not None else _csr_base
csr_base = csr_base if csr_base is not None else _csr_base
r += _generate_csr_base_define_c(csr_base, with_csr_base_define)
r += "\n"
r += generated_separator("//", "CSR Registers/Fields Definition.")
for name, region in regions.items():
origin = region.origin - _csr_base
r += _generate_csr_region_definitions_c(name, region, origin, alignment, csr_base, with_csr_base_define, with_access_functions, with_fields_access_functions)
r += "\n#endif\n"
r += "\n"
r += generated_separator("//", "CSR Registers Access Functions.")
r += "\n"
r += generated_separator("//", "CSR Registers Field Access Functions.")
r += "\n#endif /* ! __GENERATED_CSR_H */\n"
return r
# C I2C Export -------------------------------------------------------------------------------------