Compare commits

...

2 Commits

Author SHA1 Message Date
Sebastien Bourdeauducq 12032433ed use nixpkgs 19.03
* too much breakage on nixos-unstable
* we should track upstream yosys/nextpnr more closely than nixpkgs does
2019-07-29 14:58:46 +08:00
Sebastien Bourdeauducq 87acbacf87 firmware: prevent Nix from corrupting output ELF 2019-07-29 13:58:21 +08:00
5 changed files with 101 additions and 30 deletions

View File

@ -15,7 +15,14 @@ Softcore system-on-chip on the Lattice ECP5 Versa board, built with a 100% Veril
* 100MHz clock frequency. * 100MHz clock frequency.
* Runs a Rust "hello world" program. * 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). 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: 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`` 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. Bypass the ispCLOCK device using the jumpers on your board.
Create a ``versa.cfg`` file with: Create a ``versa.cfg`` file with:

View File

@ -1,29 +1,21 @@
{ stdenv, rustc, fetchFromGitHub }: { stdenv, rustc }:
let stdenv.mkDerivation {
compiler-builtins-src = fetchFromGitHub { name = "rust-riscv32i-crates";
owner = "rust-lang-nursery"; src = rustc.src;
repo = "compiler-builtins"; phases = [ "unpackPhase" "buildPhase" ];
rev = "0.1.12"; buildPhase = ''
sha256 = "0hkssvrh952kcz7w7aws3pqr05barg3qppqpji641b35xpbg9gyg"; 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"
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"
mkdir -p ''${destdir} mkdir -p ''${destdir}
export RUSTC_BOOTSTRAP=1 export RUSTC_BOOTSTRAP=1
''${rustc} --crate-name core src/libcore/lib.rs ''${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 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 alloc src/liballoc/lib.rs
# ''${rustc} --crate-name libc ${./libc_mini.rs} # ''${rustc} --crate-name libc ${./libc_mini.rs}
# ''${rustc} --crate-name unwind src/libunwind/lib.rs # ''${rustc} --crate-name unwind src/libunwind/lib.rs
# ''${rustc} --crate-name std src/libstd/lib.rs # ''${rustc} --crate-name std src/libstd/lib.rs
# ''${rustc} -Cpanic=abort --crate-name panic_abort src/libpanic_abort/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 # ''${rustc} -Cpanic=unwind --crate-name panic_unwind src/libpanic_unwind/lib.rs --cfg llvm_libunwind
} }

View File

@ -7,6 +7,8 @@ rustPlatform.buildRustPackage rec {
src = ./.; src = ./.;
cargoSha256 = "0kf2pnfylfmzm0qvi4jfci43qvrnj1v5f037sb9zpvfqyddhdffl"; cargoSha256 = "0kf2pnfylfmzm0qvi4jfci43qvrnj1v5f037sb9zpvfqyddhdffl";
phases = ["unpackPhase" "buildPhase" "installPhase"];
buildPhase = '' buildPhase = ''
export CARGO_HOME=$(mktemp -d cargo-home.XXX) export CARGO_HOME=$(mktemp -d cargo-home.XXX)
export RUSTFLAGS="-L ${rust-riscv32i-crates}/lib/rustlib/riscv32i-unknown-none-elf/lib -C linker=${binutils-riscv32}/bin/riscv32-unknown-elf-ld -C link-arg=-Tlink.x" export RUSTFLAGS="-L ${rust-riscv32i-crates}/lib/rustlib/riscv32i-unknown-none-elf/lib -C linker=${binutils-riscv32}/bin/riscv32-unknown-elf-ld -C link-arg=-Tlink.x"

View File

@ -1,5 +1,73 @@
self: super: self: super:
rec { 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: { llvm_7 = super.llvm_7.overrideAttrs(oa: {
name = oa.name + "-riscv"; name = oa.name + "-riscv";
cmakeFlags = oa.cmakeFlags ++ ["-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=RISCV"]; cmakeFlags = oa.cmakeFlags ++ ["-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=RISCV"];

View File

@ -3,7 +3,7 @@ let
pkgs = import <nixpkgs> { overlays = [ (import ./overlay.nix) ]; }; pkgs = import <nixpkgs> { overlays = [ (import ./overlay.nix) ]; };
hx = import ./default.nix { inherit pkgs; }; hx = import ./default.nix { inherit pkgs; };
jobs = hx // { 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_ecp5 = import ./examples/helloworld_ecp5.nix { inherit pkgs hx; };
helloworld_kintex7 = import ./examples/helloworld_kintex7.nix { inherit pkgs hx; }; helloworld_kintex7 = import ./examples/helloworld_kintex7.nix { inherit pkgs hx; };