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

analyze +define+ASIC_SYNTHESIS+SYNTHESIS -F [glob build/formal_0/sim-icarus/*.scr] -sv

elaborate $env(LINT_TOP)

analyze_intent
verify_cdc

report_policy ALL -all_runs -verbose -output cdc.rpt

exit
