|  |  |  | @ -1,17 +1,10 @@ | 
		
	
		
			
				|  |  |  |  | #!/usr/bin/python3 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | from fusesoc.capi2.generator import Generator | 
		
	
		
			
				|  |  |  |  | from litex.build.tools import write_to_file | 
		
	
		
			
				|  |  |  |  | from litex.build.tools import replace_in_file | 
		
	
		
			
				|  |  |  |  | from litex.build.generic_platform import * | 
		
	
		
			
				|  |  |  |  | from litex.build.xilinx import XilinxPlatform | 
		
	
		
			
				|  |  |  |  | from litex.build.lattice import LatticePlatform | 
		
	
		
			
				|  |  |  |  | from litex.soc.integration.builder import * | 
		
	
		
			
				|  |  |  |  | from litedram.gen import * | 
		
	
		
			
				|  |  |  |  | import subprocess | 
		
	
		
			
				|  |  |  |  | import os | 
		
	
		
			
				|  |  |  |  | import sys | 
		
	
		
			
				|  |  |  |  | import yaml | 
		
	
		
			
				|  |  |  |  | import shutil | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | def make_new_dir(base, added): | 
		
	
	
		
			
				
					|  |  |  | @ -28,9 +21,6 @@ gen_src_dir = os.path.join(base_dir, "gen-src") | 
		
	
		
			
				|  |  |  |  | gen_dir = make_new_dir(base_dir, "generated") | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Build the init code for microwatt-initialized DRAM | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # XXX Not working yet | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | def build_init_code(build_dir, is_sim): | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     # More path fudging | 
		
	
	
		
			
				
					|  |  |  | @ -45,7 +35,7 @@ def build_init_code(build_dir, is_sim): | 
		
	
		
			
				|  |  |  |  |     print(" lx src dir:", lxbios_src_dir) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     # Generate mem.h (hard wire size, it's not important) | 
		
	
		
			
				|  |  |  |  |     mem_h = "#define MAIN_RAM_BASE 0x40000000\n#define MAIN_RAM_SIZE 0x10000000" | 
		
	
		
			
				|  |  |  |  |     mem_h = "#define MAIN_RAM_BASE 0x40000000UL\n#define MAIN_RAM_SIZE 0x10000000UL\n" | 
		
	
		
			
				|  |  |  |  |     write_to_file(os.path.join(gen_inc_dir, "mem.h"), mem_h) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     # Environment | 
		
	
	
		
			
				
					|  |  |  | @ -55,18 +45,19 @@ def build_init_code(build_dir, is_sim): | 
		
	
		
			
				|  |  |  |  |     def add_var(k, v): | 
		
	
		
			
				|  |  |  |  |         env_vars.append("{}={}\n".format(k, _makefile_escape(v))) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     add_var("BUILD_DIR", sw_dir) | 
		
	
		
			
				|  |  |  |  |     add_var("SRC_DIR", src_dir) | 
		
	
		
			
				|  |  |  |  |     add_var("GENINC_DIR", sw_inc_dir) | 
		
	
		
			
				|  |  |  |  |     add_var("LXSRC_DIR", lxbios_src_dir) | 
		
	
		
			
				|  |  |  |  |     makefile = os.path.join(src_dir, "Makefile") | 
		
	
		
			
				|  |  |  |  |     cmd = ["make", "-C", build_dir, "-f", makefile] | 
		
	
		
			
				|  |  |  |  |     cmd.append("BUILD_DIR=%s" % sw_dir) | 
		
	
		
			
				|  |  |  |  |     cmd.append("SRC_DIR=%s" % src_dir) | 
		
	
		
			
				|  |  |  |  |     cmd.append("GENINC_DIR=%s" % sw_inc_dir) | 
		
	
		
			
				|  |  |  |  |     cmd.append("LXSRC_DIR=%s" % lxbios_src_dir) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     if is_sim: | 
		
	
		
			
				|  |  |  |  |         add_var("EXTRA_CFLAGS", "-D__SIM__") | 
		
	
		
			
				|  |  |  |  |     write_to_file(os.path.join(gen_inc_dir, "variables.mak"), "".join(env_vars)) | 
		
	
		
			
				|  |  |  |  |         cmd.append("EXTRA_CFLAGS=%s" % "-D__SIM__") | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     # Build init code | 
		
	
		
			
				|  |  |  |  |     print(" Generating init software...") | 
		
	
		
			
				|  |  |  |  |     makefile = os.path.join(src_dir, "Makefile") | 
		
	
		
			
				|  |  |  |  |     r = subprocess.check_call(["make", "-C", build_dir, "-I", gen_inc_dir, "-f", makefile]) | 
		
	
		
			
				|  |  |  |  |     r = subprocess.check_call(cmd) | 
		
	
		
			
				|  |  |  |  |     print("Make result:", r) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     return os.path.join(sw_dir, "obj", "sdram_init.hex") | 
		
	
	
		
			
				
					|  |  |  | @ -76,48 +67,17 @@ def generate_one(t): | 
		
	
		
			
				|  |  |  |  |     print("Generating target:", t) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     # Is it a simulation ? | 
		
	
		
			
				|  |  |  |  |     is_sim = t is "sim" | 
		
	
		
			
				|  |  |  |  |     is_sim = "sim" in t | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     # Muck with directory path | 
		
	
		
			
				|  |  |  |  |     build_dir = make_new_dir(build_top_dir, t) | 
		
	
		
			
				|  |  |  |  |     t_dir = make_new_dir(gen_dir, t) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     # Grab config file | 
		
	
		
			
				|  |  |  |  |     cfile = os.path.join(gen_src_dir, t  + ".yml") | 
		
	
		
			
				|  |  |  |  |     core_config = yaml.load(open(cfile).read(), Loader=yaml.Loader) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     ### TODO: Make most stuff below a function in litedram gen.py and | 
		
	
		
			
				|  |  |  |  |     ###       call it rather than duplicate it | 
		
	
		
			
				|  |  |  |  |     ### | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     # Convert YAML elements to Python/LiteX | 
		
	
		
			
				|  |  |  |  |     for k, v in core_config.items(): | 
		
	
		
			
				|  |  |  |  |         replaces = {"False": False, "True": True, "None": None} | 
		
	
		
			
				|  |  |  |  |         for r in replaces.keys(): | 
		
	
		
			
				|  |  |  |  |             if v == r: | 
		
	
		
			
				|  |  |  |  |                 core_config[k] = replaces[r] | 
		
	
		
			
				|  |  |  |  |         if "clk_freq" in k: | 
		
	
		
			
				|  |  |  |  |             core_config[k] = float(core_config[k]) | 
		
	
		
			
				|  |  |  |  |         if k == "sdram_module": | 
		
	
		
			
				|  |  |  |  |             core_config[k] = getattr(litedram_modules, core_config[k]) | 
		
	
		
			
				|  |  |  |  |         if k == "sdram_phy": | 
		
	
		
			
				|  |  |  |  |             core_config[k] = getattr(litedram_phys, core_config[k]) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     # Generate core | 
		
	
		
			
				|  |  |  |  |     cmd = ["litedram_gen", "--output-dir=%s" % build_dir] | 
		
	
		
			
				|  |  |  |  |     if is_sim: | 
		
	
		
			
				|  |  |  |  |         platform = SimPlatform("", io=[]) | 
		
	
		
			
				|  |  |  |  |     elif core_config["sdram_phy"] in [litedram_phys.ECP5DDRPHY]: | 
		
	
		
			
				|  |  |  |  |         platform = LatticePlatform("LFE5UM5G-45F-8BG381C", io=[], toolchain="trellis") | 
		
	
		
			
				|  |  |  |  |     elif core_config["sdram_phy"] in [litedram_phys.A7DDRPHY, litedram_phys.K7DDRPHY, litedram_phys.V7DDRPHY]: | 
		
	
		
			
				|  |  |  |  |         platform = XilinxPlatform("", io=[], toolchain="vivado") | 
		
	
		
			
				|  |  |  |  |     else: | 
		
	
		
			
				|  |  |  |  |         raise ValueError("Unsupported SDRAM PHY: {}".format(core_config["sdram_phy"])) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     soc      = LiteDRAMCore(platform, core_config, is_sim = is_sim, integrated_rom_size=0x6000) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     # Build into build_dir | 
		
	
		
			
				|  |  |  |  |     builder  = Builder(soc, output_dir=build_dir, compile_gateware=False) | 
		
	
		
			
				|  |  |  |  |     vns      = builder.build(build_name="litedram_core", regular_comb=False) | 
		
	
		
			
				|  |  |  |  |         cmd.append("--sim") | 
		
	
		
			
				|  |  |  |  |     cmd.append("%s.yml" % t) | 
		
	
		
			
				|  |  |  |  |     subprocess.check_call(cmd) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     # Grab generated gatewar dir | 
		
	
		
			
				|  |  |  |  |     gw_dir = os.path.join(build_dir, "gateware") | 
		
	
	
		
			
				
					|  |  |  | 
 |