# Copyright 2023 Google Inc. All Rights Reserved.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

workspace(name = "matcha")

local_repository(
    name = "lowrisc_opentitan",
    path = "../opentitan-upstream",
)

# TODO(b/248356571): Replace isp with vendor.
new_local_repository(
    name = "isp",
    build_file = "third_party/vendor/BUILD",
    path = "../../hw/ip/isp",
)

new_local_repository(
    name = "kelvin-gcc",
    build_file = "third_party/kelvin-gcc/BUILD",
    path = "../../cache/toolchain_kelvin",
)

new_local_repository(
    name = "kelvin-binary",
    build_file = "third_party/kelvin-binary/BUILD",
    path = "../../out/kelvin/sw/bazel_out",
)

# CRT is the Compiler Repository Toolkit.  It contains the configuration for
# the windows compiler.
load("@lowrisc_opentitan//third_party/crt:repos.bzl", "crt_repos")

crt_repos()

load("@crt//:repos.bzl", "crt_repos")

crt_repos()

load("@crt//:deps.bzl", "crt_deps")

crt_deps()

load("@crt//config:registration.bzl", "crt_register_toolchains")

crt_register_toolchains(riscv32 = True)

load("//platforms:registration.bzl", "kelvin_register_toolchain")

kelvin_register_toolchain()

# Tools for release automation
load("@lowrisc_opentitan//third_party/github:repos.bzl", "github_tools_repos")

github_tools_repos()

# Python Toolchain + PIP Dependencies
load("@lowrisc_opentitan//third_party/python:repos.bzl", "python_repos")

python_repos()

load("@lowrisc_opentitan//third_party/python:deps.bzl", "python_deps")

python_deps()

load("@lowrisc_opentitan//third_party/python:pip.bzl", "pip_deps")

pip_deps()

# Google/Bazel dependencies.  This needs to be after Python initialization
# so that our preferred python configuration takes precedence.
load("@lowrisc_opentitan//third_party/google:repos.bzl", "google_repos")

google_repos()

load("@lowrisc_opentitan//third_party/google:deps.bzl", "google_deps")

google_deps()

# Rust Toolchain + crates.io Dependencies
load("@lowrisc_opentitan//third_party/rust:repos.bzl", "rust_repos")

rust_repos()

load("@lowrisc_opentitan//third_party/rust:deps.bzl", "rust_deps")

rust_deps()

load("@rules_rust//crate_universe:repositories.bzl", "crate_universe_dependencies")

crate_universe_dependencies(bootstrap = True)

load("@lowrisc_opentitan//third_party/rust/crates:crates.bzl", "crate_repositories")

crate_repositories()

# The nonhermetic_repo imports environment variables needed to run vivado.
load("@lowrisc_opentitan//rules:nonhermetic.bzl", "nonhermetic_repo")

nonhermetic_repo(name = "nonhermetic")

# FreeRTOS; used by the OTTF
load("@lowrisc_opentitan//third_party/freertos:repos.bzl", "freertos_repos")

freertos_repos()

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

# Binary firmware image for HyperDebug
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file")

http_file(
    name = "hyperdebug_firmware",
    sha256 = "e9c93d2935b9b6a571b547f20fe6177c48a909535d87533b7a0c64fb049bd643",
    urls = ["https://storage.googleapis.com/aoa-recovery-test-images/hyperdebug_v2.0.20491-956ccf530.bin"],
)
