# 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
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

# Used by OTBN simulator
riscv-model == 0.6.5

# 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
