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

waive -rules NOT_READ -location {pinmux_reg_top.sv} -regexp {.*reg_wdata.*} \
      -comment "Upper bits of reg_wdata are not read"

waive -rules HIER_NET_NOT_READ -location {pinmux_reg_top.sv} -regexp {.*reg_wdata.*} \
      -comment "Upper bits of reg_wdata are not read"

waive -rules VAR_INDEX_RANGE -location {pinmux.sv} -regexp {.*maximum value.*} \
      -comment "Indexed arrays may not be fully populated."

waive -rules RESET_USE -location {pinmux_strap_sampling.sv} -regexp {'rst_ni' is connected to 'prim_clock_mux2' port 'clk1_i
', and used as an asynchronous reset or set at pinmux_strap_sampling} \
      -comment "This is a clock mux for DFT."

waive -rules RESET_MUX -location {pinmux_strap_sampling.sv} -regexp {Asynchronous reset 'rst_ni' reaches a multiplexer here, used as a reset at pinmux_strap_sampling} \
      -comment "This is a clock mux for DFT."

# temporary waiver for #15602. This waiver needs to be removed once rst_sys_n is connected in pinmux_strap_sampling
waive -rules HIER_NET_NOT_READ -location {pinmux.sv} -regexp {.*'rst_sys_ni'.*is not read from.*'} \
      -comment "Temporary waiver for #15602. This waiver needs to be removed once rst_sys_n is connected in pinmux_strap_sampling"

waive -rules INPUT_NOT_READ -location {pinmux_strap_sampling.sv} -regexp {Input port 'rst_sys_ni' is not read from in module 'pinmux_strap_sampling'} \
      -comment "Temporary waiver for #15602. This waiver needs to be removed once rst_sys_n is connected in pinmux_strap_sampling"
'rst_sys_ni' is not read from in module 'pinmux_strap_sampling'
