litex/make.py

78 lines
3.4 KiB
Python
Raw Normal View History

2013-07-04 13:19:39 -04:00
#!/usr/bin/env python3
import argparse, os, importlib, subprocess
from mibuild.tools import write_to_file
2013-11-24 04:30:02 -05:00
from misoclib.gensoc import cpuif
2013-11-09 09:27:32 -05:00
from misoclib.s6ddrphy import initsequence
2013-07-04 13:19:39 -04:00
import top, jtag
2013-10-20 18:04:26 -04:00
def build(platform_name, build_bitstream, build_header, csr_csv_filename, *soc_args, **soc_kwargs):
2013-07-04 13:19:39 -04:00
platform_module = importlib.import_module("mibuild.platforms."+platform_name)
platform = platform_module.Platform()
2013-11-24 04:30:02 -05:00
soc = top.SoC(platform, *soc_args, **soc_kwargs)
2013-07-04 13:19:39 -04:00
platform.add_platform_command("""
INST "mxcrg/wr_bufpll" LOC = "BUFPLL_X0Y2";
INST "mxcrg/rd_bufpll" LOC = "BUFPLL_X0Y3";
PIN "mxcrg/bufg_x1.O" CLOCK_DEDICATED_ROUTE = FALSE;
2013-09-18 11:14:11 -04:00
PIN "dviout_pix_bufg.O" CLOCK_DEDICATED_ROUTE = FALSE;
2013-07-04 13:19:39 -04:00
""")
if hasattr(soc, "fb"):
platform.add_platform_command("""
2013-09-17 12:15:22 -04:00
NET "{vga_clk}" TNM_NET = "GRPvga_clk";
2013-07-04 13:19:39 -04:00
NET "sys_clk" TNM_NET = "GRPsys_clk";
TIMESPEC "TSise_sucks1" = FROM "GRPvga_clk" TO "GRPsys_clk" TIG;
TIMESPEC "TSise_sucks2" = FROM "GRPsys_clk" TO "GRPvga_clk" TIG;
2013-09-17 12:15:22 -04:00
""", vga_clk=soc.fb.driver.clocking.cd_pix.clk)
2013-07-04 13:19:39 -04:00
for d in ["mxcrg", "minimac3"]:
2013-07-04 13:19:39 -04:00
platform.add_source_dir(os.path.join("verilog", d))
platform.add_sources(os.path.join("verilog", "lm32", "submodule", "rtl"),
"lm32_cpu.v", "lm32_instruction_unit.v", "lm32_decoder.v",
"lm32_load_store_unit.v", "lm32_adder.v", "lm32_addsub.v", "lm32_logic_op.v",
"lm32_shifter.v", "lm32_multiplier.v", "lm32_mc_arithmetic.v",
"lm32_interrupt.v", "lm32_ram.v", "lm32_dp_ram.v", "lm32_icache.v",
"lm32_dcache.v", "lm32_top.v", "lm32_debug.v", "lm32_jtag.v", "jtag_cores.v",
"jtag_tap_spartan6.v", "lm32_itlb.v", "lm32_dtlb.v")
platform.add_sources(os.path.join("verilog", "lm32"), "lm32_config.v")
if build_bitstream:
build_name = "soc-"+platform_name
platform.build(soc, build_name=build_name)
2013-07-07 08:55:06 -04:00
subprocess.call(["tools/byteswap", "build/"+build_name+".bin", "build/"+build_name+".fpg"])
2013-07-04 13:19:39 -04:00
else:
soc.finalize()
if build_header:
2013-10-20 18:04:26 -04:00
csr_header = cpuif.get_csr_header(soc.csr_base, soc.csrbankarray, soc.interrupt_map)
2013-07-04 13:19:39 -04:00
write_to_file("software/include/hw/csr.h", csr_header)
2013-10-20 18:04:26 -04:00
sdram_phy_header = initsequence.get_sdram_phy_header(soc.ddrphy)
write_to_file("software/include/hw/sdram_phy.h", sdram_phy_header)
2013-10-20 18:04:26 -04:00
if csr_csv_filename:
csr_csv = cpuif.get_csr_csv(soc.csr_base, soc.csrbankarray)
write_to_file(csr_csv_filename, csr_csv)
2013-07-04 13:19:39 -04:00
def main():
2013-11-09 09:27:32 -05:00
parser = argparse.ArgumentParser(description="MiSoC - a high performance SoC based on Migen.")
2013-07-04 13:19:39 -04:00
parser.add_argument("-p", "--platform", default="mixxeo", help="platform to build for")
parser.add_argument("-B", "--no-bitstream", default=False, action="store_true", help="do not build bitstream file")
parser.add_argument("-H", "--no-header", default=False, action="store_true", help="do not build C header files with CSR/IRQ/SDRAM_PHY defs")
2013-10-20 18:04:26 -04:00
parser.add_argument("-c", "--csr-csv", default="", help="save CSR map in CSV file")
2013-07-04 13:19:39 -04:00
parser.add_argument("-l", "--load", default=False, action="store_true", help="load bitstream to SRAM")
parser.add_argument("-f", "--flash", default=False, action="store_true", help="load bitstream to flash")
parser.add_argument("-m", "--with-memtest", default=False, action="store_true", help="include memtest cores")
2013-07-04 13:19:39 -04:00
args = parser.parse_args()
2013-10-20 18:04:26 -04:00
build(args.platform, not args.no_bitstream, not args.no_header, args.csr_csv, args.with_memtest)
2013-07-04 13:19:39 -04:00
if args.load:
jtag.load("build/soc-"+args.platform+".bit")
if args.flash:
jtag.flash("build/soc-"+args.platform+".fpg")
if __name__ == "__main__":
main()