# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

# Keep sorted.
hjson
libcst
mako
pycryptodome >= 3.11.0
pyelftools
pytest
pytest-timeout
pyyaml
tabulate

# Dependencies: dv_sim
enlighten
mistletoe >= 0.7.2
# Premailer 3.9.0 broke the API by introducing an allow_loading_external_files
# argument that is now mandatory, but didn't exist in previous versions.
# To relax the constraint we either need to do a runtime detection, or switch all
# users to a newer version.
premailer < 3.9.0

# Dependencies: check_dif_statuses.py
pydriller
termcolor

# Linters
flake8
isort
mypy
yapf

# Type stubs for mypy checking.
# types-dataclasses is only needed for Python <= 3.6.
types-dataclasses
types-pkg_resources
types-pyyaml
types-tabulate

# Dependency of sw/host/vendor/google_verible_verilog_syntax_py
anytree

# To be removed with Meson.
# Minimum matches version in meson.build
meson >= 0.56.2, <= 0.57.2 

# Development version with OT-specific changes
git+https://github.com/lowRISC/fusesoc.git@ot-0.2

# Development version with OT-specific changes
git+https://github.com/lowRISC/edalize.git@ot-0.2

# Development version of ChipWhisperer toolchain
# Use a development version until support for the CW310 board works in a
# released version.
# Prefer the archive download over a git clone to decrease installation time
# (The chipwhisperer repository is rather large and uses additionally uses
# submodules, which need to be fetched as well.)
https://github.com/newaetech/chipwhisperer/archive/9b6825b495f14f85aae8b11007c63c59a1654584.tar.gz
