# 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
pluralizer
pycryptodome >= 3.11.0
pyelftools
pytest
pytest-timeout
pyyaml
rich
tabulate
typer

# 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

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

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

# Development version of minimal ChipWhisperer toolchain with latest features
# and bug fixes. We fix the version for improved stability and manually update
# if necessary.
git+https://github.com/newaetech/chipwhisperer-minimal.git@2643131b71e528791446ee1bab7359120288f4ab#egg=chipwhisperer
