core/cpu: integrate Zynq as a classical CPU (Zynq7000), deprecate SoCZynq.
[litex.git] / litex / soc / integration / builder.py
index 18af0b96f0b1cc1532c4d534460a42269d4c9a72..2648e4b0d042ece12a8d541ef74a4de7596e9a4d 100644 (file)
@@ -14,17 +14,27 @@ import subprocess
 import struct
 import shutil
 
+from litex import get_data_mod
 from litex.build.tools import write_to_file
 from litex.soc.integration import export, soc_core
-
-__all__ = ["soc_software_packages", "soc_directory",
-           "Builder", "builder_args", "builder_argdict"]
+from litex.soc.cores import cpu
+
+__all__ = [
+    "soc_software_packages",
+    "soc_directory",
+    "Builder",
+    "builder_args",
+    "builder_argdict"
+]
 
 
 soc_software_packages = [
     "libcompiler_rt",
     "libbase",
-    "libnet",
+    "liblitedram",
+    "libliteeth",
+    "liblitespi",
+    "liblitesdcard",
     "bios"
 ]
 
@@ -38,22 +48,22 @@ def _makefile_escape(s):
 
 class Builder:
     def __init__(self, soc,
-        output_dir              = None,
-        gateware_dir            = None,
-        software_dir            = None,
-        include_dir             = None,
-        generated_dir           = None,
-        compile_software        = True,
-        compile_gateware        = True,
-        csr_json                = None,
-        csr_csv                 = None,
-        csr_svd                 = None,
-        mr_memory_x             = None):
+        output_dir       = None,
+        gateware_dir     = None,
+        software_dir     = None,
+        include_dir      = None,
+        generated_dir    = None,
+        compile_software = True,
+        compile_gateware = True,
+        csr_json         = None,
+        csr_csv          = None,
+        csr_svd          = None,
+        memory_x         = None,
+        bios_options     = None):
         self.soc = soc
 
-        # From Python doc: makedirs() will become confused if the path
-        # elements to create include '..'
-        self.output_dir    = os.path.abspath(output_dir    or "soc_{}_{}".format(soc.__class__.__name__.lower(), soc.platform.name))
+        # From Python doc: makedirs() will become confused if the path elements to create include '..'
+        self.output_dir    = os.path.abspath(output_dir    or os.path.join("build", soc.platform.name))
         self.gateware_dir  = os.path.abspath(gateware_dir  or os.path.join(self.output_dir,   "gateware"))
         self.software_dir  = os.path.abspath(software_dir  or os.path.join(self.output_dir,   "software"))
         self.include_dir   = os.path.abspath(include_dir   or os.path.join(self.software_dir, "include"))
@@ -64,7 +74,8 @@ class Builder:
         self.csr_csv  = csr_csv
         self.csr_json = csr_json
         self.csr_svd  = csr_svd
-        self.mr_memory_x = mr_memory_x
+        self.memory_x = memory_x
+        self.bios_options = bios_options
 
         self.software_packages = []
         for name in soc_software_packages:
@@ -79,33 +90,26 @@ class Builder:
         os.makedirs(self.include_dir, exist_ok=True)
         os.makedirs(self.generated_dir, exist_ok=True)
 
-        if self.soc.cpu_type is not None:
+        if self.soc.cpu_type not in [None, "zynq7000"]:
             variables_contents = []
             def define(k, v):
                 variables_contents.append("{}={}\n".format(k, _makefile_escape(v)))
 
             for k, v in export.get_cpu_mak(self.soc.cpu, self.compile_software):
                 define(k, v)
-            # Distinguish between LiteX and MiSoC.
-            define("LITEX", "1")
-            # Distinguish between applications running from main RAM and
-            # flash for user-provided software packages.
-            exec_profiles = {
-                "COPY_TO_MAIN_RAM" : "0",
-                "EXECUTE_IN_PLACE" : "0"
-            }
-            if "main_ram" in self.soc.mem_regions.keys():
-                exec_profiles["COPY_TO_MAIN_RAM"] = "1"
-            else:
-                exec_profiles["EXECUTE_IN_PLACE"] = "1"
-            for k, v in exec_profiles.items():
-                define(k, v)
+            define(
+                "COMPILER_RT_DIRECTORY",
+                get_data_mod("software", "compiler_rt").data_location)
             define("SOC_DIRECTORY", soc_directory)
             variables_contents.append("export BUILDINC_DIRECTORY\n")
             define("BUILDINC_DIRECTORY", self.include_dir)
             for name, src_dir in self.software_packages:
                 define(name.upper() + "_DIRECTORY", src_dir)
 
+            if self.bios_options is not None:
+                for option in self.bios_options:
+                    define(option, "1")
+
             write_to_file(
                 os.path.join(self.generated_dir, "variables.mak"),
                 "".join(variables_contents))
@@ -124,8 +128,11 @@ class Builder:
             export.get_soc_header(self.soc.constants))
         write_to_file(
             os.path.join(self.generated_dir, "csr.h"),
-            export.get_csr_header(self.soc.csr_regions,
-                                         self.soc.constants)
+            export.get_csr_header(
+                regions   = self.soc.csr_regions,
+                constants = self.soc.constants,
+                csr_base  = self.soc.mem_regions['csr'].origin
+            )
         )
         write_to_file(
             os.path.join(self.generated_dir, "git.h"),
@@ -156,10 +163,10 @@ class Builder:
             write_to_file(self.csr_svd, export.get_csr_svd(self.soc))
 
     def _generate_mem_region_map(self):
-        if self.mr_memory_x is not None:
-            mr_memory_x_dir = os.path.dirname(os.path.realpath(self.mr_memory_x))
-            os.makedirs(mr_memory_x_dir, exist_ok=True)
-            write_to_file(self.mr_memory_x, export.get_mr_memory_x(self.soc))
+        if self.memory_x is not None:
+            memory_x_dir = os.path.dirname(os.path.realpath(self.memory_x))
+            os.makedirs(memory_x_dir, exist_ok=True)
+            write_to_file(self.memory_x, export.get_memory_x(self.soc))
 
     def _prepare_rom_software(self):
         for name, src_dir in self.software_packages:
@@ -234,8 +241,8 @@ def builder_args(parser):
     parser.add_argument("--csr-svd", default=None,
                         help="store CSR map in SVD format into the "
                              "specified file")
-    parser.add_argument("--mr-memory-x", default=None,
-                        help="store memory regions in memory-x format into the "
+    parser.add_argument("--memory-x", default=None,
+                        help="store Mem regions in memory-x format into the "
                              "specified file")
 
 
@@ -251,5 +258,5 @@ def builder_argdict(args):
         "csr_csv":          args.csr_csv,
         "csr_json":         args.csr_json,
         "csr_svd":          args.csr_svd,
-        "mr_memory_x":      args.mr_memory_x,
+        "memory_x":         args.memory_x,
     }