diff --git a/templates/chisel/nix/gcd/vcs-wrapper.sh b/templates/chisel/nix/gcd/vcs-wrapper.sh new file mode 100755 index 0000000..4acbe91 --- /dev/null +++ b/templates/chisel/nix/gcd/vcs-wrapper.sh @@ -0,0 +1,42 @@ +#!@shell@ + +_EXTRA_ARGS="$@" + +if (( $VERBOSE )); then + set -x +fi + +_DATE_BIN=@dateBin@ +_VCS_SIM_BIN=@vcsSimBin@ +_VCS_SIM_DAIDIR=@vcsSimDaidir@ +_VCS_FHS_ENV=@vcsFhsEnv@ + +_NOW=$("$_DATE_BIN" "+%Y-%m-%d-%H-%M-%S") +_GCD_SIM_RESULT_DIR=${GCD_SIM_RESULT_DIR:-"gcd-sim-result"} +_CURRENT="$_GCD_SIM_RESULT_DIR"/all/"$_NOW" +mkdir -p "$_CURRENT" +ln -sf "all/$_NOW" "$_GCD_SIM_RESULT_DIR/result" + +cp "$_VCS_SIM_BIN" "$_CURRENT/" +cp -r "$_VCS_SIM_DAIDIR" "$_CURRENT/" + +chmod -R +w "$_CURRENT" + +pushd "$_CURRENT" >/dev/null + +_emu_name=$(basename "$_VCS_SIM_BIN") +_daidir=$(basename "$_VCS_SIM_DAIDIR") + +export LD_LIBRARY_PATH="$PWD/$_daidir:$LD_LIBRARY_PATH" + +"$_VCS_FHS_ENV" -c "./$_emu_name $_EXTRA_ARGS" &> >(tee vcs-emu-journal.log) + +if (( $DATA_ONLY )); then + rm -f "./$_emu_name" +fi + +set -e _emu_name _daidir + +popd >/dev/null + +echo "VCS emulator finished, result saved in $_GCD_SIM_RESULT_DIR/result" diff --git a/templates/chisel/nix/gcd/vcs.nix b/templates/chisel/nix/gcd/vcs.nix index fd8f986..6adae77 100644 --- a/templates/chisel/nix/gcd/vcs.nix +++ b/templates/chisel/nix/gcd/vcs.nix @@ -58,9 +58,11 @@ stdenv.mkDerivation (finalAttr: { inherit rtl; tests.simple-sim = runCommand "${binName}-test" { __noChroot = true; } '' - # Combine stderr and stdout and redirect them to tee - # So that we can have log saving to output and also printing to stdout - ${finalAttr.finalPackage}/bin/${binName} &> >(tee $out) + mkdir -p "$out" + + export _GCD_SIM_RESULT_DIR="$out" + export _DATA_ONLY=1 + ${finalAttr.finalPackage}/bin/${binName} ''; }; @@ -76,14 +78,13 @@ stdenv.mkDerivation (finalAttr: { cp ${binName} $out/lib cp -r ${binName}.daidir $out/lib - # We need to carefully handle string escape here, so don't use makeWrapper - tee $out/bin/${binName} <