diff --git a/README.md b/README.md index 790f385..4c9942f 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,14 @@ Softcore system-on-chip on the Lattice ECP5 Versa board, built with a 100% Veril * 100MHz clock frequency. * Runs a Rust "hello world" program. -Use nixpkgs unstable (known to work with ae71c13). Check https://nixbld.m-labs.hk/project/fpga for the status of the build with other nixpkgs versions. +Use nixpkgs 19.03. If you are unfamiliar with Nix and just installed it on another (non-NixOS) distribution, simply run: + +``` +$ nix-channel --remove nixpkgs +$ nix-channel --add https://nixos.org/channels/nixos-19.03 nixpkgs +$ nix-channel --update + +``` Optional: set up the M-Labs key and binary substituter for Nix (otherwise Nix will recompile LLVM, rustc, etc. on your machine). Create the file ``~/.config/nix/nix.conf`` with the following contents: @@ -27,6 +34,8 @@ trusted-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDS Run ``nix-build -A simplesoc_ecp5 release.nix`` +You can also build manually and use your distribution's packages, but YMMV. + Bypass the ispCLOCK device using the jumpers on your board. Create a ``versa.cfg`` file with: diff --git a/compilers/rust-riscv32i-crates.nix b/compilers/rust-riscv32i-crates.nix index 1bf9a04..b94ea01 100644 --- a/compilers/rust-riscv32i-crates.nix +++ b/compilers/rust-riscv32i-crates.nix @@ -1,29 +1,21 @@ -{ stdenv, rustc, fetchFromGitHub }: -let - compiler-builtins-src = fetchFromGitHub { - owner = "rust-lang-nursery"; - repo = "compiler-builtins"; - rev = "0.1.12"; - sha256 = "0hkssvrh952kcz7w7aws3pqr05barg3qppqpji641b35xpbg9gyg"; - }; -in - stdenv.mkDerivation { - name = "rust-riscv32i-crates"; - src = rustc.src; - phases = [ "unpackPhase" "buildPhase" ]; - buildPhase = '' - destdir=$out/lib/rustlib/riscv32i-unknown-none-elf/lib/ - rustc="${rustc}/bin/rustc --out-dir ''${destdir} -L ''${destdir} --target riscv32i-unknown-none-elf -g -C opt-level=s --crate-type rlib" +{ stdenv, rustc }: +stdenv.mkDerivation { + name = "rust-riscv32i-crates"; + src = rustc.src; + phases = [ "unpackPhase" "buildPhase" ]; + buildPhase = '' + destdir=$out/lib/rustlib/riscv32i-unknown-none-elf/lib/ + rustc="${rustc}/bin/rustc --out-dir ''${destdir} -L ''${destdir} --target riscv32i-unknown-none-elf -g -C opt-level=s --crate-type rlib" - mkdir -p ''${destdir} - export RUSTC_BOOTSTRAP=1 - ''${rustc} --crate-name core src/libcore/lib.rs - ''${rustc} --crate-name compiler_builtins ${compiler-builtins-src}/src/lib.rs --cfg 'feature="compiler-builtins"' --cfg 'feature="mem"' - ''; - # ''${rustc} --crate-name alloc src/liballoc/lib.rs - # ''${rustc} --crate-name libc ${./libc_mini.rs} - # ''${rustc} --crate-name unwind src/libunwind/lib.rs - # ''${rustc} --crate-name std src/libstd/lib.rs - # ''${rustc} -Cpanic=abort --crate-name panic_abort src/libpanic_abort/lib.rs - # ''${rustc} -Cpanic=unwind --crate-name panic_unwind src/libpanic_unwind/lib.rs --cfg llvm_libunwind - } + mkdir -p ''${destdir} + export RUSTC_BOOTSTRAP=1 + ''${rustc} --crate-name core src/libcore/lib.rs + ''${rustc} --crate-name compiler_builtins src/libcompiler_builtins/src/lib.rs --cfg 'feature="compiler-builtins"' --cfg 'feature="mem"' + ''; + # ''${rustc} --crate-name alloc src/liballoc/lib.rs + # ''${rustc} --crate-name libc ${./libc_mini.rs} + # ''${rustc} --crate-name unwind src/libunwind/lib.rs + # ''${rustc} --crate-name std src/libstd/lib.rs + # ''${rustc} -Cpanic=abort --crate-name panic_abort src/libpanic_abort/lib.rs + # ''${rustc} -Cpanic=unwind --crate-name panic_unwind src/libpanic_unwind/lib.rs --cfg llvm_libunwind +} diff --git a/overlay.nix b/overlay.nix index a3b4d80..5361b96 100644 --- a/overlay.nix +++ b/overlay.nix @@ -1,5 +1,73 @@ self: super: rec { + yosys = super.yosys.overrideAttrs(oa: rec { + name = "yosys-${version}"; + version = "2019-07-27"; + srcs = [ + (super.fetchFromGitHub { + owner = "yosyshq"; + repo = "yosys"; + rev = "6538671c84a12114a991d59569eede3e0d368758"; + sha256 = "1l6v94a9vh9krmfsmd3v8l8xciwf028xvg93qf80s8a75djm7bc3"; + name = "yosys"; + }) + + # NOTE: the version of abc used here is synchronized with + # the one in the yosys Makefile of the version above; + # keep them the same for quality purposes. + (super.fetchFromGitHub { + owner = "berkeley-abc"; + repo = "abc"; + rev = "5776ad07e7247993976bffed4802a5737c456782"; + sha256 = "1la4idmssg44rp6hd63sd5vybvs3vr14yzvwcg03ls37p39cslnl"; + name = "yosys-abc"; + }) + ]; + buildInputs = oa.buildInputs ++ [ super.zlib ]; + }); + nextpnr = super.nextpnr.overrideAttrs(oa: rec { + name = "nextpnr-${version}"; + version = "2019-07-22"; + src = super.fetchFromGitHub { + owner = "yosyshq"; + repo = "nextpnr"; + rev = "ba050c21b94e816f9dd69f69b23ad5105858f401"; + sha256 = "1wxsv1lcbi6bvv5vryvjz9mj530iva85wh6b6pvnfff2i4yc3p9q"; + }; + buildInputs = oa.buildInputs ++ [ super.eigen ]; + cmakeFlags = oa.cmakeFlags ++ [ "-DUSE_OPENMP=ON" ]; + }); + icestorm = super.icestorm.overrideAttrs(oa: rec { + name = "icestorm-${version}"; + version = "2019-07-03"; + src = super.fetchFromGitHub { + owner = "cliffordwolf"; + repo = "icestorm"; + rev = "792cef084a751e32f541332feb4905f8e49e9943"; + sha256 = "115qmgcz5ndw4z8ivk1cdlz6i2dzhq195gr8y4fjrjcb5jlacz23"; + }; + }); + trellis = super.trellis.overrideAttrs(oa: rec { + name = "trellis-${version}"; + version = "2019-07-18"; + srcs = [ + (super.fetchFromGitHub { + owner = "symbiflow"; + repo = "prjtrellis"; + rev = "b27c0da5d20a4c105fe9be2b5f8d859316613f44"; + sha256 = "12jcs64agv5yhqq4zwjp2vd9y248608hz1gj187g1cfqrv0yc8d5"; + name = "trellis"; + }) + (super.fetchFromGitHub { + owner = "symbiflow"; + repo = "prjtrellis-db"; + rev = "b4d626b6402c131e9a035470ffe4cf33ccbe7986"; + sha256 = "0k26lq6c049ja8hhqcljwjb1y5k4gcici23l2n86gyp83jr03ilx"; + name = "database"; + }) + ]; + }); + llvm_7 = super.llvm_7.overrideAttrs(oa: { name = oa.name + "-riscv"; cmakeFlags = oa.cmakeFlags ++ ["-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=RISCV"]; diff --git a/release.nix b/release.nix index c8823a5..b4bed21 100644 --- a/release.nix +++ b/release.nix @@ -3,7 +3,7 @@ let pkgs = import { overlays = [ (import ./overlay.nix) ]; }; hx = import ./default.nix { inherit pkgs; }; jobs = hx // { - inherit (pkgs) llvm_7 rustc cargo cargo-vendor; + inherit (pkgs) yosys nextpnr icestorm trellis llvm_7 rustc cargo cargo-vendor; helloworld_ecp5 = import ./examples/helloworld_ecp5.nix { inherit pkgs hx; }; helloworld_kintex7 = import ./examples/helloworld_kintex7.nix { inherit pkgs hx; };