3838 logger .setLevel (logging .INFO )
3939
4040
41+ class ArmCompileSpecBuilder :
42+ def __init__ (self ):
43+ self .compile_spec : List [CompileSpec ] = []
44+ self .compiler_flags = []
45+ self .output_format = None
46+ self .path_for_intermediates = None
47+ self .permute_nhwc = False
48+
49+ def ethosu_compile_spec (
50+ self ,
51+ config : str ,
52+ system_config : Optional [str ] = None ,
53+ memory_mode : Optional [str ] = None ,
54+ extra_flags : Optional [str ] = None ,
55+ config_ini : Optional [str ] = "Arm/vela.ini" ,
56+ ):
57+ """
58+ Generate compile spec for Ethos-U NPU
59+
60+ Args:
61+ config: Ethos-U accelerator configuration, e.g. ethos-u55-128
62+ system_config: System configuration to select from the Vel
63+ configuration file
64+ memory_mode: Memory mode to select from the Vela configuration file
65+ extra_flags: Extra flags for the Vela compiler
66+ config_ini: Vela configuration file(s) in Python ConfigParser .ini
67+ file format
68+ """
69+ assert (
70+ self .output_format is None
71+ ), f"Output format already set to f{ self .output_format } "
72+ self .output_format = "vela"
73+ self .compiler_flags = [
74+ f"--accelerator-config={ config } " ,
75+ f"--config={ config_ini } " ,
76+ ]
77+ if system_config is not None :
78+ self .compiler_flags .append (f"--system-config={ system_config } " )
79+ if memory_mode is not None :
80+ self .compiler_flags .append (f"--memory-mode={ memory_mode } " )
81+ if extra_flags is not None :
82+ self .compiler_flags .append (extra_flags )
83+
84+ return self
85+
86+ def tosa_compile_spec (self ):
87+ """
88+ Generate compile spec for TOSA flatbuffer output
89+ """
90+ assert (
91+ self .output_format is None
92+ ), f"Output format already set: { self .output_format } "
93+ self .output_format = "tosa"
94+ return self
95+
96+ def dump_intermediate_tosa (self , output_path : str ):
97+ """
98+ Output intermediate .tosa file
99+ """
100+ self .path_for_intermediates = output_path
101+ return self
102+
103+ def set_permute_memory_format (self , set_nhwc_permutation : bool = True ):
104+ self .permute_nhwc = set_nhwc_permutation
105+ return self
106+
107+ def build (self ):
108+ """
109+ Generate a list of compile spec objects from the builder
110+ """
111+ if self .output_format == "vela" :
112+ self .compile_spec += [
113+ CompileSpec ("output_format" , "vela" .encode ()),
114+ CompileSpec ("compile_flags" , " " .join (self .compiler_flags ).encode ()),
115+ ]
116+ elif self .output_format == "tosa" :
117+ self .compile_spec .append (CompileSpec ("output_format" , "tosa" .encode ()))
118+
119+ if self .path_for_intermediates is not None :
120+ self .compile_spec .append (
121+ CompileSpec ("debug_tosa_path" , self .path_for_intermediates .encode ())
122+ )
123+
124+ if self .permute_nhwc :
125+ self .compile_spec .append (
126+ CompileSpec ("permute_memory_format" , "nhwc" .encode ())
127+ )
128+
129+ return self .compile_spec
130+
131+
132+ def is_permute_memory (compile_spec : List [CompileSpec ]) -> bool :
133+ for spec in compile_spec :
134+ if spec .key == "permute_memory_format" :
135+ return spec .value .decode () == "nhwc"
136+ return False
137+
138+
139+ def is_tosa (compile_spec : List [CompileSpec ]) -> bool :
140+ for spec in compile_spec :
141+ if spec .key == "output_format" :
142+ return spec .value .decode () == "tosa"
143+ return False
144+
145+
146+ def get_intermediate_path (compile_spec : List [CompileSpec ]) -> str :
147+ for spec in compile_spec :
148+ if spec .key == "debug_tosa_path" :
149+ return spec .value .decode ()
150+ return None
151+
152+
41153def generate_ethosu_compile_spec (
42154 config : str ,
43155 permute_memory_to_nhwc : Optional [bool ] = None ,
@@ -46,45 +158,31 @@ def generate_ethosu_compile_spec(
46158 extra_flags : Optional [str ] = None ,
47159 config_ini : Optional [str ] = "Arm/vela.ini" ,
48160) -> List [CompileSpec ]:
49- """
50- Generate compile spec for Ethos-U NPU
51- """
52- compiler_flags = [f"--accelerator-config={ config } " , f"--config={ config_ini } " ]
53- if system_config is not None :
54- compiler_flags .append (f"--system-config={ system_config } " )
55- if memory_mode is not None :
56- compiler_flags .append (f"--memory-mode={ memory_mode } " )
57- if extra_flags is not None :
58- compiler_flags .append (extra_flags )
59-
60- compile_spec = [
61- CompileSpec ("output_format" , "vela" .encode ()),
62- CompileSpec ("compile_flags" , " " .join (compiler_flags ).encode ()),
63- ]
64-
65- if permute_memory_to_nhwc :
66- compile_spec .append (CompileSpec ("permute_memory_format" , "nhwc" .encode ()))
67-
68- return compile_spec
161+ return (
162+ ArmCompileSpecBuilder ()
163+ .ethosu_compile_spec (
164+ config ,
165+ system_config = system_config ,
166+ memory_mode = memory_mode ,
167+ extra_flags = extra_flags ,
168+ config_ini = config_ini ,
169+ )
170+ .set_permute_memory_format (permute_memory_to_nhwc )
171+ .build ()
172+ )
69173
70174
71175def generate_tosa_compile_spec (
72176 permute_memory_to_nhwc : Optional [bool ] = None ,
73177 output_path : Optional [str ] = None ,
74178) -> List [CompileSpec ]:
75- """
76- Generate compile spec for TOSA flatbuffer output
77- """
78-
79- compile_spec = [CompileSpec ("output_format" , "tosa" .encode ())]
80-
81- if permute_memory_to_nhwc :
82- compile_spec .append (CompileSpec ("permute_memory_format" , "nhwc" .encode ()))
83-
84- if output_path is not None :
85- compile_spec .append (CompileSpec ("debug_tosa_path" , output_path .encode ()))
86-
87- return compile_spec
179+ return (
180+ ArmCompileSpecBuilder ()
181+ .tosa_compile_spec ()
182+ .set_permute_memory_format (permute_memory_to_nhwc )
183+ .dump_intermediate_tosa (output_path )
184+ .build ()
185+ )
88186
89187
90188@final
0 commit comments