{ stdenv , fetchFromGitHub , fetchgit , lib , autoconf , automake , bison , blas , flex , fftw , gfortran , lapack , libtool_2 , mpi , suitesparse , trilinos , withMPI ? false # for doc , texliveMedium , pandoc , enableDocs ? true # for tests , bash , bc , openssh # required by MPI , perl , perlPackages , python3 , enableTests ? true }: assert withMPI -> trilinos.withMPI; let version = "7.8.0"; # useing fetchurl or fetchFromGitHub doesn't include the manuals # due to .gitattributes files xyce_src = fetchgit { url = "https://github.com/Xyce/Xyce.git"; rev = "Release-${version}"; sha256 = "sha256-+aNy2bGuFQ517FZUvU0YqN0gmChRpVuFEmFGTCx9AgY="; }; regression_src = fetchFromGitHub { owner = "Xyce"; repo = "Xyce_Regression"; rev = "Release-${version}"; sha256 = "sha256-Fxi/NpXXIw/bseWaLi2iQ4sg4S9Z+othGgSvQoxyJ9c="; }; in stdenv.mkDerivation rec { pname = "xyce"; inherit version; srcs = [ xyce_src regression_src ]; sourceRoot = xyce_src.name; preConfigure = "./bootstrap"; configureFlags = [ "CXXFLAGS=-O3" "--enable-xyce-shareable" "--enable-shared" "--enable-stokhos" "--enable-amesos2" ] ++ lib.optionals withMPI [ "--enable-mpi" "CXX=mpicxx" "CC=mpicc" "F77=mpif77" ]; enableParallelBuilding = true; nativeBuildInputs = [ autoconf automake gfortran libtool_2 ] ++ lib.optionals enableDocs [ (texliveMedium.withPackages (ps: with ps; [ enumitem koma-script optional framed enumitem multirow newtx preprint ])) ]; buildInputs = [ bison blas flex fftw lapack suitesparse trilinos ] ++ lib.optionals withMPI [ mpi ]; doCheck = enableTests; postPatch = '' pushd ../${regression_src.name} find Netlists -type f -regex ".*\.sh\|.*\.pl" -exec chmod ugo+x {} \; # some tests generate new files, some overwrite netlists find . -type d -exec chmod u+w {} \; find . -type f -name "*.cir" -exec chmod u+w {} \; patchShebangs Netlists/ TestScripts/ # patch script generating functions sed -i -E 's|/usr/bin/env perl|${lib.escapeRegex perl.outPath}/bin/perl|' \ TestScripts/XyceRegression/Testing/Netlists/RunOptions/runOptions.cir.sh sed -i -E 's|/bin/sh|${lib.escapeRegex bash.outPath}/bin/sh|' \ TestScripts/XyceRegression/Testing/Netlists/RunOptions/runOptions.cir.sh popd ''; nativeCheckInputs = [ bc perl (python3.withPackages (ps: with ps; [ numpy scipy ])) ] ++ lib.optionals withMPI [ mpi openssh ]; checkPhase = '' XYCE_BINARY="$(pwd)/src/Xyce" EXECSTRING="${lib.optionalString withMPI "mpirun -np 2 "}$XYCE_BINARY" TEST_ROOT="$(pwd)/../${regression_src.name}" # Honor the TMP variable sed -i -E 's|/tmp|\$TMP|' $TEST_ROOT/TestScripts/suggestXyceTagList.sh EXLUDE_TESTS_FILE=$TMP/exclude_tests.$$ # Gold standard has additional ":R" suffix in result column label echo "Output/HB/hb-step-tecplot.cir" >> $EXLUDE_TESTS_FILE # This test makes Xyce access /sys/class/net when run with MPI ${lib.optionalString withMPI "echo \"CommandLine/command_line.cir\" >> $EXLUDE_TESTS_FILE"} $TEST_ROOT/TestScripts/run_xyce_regression \ --output="$(pwd)/Xyce_Test" \ --xyce_test="''${TEST_ROOT}" \ --taglist="$($TEST_ROOT/TestScripts/suggestXyceTagList.sh "$XYCE_BINARY" | sed -E -e 's/TAGLIST=([^ ]+).*/\1/' -e '2,$d')" \ --resultfile="$(pwd)/test_results" \ --excludelist="$EXLUDE_TESTS_FILE" \ "''${EXECSTRING}" ''; outputs = [ "out" "doc" ]; postInstall = lib.optionalString enableDocs '' local docFiles=("doc/Users_Guide/Xyce_UG" "doc/Reference_Guide/Xyce_RG" "doc/Release_Notes/Release_Notes_${lib.versions.majorMinor version}/Release_Notes_${lib.versions.majorMinor version}") # SANDIA LaTeX class and some organization logos are not publicly available see # https://groups.google.com/g/xyce-users/c/MxeViRo8CT4/m/ppCY7ePLEAAJ for img in "snllineblubrd" "snllineblk" "DOEbwlogo" "NNSA_logo"; do sed -i -E "s/\\includegraphics\[height=(0.[1-9]in)\]\{$img\}/\\mbox\{\\rule\{0mm\}\{\1\}\}/" ''${docFiles[2]}.tex done install -d $doc/share/doc/${pname}-${version}/ for d in ''${docFiles[@]}; do # Use a public document class sed -i -E 's/\\documentclass\[11pt,report\]\{SANDreport\}/\\documentclass\[11pt,letterpaper\]\{scrreprt\}/' $d.tex sed -i -E 's/\\usepackage\[sand\]\{optional\}/\\usepackage\[report\]\{optional\}/' $d.tex pushd $(dirname $d) make install -t $doc/share/doc/${pname}-${version}/ $(basename $d.pdf) popd done ''; meta = with lib; { broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin; description = "High-performance analog circuit simulator"; longDescription = '' Xyce is a SPICE-compatible, high-performance analog circuit simulator, capable of solving extremely large circuit problems by supporting large-scale parallel computing platforms. ''; homepage = "https://xyce.sandia.gov"; license = licenses.gpl3; maintainers = with maintainers; [ fbeffa ]; platforms = platforms.all; }; }