diff --git a/aidge_export_arm_cortexm/_Aidge_Arm/kernels/Atan/aidge_atan.hpp b/aidge_export_arm_cortexm/_Aidge_Arm/kernels/Atan/aidge_atan.hpp new file mode 100644 index 0000000000000000000000000000000000000000..d4da329a44eb8669bc0469a31beeca670b63e6c3 --- /dev/null +++ b/aidge_export_arm_cortexm/_Aidge_Arm/kernels/Atan/aidge_atan.hpp @@ -0,0 +1,10 @@ +#include <cmath> + +template <unsigned int SIZE, typename Input_T, typename Output_T> +__attribute__((always_inline)) inline static +void aidge_atan(Input_T* __restrict input, Output_T* __restrict output) { + for (unsigned int i = 0; i < SIZE; ++i) { + // Note : no cast to get compiler warning if we lose precision during auto cast! + output[i] = std::atan(input[i]); + } +} diff --git a/aidge_export_arm_cortexm/_Aidge_Arm/kernels/Atan/aidge_atan_float32.c b/aidge_export_arm_cortexm/_Aidge_Arm/kernels/Atan/aidge_atan_float32.c deleted file mode 100644 index 469f3aec9364ea16c715cbf39e6e9d31213c246e..0000000000000000000000000000000000000000 --- a/aidge_export_arm_cortexm/_Aidge_Arm/kernels/Atan/aidge_atan_float32.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <math.h> - -void aidge_atan_float32 (float* input, - float* output, - unsigned int size) -{ - for (unsigned int i = 0; i < size; ++i) { - output[i] = atanf(input[i]); - } -} diff --git a/aidge_export_arm_cortexm/_Aidge_Arm/templates/configuration/atan.jinja b/aidge_export_arm_cortexm/_Aidge_Arm/templates/configuration/atan.jinja new file mode 100644 index 0000000000000000000000000000000000000000..70ab97008b2cc15ab00b132d5f96c696d7d61415 --- /dev/null +++ b/aidge_export_arm_cortexm/_Aidge_Arm/templates/configuration/atan.jinja @@ -0,0 +1,9 @@ +{#- For name header -#} +#ifndef {{ name|upper }}_LAYER_H +#define {{ name|upper }}_LAYER_H + +{% include "./_meminfo.jinja" %} + +#define {{ name|upper }}_OUTPUTS_SIZE {{ out_chan[0] * out_height[0] * out_width[0] }} + +#endif /* {{ name|upper }}_LAYER_H */ diff --git a/aidge_export_arm_cortexm/_Aidge_Arm/templates/configuration/elemwise.jinja b/aidge_export_arm_cortexm/_Aidge_Arm/templates/configuration/elemwise.jinja index dc3bdc00f90f903f116f42e4825dc7613b2a2180..4651bd47002f994097b233825f32e399c0c6995a 100644 --- a/aidge_export_arm_cortexm/_Aidge_Arm/templates/configuration/elemwise.jinja +++ b/aidge_export_arm_cortexm/_Aidge_Arm/templates/configuration/elemwise.jinja @@ -16,6 +16,5 @@ #define {{in_name[0]|upper}}_NB_DIM {{ in_dims[0]|length}} #define {{in_name[1]|upper}}_NB_DIM {{ in_dims[1]|length}} #define {{out_name[0]|upper}}_NB_DIM {{ out_dims[0]|length}} -#define {{ name|upper }}_ELEM_OP {{ elemwise_op }} #endif /* {{ name|upper }}_LAYER_H */ diff --git a/aidge_export_arm_cortexm/_Aidge_Arm/templates/forward_call/atan.jinja b/aidge_export_arm_cortexm/_Aidge_Arm/templates/forward_call/atan.jinja new file mode 100644 index 0000000000000000000000000000000000000000..3bd5ea111bddf2f4cca2fcc401fc3b5bb3256833 --- /dev/null +++ b/aidge_export_arm_cortexm/_Aidge_Arm/templates/forward_call/atan.jinja @@ -0,0 +1,4 @@ +{% if not is_output %} +{{out_cdtype[0]}}* {{out_name[0]}} = ({{out_cdtype[0]}}*) mem + {{out_name[0]|upper}}_OFFSET; +{% endif %} +aidge_atan <{{name|upper}}_OUTPUTS_SIZE> ({{in_name[0]}}, {{out_name[0]}}); diff --git a/aidge_export_arm_cortexm/_Aidge_Arm/templates/forward_call/elemwise.jinja b/aidge_export_arm_cortexm/_Aidge_Arm/templates/forward_call/elemwise.jinja index c4ca30d6f9ef7cab5fbc3f260b23275feed3b6f0..98d6cc95682c27cc1b7468e6972653ecf0189ca9 100644 --- a/aidge_export_arm_cortexm/_Aidge_Arm/templates/forward_call/elemwise.jinja +++ b/aidge_export_arm_cortexm/_Aidge_Arm/templates/forward_call/elemwise.jinja @@ -1 +1 @@ -aidge_{{elemwise_type|lower}}_{{dtype[0]}} ({{in_name[0]}}, {{in_name[1]}}, {{out_name[0]}}, {{in_name[0]}}_DIMS, {{in_name[1]}}_DIMS, {{out_name[0]}}_DIMS,{{in_name[0]|upper}}_NB_DIM,{{in_name[1]|upper}}_NB_DIM,{{out_name[0]|upper}}_NB_DIM, {{name|upper}}_OUTPUTS_SIZE); +aidge_{{elemwise_op|lower}}_{{out_dtype[0]}} ({{in_name[0]}}, {{in_name[1]}}, {{out_name[0]}}, {{in_name[0]}}_DIMS, {{in_name[1]}}_DIMS, {{out_name[0]}}_DIMS,{{in_name[0]|upper}}_NB_DIM,{{in_name[1]|upper}}_NB_DIM,{{out_name[0]|upper}}_NB_DIM, {{name|upper}}_OUTPUTS_SIZE); diff --git a/aidge_export_arm_cortexm/operators.py b/aidge_export_arm_cortexm/operators.py index dd6ce2e713389940fd4c2b5b63d05b526eaf929f..8df1bfeaf9bbe6a4394c1bcb4cacc3d5d877d249 100644 --- a/aidge_export_arm_cortexm/operators.py +++ b/aidge_export_arm_cortexm/operators.py @@ -345,6 +345,20 @@ class Add_ARMCortexM(ExportNodeCpp): str(ROOT / "_Aidge_Arm" / "kernels" / "Utils" / "aidge_supportfunctions.h") ] +@ExportLibAidgeARM.register("Sub", 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) + self.attributes["elemwise_op"] = "\"SUB\"" + + self.config_template = str(ROOT / "_Aidge_Arm" / "templates" / "configuration" / "elemwise.jinja") + self.forward_template = str(ROOT / "_Aidge_Arm" / "templates" / "forward_call" / "elemwise.jinja") + self.include_list = [] + self.kernels_to_copy = [ + str(ROOT / "_Aidge_Arm" / "kernels" / "Sub" / "aidge_sub_float32.h"), + str(ROOT / "_Aidge_Arm" / "kernels" / "Utils" / "aidge_supportfunctions.h") + ] + @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): @@ -372,6 +386,19 @@ class Softmax_ARMCortexM(ExportNodeCpp): str(ROOT / "_Aidge_Arm" / "kernels" / "Softmax" / "aidge_softmax_chw_float32.h"), ] +@ExportLibAidgeARM.register("Atan", aidge_core.ImplSpec(aidge_core.IOSpec(aidge_core.dtype.float32))) +class Atan_ARMCortexM(ExportNodeCpp): + def __init__(self, node, mem_info, is_input, is_output): + super().__init__(node, mem_info, is_input, is_output) + + self.config_template = str(ROOT / "_Aidge_Arm" / "templates" / "configuration" / "atan.jinja") + self.forward_template = str(ROOT / "_Aidge_Arm" / "templates" / "forward_call" / "atan.jinja") + self.include_list = [] + self.kernels_to_copy = [ + str(ROOT / "_Aidge_Arm" / "kernels" / "Atan" / "aidge_atan.hpp"), + ] + + @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):