Support airgapped bitstream/DV flow

Allow using an archive path for some cores to build bitstream targets in an
air-gapped environment. The files of the cores are expected to be built
offline

To enable the config for bitstream, run

bazel build --config=airgapped_env <bitstream target>

For DV, add airgapped cores-root path allowing fusesoc to find the
chisel-built cores.

Test: bazel cquery "deps(//hw/bitstream/vivado:fpga_nexus)"
[--//rules:build_env='airgapped'] and check
dependencies

Change-Id: I6ca0d9a3d501f065d173437a084cad34bbd0f0bb
diff --git a/.bazelrc b/.bazelrc
index 43d1234..a4341dc 100644
--- a/.bazelrc
+++ b/.bazelrc
@@ -28,6 +28,9 @@
 build:kelvin --platforms=//platforms/riscv32:kelvin
 build:sparrow --platforms=@matcha//platforms/riscv32:sparrow
 
+# Support airgapped build environment
+build:airgapped_env --//rules:build_env='airgapped'
+
 # Shared configuration for clang's source-based coverage instrumentation.
 # Bazel seems to support this only partially, thus we have to perform some
 # additional processing. See
diff --git a/BUILD.bazel b/BUILD.bazel
index 0f0a46b..b131709 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -11,13 +11,20 @@
         # Add a file from each directory and let fusesoc to pick the directory.
         "@lowrisc_opentitan//hw/dv:BUILD",
         "@lowrisc_opentitan//hw/ip:BUILD",
-        "@kelvin_hw//hdl/chisel:kelvin.core",
-        "//hw/top_matcha/ip/dma/chisel:fastvdma.core",
         "@lowrisc_opentitan//hw/lint:BUILD",
         "@lowrisc_opentitan//hw/vendor:BUILD",
         # Place the following file to make compilation works
         "//hw:check_tool_requirements.core",
         "@axi2sramcrs//:BUILD",
         "@isp_yocto//:BUILD",
-    ],
+    ] + select({
+        "//rules:airgapped_env": [
+            "@fastvdma_core//:fastvdma.core",
+            "@kelvin_core//:kelvin.core",
+        ],
+        "//conditions:default": [
+            "//hw/top_matcha/ip/dma/chisel:fastvdma.core",
+            "@kelvin_hw//hdl/chisel:kelvin.core",
+        ],
+    }),
 )
diff --git a/WORKSPACE b/WORKSPACE
index e805e27..84eff09 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -38,6 +38,35 @@
     path = "../../out/kelvin/sw/bazel_out",
 )
 
+# Used by airgapped environment
+new_local_repository(
+    name = "kelvin_core",
+    build_file_content = """
+exports_files(glob(["**"]))
+
+filegroup(
+    name = "all_files",
+    srcs = glob(["*.*"]),
+    visibility = ["//visibility:public"],
+)
+    """,
+    path = "../../out/kelvin/hw/kelvin_core",
+)
+
+# Used by airgapped environment
+new_local_repository(
+    name = "fastvdma_core",
+    build_file_content = """
+exports_files(glob(["**"]))
+filegroup(
+    name = "all_files",
+    srcs = glob(["*.*"]),
+    visibility = ["//visibility:public"],
+)
+    """,
+    path = "../../out/matcha/hw/fastvdma_core",
+)
+
 # CRT is the Compiler Repository Toolkit.  It contains the configuration for
 # the windows compiler.
 load("@lowrisc_opentitan//third_party/crt:repos.bzl", "crt_repos")
diff --git a/hw/BUILD b/hw/BUILD
index e763510..ec4c0d3 100644
--- a/hw/BUILD
+++ b/hw/BUILD
@@ -3,8 +3,8 @@
 # Licensed under the Apache License, Version 2.0, see LICENSE for details.
 # SPDX-License-Identifier: Apache-2.0
 
-load("@lowrisc_opentitan//rules:fusesoc.bzl", "fusesoc_build")
 load("@bazel_skylib//rules:common_settings.bzl", "string_list_flag")
+load("@lowrisc_opentitan//rules:fusesoc.bzl", "fusesoc_build")
 
 package(default_visibility = ["//visibility:public"])
 
@@ -82,8 +82,15 @@
     name = "all_files",
     srcs = glob(["**"]) + [
         "//hw/top_matcha:all_files",
-        "@kelvin_hw//hdl/chisel:matcha_kelvin_verilog",
-        "@kelvin_hw//hdl/chisel:kelvin.core",
         "@lowrisc_opentitan//hw/dv:all_files",
-    ],
+    ] + select({
+        "//rules:airgapped_env": [
+            "@fastvdma_core//:all_files",
+            "@kelvin_core//:all_files",
+        ],
+        "//conditions:default": [
+            "//hw/top_matcha/ip/dma/chisel:fastvdma_core",
+            "@kelvin_hw//hdl/chisel:kelvin_core",
+        ],
+    }),
 )
diff --git a/hw/dv/tools/dvsim/fusesoc.hjson b/hw/dv/tools/dvsim/fusesoc.hjson
index 522e5a6..3337b7a 100644
--- a/hw/dv/tools/dvsim/fusesoc.hjson
+++ b/hw/dv/tools/dvsim/fusesoc.hjson
@@ -14,6 +14,8 @@
   fusesoc_cores_root_dirs: ["--cores-root {titan_root}/hw/ip",
           "--cores-root {proj_root}/bazel-bin/external/kelvin_hw/hdl/chisel",
           "--cores-root {proj_root}/bazel-bin/hw/top_matcha/ip/dma/chisel",
+          "--cores-root {proj_root}/../../out/kelvin/hw/kelvin_core",
+          "--cores-root {proj_root}/../../out/matcha/hw/fastvdma_core",
           "--cores-root {titan_root}/hw/dv/sv",
           "--cores-root {titan_root}/hw/dv/verilator",
           "--cores-root {titan_root}/hw/formal",
diff --git a/rules/BUILD b/rules/BUILD
index d21803e..a10bb72 100644
--- a/rules/BUILD
+++ b/rules/BUILD
@@ -2,8 +2,9 @@
 # Licensed under the Apache License, Version 2.0, see LICENSE for details.
 # SPDX-License-Identifier: Apache-2.0
 
-load("//rules:matcha.bzl", "OPENTITAN_PLATFORM")
 load("@bazel_skylib//lib:selects.bzl", "selects")
+load("@bazel_skylib//rules:common_settings.bzl", "string_flag")
+load("//rules:matcha.bzl", "OPENTITAN_PLATFORM")
 
 package(default_visibility = ["//visibility:public"])
 
@@ -24,5 +25,20 @@
 
 selects.config_setting_group(
     name = "sparrow_platform",
-    match_any = [":sparrow_platform_internal", ":sparrow_platform_external"],
+    match_any = [
+        ":sparrow_platform_internal",
+        ":sparrow_platform_external",
+    ],
+)
+
+string_flag(
+    name = "build_env",
+    build_setting_default = "",
+)
+
+config_setting(
+    name = "airgapped_env",
+    flag_values = {
+        ":build_env": "airgapped",
+    },
 )