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

# clear previous settings
clear -all

#-------------------------------------------------------------------------
# read design, specify clock and reset
#-------------------------------------------------------------------------
analyze -sv09 \
  -f formal_0.scr \
  [glob ../../../../ip/*/dv/*_bind.sv] \
  [glob ../../../../ip/*/dv/tb/*_bind.sv] \
  +define+ASIC_SYNTHESIS \
  +define+SYNTHESIS

elaborate -top $env(FPV_TOP)

# select primary clock and reset condition (use ! for active-low reset)
if {$env(FPV_TOP) == "usb_fs_nb_pe"} {
  clock clk_48mhz_i -both_edges
  reset -expr {!rst_ni}
} elseif {$env(FPV_TOP) == "xbar_main"} {
  clock clk_main_i -both_edges
  reset -expr {!rst_main_ni}
} else {
  clock clk_i -both_edges
  reset -expr {!rst_ni}
}
# TODO: define additional clocks here for modules with multiple clocks
# (such as cio_sck_i for spi_device module)

#-------------------------------------------------------------------------
# assume properties for inputs
#-------------------------------------------------------------------------

# For generated *_reg_top modules, below assertion solely depends on
# module inputs a_valid and a_user.parity_en, and therefore is
# assumed to be correct
assume -from_assert -remove_original -regexp {^\w*\.u_reg\.reqParity}

# For all TL-UL host-interfaces (i.e. ports interfacing a host), A-channel is
# an input, so inputs a_opcode, a_param, etc. are constrained by below assuames.
# Note that all tlul_assert checkers for host interfaces are called tlul_assert_host*
assume -from_assert -remove_original -regexp {^\w*\.tlul_assert_host\w*\.legalAOpcode}
assume -from_assert -remove_original -regexp {^\w*\.tlul_assert_host\w*\.legalAParam}
assume -from_assert -remove_original -regexp {^\w*\.tlul_assert_host\w*\.sizeMatchesMask}
assume -from_assert -remove_original -regexp {^\w*\.tlul_assert_host\w*\.onlyOnePendingReqPerSourceID}
assume -from_assert -remove_original -regexp {^\w*\.tlul_assert_host\w*\.addressAlignedToSize}
assume -from_assert -remove_original -regexp {^\w*\.tlul_assert_host\w*\.maskMustBeContiguous}

# For all TL-UL device-interfaces (i.e. ports interfacing a device), D-channel is an
# input, so inputs d_* are constrained by below assumes
assume -from_assert -remove_original -regexp {^\w*\.tlul_assert_device\w*\.checkResponseOpcode}
assume -from_assert -remove_original -regexp {^\w*\.tlul_assert_device\w*\.legalDParam}
assume -from_assert -remove_original -regexp {^\w*\.tlul_assert_device\w*\.responseSizeMustEqualReqSize}
assume -from_assert -remove_original -regexp {^\w*\.tlul_assert_device\w*\.responseMustHaveReq}

# Notes on above regular expressions: ^ indicates the beginning of the string;
# \w* includes all letters a-z, A-Z, and the underscore, but not the period.
# And \. is for period (with escape). These regular expressions make sure that
# the assume only applies to module_name.tlul_assert_*, but not to
# module_name.submodule.tlul_assert_*

# For sram2tlul, input tl_i.a_ready is constrained by below asssertion
if {$env(FPV_TOP) == "sram2tlul"} {
  assume -from_assert -remove_original {sram2tlul.validNotReady}
}

# TODO: remove below assert disable lines
# To reduce prohibitive runtimes, below assertions are simply turned off for now
assert -disable {spi_device.u_tlul2sram.*}
assert -disable {spi_device*.responseMustHaveReq}
assert -disable {spi_device*.checkResponseOpcode}
assert -disable {spi_device.u_reg.u_socket.tlul_assert_device.responseSize*}
assert -disable {spi_device.u_reg.u_socket.tlul_assert_device.onlyOnePendingReq*}
assert -disable {hmac.u_tlul_adapter.*}
assert -disable {hmac.tlul_assert_host.response*Must*}
assert -disable {hmac.tlul_assert_host.checkResponseOpcode*}
assert -disable {hmac.u_reg.u_socket.tlul_assert_*.response*Must*}
assert -disable {hmac.u_reg.u_socket.tlul_assert_*.*ResponseOpcode}
assert -disable {hmac.u_reg.u_socket.tlul_assert_*.onlyOnePendingReq*}
assert -disable {flash_ctrl.tlul_assert_host.responseMustHave*}
assert -disable {flash_ctrl.u_reg.u_socket.tlul_assert_*.response*Must*}
assert -disable {flash_ctrl.u_reg.u_socket.tlul_assert_device.onlyOnePendingReq*}
assert -disable {xbar_main.tlul_assert_device_*}
assert -disable {xbar_main.tlul_assert_host_*.legal*}
assert -disable {xbar_main.u_s*}
assert -disable {top_earlgrey.u_xbar_main.*}
assert -disable {top_earlgrey.*tl_adapter_*}
assert -disable {top_earlgrey.*tlul_assert_*}
assert -disable {top_earlgrey.*.u_reg.reqParity}
assert -disable {top_earlgrey.hmac.u_tlul_adapter.*}
assert -disable {top_earlgrey.spi_devicore.u_core.load_store_unit_i.*}
assert -disable {top_earlgrey.core.u_core.load_store_unit_i.*}
assert -disable {top_earlgrey.uart.uart_core.u_uart_rxfifo.depthShall*}

#-------------------------------------------------------------------------
# prove all assertions & covers, report
#-------------------------------------------------------------------------
set_proofgrid_per_engine_max_local_jobs 8
prove -all
report

exit
