diff --git a/litex/build/tools.py b/litex/build/tools.py index 410d280c4..bada20978 100644 --- a/litex/build/tools.py +++ b/litex/build/tools.py @@ -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) diff --git a/litex/soc/integration/export.py b/litex/soc/integration/export.py index a6d1ffdb7..7915c136c 100644 --- a/litex/soc/integration/export.py +++ b/litex/soc/integration/export.py @@ -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 -------------------------------------------------------------------------------------