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

# dedicated reset drivers / muxes
waive -rules RESET_DRIVER -location {top_earlgrey.sv} -msg {sys_rst_n' is driven here, and used as an asynchronous reset 'rst_ni'} \
      -comment "This is dedicated reset infrastructure, and hence permissible"
waive -rules RESET_DRIVER -location {top_earlgrey.sv} -msg {'spi_device_rst_n' is driven here, and used as an asynchronous reset 'rst_ni' at spi_device} \
      -comment "This is dedicated reset infrastructure, and hence permissible"
waive -rules RESET_DRIVER -location {top_earlgrey.sv} -msg {'spi_device_rst_n' driven in module 'top_earlgrey' by 'sys_rst_n' at top_earlgrey} \
      -comment "This is dedicated reset infrastructure, and hence permissible"
waive -rules RESET_DRIVER -location {top_earlgrey.sv} -msg {'sys_rst_n' driven in module 'top_earlgrey' at top_earlgrey} \
      -comment "This is dedicated reset infrastructure, and hence permissible"
waive -rules RESET_MUX -location {top_earlgrey.sv} -msg {Asynchronous reset 'sys_rst_n' is driven by a multiplexer here, used as a reset 'rst_ni' at rv_core_ibex} \
      -comment "This is dedicated reset infrastructure, and hence permissible"

## xbar
#waive -rules HIER_NET_NOT_READ -location {tlul_xbar.sv} -regexp {a_source.* is not read from} \
#      -comment "upper bits of a_source are shifted off when going through M:1 sockets"
#waive -rules LINE_LENGTH -location {xbar_main.sv} -regexp {Line length of .* exceeds 100 character limit} \
#      -comment "This is a generated file and it is hence permissible to have line lengths that exceed this limit"
