@@ -21,19 +21,77 @@ typedef struct {
2121 uint32 ns_lookup_pool_size ;
2222} libc_wasi_parse_context_t ;
2323
24+ typedef enum {
25+ LIBC_WASI_PARSE_RESULT_OK = 0 ,
26+ LIBC_WASI_PARSE_RESULT_NEED_HELP ,
27+ LIBC_WASI_PARSE_RESULT_BAD_PARAM
28+ } libc_wasi_parse_result_t ;
29+
2430typedef struct {
2531 const char * model_names [10 ];
26- const char * encoding [10 ];
27- const char * target [10 ];
32+ const uint32_t * encoding [10 ];
33+ const uint32_t * target [10 ];
2834 const char * graph_paths [10 ];
2935 uint32 n_graphs ;
3036} wasi_nn_parse_context_t ;
3137
3238typedef enum {
33- LIBC_WASI_PARSE_RESULT_OK = 0 ,
34- LIBC_WASI_PARSE_RESULT_NEED_HELP ,
35- LIBC_WASI_PARSE_RESULT_BAD_PARAM
36- } libc_wasi_parse_result_t ;
39+ wasi_nn_openvino = 0 ,
40+ wasi_nn_onnx ,
41+ wasi_nn_tensorflow ,
42+ wasi_nn_pytorch ,
43+ wasi_nn_tensorflowlite ,
44+ wasi_nn_ggml ,
45+ wasi_nn_autodetect ,
46+ wasi_nn_unknown_backend ,
47+ } wasi_nn_encoding ;
48+
49+ typedef enum wasi_nn_target {
50+ wasi_nn_cpu = 0 ,
51+ wasi_nn_gpu ,
52+ wasi_nn_tpu ,
53+ wasi_nn_unsupported_target ,
54+ } wasi_nn_target ;
55+
56+ static wasi_nn_encoding
57+ str2encoding (char * str_encoding )
58+ {
59+ if (!str_encoding ) {
60+ printf ("Got empty string encoding" );
61+ return -1 ;
62+ }
63+
64+ if (!strcmp (str_encoding , "openvino" ))
65+ return wasi_nn_openvino ;
66+ else if (!strcmp (str_encoding , "tensorflowlite" ))
67+ return wasi_nn_tensorflowlite ;
68+ else if (!strcmp (str_encoding , "ggml" ))
69+ return wasi_nn_ggml ;
70+ else if (!strcmp (str_encoding , "onnx" ))
71+ return wasi_nn_onnx ;
72+ else
73+ return wasi_nn_unknown_backend ;
74+ // return autodetect;
75+ }
76+
77+ static wasi_nn_target
78+ str2target (char * str_target )
79+ {
80+ if (!str_target ) {
81+ printf ("Got empty string target" );
82+ return -1 ;
83+ }
84+
85+ if (!strcmp (str_target , "cpu" ))
86+ return wasi_nn_cpu ;
87+ else if (!strcmp (str_target , "gpu" ))
88+ return wasi_nn_gpu ;
89+ else if (!strcmp (str_target , "tpu" ))
90+ return wasi_nn_tpu ;
91+ else
92+ return wasi_nn_unsupported_target ;
93+ // return autodetect;
94+ }
3795
3896static void
3997libc_wasi_print_help (void )
@@ -223,10 +281,19 @@ wasi_nn_parse(char **argv, wasi_nn_parse_context_t *ctx)
223281 }
224282
225283 ctx -> model_names [ctx -> n_graphs ] = tokens [0 ];
226- ctx -> encoding [ctx -> n_graphs ] = tokens [1 ];
227- ctx -> target [ctx -> n_graphs ] = tokens [2 ];
228- ctx -> graph_paths [ctx -> n_graphs ++ ] = tokens [3 ];
284+ ctx -> encoding [ctx -> n_graphs ] = (uint32_t )str2encoding (tokens [1 ]);
285+ ctx -> target [ctx -> n_graphs ] = (uint32_t )str2target (tokens [2 ]);
286+ ctx -> graph_paths [ctx -> n_graphs ] = tokens [3 ];
287+
288+ if ((!ctx -> model_names [ctx -> n_graphs ]) ||
289+ (ctx -> encoding [ctx -> n_graphs ] == wasi_nn_unknown_backend ) ||
290+ (ctx -> target [ctx -> n_graphs ] == wasi_nn_unsupported_target )) {
291+ ret = LIBC_WASI_PARSE_RESULT_NEED_HELP ;
292+ printf ("Invalid arguments for wasi-nn.\n" );
293+ goto fail ;
294+ }
229295
296+ ctx -> n_graphs ++ ;
230297fail :
231298
232299 return ret ;
0 commit comments