Set up meson build structure for silicon_creator crypto library

Signed-off-by: Jade Philipoom <jadep@google.com>
diff --git a/sw/device/silicon_creator/lib/crypto/ecdsa-p256/meson.build b/sw/device/silicon_creator/lib/crypto/ecdsa-p256/meson.build
new file mode 100644
index 0000000..94406a3
--- /dev/null
+++ b/sw/device/silicon_creator/lib/crypto/ecdsa-p256/meson.build
@@ -0,0 +1,13 @@
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+
+sw_lib_crypto_otbn_sources += {
+  'p256': files(
+    'p256.s'
+  ),
+  'p256_ecdsa': files(
+    'p256_ecdsa.s',
+    'p256.s',
+  ),
+}
diff --git a/sw/device/silicon_creator/lib/crypto/meson.build b/sw/device/silicon_creator/lib/crypto/meson.build
new file mode 100644
index 0000000..e2ffb7c
--- /dev/null
+++ b/sw/device/silicon_creator/lib/crypto/meson.build
@@ -0,0 +1,110 @@
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+
+# Build definitions for OTBN software
+#
+# OTBN software is built with a separate toolchain, which is called as an
+# external target from Meson. All functionality to call the external toolchain
+# is encapsulated in this build file; users only need to care about two
+# dictionaries.
+#
+# To use an OTBN application in device software, use the sw_lib_crypto_otbn
+# dictionary.  For example, to add a dependency to an embeddable version of the
+# barrett384 OTBN application, add the following variable to the list of
+# dependencies: sw_lib_crypto_otbn['barrett384']['rv32embed_dependency']
+#
+# The sw_lib_crypto_otbn dictionary has the following structure:
+# sw_lib_crypto_otbn = {
+#   APPNAME: {
+#     'elf': OTBN_ELF_FILE,
+#     'rv32embed_lib': RV32_LIBRARY,
+#     'rv32embed_dependency': DEPENDENCY_ON_RV32_LIBRARY,
+# }}
+#
+# Note that application names must be unique across subdirectories.
+
+# All OTBN software is added to this dictionary and then built in one go.
+sw_lib_crypto_otbn_sources = {}
+
+# All subdirectories add the objects they want to build to the
+# sw_lib_crypto_otbn_sources dictionary.
+subdir('ecdsa-p256')
+
+prog_otbn_build = meson.source_root() / 'util/otbn_build.py'
+
+otbn_build_command = [
+  prog_env,
+  'OTBN_AS=@0@'.format(prog_otbn_as),
+  'OTBN_LD=@0@'.format(prog_otbn_ld),
+  'RV32_TOOL_OBJCOPY=@0@'.format(prog_objcopy.path()),
+  'RV32_TOOL_AS=@0@'.format(prog_as.path()),
+  'RV32_TOOL_LD=@0@'.format(prog_ld.path()),
+  prog_python,
+  prog_otbn_build,
+  '--out-dir',
+  '@OUTDIR@',
+  '@INPUT@',
+]
+otbn_build_depend_files = [
+  prog_otbn_as,
+  prog_otbn_ld,
+  prog_objcopy.path(),
+  prog_as.path(),
+  prog_ld.path(),
+  prog_otbn_build,
+]
+
+# Note on variable naming below: Variables in meson are global, we hence prefix
+# all variables with sw_lib_crypto_otbn as "our namespace". Variables which are meant to be
+# local to this file are prefixed with `sw_lib_crypto_otbn__`.
+
+sw_lib_crypto_otbn = {}
+foreach sw_lib_crypto_otbn__app_name, sw_lib_crypto_otbn__app_sources : sw_lib_crypto_otbn_sources
+  # Output files generated by the otbn_build.py script.
+  sw_lib_crypto_otbn__app_output_files = [
+    sw_lib_crypto_otbn__app_name + '.rv32embed.o',
+    sw_lib_crypto_otbn__app_name + '.elf',
+  ]
+
+  # Target calling otbn_build.py
+  sw_lib_crypto_otbn__target = custom_target(
+    'sw_lib_crypto_otbn_apps_' + sw_lib_crypto_otbn__app_name + '_target',
+    input: sw_lib_crypto_otbn__app_sources,
+    output: sw_lib_crypto_otbn__app_output_files,
+    command: otbn_build_command,
+    depend_files: [otbn_build_depend_files,],
+  )
+
+  # A library containing the OTBN application in a form embeddable into device
+  # (Ibex) software (the *.rv32embed.o file).
+  sw_lib_crypto_otbn__embedded_lib = static_library(
+    sw_lib_crypto_otbn__app_name,
+    [sw_lib_crypto_otbn__target[0]] # == sw_lib_crypto_otbn__app_output_files[0], i.e. *.rv32embed.o
+  )
+
+  # A dependency on the application as embeddable library, to be used if
+  # device (Ibex) software wants to include an OTBN application in its binary.
+  sw_lib_crypto_otbn__dependency = declare_dependency(
+    link_with: sw_lib_crypto_otbn__embedded_lib,
+  )
+
+  sw_lib_crypto_otbn += {
+    sw_lib_crypto_otbn__app_name: {
+      'elf': sw_lib_crypto_otbn__target[1],
+      'rv32embed_lib': sw_lib_crypto_otbn__embedded_lib,
+      'rv32embed_dependency': sw_lib_crypto_otbn__dependency,
+    }
+  }
+
+  custom_target(
+    'sw_lib_crypto_otbn_app_export_' + sw_lib_crypto_otbn__app_name,
+    command: export_target_command,
+    depend_files: [export_target_depend_files,],
+    input: [sw_lib_crypto_otbn__target[1]],
+    output: 'sw_lib_crypto_otbn_app_export_' + sw_lib_crypto_otbn__app_name,
+    build_always_stale: true,
+    build_by_default: true,
+  )
+
+endforeach
diff --git a/sw/device/silicon_creator/lib/meson.build b/sw/device/silicon_creator/lib/meson.build
index ce82910..f2c3c38 100644
--- a/sw/device/silicon_creator/lib/meson.build
+++ b/sw/device/silicon_creator/lib/meson.build
@@ -3,6 +3,7 @@
 # SPDX-License-Identifier: Apache-2.0
 subdir('base')
 subdir('drivers')
+subdir('crypto')
 
 # Mask ROM fake dependencies.  These are temporary dependencies until we
 # refactor or copy the other libraries we need (e.g. `runtime`).