diff --git a/aidge_export_arm_cortexm/export_registry.py b/aidge_export_arm_cortexm/export_registry.py index f51867dea0b894548fd9472d32062e860e89c7c2..46c0653ad05895d13ca0d9be7fdb5f4314f2f775 100644 --- a/aidge_export_arm_cortexm/export_registry.py +++ b/aidge_export_arm_cortexm/export_registry.py @@ -2,9 +2,12 @@ from aidge_core.export_utils import ExportLib class ExportLibAidgeARM(ExportLib): _name="aidge_arm" - static_files={ - } + + +# TODO ugly fix for Tensor registration issue... +import aidge_core +aidge_core.register_Tensor(["aidge_arm", aidge_core.dtype.float32], + aidge_core.get_key_value_Tensor(["cpu", aidge_core.dtype.float32])) class ExportLibCMSISNN(ExportLib): _name="export_cmsisnn" - diff --git a/aidge_export_arm_cortexm/operators.py b/aidge_export_arm_cortexm/operators.py index 69281a8dd1e17d296ece79bea186c103b6232f36..dd6ce2e713389940fd4c2b5b63d05b526eaf929f 100644 --- a/aidge_export_arm_cortexm/operators.py +++ b/aidge_export_arm_cortexm/operators.py @@ -4,8 +4,8 @@ import numpy as np from pathlib import Path from typing import Tuple, List -# import aidge_core -from aidge_core.export_utils import ExportNode, ExportNodeCpp, operator_register +import aidge_core +from aidge_core.export_utils import ExportNode, ExportNodeCpp from aidge_core.export_utils.code_generation import * from aidge_export_arm_cortexm.utils import ROOT from aidge_export_arm_cortexm.utils.converter import numpy_dtype2ctype @@ -45,7 +45,7 @@ def set_up_output(name, dtype): -@operator_register(ExportLibAidgeARM, "Producer") +@ExportLibAidgeARM.register("Producer", aidge_core.ImplSpec(aidge_core.IOSpec(aidge_core.dtype.any))) class Producer_ARMCortexM(ExportNode): def __init__(self, node, mem_info, is_input, is_output): @@ -193,7 +193,16 @@ class Scaling(): return self.scaling -@operator_register(ExportLibAidgeARM, "ReLU") +# TODO : find a way to remove this dummy exportnode +@ExportLibAidgeARM.register("Pad2D", aidge_core.ImplSpec(aidge_core.IOSpec(aidge_core.dtype.any))) +class Pad_ARMCortexM(ExportNodeCpp): + def __init__(self, node, mem_info, is_input, is_output): + raise NotImplementedError("Pad2D nodes is not implemented") + + + + +@ExportLibAidgeARM.register("ReLU", aidge_core.ImplSpec(aidge_core.IOSpec(aidge_core.dtype.float32))) class ReLU_ARMCortexM(ExportNodeCpp): def __init__(self, node, mem_info, is_input, is_output): super().__init__(node, mem_info, is_input, is_output) @@ -205,11 +214,8 @@ class ReLU_ARMCortexM(ExportNodeCpp): self.kernels_to_copy = [ str(ROOT / "_Aidge_Arm" / "kernels" / "Relu" / "aidge_relu_float32.h"), ] - @classmethod - def exportable(cls, node): - return True # TODO add check i/o NCHW -@operator_register(ExportLibAidgeARM, "Conv") +@ExportLibAidgeARM.register("Conv2D", aidge_core.ImplSpec(aidge_core.IOSpec(aidge_core.dtype.float32))) class Conv_ARMCortexM(ExportNodeCpp): def __init__(self, node, mem_info, is_input, is_output): super().__init__(node, mem_info, is_input, is_output) @@ -225,21 +231,20 @@ class Conv_ARMCortexM(ExportNodeCpp): self.kernels_to_copy = [ str(ROOT / "_Aidge_Arm" / "kernels" / "Convolution" / "Conv.hpp") ] - @classmethod - def exportable(cls, node): - return True # TODO add check i/o NCHW -@operator_register(ExportLibAidgeARM, "PaddedConv") + +@ExportLibAidgeARM.register_metaop("PaddedConv2D", aidge_core.ImplSpec(aidge_core.IOSpec(aidge_core.dtype.float32))) class PaddedConv_ARMCortexM(ExportNodeCpp): def __init__(self, node, mem_info, is_input, is_output): super().__init__(node, mem_info, is_input, is_output) self.attributes["activation"] = "Linear" self.attributes.update(Scaling()("no_scaling")) + print(self.attributes) for n in self.operator.get_micro_graph().get_nodes(): - if n.type() == "Pad": + if n.type() == "Pad2D": self.attributes["padding"] = n.get_operator( ).attr.begin_end_borders - if n.type() == "Conv": + if n.type() == "Conv2D": self.attributes["kernel_dims"] = n.get_operator( ).attr.kernel_dims self.attributes["stride_dims"] = n.get_operator( @@ -253,11 +258,6 @@ class PaddedConv_ARMCortexM(ExportNodeCpp): self.kernels_to_copy = [ str(ROOT / "_Aidge_Arm" / "kernels" / "Convolution" / "Conv.hpp") ] - @classmethod - def exportable(cls, node): - return True # TODO add check i/o NCHW - - class Pooling_ARMCortexM(ExportNodeCpp): @@ -281,7 +281,7 @@ class Pooling_ARMCortexM(ExportNodeCpp): def exportable(cls, node): return True # TODO add check i/o NCHW -@operator_register(ExportLibAidgeARM, "FC") +@ExportLibAidgeARM.register("FC", aidge_core.ImplSpec(aidge_core.IOSpec(aidge_core.dtype.float32))) class FC_ARMCortexM(ExportNodeCpp): def __init__(self, node, mem_info, is_input, is_output): super().__init__(node, mem_info, is_input, is_output) @@ -301,19 +301,19 @@ class FC_ARMCortexM(ExportNodeCpp): def exportable(cls, node): return True # TODO add check i/o NCHW -@operator_register(ExportLibAidgeARM, "MaxPooling") +@ExportLibAidgeARM.register("MaxPooling2D", aidge_core.ImplSpec(aidge_core.IOSpec(aidge_core.dtype.float32))) class MaxPooling_ARMCortexM(Pooling_ARMCortexM): def __init__(self, node, mem_info, is_input, is_output): super().__init__(node, mem_info, is_input, is_output) self.attributes["pool_type"] = "Max" -@operator_register(ExportLibAidgeARM, "AvgPooling") +@ExportLibAidgeARM.register("AvgPooling2D", aidge_core.ImplSpec(aidge_core.IOSpec(aidge_core.dtype.float32))) class AvgPooling_ARMCortexM(Pooling_ARMCortexM): def __init__(self, node, mem_info, is_input, is_output): super().__init__(node, mem_info, is_input, is_output) self.attributes["pool_type"] = "Avg" -@operator_register(ExportLibAidgeARM, "FcReluScaling") +@ExportLibAidgeARM.register_metaop("FcReluScaling", aidge_core.ImplSpec(aidge_core.IOSpec(aidge_core.dtype.float32))) class FC_ARMCortexM(ExportNodeCpp): def __init__(self, node, mem_info, is_input, is_output): super().__init__(node, mem_info, is_input, is_output) @@ -331,7 +331,7 @@ class FC_ARMCortexM(ExportNodeCpp): str(ROOT / "_Aidge_Arm" / "kernels" / "FullyConnected" / "Fc.hpp") ] -@operator_register(ExportLibAidgeARM, "Add") +@ExportLibAidgeARM.register("Add", aidge_core.ImplSpec(aidge_core.IOSpec(aidge_core.dtype.float32))) class Add_ARMCortexM(ExportNodeCpp): def __init__(self, node, mem_info, is_input, is_output): super().__init__(node, mem_info, is_input, is_output) @@ -345,7 +345,7 @@ class Add_ARMCortexM(ExportNodeCpp): str(ROOT / "_Aidge_Arm" / "kernels" / "Utils" / "aidge_supportfunctions.h") ] -@operator_register(ExportLibAidgeARM, "Mul") +@ExportLibAidgeARM.register("Mul", aidge_core.ImplSpec(aidge_core.IOSpec(aidge_core.dtype.float32))) class Mul_ARMCortexM(ExportNodeCpp): def __init__(self, node, mem_info, is_input, is_output): super().__init__(node, mem_info, is_input, is_output) @@ -359,7 +359,7 @@ class Mul_ARMCortexM(ExportNodeCpp): str(ROOT / "_Aidge_Arm" / "kernels" / "Utils" / "aidge_supportfunctions.h") ] -@operator_register(ExportLibAidgeARM, "Softmax") +@ExportLibAidgeARM.register("Softmax", aidge_core.ImplSpec(aidge_core.IOSpec(aidge_core.dtype.float32))) class Softmax_ARMCortexM(ExportNodeCpp): def __init__(self, node, mem_info, is_input, is_output): super().__init__(node, mem_info, is_input, is_output) @@ -372,7 +372,7 @@ class Softmax_ARMCortexM(ExportNodeCpp): str(ROOT / "_Aidge_Arm" / "kernels" / "Softmax" / "aidge_softmax_chw_float32.h"), ] -@operator_register(ExportLibAidgeARM, "Sigmoid") +@ExportLibAidgeARM.register("Sigmoid", aidge_core.ImplSpec(aidge_core.IOSpec(aidge_core.dtype.float32))) class Sigmoid_ARMCortexM(ExportNodeCpp): def __init__(self, node, mem_info, is_input, is_output): super().__init__(node, mem_info, is_input, is_output) @@ -385,7 +385,7 @@ class Sigmoid_ARMCortexM(ExportNodeCpp): str(ROOT / "_Aidge_Arm" / "kernels" / "Sigmoid" / "aidge_sigmoid_float32.h"), ] -@operator_register(ExportLibAidgeARM, "MatMul") +@ExportLibAidgeARM.register("MatMul", aidge_core.ImplSpec(aidge_core.IOSpec(aidge_core.dtype.float32))) class MatMul_ARMCortexM(ExportNodeCpp): def __init__(self, node, mem_info, is_input, is_output): super().__init__(node, mem_info, is_input, is_output) @@ -399,7 +399,7 @@ class MatMul_ARMCortexM(ExportNodeCpp): # TODO: Is this used ? -# @operator_register("ConvReluScaling") +# @register("ConvReluScaling") # class ConvReluScaling_ARMCortexM(Conv_ARMCortexM): # def __init__(self, node, board, library): # super(Conv_ARMCortexM, self).__init__(node, board, library) @@ -422,7 +422,7 @@ class MatMul_ARMCortexM(ExportNodeCpp): # self.scaling = Scaling(self.operator.attr.scaling_factor, # self.operator.attr.quantized_nb_bits)("floating_point") -# @operator_register("BatchNorm") +# @register("BatchNorm") # class BatchNorm2D_ARMCortexM(ExportNode): # def __init__(self, node, board, library): @@ -480,7 +480,7 @@ class MatMul_ARMCortexM(ExportNodeCpp): # )) # return list_actions -# @operator_register("Reshape") +# @register("Reshape") # class Reshape_ARMCortexM(ExportNode): # def __init__(self, node, board, library): # super().__init__(node) @@ -526,7 +526,7 @@ class MatMul_ARMCortexM(ExportNodeCpp): # return list_actions -# @operator_register("Gather") +# @register("Gather") # class Gather_ARMCortexM(ExportNode): # def __init__(self, node, board, library): # super().__init__(node) @@ -582,7 +582,7 @@ class MatMul_ARMCortexM(ExportNodeCpp): # return list_actions -# @operator_register("Transpose") +# @register("Transpose") # class Transpose_ARMCortexM(ExportNode): # def __init__(self, node, board, library): # super().__init__(node)