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

# Keep sorted.
flake8
gitpython
hjson
ipyxact >= 0.2.4
isort
libcst
livereload
mako
meson >= 0.53.0, <= 0.54 # minimum matches version in meson.build
mistletoe>=0.7.2
premailer
pycryptodome
pyelftools
pyftdi
pyserial
pygments
pytest
pytest-timeout
pyyaml
tabulate
yapf

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

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