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

# Autogen AES DIF library
sw_lib_dif_autogen_aes = declare_dependency(
  link_with: static_library(
    'sw_lib_dif_autogen_aes',
    sources: [
      hw_ip_aes_reg_h,
      'dif_aes_autogen.c',
    ],
    dependencies: [
      sw_lib_mmio,
    ],
  )
)

# Autogen Alert Handler DIF library
sw_lib_dif_autogen_alert_handler = declare_dependency(
  link_with: static_library(
    'sw_lib_dif_autogen_alert_handler',
    sources: [
      hw_ip_alert_handler_reg_h,
      'dif_alert_handler_autogen.c',
    ],
    dependencies: [
      sw_lib_mmio,
    ],
  )
)

# Autogen Clock Manager DIF library
sw_lib_dif_autogen_clkmgr = declare_dependency(
  link_with: static_library(
    'sw_lib_dif_autogen_clkmgr',
    sources: [
      hw_ip_clkmgr_reg_h,
      'dif_clkmgr_autogen.c',
    ],
    dependencies: [
      sw_lib_mmio,
    ],
  )
)

# Autogen CSRNG DIF library
sw_lib_dif_autogen_csrng = declare_dependency(
  link_with: static_library(
    'sw_lib_dif_autogen_csrng',
    sources: [
      hw_ip_csrng_reg_h,
      'dif_csrng_autogen.c',
    ],
    dependencies: [
      sw_lib_mmio,
    ],
  )
)

# Autogen EDN DIF library
sw_lib_dif_autogen_edn = declare_dependency(
  link_with: static_library(
    'sw_lib_dif_autogen_edn',
    sources: [
      hw_ip_edn_reg_h,
      'dif_edn_autogen.c',
    ],
    dependencies: [
      sw_lib_mmio,
    ],
  )
)

# Autogen Entropy Source DIF library
sw_lib_dif_autogen_entropy_src = declare_dependency(
  link_with: static_library(
    'sw_lib_dif_autogen_entropy_src',
    sources: [
      hw_ip_entropy_src_reg_h,
      'dif_entropy_src_autogen.c',
    ],
    dependencies: [
      sw_lib_mmio,
    ],
  )
)

# Autogen GPIO DIF library
sw_lib_dif_autogen_gpio = declare_dependency(
  link_with: static_library(
    'sw_lib_dif_autogen_gpio',
    sources: [
      hw_ip_gpio_reg_h,
      'dif_gpio_autogen.c',
    ],
    dependencies: [
      sw_lib_mmio,
    ],
  )
)

# Autogen HMAC DIF library
sw_lib_dif_autogen_hmac = declare_dependency(
  link_with: static_library(
    'sw_lib_dif_autogen_hmac',
    sources: [
      hw_ip_hmac_reg_h,
      'dif_hmac_autogen.c',
    ],
    dependencies: [
      sw_lib_mmio,
    ],
  )
)

# Autogen I2C DIF library
sw_lib_dif_autogen_i2c = declare_dependency(
  link_with: static_library(
    'sw_lib_dif_autogen_i2c',
    sources: [
      hw_ip_i2c_reg_h,
      'dif_i2c_autogen.c',
    ],
    dependencies: [
      sw_lib_mmio,
    ],
  )
)

# Autogen Key Manager DIF library
sw_lib_dif_autogen_keymgr = declare_dependency(
  link_with: static_library(
    'sw_lib_dif_autogen_keymgr',
    sources: [
      hw_ip_keymgr_reg_h,
      'dif_keymgr_autogen.c',
    ],
    dependencies: [
      sw_lib_mmio,
    ],
  )
)

# Autogen KMAC DIF library
sw_lib_dif_autogen_kmac = declare_dependency(
  link_with: static_library(
    'sw_lib_dif_autogen_kmac',
    sources: [
      hw_ip_kmac_reg_h,
      'dif_kmac_autogen.c',
    ],
    dependencies: [
      sw_lib_mmio,
    ],
  )
)

# Autogen Lifecycle Controller DIF library
sw_lib_dif_autogen_lc_ctrl = declare_dependency(
  link_with: static_library(
    'sw_lib_dif_autogen_lc_ctrl',
    sources: [
      hw_ip_lc_ctrl_reg_h,
      'dif_lc_ctrl_autogen.c',
    ],
    dependencies: [
      sw_lib_mmio,
    ],
  )
)

# Autogen OTBN DIF library
sw_lib_dif_autogen_otbn = declare_dependency(
  link_with: static_library(
    'sw_lib_dif_autogen_otbn',
    sources: [
      hw_ip_otbn_reg_h,
      'dif_otbn_autogen.c',
    ],
    dependencies: [
      sw_lib_mmio,
    ],
  )
)

# Autogen OTP Controller DIF library
sw_lib_dif_autogen_otp_ctrl = declare_dependency(
  link_with: static_library(
    'sw_lib_dif_autogen_otp_ctrl',
    sources: [
      hw_ip_otp_ctrl_reg_h,
      'dif_otp_ctrl_autogen.c',
    ],
    dependencies: [
      sw_lib_mmio,
    ],
  )
)

# Autogen Pin Multiplexer DIF library
sw_lib_dif_autogen_pinmux = declare_dependency(
  link_with: static_library(
    'sw_lib_dif_autogen_pinmux',
    sources: [
      hw_top_earlgrey_pinmux_reg_h,
      'dif_pinmux_autogen.c',
    ],
    dependencies: [
      sw_lib_mmio,
    ],
  )
)

# Autogen Power Manager DIF library
sw_lib_dif_autogen_pwrmgr = declare_dependency(
  link_with: static_library(
    'sw_lib_dif_autogen_pwrmgr',
    sources: [
      hw_ip_pwrmgr_reg_h,
      'dif_pwrmgr_autogen.c',
    ],
    dependencies: [
      sw_lib_mmio,
    ],
  )
)

# Autogen Reset Manager DIF library
sw_lib_dif_autogen_rstmgr = declare_dependency(
  link_with: static_library(
    'sw_lib_dif_autogen_rstmgr',
    sources: [
      hw_ip_rstmgr_reg_h,
      'dif_rstmgr_autogen.c',
    ],
    dependencies: [
      sw_lib_mmio,
    ],
  )
)

# Autogen UART DIF library
sw_lib_dif_autogen_uart = declare_dependency(
  link_with: static_library(
    'sw_lib_dif_autogen_uart',
    sources: [
      hw_ip_uart_reg_h,
      'dif_uart_autogen.c',
    ],
    dependencies: [
      sw_lib_mmio,
    ],
  )
)

# Autogen SRAM Controller DIF library
sw_lib_dif_autogen_sram_ctrl = declare_dependency(
  link_with: static_library(
    'sw_lib_dif_autogen_sram_ctrl',
    sources: [
      hw_ip_sram_ctrl_reg_h,
      'dif_sram_ctrl_autogen.c',
    ],
    dependencies: [
      sw_lib_mmio,
    ],
  )
)
