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

# Keep sorted.
gitpython
hjson
ipyxact >= 0.2.4
isort
livereload
mako
# Meson 0.53.0 broke compatibility with Python 3.5.2, see
# https://github.com/lowRISC/opentitan/issues/1288 for details.
# Meson 0.54.0+ requires ninja 1.7+, which isn't available by default on
# Ubuntu 16.04.
meson >= 0.51.0, != 0.53.0, <0.54.0 # minimum matches version in meson.build
mistletoe>=0.7.2
premailer
pyelftools
pyftdi
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
