# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
#
# waiver file for aes
waive -rules COMBO_READ_WRITE -location {aes_key_expand.sv} -regexp {'regular\[[0-9]+:?[0-9]*\]\[2:1|4:2|6:5\]' is read from within the same combinational process block} \
      -comment "regular[*] is assigned in a for loop, regular[*][1|2|5] depends on regular[*][0|1|4]"

waive -rules {CLOCK_USE} -location {aes_cipher_core.sv} -regexp {clk_i' is connected to 'aes_sub_bytes' port} \
      -comment "when using fully combinational S-Box implementations, no clock is used inside aes_sub_bytes"

waive -rules {CLOCK_USE} -location {aes_sub_bytes.sv} -regexp {clk_i' is connected to 'aes_sbox' port} \
      -comment "when using fully combinational S-Box implementations, no clock is used inside aes_sbox"

waive -rules {CLOCK_USE} -location {aes_key_expand.sv} -regexp {clk_i' is connected to 'aes_sbox' port} \
      -comment "when using fully combinational S-Box implementations, no clock is used inside aes_sbox"

waive -rules {RESET_USE} -location {aes_sub_bytes.sv} -regexp {'rst_ni' is connected to 'aes_sbox' port} \
      -comment "when using fully combinational S-Box implementations, no reset is used inside aes_sbox"

waive -rules {RESET_USE} -location {aes_key_expand.sv} -regexp {'rst_ni' is connected to 'aes_sbox' port} \
      -comment "when using fully combinational S-Box implementations, no reset is used inside aes_sbox"

waive -rules {CLOCK_USE} -location {aes_core.sv} -regexp {clk_i' is connected to 'aes_sel_buf_chk' port} \
      -comment "clock and reset are just used for assertions inside aes_sel_buf_chk"

waive -rules {CLOCK_USE} -location {aes_control.sv} -regexp {clk_i' is connected to 'aes_sel_buf_chk' port} \
      -comment "clock and reset are just used for assertions inside aes_sel_buf_chk"

waive -rules {CLOCK_USE} -location {aes_cipher_core.sv} -regexp {clk_i' is connected to 'aes_sel_buf_chk' port} \
      -comment "clock and reset are just used for assertions inside aes_sel_buf_chk"

waive -rules {CLOCK_USE} -location {aes_cipher_control.sv} -regexp {clk_i' is connected to 'aes_sel_buf_chk' port} \
      -comment "clock and reset are just used for assertions inside aes_sel_buf_chk"

waive -rules {CLOCK_USE} -location {aes_sub_bytes.sv} -regexp {clk_i' is connected to 'aes_sel_buf_chk' port} \
      -comment "clock and reset are just used for assertions inside aes_sel_buf_chk"

waive -rules {CLOCK_USE} -location {aes_key_expand.sv} -regexp {clk_i' is connected to 'aes_sel_buf_chk' port} \
      -comment "clock and reset are just used for assertions inside aes_sel_buf_chk"

waive -rules {CLOCK_USE} -location {aes_ctr.sv} -regexp {clk_i' is connected to 'aes_sel_buf_chk' port} \
      -comment "clock and reset are just used for assertions inside aes_sel_buf_chk"

waive -rules {RESET_USE} -location {aes_cipher_core.sv} -regexp {'rst_ni' is connected to 'aes_sub_bytes' port} \
      -comment "when using fully combinational S-Box implementations, no reset is used inside aes_sub_bytes"

waive -rules {RESET_USE} -location {aes_core.sv} -regexp {'rst_ni' is connected to 'aes_sel_buf_chk' port} \
      -comment "clock and reset are just used for assertions inside aes_sel_buf_chk"

waive -rules {RESET_USE} -location {aes_control.sv} -regexp {'rst_ni' is connected to 'aes_sel_buf_chk' port} \
      -comment "clock and reset are just used for assertions inside aes_sel_buf_chk"

waive -rules {RESET_USE} -location {aes_cipher_core.sv} -regexp {'rst_ni' is connected to 'aes_sel_buf_chk' port} \
      -comment "clock and reset are just used for assertions inside aes_sel_buf_chk"

waive -rules {RESET_USE} -location {aes_cipher_control.sv} -regexp {'rst_ni' is connected to 'aes_sel_buf_chk' port} \
      -comment "clock and reset are just used for assertions inside aes_sel_buf_chk"

waive -rules {RESET_USE} -location {aes_sub_bytes.sv} -regexp {'rst_ni' is connected to 'aes_sel_buf_chk' port} \
      -comment "clock and reset are just used for assertions inside aes_sel_buf_chk"

waive -rules {RESET_USE} -location {aes_key_expand.sv} -regexp {'rst_ni' is connected to 'aes_sel_buf_chk' port} \
      -comment "clock and reset are just used for assertions inside aes_sel_buf_chk"

waive -rules {RESET_USE} -location {aes_ctr.sv} -regexp {'rst_ni' is connected to 'aes_sel_buf_chk' port} \
      -comment "clock and reset are just used for assertions inside aes_sel_buf_chk"

waive -rules {ONE_BRANCH} -location {aes_sel_buf_chk.sv} -regexp {unique case statement has only one branch} \
      -comment "check for legal combinations only, assert error signal otherwise"
