1919from executorch .backends .nxp .backend .edge_program_converter import (
2020 EdgeProgramToIRConverter ,
2121)
22+ from executorch .backends .nxp .backend .ir .conversion_config import ConversionConfig
2223from executorch .backends .nxp .backend .ir .tensor_formatting import TensorFormat
2324from executorch .backends .nxp .backend .neutron_converter_manager import (
2425 NeutronConverterManager ,
@@ -44,6 +45,7 @@ def __init__(self):
4445 self .output_format = None
4546 self .operators_not_to_delegate : List [str ] = []
4647 self .neutron_converter_flavor = None
48+ self .use_neutron_for_format_conversion = False
4749
4850 def _replace_colons (self , operator : str ) -> str :
4951 """
@@ -57,6 +59,7 @@ def neutron_compile_spec(
5759 neutron_converter_flavor : str ,
5860 extra_flags : Optional [str ] = None ,
5961 operators_not_to_delegate : Optional [List [str ]] = None ,
62+ use_neutron_for_format_conversion : bool = False ,
6063 ):
6164 """
6265 Generate compile spec for Neutron NPU
@@ -67,6 +70,9 @@ def neutron_compile_spec(
6770 "'neutron_converter_SDK_25_09' has flavor 'SDK_25_09'.
6871 extra_flags: Extra flags for the Neutron compiler
6972 operators_not_to_delegate: List of operators that should not be delegated
73+ use_neutron_for_format_conversion: If True, the EdgeProgramToIRConverter will insert `Transpose` ops to
74+ ensure that the IO matches the executorch partition, which will be
75+ delegated to Neutron.
7076 """
7177
7278 self .neutron_converter_flavor = neutron_converter_flavor
@@ -86,6 +92,8 @@ def neutron_compile_spec(
8692 self ._replace_colons (op ) for op in operators_not_to_delegate
8793 ]
8894
95+ self .use_neutron_for_format_conversion = use_neutron_for_format_conversion
96+
8997 return self
9098
9199 def build (self ):
@@ -104,6 +112,10 @@ def build(self):
104112 "operators_not_to_delegate" ,
105113 "," .join (self .operators_not_to_delegate ).encode (),
106114 ),
115+ CompileSpec (
116+ "use_neutron_for_format_conversion" ,
117+ f"{ self .use_neutron_for_format_conversion } " .encode (),
118+ ),
107119 ]
108120
109121 return self .compile_spec
@@ -115,6 +127,7 @@ def generate_neutron_compile_spec(
115127 system_config : Optional [str ] = None ,
116128 extra_flags : Optional [str ] = None ,
117129 operators_not_to_delegate : Optional [List [str ]] = None ,
130+ use_neutron_for_format_conversion : bool = False ,
118131) -> List [CompileSpec ]:
119132 return (
120133 NeutronCompileSpecBuilder ()
@@ -123,6 +136,7 @@ def generate_neutron_compile_spec(
123136 neutron_converter_flavor ,
124137 extra_flags = extra_flags ,
125138 operators_not_to_delegate = operators_not_to_delegate ,
139+ use_neutron_for_format_conversion = use_neutron_for_format_conversion ,
126140 )
127141 .build ()
128142 )
@@ -145,6 +159,7 @@ def preprocess( # noqa C901
145159 binary = bytes ()
146160 target = ""
147161 neutron_converter_flavor = ""
162+ use_neutron_for_format_conversion = None
148163 for spec in compile_spec :
149164 if spec .key == "output_format" :
150165 output_format = spec .value .decode ()
@@ -154,6 +169,8 @@ def preprocess( # noqa C901
154169 compile_flags .append (spec .value .decode ())
155170 if spec .key == "neutron_converter_flavor" :
156171 neutron_converter_flavor = spec .value .decode ()
172+ if spec .key == "use_neutron_for_format_conversion" :
173+ use_neutron_for_format_conversion = spec .value .decode () == "True"
157174
158175 # Check that the output format is set in the compile spec
159176 if not output_format :
@@ -180,9 +197,15 @@ def preprocess( # noqa C901
180197 ).transform ()
181198
182199 # Convert the edge program to TFLite.
200+ conversion_config = ConversionConfig (
201+ {"use_neutron_for_format_conversion" : use_neutron_for_format_conversion }
202+ if use_neutron_for_format_conversion is not None
203+ else {}
204+ )
183205 tflite_model , io_formats = EdgeProgramToIRConverter ().convert_program (
184206 edge_program ,
185207 neutron_target_spec = NeutronTargetSpec (target , neutron_converter_flavor ),
208+ conversion_config = conversion_config ,
186209 )
187210
188211 neutron_model = NeutronConverterManager (neutron_converter_flavor ).convert (
0 commit comments