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

# Keep sorted.
anytree # dependency of sw/host/vendor/google_verible_verilog_syntax_py
enlighten
flake8
git-fame
gitpython
hjson
ipyxact >= 0.2.4
isort
libcst
livereload
mako
meson >= 0.56.2, <= 0.57.2 # minimum matches version in meson.build
mistletoe>=0.7.2
mypy
# 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
pycryptodome >= 3.11.0
pydriller
pyelftools
pyftdi
pyserial
pygments
pytest
pytest-timeout
pyyaml
tabulate
termcolor
yapf

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

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

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

# 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
