xmos-ai-tools 1.3.2.dev294__py3-none-macosx_10_15_universal2.whl → 1.3.2.dev314__py3-none-macosx_10_15_universal2.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,7 +5,7 @@ set(XMOS_AITOOLSLIB_DEFINITIONS
5
5
  "NO_INTERPRETER"
6
6
  )
7
7
 
8
- if("${APP_BUILD_ARCH}" STREQUAL xs3a OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL XCORE_XS3A)
8
+ if("${APP_BUILD_ARCH}" STREQUAL xs3a OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL XCORE_XS3A OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL XCORE_XS)
9
9
  set(XMOS_AITOOLSLIB_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/../lib/libxtflitemicro.a")
10
10
  else()
11
11
  set(XMOS_AITOOLSLIB_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/../lib/libhost_xtflitemicro.a")
@@ -0,0 +1,17 @@
1
+ #pragma once
2
+
3
+ #include "nn_api.h"
4
+
5
+ typedef enum {
6
+ TARGET_ARCH_XS3A = 0,
7
+ TARGET_ARCH_VX4A = 1,
8
+ } nn_target_arch_t;
9
+
10
+ extern nn_target_arch_t NN_ARCH;
11
+
12
+ C_API void SetNNTargetArch(nn_target_arch_t arch);
13
+
14
+ typedef enum {
15
+ VLMUL_SHR_XS3A = 14,
16
+ VLMUL_SHR_VX4A = 15,
17
+ } nn_vlmul_shr_t;
@@ -106,9 +106,15 @@ static inline unsigned smin(const unsigned a, const unsigned b) {
106
106
 
107
107
  static inline int ceil_log2(uint32_t a) {
108
108
  if (a == 0) return -1;
109
- #if defined(__XS3A__)
109
+ #ifdef __xcore__
110
110
  unsigned x;
111
- asm("clz %0, %1" : "=r"(x) : "r"(a));
111
+ #ifdef __XS3A__
112
+ asm("clz %0, %1" : "=r"(x) : "r"(a));
113
+ #endif
114
+ #ifdef __VX4A__
115
+ asm("xm.clz %0, %1" : "=r"(x) : "r"(a));
116
+ #endif
117
+
112
118
  unsigned y = 31 - x;
113
119
 
114
120
  // clz(1) = 31 -> 31-31 = 0 -> 2^0 = 1
@@ -28,6 +28,7 @@ typedef enum {
28
28
  MODE_S32 = 0x00,
29
29
  MODE_S16 = 0x100,
30
30
  MODE_S8 = 0x200,
31
+ MODE_S16x8 = 0x400,
31
32
  } vector_mode;
32
33
 
33
34
  C_API
@@ -2,6 +2,8 @@
2
2
  #ifndef XCORE_SHARED_CONFIG_H_
3
3
  #define XCORE_SHARED_CONFIG_H_
4
4
 
5
+ #include "lib_nn/api/nn_arch.h"
6
+
5
7
  namespace shared_config {
6
8
 
7
9
  // This string is used as a key to store the shared config
@@ -19,6 +21,8 @@ struct tensor_info_t {
19
21
  // The metadata struct must be aligned to 16 bytes
20
22
  // We cannot use alignas(16) yet in xcore
21
23
  struct xcore_metadata_t {
24
+ // Target arch can be XS3A = 0, or VX4A = 1
25
+ nn_target_arch_t target_arch;
22
26
  // Versions of libraries used to build the model
23
27
  uint32_t lib_nn_major_version;
24
28
  uint32_t lib_nn_minor_version;
@@ -2,6 +2,11 @@
2
2
  #define __micro_thread_library_h__
3
3
 
4
4
  #include <stdint.h>
5
+ #ifdef __xcore__
6
+ #include <xcore/parallel.h>
7
+ #else
8
+ typedef unsigned synchronizer_t;
9
+ #endif
5
10
 
6
11
  #ifdef __cplusplus
7
12
  extern "C" {
@@ -21,8 +26,6 @@ typedef struct { // THIS STRUCT MUST BE IN SYNC WITH ASSEMBLY CODE.
21
26
  uint32_t id[4]; // Actual IDs
22
27
  } thread_ids; // ids of at most 4 threads - live during invoke
23
28
  uint32_t synchroniser; // synchroniser for threads - live during invoke
24
- uint32_t nstackwords; // nstackwords per stack - live after load model
25
- void *UNSAFE stacks; // pointer to top of stack - live after load model
26
29
  } thread_info_t;
27
30
 
28
31
 
@@ -31,56 +34,15 @@ typedef struct { // THIS STRUCT MUST BE IN SYNC WITH ASSEMBLY CODE.
31
34
  typedef void (*thread_function_pointer_t)(void * arg0, void * arg1, void * arg2);
32
35
  struct inference_engine;
33
36
 
34
- /** Function that creates threads, then calls a interp_invoke_internal,
35
- * then destroys threads
36
- * This function creates four threads for a total of five threads.
37
- * other versions of the functions create 3, 2, 1, or 0 threads.
38
- *
39
- * \param ie Pointer to the inference object to be passed to
40
- * interp_invoke_internal
41
- * \param ptr Pointer to a thread_info block. The thread-ids will
42
- * be stored in this block, and a stack pointer is expected
43
- * in this block:
44
- * ptr[0] [out] thread-id-0 (versions with fewer threads
45
- * ptr[1] [out] thread-id-1 will only use the first few
46
- * ptr[2] [out] thread-id-2 slots)
47
- * ptr[3] [out] thread-id-3
48
- * ptr[4] [out] synchroniser-id
49
- * ptr[5] [in] top of stacks
50
- * ptr[6] [in] number of words per stack
37
+ /** Function that runs the client task
51
38
  */
52
- int thread_invoke_5(struct inference_engine *ie, thread_info_t *ptr);
53
- int thread_invoke_4(struct inference_engine *ie, thread_info_t *ptr);
54
- int thread_invoke_3(struct inference_engine *ie, thread_info_t *ptr);
55
- int thread_invoke_2(struct inference_engine *ie, thread_info_t *ptr);
56
- int thread_invoke_1(struct inference_engine *ie, thread_info_t *ptr);
39
+ void thread_client(thread_info_t *ptr, int n);
57
40
 
58
- /** Function that creates threads.
59
- * This function creates four threads for a total of five threads.
60
- * other versions of the functions create 3, 2, 1, or 0 threads.
61
- *
62
- * \param ptr Pointer to a thread_info block. The thread-ids will
63
- * be stored in this block, and a stack pointer is expected
64
- * in this block:
65
- * ptr[0] [out] thread-id-0 (versions with fewer threads
66
- * ptr[1] [out] thread-id-1 will only use the first few
67
- * ptr[2] [out] thread-id-2 slots)
68
- * ptr[3] [out] thread-id-3
69
- * ptr[4] [out] synchroniser-id
70
- * ptr[5] [in] top of stacks
71
- * ptr[6] [in] number of words per stack
72
- */
73
- void thread_init_5(thread_info_t *ptr);
74
- void thread_init_4(thread_info_t *ptr);
75
- void thread_init_3(thread_info_t *ptr);
76
- void thread_init_2(thread_info_t *ptr);
77
- void thread_init_1(thread_info_t *ptr);
78
- /** Function that destroys threads. Must be called from the same function that
79
- * called an _init_ above.
80
- *
81
- * \param ptr Pointer to a thread_info block.
41
+ /** Function that runs the client task
82
42
  */
83
- void thread_destroy(thread_info_t *ptr);
43
+ static inline void thread_store_sync(thread_info_t *ptr, uint32_t s) {
44
+ ptr->synchroniser = s;
45
+ }
84
46
 
85
47
  /** Function that sets up parameters for one of the client threads
86
48
  * This particular one passes the second and third arguments to the thread.
@@ -94,7 +56,21 @@ void thread_destroy(thread_info_t *ptr);
94
56
  * \param arg2 Third argument for the thread function
95
57
  * \param thread_id The thread_id to initialise; one of ptr[0]..ptr[3] above
96
58
  */
97
- void thread_variable_setup(void * arg1, void * arg2, uint32_t thread_id);
59
+ #ifdef __xcore__
60
+ static inline void thread_variable_setup(void * arg1, void * arg2, uint32_t thread_id) {
61
+ #ifdef __VX4A__
62
+ asm volatile("xm.tsetr %0, 11, %1" :: "r" (thread_id), "r" (arg1));
63
+ asm volatile("xm.tsetr %0, 12, %1" :: "r" (thread_id), "r" (arg2));
64
+ asm volatile("xm.tsetr %0, 24, %1" :: "r" (thread_id), "r" (1));
65
+ #else
66
+ asm volatile("set t[%0]:r1, %1" :: "r" (thread_id), "r" (arg1));
67
+ asm volatile("set t[%0]:r2, %1" :: "r" (thread_id), "r" (arg2));
68
+ asm volatile("set t[%0]:r10, %1" :: "r" (thread_id), "r" (1));
69
+ #endif
70
+ }
71
+ #else
72
+ extern void thread_variable_setup(void * arg1, void * arg2, uint32_t thread_id);
73
+ #endif
98
74
 
99
75
  /** Function that starts all thread functions and runs them until completion.
100
76
  * It is assumed that the variable parts have been set up per thread.
Binary file
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xmos_ai_tools
3
- Version: 1.3.2.dev294
3
+ Version: 1.3.2.dev314
4
4
  Summary: XMOS AI Tools
5
5
  Home-page: https://github.com/xmos/ai_tools
6
6
  Author: XMOS
@@ -41,4 +41,4 @@ Dynamic: summary
41
41
  Documentation
42
42
  -------------
43
43
 
44
- Click [here](https://github.com/xmos/ai_tools/blob/113f04f7d5485ed2f43037ae48bc5d8772acd831/README.md) for documentation on using xmos-ai-tools to deploy AI models on xcore.
44
+ Click [here](https://github.com/xmos/ai_tools/blob/e358ca58e3fa05f0132d216e1dfefac098d2bb63/README.md) for documentation on using xmos-ai-tools to deploy AI models on xcore.
@@ -1,7 +1,7 @@
1
1
  xmos_ai_tools/__init__.py,sha256=AEb1P1AVQeYBcBsImZNpg46juG7y-0EQU-eRVczLUgc,172
2
2
  xmos_ai_tools/io_server/__init__.py,sha256=Wr8MHyIxhY80hnvwUH0AsE3BojqIt-AwbYBj-02HDiM,4801
3
3
  xmos_ai_tools/runtime/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- xmos_ai_tools/runtime/buildfiles/aitoolslib.cmake,sha256=7xlnDRNVsEIxu929Nt887drbV104t_Nsye1Rv_FpasA,478
4
+ xmos_ai_tools/runtime/buildfiles/aitoolslib.cmake,sha256=yxN1_9nhMo2PVQ3A7uroPjBudDB_Kx6_DcJ5eik5W50,525
5
5
  xmos_ai_tools/runtime/buildfiles/aitoolslib.make,sha256=D4GFs74BsWTuQT6R_yxXwR4LLH0pzyFiAXnGpe5hntI,253
6
6
  xmos_ai_tools/runtime/include/flash_server.h,sha256=4OQaauv9maSV9pFnxmf6R1LL_TzgnFdXeVPPVWSKPhU,3322
7
7
  xmos_ai_tools/runtime/include/ioserver.h,sha256=gEVBhuVLjwi9c00vHUKDEByibl6GVtSUpl5ePAk5GiE,1045
@@ -45,12 +45,13 @@ xmos_ai_tools/runtime/include/lib_nn/api/expand_8_to_16.h,sha256=7-HFoUFgiOjgyGl
45
45
  xmos_ai_tools/runtime/include/lib_nn/api/multiply_int16.h,sha256=gBgXPvMYhZ9ZIqKthWKSeWmLPwhFCy6eKKmj0f1M2JQ,1551
46
46
  xmos_ai_tools/runtime/include/lib_nn/api/multiply_int16_transform.h,sha256=Vaycg971CZkR9wHO1k3-DxHxp026hgDYqyfZI_YNSy4,2454
47
47
  xmos_ai_tools/runtime/include/lib_nn/api/nn_api.h,sha256=UhLAFqf245v5XdcAohZOInOcbsRqJSHGCGqI1iBmu3U,219
48
+ xmos_ai_tools/runtime/include/lib_nn/api/nn_arch.h,sha256=RRRL3AOAQxiFR0qwQaqDvNMnWsmpF4Jb_N5kud2Q0jo,283
48
49
  xmos_ai_tools/runtime/include/lib_nn/api/nn_bin_types.h,sha256=DTFX2ecfzwl-_tHlqTR2xypgK7oxmvVWc58eJqJK2rE,325
49
50
  xmos_ai_tools/runtime/include/lib_nn/api/nn_config.h,sha256=KFoA5zyOTTHi6x-qDuIWkF8wAz4Gc4BdOBgUzOArOD0,11558
50
51
  xmos_ai_tools/runtime/include/lib_nn/api/nn_conv2d_structs.h,sha256=Kfyq3bD1aLcSnWTB_cijU_D5ThGol5utJ1k-WsjqeMY,2268
51
52
  xmos_ai_tools/runtime/include/lib_nn/api/nn_image.h,sha256=gz7NyxmZACZiDED0wT7px2qjEEMcUwfa5TjeOUmYzL4,514
52
53
  xmos_ai_tools/runtime/include/lib_nn/api/nn_layers.h,sha256=iM2hvfUp_yPK0cp0Bt0heRK97moepModnsNIbTsu4-s,10817
53
- xmos_ai_tools/runtime/include/lib_nn/api/nn_op_helper.h,sha256=r8FexVvHL0MGjZl8hnshO42pS3PlWk-tTuxA14FoGvY,3722
54
+ xmos_ai_tools/runtime/include/lib_nn/api/nn_op_helper.h,sha256=xmOZZFZ6quj7mc2MFvz-nMtAcIy088OrnVKy08qxKHg,3819
54
55
  xmos_ai_tools/runtime/include/lib_nn/api/nn_op_utils.h,sha256=zdCGBeyiHx4-T1hZ4Cjf-QTtXwIyWp4xzuI1dfOjHPA,4948
55
56
  xmos_ai_tools/runtime/include/lib_nn/api/nn_operator.h,sha256=Nj4jiXVHlnFjVBtV7mCGulTzSyNwCIpitz8Ao9kSIsU,337
56
57
  xmos_ai_tools/runtime/include/lib_nn/api/nn_pooling.h,sha256=DUJNIhtabaMJvP4m46BICDNY2nCSXWKdfE0AUu7VhaY,24456
@@ -66,7 +67,7 @@ xmos_ai_tools/runtime/include/lib_nn/api/quantize_int16_transform.h,sha256=Rg2XO
66
67
  xmos_ai_tools/runtime/include/lib_nn/api/version.h,sha256=e6-GRd2_R0vtq6Jps57nM3F0Zt37ZpClL7u3Er0W1ZI,303
67
68
  xmos_ai_tools/runtime/include/lib_nn/api/vpu_memmove_word_aligned.h,sha256=-OgMM0JMG1kIlL6YSiEg-6o6t43t1LUDwAS_inW-r_8,579
68
69
  xmos_ai_tools/runtime/include/lib_nn/api/vpu_memset_256.h,sha256=u71fu0EldAXMiMfQ-il9pN9ZXUkrcSp7kiMcJRnESRE,1967
69
- xmos_ai_tools/runtime/include/lib_nn/api/vpu_sim.h,sha256=3S1_2eSaEj2q8nhFuRiCefQhwTeYpfothuFu0fC54_s,3811
70
+ xmos_ai_tools/runtime/include/lib_nn/api/vpu_sim.h,sha256=0ujuOUFwKd8YYVgVAvBzFlxLsND_EBLRDhuevrzvU7Y,3833
70
71
  xmos_ai_tools/runtime/include/lib_nn/api/xs3_vpu.h,sha256=xuEpNayaSWeEIoL1--EfQAXkr4TidwDASFYgbshJ-Mw,6227
71
72
  xmos_ai_tools/runtime/include/lib_nn/api/xs3a_registers.h,sha256=5i6Tue1VplRI2VlIes-gaD2BXOKreuUit51OYTsbgFs,139774
72
73
  xmos_ai_tools/runtime/include/lib_nn/src/asm/asm_constants.h,sha256=VB8pk_H4vI4S18xYfPFCOGZoLG6S0FYW5uVfG3u9glU,1018
@@ -78,8 +79,8 @@ xmos_ai_tools/runtime/include/lib_tflite_micro/api/memory_parallel_transport.h,s
78
79
  xmos_ai_tools/runtime/include/lib_tflite_micro/api/version.h,sha256=ImFxGU2PzLZ3TzGiB1V2Ghgd2yh0qWR7UI7ao-MrG6w,318
79
80
  xmos_ai_tools/runtime/include/lib_tflite_micro/api/xcore_config.h,sha256=gywR3hBJe05GTLkcdJss0bmk3dzsWivXK6U9FF7Pfm0,589
80
81
  xmos_ai_tools/runtime/include/lib_tflite_micro/api/xcore_device_memory.h,sha256=bLWcRDNrzClLh8_eR3XRRz3sA2pEAzzxGLDoPTsNp8A,1917
81
- xmos_ai_tools/runtime/include/lib_tflite_micro/api/xcore_shared_config.h,sha256=bcpjAc7bfGrxovRkBZIr3hu4vpayX-TdhjCNrYXzQik,1451
82
- xmos_ai_tools/runtime/include/lib_tflite_micro/src/thread_call.h,sha256=KNG-3gNWMSonzYTGbk4L0kT8WU9JD0bOzlk8naz7JO0,4965
82
+ xmos_ai_tools/runtime/include/lib_tflite_micro/api/xcore_shared_config.h,sha256=EdqTecMZIdSk1ZWUE7rdl6ilXe4-vbFiwwcf0Y124c4,1562
83
+ xmos_ai_tools/runtime/include/lib_tflite_micro/src/thread_call.h,sha256=YobSgoLTISGz3o7mz-ZXiLNlJWnko5R44NmYh8SvxkQ,3206
83
84
  xmos_ai_tools/runtime/include/lib_tflite_micro/src/tflite-xcore-kernels/conv2d_float.h,sha256=XfVVWAKhbv6nByOzO1j6WA4oQ4RTX3PvYx22f-_3JFA,7681
84
85
  xmos_ai_tools/runtime/include/lib_tflite_micro/src/tflite-xcore-kernels/xcore_custom_options.h,sha256=lC4Tw1Pxxg3zOXRdqNNtokuU-_cX9TTkYmGLe47-9dQ,630
85
86
  xmos_ai_tools/runtime/include/lib_tflite_micro/src/tflite-xcore-kernels/xcore_error_reporter.h,sha256=_NIzvBYMqlwJexYESP5t5JXpxYTt-ZKq-1AdqAB9-Sc,812
@@ -379,17 +380,17 @@ xmos_ai_tools/runtime/include/tensorflow/lite/micro/tools/benchmarking/metrics.h
379
380
  xmos_ai_tools/runtime/include/tensorflow/lite/micro/tools/benchmarking/op_resolver.h,sha256=g0dl9tzUqngiINvjBlqDclFqvkC85MC4kbU13vE4OkY,6071
380
381
  xmos_ai_tools/runtime/include/tensorflow/lite/schema/schema_generated.h,sha256=hSumwEqc-LmMHG82KKl1yPLiVMNbLj_q19-VRPCR7ng,1093175
381
382
  xmos_ai_tools/runtime/include/tensorflow/lite/schema/schema_utils.h,sha256=tkHMDPARjIqppYCVInIowwdHxjNP3pfSS9O7vx-ODeo,1333
382
- xmos_ai_tools/runtime/lib/libhost_xtflitemicro.a,sha256=-DhzLYrSOKlBtk7BbC8KMQ5mxIgUhTtaLN2yjSyBK_g,2470136
383
- xmos_ai_tools/runtime/lib/libxtflitemicro.a,sha256=KqyxIQSTcpcoQxwDO-N9rwU_xgghlSgO6Y0YlxPU00s,71877202
383
+ xmos_ai_tools/runtime/lib/libhost_xtflitemicro.a,sha256=zNVlVeITK-V46GeccRWRBh-e33bLq1zJr4jpj6b-q1U,2479336
384
+ xmos_ai_tools/runtime/lib/libxtflitemicro.a,sha256=SQU77BXngIHnTu1q9o6_no3cvvMoL93yCSy8cBj9F8E,72202704
384
385
  xmos_ai_tools/xformer/__init__.py,sha256=a4K06oiSu2TYVwGvzwMDGGejPUYTvW9-5Uw6SfuFCX4,1903
385
386
  xmos_ai_tools/xformer/flash.py,sha256=MG4coi_Lvvg-oQmw1pomJD8eeOH4gAMjixjBFvO2BCk,6376
386
387
  xmos_ai_tools/xinterpreters/__init__.py,sha256=PFRB9VxOLKaA--j2ZvWGcmesv2C6uNYqJ_kBam68aUI,50
387
388
  xmos_ai_tools/xinterpreters/exceptions.py,sha256=HOjADxHYMPI9mN0YIbWxtw9hSeL2B6XWWwqtGtyJdVs,577
388
389
  xmos_ai_tools/xinterpreters/host_interpreter.py,sha256=ZdvzXUnAdnCcSU-dNQvq6ad2MDk9PZqu9UyNoBgBYKI,25755
389
- xmos_ai_tools/xinterpreters/libs/macos/xtflm_python.1.0.1.dylib,sha256=tKwL8dJLDWfttTdKQzAONMlWPzOxUVUZcyQIzck__DU,2359448
390
- xmos_ai_tools/xinterpreters/libs/macos/xtflm_python.dylib,sha256=tKwL8dJLDWfttTdKQzAONMlWPzOxUVUZcyQIzck__DU,2359448
391
- xmos_ai_tools-1.3.2.dev294.data/data/bin/xcore-opt,sha256=09Pzk2TD7TzzkS73oZC2ZOUSC1HYPMNSaZZl4WKTuhE,286566280
392
- xmos_ai_tools-1.3.2.dev294.dist-info/METADATA,sha256=pN1sKQ1zAibNroaAd_Q28YHt31IKllRirM1gCCcHi5k,1574
393
- xmos_ai_tools-1.3.2.dev294.dist-info/WHEEL,sha256=zptREcKej0ZTXp5pemGtOgadxZp76B2ndJnv7YH9sHw,112
394
- xmos_ai_tools-1.3.2.dev294.dist-info/top_level.txt,sha256=YWegea73ll3tMlRWRdHJemUy2VOuEYDdOIaffxu_eF0,14
395
- xmos_ai_tools-1.3.2.dev294.dist-info/RECORD,,
390
+ xmos_ai_tools/xinterpreters/libs/macos/xtflm_python.1.0.1.dylib,sha256=mQp_HoqoSMCxV3Wj1MVVSjtoobePEkDJxgXolJmJsPA,2359560
391
+ xmos_ai_tools/xinterpreters/libs/macos/xtflm_python.dylib,sha256=mQp_HoqoSMCxV3Wj1MVVSjtoobePEkDJxgXolJmJsPA,2359560
392
+ xmos_ai_tools-1.3.2.dev314.data/data/bin/xcore-opt,sha256=F9lfM3nO9moykySibqzSvqf0fR_dl-SOCiumIEa2nVw,286686296
393
+ xmos_ai_tools-1.3.2.dev314.dist-info/METADATA,sha256=4PARxhHjjMdc_jnNIG63WgAEbsQ_UfR3ww_QpZllsZ8,1574
394
+ xmos_ai_tools-1.3.2.dev314.dist-info/WHEEL,sha256=98VLpmTXZiW_X2RJ0T4x1A5tW4Utj3RcaNGBZZbavbg,112
395
+ xmos_ai_tools-1.3.2.dev314.dist-info/top_level.txt,sha256=YWegea73ll3tMlRWRdHJemUy2VOuEYDdOIaffxu_eF0,14
396
+ xmos_ai_tools-1.3.2.dev314.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.1.0)
2
+ Generator: setuptools (79.0.1)
3
3
  Root-Is-Purelib: false
4
4
  Tag: py3-none-macosx_10_15_universal2
5
5