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

waive -rules HIER_NET_NOT_READ -location {i2s.sv} -regexp {[nN]et.*a_(address|param|user).*not read from} \
      -comment "several TLUL signals are not used by register file"
waive -rules HIER_NET_NOT_READ -location {i2s.sv} -regexp {[nN]et 'reg2hw.rdata.q' .* is not read from} \
      -comment "don't need this data, only marking hwaccess as 'hrw' in order to get the .re signal"
waive -rules INPUT_NOT_READ    -location {i2s_core.sv} -regexp {Input port 'reg2hw.rdata.q' is not read from} \
      -comment "don't need this data, only marking hwaccess as 'hrw' in order to get the .re signal"
waive -rules HIER_NET_NOT_READ -location {i2s.sv} -regexp {[nN]et 'reg2hw.status.*q' .* is not read from} \
      -comment "don't need this data, only marking hwaccess as 'hrw' in order to get the .re signal"
waive -rules INPUT_NOT_READ    -location {i2s_core.sv} -regexp {Input port 'reg2hw.status.*' is not read from} \
      -comment "don't need this data, only marking hwaccess as 'hrw' in order to get the .re signal"
waive -rules HIER_NET_NOT_READ -location {i2s.sv} -regexp {[nN]et 'reg2hw.status.*re' .* is not read from} \
      -comment "registers with multiple fields often have unused re's since they are duplicative"
waive -rules HIER_NET_NOT_READ -location {i2s.sv} -regexp {Net 'reg2hw.*.qe.* is not read from} \
      -comment "registers with multiple fields often have unused qe's since they are duplicative"
waive -rules NOT_READ          -location {i2s.sv} -regexp {Signal 'reg2hw.*.qe' is not read from} \
      -comment "registers with multiple fields often have unused qe's since they are duplicative"
waive -rules INPUT_NOT_READ    -location {i2s_core.sv} -regexp {Input port 'reg2hw.*.qe' is not read from} \
      -comment "registers with multiple fields often have unused qe's since they are duplicative"
waive -rules CONST_OUTPUT      -location {i2s.sv} -regexp {Output 'cio_tx_en_o' is driven by constant one} \
      -comment "required output, always true"
waive -rules CONST_OUTPUT      -location {i2s_core.sv} -regexp {Output 'hw2reg.fifo_ctrl.*.(d|de)' is driven by constant} \
      -comment "need .d/.de for some fields, not for others"

# async resets
waive -rules RESET_DRIVER -location {i2s_core.sv} -regexp {'(tx|rx)_fifo_rst_n' is driven here, and used as an asynchronous reset} \
      -comment "Async reset generation is required here"
waive -rules RESET_MUX    -location {i2s_core.sv} -regexp {Asynchronous reset '(tx|rx)_fifo_rst_n' is driven by a multiplexer} \
      -comment "The MUX is needed to control the reset during scanmode (scanmode_i == 1)"

waive -rules UNREACHABLE -location {i2s_core.sv} -msg {'break_st_q' is assigned to a non-x value within the default branch of a fully specified case statement} \
      -comment "This is fine, lint tool doesn't seem to recognize the if-statements in the case-items."
