1#!/usr/bin/env python
2
3"""
4Copyright (c) 2024 Silicon Laboratories Inc.
5
6SPDX-License-Identifier: Apache-2.0
7"""
8
9import argparse
10import re
11import shutil
12import subprocess
13from pathlib import Path
14from ruamel.yaml import YAML
15
16paths = [
17  "License.txt",
18  "platform/common/config/sl_core_config.h",
19  "platform/common/inc/*.h",
20  "platform/common/src/sl_assert.c",
21  "platform/common/src/sl_core_cortexm.c",
22  "platform/common/src/sl_slist.c",
23  "platform/Device/SiliconLabs/EFR32BG2[279]/Include/*.h",
24  "platform/Device/SiliconLabs/EFR32BG2[279]/Source/system_*.c",
25  "platform/Device/SiliconLabs/EFR32FG2[3]/Include/*.h",
26  "platform/Device/SiliconLabs/EFR32FG2[3]/Source/system_*.c",
27  "platform/Device/SiliconLabs/EFR32MG2[149]/Include/*.h",
28  "platform/Device/SiliconLabs/EFR32MG2[149]/Source/system_*.c",
29  "platform/Device/SiliconLabs/EFR32ZG2[3]/Include/*.h",
30  "platform/Device/SiliconLabs/EFR32ZG2[3]/Source/system_*.c",
31  "platform/driver/gpio/inc/*.h",
32  "platform/driver/gpio/src/*.c",
33  "platform/emdrv/common/inc/*.h",
34  "platform/emdrv/dmadrv/config/s2_8ch/*.h",
35  "platform/emdrv/dmadrv/inc/*.h",
36  "platform/emdrv/dmadrv/inc/s2_signals/.h",
37  "platform/emdrv/dmadrv/src/*.c",
38  "platform/emlib/inc/*.h",
39  "platform/emlib/src/*.c",
40  "platform/peripheral/inc/*.h",
41  "platform/peripheral/src/*.c",
42  "platform/radio/rail_lib/chip/**/*.[ch]",
43  "platform/radio/rail_lib/common/*.[ch]",
44  "platform/radio/rail_lib/plugin/pa-conversions/**/*.[ch]",
45  "platform/radio/rail_lib/plugin/rail_util_protocol/**/*.[ch]",
46  "platform/radio/rail_lib/protocol/**/*.[ch]",
47  "platform/security/sl_component/se_manager/**/*.[ch]",
48  "platform/security/sl_component/sli_psec_osal/**/*.[ch]",
49  "platform/security/sl_component/sl_protocol_crypto/**/*.[ch]",
50  "platform/security/sl_component/sli_crypto/**/*.[ch]",
51  "platform/service/clock_manager/config/**/*.h", # TODO
52  "platform/service/clock_manager/inc/*.h",
53  "platform/service/clock_manager/src/*.[ch]",
54  "platform/service/device_init/config/**/*.h", # TODO
55  "platform/service/device_init/inc/*.h",
56  "platform/service/device_init/src/*.[ch]",
57  "platform/service/device_manager/**/*.[ch]",
58  "platform/service/hfxo_manager/config/**/*.h", # TODO
59  "platform/service/hfxo_manager/inc/*.h",
60  "platform/service/hfxo_manager/src/*.[ch]",
61  "platform/service/interrupt_manager/inc/*.h",
62  "platform/service/memory_manager/config/*.h", # TODO
63  "platform/service/memory_manager/inc/*.h",
64  "platform/service/memory_manager/src/*.[ch]",
65  "platform/service/memory_manager/profiler/config/*.h", # TODO
66  "platform/service/memory_manager/profiler/inc/*.h",
67  "platform/service/memory_manager/profiler/src/*.c",
68  "platform/service/power_manager/config/**/*.h", # TODO
69  "platform/service/power_manager/inc/*.h",
70  "platform/service/power_manager/src/*/*.[ch]",
71  "platform/service/sleeptimer/config/**/*.h", # TODO
72  "platform/service/sleeptimer/inc/*.h",
73  "platform/service/sleeptimer/src/*.[ch]",
74  "protocol/bluetooth/bgstack/ll/inc/*.h",
75]
76
77configs = [
78  "platform/common/config/sl_core_config.h"
79]
80
81def copy_files(src: Path, dst: Path, paths: list[str]) -> None:
82  for path in paths:
83    for f in src.glob(path):
84      destfile = dst / f.relative_to(src)
85      destfile.parent.mkdir(parents=True, exist_ok=True)
86      shutil.copy(f, destfile)
87
88
89def update_blobs(mod: Path, sdk: Path) -> None:
90  y = YAML(typ='rt')
91  y.default_flow_style = False
92  y.indent(mapping=2, sequence=4, offset=2)
93  y.preserve_quotes = True
94  y.width = 1024
95  y.boolean_representation = ['False', 'True']
96
97  slcs = y.load(sdk / "simplicity_sdk.slcs")
98
99  data = y.load(mod)
100  for blob in data.get('blobs'):
101    path = Path(blob["path"])
102    if not path.is_relative_to(Path("simplicity_sdk")):
103      continue
104
105    path = path.relative_to(Path("simplicity_sdk"))
106    lfs = subprocess.check_output(["git", "show", f"HEAD:{str(path)}"], cwd=sdk).decode()
107    sha = re.search(r"sha256:([0-9a-f]{64})\s", lfs).group(1)
108
109    blob["sha256"] = sha
110    blob["url"] = f"https://artifacts.silabs.net/artifactory/gsdk/objects/{sha[0:2]}/{sha[2:4]}/{sha}"
111    blob["version"] = slcs["sdk_version"]
112
113  y.dump(data, mod)
114
115
116if __name__ == "__main__":
117  parser = argparse.ArgumentParser()
118  parser.add_argument("--sdk", "-s", type=Path)
119  parser.add_argument("--blobs", "-b", action='store_true')
120  args = parser.parse_args()
121
122  dst = (Path(__file__).parent.parent / "simplicity_sdk").resolve()
123
124  if args.sdk is not None:
125    src = args.sdk.resolve(strict=True)
126
127    print(f"Import SDK from {src}")
128    for dir in dst.iterdir():
129      if dir.is_dir():
130        shutil.rmtree(dir, ignore_errors=True)
131
132    copy_files(src, dst, paths)
133
134    print(f"Update module.yml with blobs from {src}")
135    mod = Path(__file__).parent.parent / "zephyr" / "module.yml"
136    update_blobs(mod, src)
137
138    print("Done")
139  else:
140    print("No SDK to import from")
141