@@ -83,6 +83,34 @@ void InferTensorsVisitor::InferCall(const CallNode* cn) {
8383 ConvolutionParams params;
8484 err += EthosnAPI::QnnConv2d (cn->op .as <FunctionNode>()->body , ¶ms);
8585 tensor_table_[cn->args [0 ]] = {params.activation_info };
86+ } else if (IsEthosnFunc (call, " ethos-n.qnn_fc" )) {
87+ FullyConnectedParams params;
88+ err += EthosnAPI::QnnFullyConnected (cn->op .as <FunctionNode>()->body , ¶ms);
89+ tensor_table_[cn->args [0 ]] = {params.input_info };
90+ } else if (IsEthosnOp (call, " nn.max_pool2d" )) {
91+ MaxPool2DParams params;
92+ params.input_info = GetTensorInfo (tensor_table_, call);
93+ err += EthosnAPI::MaxPool2D (call, ¶ms);
94+ tensor_table_[cn->args [0 ]] = {params.input_info };
95+ } else if (IsEthosnFunc (call, " ethos-n.qnn_avg_pool2d" )) {
96+ AvgPool2DParams params;
97+ params.input_info = GetTensorInfo (tensor_table_, call);
98+ err += EthosnAPI::AvgPool2D (cn->op .as <FunctionNode>()->body , ¶ms);
99+ tensor_table_[cn->args [0 ]] = {params.input_info };
100+ } else if (IsEthosnOp (call, " reshape" )) {
101+ ReshapeParams params;
102+ params.input_info = GetTensorInfo (tensor_table_, call);
103+ err += EthosnAPI::Reshape (call, ¶ms);
104+ tensor_table_[cn->args [0 ]] = {params.input_info };
105+ } else if (IsEthosnOp (call, " qnn.add" )) {
106+ AdditionParams params;
107+ err += EthosnAPI::Addition (call, ¶ms);
108+ tensor_table_[cn->args [0 ]] = {params.lhs_info };
109+ tensor_table_[cn->args [1 ]] = {params.rhs_info };
110+ } else if (IsEthosnFunc (call, " ethos-n.qnn_sigmoid" )) {
111+ SigmoidParams params;
112+ err += EthosnAPI::Sigmoid (cn->op .as <FunctionNode>()->body , ¶ms);
113+ tensor_table_[cn->args [0 ]] = {params.input_info };
86114 } else if (IsEthosnOp (call, " qnn.concatenate" )) {
87115 ConcatenateParams params;
88116 err = EthosnAPI::Concatenate (call, ¶ms);
@@ -92,6 +120,16 @@ void InferTensorsVisitor::InferCall(const CallNode* cn) {
92120 params.input_info = GetTensorInfo (tensor_table_, call);
93121 err = EthosnAPI::Split (call, ¶ms);
94122 tensor_table_[cn->args [0 ]] = {params.input_info };
123+ } else if (IsEthosnOp (call, " nn.depth_to_space" )) {
124+ DepthToSpaceParams params;
125+ params.input_info = GetTensorInfo (tensor_table_, call);
126+ err += EthosnAPI::DepthToSpace (call, ¶ms);
127+ tensor_table_[cn->args [0 ]] = {params.input_info };
128+ } else if (IsEthosnOp (call, " clip" )) {
129+ ReluParams params;
130+ params.input_info = GetTensorInfo (tensor_table_, call);
131+ err = EthosnAPI::Relu (call, ¶ms);
132+ tensor_table_[cn->args [0 ]] = {params.input_info };
95133 } else {
96134 err = EthosnError (" unknown operator" );
97135 }
@@ -198,12 +236,36 @@ sl::TensorsAndId ConstructNetworkVisitor::HandleCall(const CallNode* cn) {
198236 if (IsEthosnFunc (call, " ethos-n.qnn_conv2d" )) {
199237 if ((err = MakeConvolutionLayer (call, &tensor))) ReportFatalError (call, err);
200238 return MakeOps (tensor);
239+ } else if (IsEthosnFunc (call, " ethos-n.qnn_fc" )) {
240+ if ((err = MakeFullyConnectedLayer (call, &tensor))) ReportFatalError (call, err);
241+ return MakeOps (tensor);
242+ } else if (IsEthosnOp (call, " nn.max_pool2d" )) {
243+ if ((err = MakeMaxPool2DLayer (call, &tensor))) ReportFatalError (call, err);
244+ return MakeOps (tensor);
245+ } else if (IsEthosnFunc (call, " ethos-n.qnn_avg_pool2d" )) {
246+ if ((err = MakeAvgPool2DLayer (call, &tensor))) ReportFatalError (call, err);
247+ return MakeOps (tensor);
248+ } else if (IsEthosnOp (call, " reshape" )) {
249+ if ((err = MakeReshapeLayer (call, &tensor))) ReportFatalError (call, err);
250+ return MakeOps (tensor);
251+ } else if (IsEthosnOp (call, " qnn.add" )) {
252+ if ((err = MakeAdditionLayer (call, &tensor))) ReportFatalError (call, err);
253+ return MakeOps (tensor);
254+ } else if (IsEthosnFunc (call, " ethos-n.qnn_sigmoid" )) {
255+ if ((err = MakeSigmoidLayer (call, &tensor))) ReportFatalError (call, err);
256+ return MakeOps (tensor);
201257 } else if (IsEthosnOp (call, " qnn.concatenate" )) {
202258 if ((err = MakeConcatenateLayer (call, &tensor))) ReportFatalError (call, err);
203259 return MakeOps (tensor);
204260 } else if (IsEthosnOp (call, " split" )) {
205261 if ((err = MakeSplitLayer (call, &tensors))) ReportFatalError (call, err);
206262 return tensors;
263+ } else if (IsEthosnOp (call, " nn.depth_to_space" )) {
264+ if ((err = MakeDepthToSpaceLayer (call, &tensor))) ReportFatalError (call, err);
265+ return MakeOps (tensor);
266+ } else if (IsEthosnOp (call, " clip" )) {
267+ if ((err = MakeReluLayer (call, &tensor))) ReportFatalError (call, err);
268+ return MakeOps (tensor);
207269 } else {
208270 ReportFatalError (call, EthosnError (" unknown operator" ));
209271 return {};
@@ -266,6 +328,115 @@ EthosnError ConstructNetworkVisitor::MakeConvolutionLayer(const Call& call,
266328 return EthosnError ();
267329}
268330
331+ EthosnError ConstructNetworkVisitor::MakeFullyConnectedLayer (const Call& call,
332+ sl::TensorAndId<sl::Operand>* out) {
333+ FullyConnectedParams params;
334+ if (auto err = EthosnAPI::QnnFullyConnected (call->op .as <FunctionNode>()->body , ¶ms)) {
335+ return err;
336+ }
337+
338+ auto weights = AddConstant (network_, params.weights_info , params.raw_weights ).tensor ;
339+ auto bias = AddConstant (network_, params.bias_info , params.raw_bias ).tensor ;
340+ try {
341+ auto input =
342+ AddReshape (network_, *operand_table_[call->args [0 ]][0 ], params.input_info .m_Dimensions )
343+ .tensor ;
344+ *out = AddFullyConnected (network_, *input, *bias, *weights, params.fc_info );
345+ } catch (const sl::NotSupportedException& e) {
346+ return EthosnError (e.what ());
347+ }
348+ return EthosnError ();
349+ }
350+
351+ EthosnError ConstructNetworkVisitor::MakeMaxPool2DLayer (const Call& call,
352+ sl::TensorAndId<sl::Operand>* out) {
353+ MaxPool2DParams params;
354+ params.input_info = GetTensorInfo (tensor_table_, call);
355+ if (auto err = EthosnAPI::MaxPool2D (call, ¶ms)) {
356+ return err;
357+ }
358+
359+ auto input = operand_table_[call->args [0 ]][0 ];
360+
361+ try {
362+ *out = AddPooling (network_, *input, params.pool_info );
363+ } catch (const sl::NotSupportedException& e) {
364+ return EthosnError (e.what ());
365+ }
366+ return EthosnError ();
367+ }
368+
369+ EthosnError ConstructNetworkVisitor::MakeAvgPool2DLayer (const Call& call,
370+ sl::TensorAndId<sl::Operand>* out) {
371+ AvgPool2DParams params;
372+ params.input_info = GetTensorInfo (tensor_table_, call);
373+ if (auto err = EthosnAPI::AvgPool2D (call->op .as <FunctionNode>()->body , ¶ms)) {
374+ return err;
375+ }
376+
377+ auto input = operand_table_[call->args [0 ]][0 ];
378+
379+ try {
380+ *out = AddPooling (network_, *input, params.pool_info );
381+ } catch (const sl::NotSupportedException& e) {
382+ return EthosnError (e.what ());
383+ }
384+ return EthosnError ();
385+ }
386+
387+ EthosnError ConstructNetworkVisitor::MakeReshapeLayer (const Call& call,
388+ sl::TensorAndId<sl::Operand>* out) {
389+ ReshapeParams params;
390+ params.input_info = GetTensorInfo (tensor_table_, call);
391+ if (auto err = EthosnAPI::Reshape (call, ¶ms)) {
392+ return err;
393+ }
394+
395+ auto input = operand_table_[call->args [0 ]][0 ];
396+
397+ try {
398+ *out = AddReshape (network_, *input, params.new_shape );
399+ } catch (const sl::NotSupportedException& e) {
400+ return EthosnError (e.what ());
401+ }
402+ return EthosnError ();
403+ }
404+
405+ EthosnError ConstructNetworkVisitor::MakeAdditionLayer (const Call& call,
406+ sl::TensorAndId<sl::Operand>* out) {
407+ AdditionParams params;
408+ if (auto err = EthosnAPI::Addition (call, ¶ms)) {
409+ return err;
410+ }
411+
412+ auto lhs = operand_table_[call->args [0 ]][0 ];
413+ auto rhs = operand_table_[call->args [1 ]][0 ];
414+
415+ try {
416+ *out = AddAddition (network_, *lhs, *rhs, params.output_quantization_info );
417+ } catch (const sl::NotSupportedException& e) {
418+ return EthosnError (e.what ());
419+ }
420+ return EthosnError ();
421+ }
422+
423+ EthosnError ConstructNetworkVisitor::MakeSigmoidLayer (const Call& call,
424+ sl::TensorAndId<sl::Operand>* out) {
425+ SigmoidParams params;
426+ if (auto err = EthosnAPI::Sigmoid (call->op .as <FunctionNode>()->body , ¶ms)) {
427+ return err;
428+ }
429+
430+ auto input = operand_table_[call->args [0 ]][0 ];
431+
432+ try {
433+ *out = AddSigmoid (network_, *input);
434+ } catch (const sl::NotSupportedException& e) {
435+ return EthosnError (e.what ());
436+ }
437+ return EthosnError ();
438+ }
439+
269440EthosnError ConstructNetworkVisitor::MakeConcatenateLayer (const Call& call,
270441 sl::TensorAndId<sl::Operand>* out) {
271442 ConcatenateParams params;
@@ -304,6 +475,42 @@ EthosnError ConstructNetworkVisitor::MakeSplitLayer(const Call& call, sl::Tensor
304475 return EthosnError ();
305476}
306477
478+ EthosnError ConstructNetworkVisitor::MakeDepthToSpaceLayer (const Call& call,
479+ sl::TensorAndId<sl::Operand>* out) {
480+ DepthToSpaceParams params;
481+ params.input_info = GetTensorInfo (tensor_table_, call);
482+ if (auto err = EthosnAPI::DepthToSpace (call, ¶ms)) {
483+ return err;
484+ }
485+
486+ auto input = operand_table_[call->args [0 ]][0 ];
487+
488+ try {
489+ *out = AddDepthToSpace (network_, *input, params.depth_info );
490+ } catch (const sl::NotSupportedException& e) {
491+ return EthosnError (e.what ());
492+ }
493+ return EthosnError ();
494+ }
495+
496+ EthosnError ConstructNetworkVisitor::MakeReluLayer (const Call& call,
497+ sl::TensorAndId<sl::Operand>* out) {
498+ ReluParams params;
499+ params.input_info = GetTensorInfo (tensor_table_, call);
500+ if (auto err = EthosnAPI::Relu (call, ¶ms)) {
501+ return err;
502+ }
503+
504+ auto input = operand_table_[call->args [0 ]][0 ];
505+
506+ try {
507+ *out = AddRelu (network_, *input, params.relu_info );
508+ } catch (const sl::NotSupportedException& e) {
509+ return EthosnError (e.what ());
510+ }
511+ return EthosnError ();
512+ }
513+
307514runtime::Module EthosnCompiler::CreateRuntimeModule (const ObjectRef& ref) {
308515 std::vector<runtime::ethosn::OrderedCompiledNetwork> cmms;
309516 if (ref->IsInstance <FunctionNode>()) {
0 commit comments