diff --git a/var/spack/repos/builtin/packages/quda/package.py b/var/spack/repos/builtin/packages/quda/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..16f3b2716217e705d14d0bd8025bf12c24023546
--- /dev/null
+++ b/var/spack/repos/builtin/packages/quda/package.py
@@ -0,0 +1,198 @@
+# Copyright Spack Project Developers. See COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+from spack.package import *
+
+
+class Quda(CMakePackage, CudaPackage, ROCmPackage):
+    """QUDA is a library for performing calculations in lattice QCD on GPUs."""
+
+    homepage = "https://lattice.github.io/quda/"
+    url = "https://github.com/lattice/quda/archive/refs/tags/v1.1.0.tar.gz"
+    git = "https://github.com/lattice/quda.git"
+
+    tags = ["hep", "lattice"]
+
+    maintainers("chaoos")
+
+    license("MIT OR BSD-3-Clause", checked_by="chaoos")
+
+    version("develop", branch="develop")
+
+    # git describe --tags --match 'v*' 18bf43ed40c75ae276e55bb8ddf2f64aa5510c37
+    version(
+        "1.1.0-4597-g18bf43ed4", preferred=True, commit="18bf43ed40c75ae276e55bb8ddf2f64aa5510c37"
+    )
+
+    version("1.1.0", sha256="b4f635c993275010780ea09d8e593e0713a6ca1af1db6cc86c64518714fcc745")
+    version(
+        "1.0.0",
+        deprecated=True,
+        sha256="32b883bd4af45b76a832d8a070ab020306c94ff6590410cbe7c3eab3b630b938",
+    )
+    version(
+        "0.9.0",
+        deprecated=True,
+        sha256="0a9f2e028fb40e4a09f78af51702d2de4099a9bf10fb8ce350eacb2d8327e481",
+    )
+    version(
+        "0.8.0",
+        deprecated=True,
+        sha256="58d9a94b7fd38ec1f79bea7a0e9b470f0fa517cbf5fce42d5776e1c65607aeda",
+    )
+
+    # build dependencies
+    generator("ninja")
+    depends_on("cmake@3.18:", type="build")
+    depends_on("ninja", type="build")
+    depends_on("c", type="build")
+    depends_on("cxx", type="build")
+    depends_on("fortran", type="build", when="+tifr")
+    depends_on("fortran", type="build", when="+bqcd")
+
+    variant("mpi", default=False, description="Enable MPI support")
+    variant("qmp", default=False, description="Enable QMP")
+    variant("qio", default=False, description="Enable QIO")
+    variant("openqcd", default=False, description="Enable openQCD interface")
+    variant("milc", default=False, description="Enable MILC interface")
+    variant("qdp", default=False, description="Enable QDP interface")
+    variant("bqcd", default=False, description="Enable BQCD interface")
+    variant("cps", default=False, description="Enable CPS interface")
+    variant("qdpjit", default=False, description="Enable QDPJIT interface")
+    variant("tifr", default=False, description="Enable TIFR interface")
+    variant("multigrid", default=False, description="Enable multigrid")
+    variant("nvshmem", default=False, description="Enable NVSHMEM", when="+cuda")
+
+    variant("clover", default=False, description="Build clover Dirac operators")
+    variant(
+        "clover_hasenbusch", default=False, description="Build clover Hasenbusch twist operators"
+    )
+    variant("domain_wall", default=False, description="Build domain wall Dirac operators")
+    variant("laplace", default=False, description="Build laplace operator")
+    variant(
+        "ndeg_twisted_clover",
+        default=False,
+        description="Build non-degenerate twisted clover Dirac operators",
+    )
+    variant(
+        "ndeg_twisted_mass",
+        default=False,
+        description="Build non-degenerate twisted mass Dirac operators",
+    )
+    variant("staggered", default=False, description="Build staggered Dirac operators")
+    variant("twisted_clover", default=False, description="Build twisted clover Dirac operators")
+    variant("twisted_mass", default=False, description="Build twisted mass Dirac operators")
+    variant("wilson", default=True, description="Build Wilson Dirac operators")
+
+    with when("+multigrid"):
+        variant(
+            "mg_mrhs_list",
+            default=16,
+            multi=True,
+            description="The list of multi-rhs sizes that get compiled",
+        )
+        variant(
+            "mg_nvec_list",
+            default="6,24,32",
+            multi=True,
+            description="The list of null space vector sizes that get compiled",
+        )
+
+    # dependencies
+    depends_on("mpi", when="+mpi")
+    depends_on("cuda", when="+cuda")
+    depends_on("nvshmem", when="+nvshmem")
+    depends_on("gdrcopy", when="+nvshmem")
+    with when("+rocm"):
+        depends_on("hip")
+        depends_on("hipblas")
+        depends_on("hipfft")
+        depends_on("hiprand")
+        depends_on("hipcub")
+
+    conflicts("+qmp +mpi", msg="Specifying both QMP and MPI might result in undefined behavior")
+    conflicts("+cuda +rocm", msg="CUDA and ROCm support are mutually exclusive")
+    conflicts("~cuda ~rocm", msg="Either CUDA or ROCm support is required")
+    conflicts("cuda_arch=none", when="+cuda", msg="Please indicate a cuda_arch value")
+    conflicts(
+        "+nvshmem", when="~mpi ~qmp", msg="NVSHMEM requires either +mpi or +qmp to be enabled"
+    )
+
+    # CMAKE_BUILD_TYPE
+    variant(
+        "build_type",
+        default="STRICT",
+        description="The build type to build",
+        values=("STRICT", "RELEASE", "DEVEL", "DEBUG", "HOSTDEBUG", "SANITIZE"),
+    )
+
+    def cmake_args(self):
+        if self.spec.satisfies("+cuda"):
+            target = "CUDA"
+            cuda_archs = self.spec.variants["cuda_arch"].value
+            arch = " ".join(f"sm_{i}" for i in cuda_archs)
+        elif self.spec.satisfies("+rocm"):
+            target = "HIP"
+            arch = self.spec.variants["amdgpu_target"].value
+
+        args = [
+            self.define("QUDA_BUILD_ALL_TESTS", False),
+            self.define("QUDA_TARGET_TYPE", target),
+            self.define("QUDA_GPU_ARCH", arch),
+            self.define("QUDA_PRECISION", 14),
+            self.define("QUDA_RECONSTRUCT", 7),
+            self.define("QUDA_DOWNLOAD_USQCD", False),
+            self.define("QUDA_DIRAC_DEFAULT_OFF", True),
+            self.define_from_variant("QUDA_DIRAC_CLOVER", "clover"),
+            self.define_from_variant("QUDA_DIRAC_CLOVER_HASENBUSCH", "clover_hasenbusch"),
+            self.define_from_variant("QUDA_DIRAC_DOMAIN_WALL", "domain_wall"),
+            self.define_from_variant("QUDA_DIRAC_LAPLACE", "laplace"),
+            self.define_from_variant("QUDA_DIRAC_NDEG_TWISTED_CLOVER", "ndeg_twisted_clover"),
+            self.define_from_variant("QUDA_DIRAC_NDEG_TWISTED_MASS", "ndeg_twisted_mass"),
+            self.define_from_variant("QUDA_DIRAC_STAGGERED", "staggered"),
+            self.define_from_variant("QUDA_DIRAC_TWISTED_CLOVER", "twisted_clover"),
+            self.define_from_variant("QUDA_DIRAC_TWISTED_MASS", "twisted_mass"),
+            self.define_from_variant("QUDA_DIRAC_WILSON", "wilson"),
+            self.define_from_variant("QUDA_MPI", "mpi"),
+            self.define_from_variant("QUDA_QMP", "qmp"),
+            self.define_from_variant("QUDA_QIO", "qio"),
+            self.define_from_variant("QUDA_INTERFACE_OPENQCD", "openqcd"),
+            self.define_from_variant("QUDA_INTERFACE_MILC", "milc"),
+            self.define_from_variant("QUDA_INTERFACE_QDP", "qdp"),
+            self.define_from_variant("QUDA_INTERFACE_BQCD", "bqcd"),
+            self.define_from_variant("QUDA_INTERFACE_CPS", "cps"),
+            self.define_from_variant("QUDA_INTERFACE_QDPJIT", "qdpjit"),
+            self.define_from_variant("QUDA_INTERFACE_TIFR", "tifr"),
+            self.define_from_variant("QUDA_MULTIGRID", "multigrid"),
+            self.define_from_variant("QUDA_NVSHMEM", "nvshmem"),
+        ]
+        if self.spec.satisfies("+multigrid"):
+            args.append(
+                self.define(
+                    "QUDA_MULTIGRID_NVEC_LIST", ",".join(self.spec.variants["mg_nvec_list"].value)
+                )
+            )
+            args.append(
+                self.define(
+                    "QUDA_MULTIGRID_MRHS_LIST", ",".join(self.spec.variants["mg_mrhs_list"].value)
+                )
+            )
+
+        if self.spec.satisfies("+nvshmem"):
+            args.append(self.define("QUDA_NVSHMEM_HOME", self.spec["nvshmem"].prefix))
+            args.append(self.define("QUDA_GDRCOPY_HOME", self.spec["gdrcopy"].prefix))
+
+        if self.spec.satisfies("+cuda"):
+            args.append(self.define("QUDA_GPU_ARCH_SUFFIX", "real"))  # real or virtual
+        elif self.spec.satisfies("+rocm"):
+            args.append(self.define("CMAKE_C_COMPILER", self.spec["hip"].hipcc))
+            args.append(self.define("CMAKE_CXX_COMPILER", self.spec["hip"].hipcc))
+            # args.append(self.define("ROCM_PATH", self.spec["hip"].prefix))
+
+            # required when building on a machine with no AMD GPU present
+            args.append(self.define("AMDGPU_TARGETS", arch))
+
+            # suppress _GLIBCXX17_DEPRECATED warnings when compiling c++17
+            args.append(self.define("CMAKE_CXX_FLAGS", "-Wno-deprecated-declarations"))
+        return args