fox32-hw/flake.nix
2024-01-10 22:10:01 +01:00

69 lines
2.0 KiB
Nix

{
description = "ice40 testing";
inputs = {
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (sys:
let pkgs = nixpkgs.legacyPackages.${sys};
verilator = import ./verilator.nix pkgs ;
rot-sim = pkgs.runCommandCC "rot-sim" {} ''
cp "${./rot.v}" rot.v
${verilator}/bin/verilator --cc -O3 --exe --build --trace ${./sim_main.cpp} rot.v
mv obj_dir "$out"
'';
rot-trace = pkgs.runCommand "rot-trace" {} ''
mkdir "$out"
${rot-sim}/Vrot $out/trace.vcd
'';
rot-trace-view = pkgs.writeScriptBin "rot-view" ''
${pkgs.gtkwave}/bin/gtkwave ${rot-trace}/trace.vcd
'';
rot-synth = pkgs.runCommand "rot-synth" {} ''
mkdir "$out"
${pkgs.yosys}/bin/yosys -p "read -vlog95 ${./rot.v} ; synth_ice40 -json $out/synth.json"
'';
rot-route = pkgs.runCommand "rot-route" {} ''
mkdir "$out"
${pkgs.nextpnr}/bin/nextpnr-ice40 --pcf ${./rot.pcf} --json ${rot-synth}/synth.json --asc $out/routed.asc --up5k --top rot --freq 12
'';
rot-pack = pkgs.runCommand "rot-pack" {} ''
mkdir "$out"
${pkgs.icestorm}/bin/icepack ${rot-route}/routed.asc $out/packed.bin
'';
rot-upload = pkgs.writeScriptBin "rot-upload" ''
${pkgs.icestorm}/bin/iceprog ${rot-pack}/packed.bin
'';
deps = with pkgs; [
yosys nextpnrWithGui icestorm verilator
];
in rec {
packages.verilator = verilator;
packages.rot-sim = rot-sim;
packages.rot-trace = rot-trace;
packages.rot-trace-view = rot-trace-view;
packages.rot-synth = rot-synth;
packages.rot-route = rot-route;
packages.rot-pack = rot-pack;
packages.rot-upload = rot-upload;
devShells.default = pkgs.mkShell {
packages = deps;
};
}
);
}