
    pi4                         d dl Z d dlmZ d dlZd dlmZmZ d Z G d d      Zd Zd Z	d	 Z
d
 Zd Zd Zedk(  r e        yy)    N)ArgumentParser)TensorProtohelperc                 V   dgt        | j                        z  }i }g }t        | j                        D ]{  \  }}t        d |j                  D              ||<   ||   dk(  r|j                  | j                  |          L|j                  D ]!  }||vr|g||<   ||   j                  |       # } | j                  D cg c]  }|j                   }}| j                  D 	cg c]  }	|	j                   }
}	||
z   }|j                          d }|D ]K  }||k(  r	|}||v s||   D ]4  }||   dz
  ||<   ||   dk(  s|j                  | j                  |          6 M d}t        |      }||k  re||   j                  D ]H  }||v s||   D ]9  }||   dz
  ||<   ||   dk(  s|j                  | j                  |          |dz   }; J |dz   }||k  re|t        | j                        k(  sJ d       | j                  d       | j                  j                  |       y c c}w c c}	w )Nr   c              3   &   K   | ]	  }|sd   yw)   N ).0_s     f/opt/services/ai/voice_agent/venv/lib/python3.12/site-packages/onnxruntime/tools/qnn/add_trans_cast.py	<genexpr>z)graph_topological_sort.<locals>.<genexpr>   s     ">A1">s   r   zGraph is not a DAGnode)lenr   	enumeratesuminputappendinitializernamesortoutput
ClearFieldextend)graph
deps_countdeps_to_nodessorted_nodesnode_idxr   
input_nameinitinitializer_namesr   graph_input_namesinput_namesprev_input_namestartendr   s                   r   graph_topological_sortr'      sk   s5::&JML#EJJ/ ;$"">djj">>
8h1$

8 45** 	;J.-5Jj)j)00:		;; 05/@/@AtAA16===#&77KO! 	>
j($&)*5 >'1(';a'?
8$h'1, ''

8(<=>	> E
l
C
#+"5)00 	&F& -f 5 &H+5h+?!+CJx(!(+q0$++EJJx,@A!Ag	&	& 	 #+ #ejj/!7#77!	V	JJl#? B=s   ?H!"H&c                       e Zd Zd Zy)QnnTensorStructc                 J    d| _         t        j                  | _        g | _        y )N )r   r   FLOATonnx_data_typedim)selfs    r   __init__zQnnTensorStruct.__init__B   s    	)//    N)__name__
__module____qualname__r0   r	   r1   r   r)   r)   A   s    r1   r)   c                 ,   | dk(  s| dk(  rt         j                  S | dk(  s| dk(  rt         j                  S | dk(  s| dk(  rt         j                  S | dk(  rt         j                  S | dk(  s| d	k(  rt         j
                  S | d
k(  s| dk(  rt         j                  S | dk(  s| dk(  rt         j                  S | dk(  rt         j                  S | dk(  rt         j                  S | dk(  rt         j                  S | dk(  rt         j                  S t         j                  S )Ni  i  i  i  i2  i2  id  i     i     i2  2   d   i  i2  i  )r   UINT8UINT16UINT32UINT64INT8INT16INT32INT64FLOAT16r,   BOOL	UNDEFINED)qnn_data_types    r   qnn_data_type_to_onnx_data_typerF   H   s   -6"9   	&	 MV$;!!!	&	 MV$;!!!	&	 !!!	&	 MV$;	&	 MV$;   	&	 MV$;   	&	    	&	 """	&	    	&	 $$$r1   c                    t        |       5 }t        j                  |      }d|v sJ d       d|d   v sJ d       |d   d   j                         D ]\  \  }}d|v rd|v rd|v sJ d       |d   d	k(  s	|d   d
k(  s*t	               }||_        t        |d         |_        |d   |_        |||<   ^ 	 d d d        t        |      d
kD  sJ d       y # 1 sw Y   xY w)Nr   z4QNN converted json file not valid. Can't find graph.tensorsz6QNN converted json file not valid. Can't find tensors.type	data_typedimszDQNN converted json file not valid. Can't find some keys from tensorsr   r   zJConverted QNN model not valid. It should have at least 1 input & 1 output.)
openjsonloaditemsr)   r   rF   r-   r.   r   )qnn_json_file_pathqnn_input_output_tensor_dicqnn_json_fileqnn_jsonqnn_tensor_nameqnn_tensor_attribute
qnn_tensors          r   parse_qnn_json_filerW   n   s6   	 	! J]99]+("Z$ZZ"HW--g/gg-5=g5Fy5Q5W5W5Y 	J1O1 ..#7722V V	V3 $F+q04H4PTU4U,.
"1
,KL`alLm,n
)!5f!=
?I+O<	J	J$ *+a/ T/%J Js   A.C;5CCc                      t               t              k(  sJ d       t         fdt        t                     D              S )Nz,Onnx shape and Qnn shape has different rank.c              3   H   K   | ]  }|   j                   |   k(    y w)N)	dim_value)r
   i	onnx_dimsqnn_dimss     r   r   z4compare_onnx_shape_with_qnn_shape.<locals>.<genexpr>   s$     Ty|%%!4Ts   ")r   allrange)r\   r]   s   ``r   !compare_onnx_shape_with_qnn_shaper`      s9    y>S]*Z,ZZ*TeC	N>STTTr1   c                     | dkD  sJ d       g }|j                  d       |j                  | dz
         t        d| dz
        D ]  }|j                  |        |S N   z,Shape rank should >2 for the Transpose node.r   r   r   r_   rankpermr[   s      r   gen_to_channel_first_permrh      s`    !8CCC8DKKNKKq1dQh A Kr1   c                     | dkD  sJ d       g }|j                  d       t        d|       D ]  }|j                  |        |j                  d       |S rb   rd   re   s      r   gen_to_channel_last_permrj      sT    !8CCC8DKKN1d^ AKKNKr1   c                  D   t        d      } | j                  ddddt               | j                  ddd	dt               | j                         }i }t	        |j
                  |       t        j                  |j                        }g }i }|j                  j                  D ]>  }|j                  |v r|j                  }||j                     }|j                  j                  j                  |j                  k7  r|}	|	d
z   }
t!        j"                  d|
|	g|
g|j                  j                  j                        }|j                  |j                  j                  _        |j%                  |g       |
}|
||j                  <   t'        |j                  j                  j(                  j*                  |j*                        r$t-        t/        |j                  j                  j(                  j*                              }|}|dz   }t!        j"                  d||g|g|      }|j%                  |g       |||j                  <   t1        t/        |j                  j                  j(                  j*                              D ]A  }|j*                  |   |j                  j                  j(                  j*                  |   _        C &t5        d|j                  z   dz          |j                  j6                  D ]7  }|j                  |v r|j                  }||j                     }|j                  j                  j                  |j                  k7  ru|}
|
d
z   }	t!        j"                  d|	|	g|
g|j                        }|j                  |j                  j                  _        |j%                  |g       |	}|	||j                  <   t'        |j                  j                  j(                  j*                  |j*                        rt9        t/        |j                  j                  j(                  j*                              }|}|dz   }t!        j"                  d||g|g|      }|j%                  |g       |||j                  <   t1        t/        |j                  j                  j(                  j*                              D ]N  }||j                     j*                  |   |j                  j                  j(                  j*                  |   _        P t5        d|j                  z   dz          |j                  j:                  D ]j  }t=        |j                        D ]  \  }}||v s||   |j                  |<    t=        |j6                        D ]  \  }}||v s||   |j6                  |<    l |j                  j:                  j%                  |       t?        |j                         t        j@                  ||j                  jC                  dd             y )NzbInsert Cast, Transpose nodes into Onnx model to make it aligned with QNN generated context binary.z-mz--onnx_modelz"Required. Path to Onnx model file.T)helprequiredrI   z-qz
--qnn_jsonz4Required. Path to Qnn converted model_net.json file.	_qnn_castCast)r   inputsoutputsto
_qnn_trans	Transpose)r   rp   rq   rg   zError: Onnx model input: z  not exist from QNN model input.zError: Onnx model output: z! not exist from QNN model output.z.onnxz_add_trans.onnx)"r   add_argumentstr
parse_argsrW   rS   onnxrN   
onnx_modelr   r   r   rI   tensor_type	elem_typer-   r   	make_noder   r`   shaper.   rh   r   r_   rZ   AssertionErrorr   rj   r   r   r'   savereplace)parserargsrQ   modelnodes_to_addgraph_input_output_name_dicgraph_inputinput_name_fater_node_insertqnn_input_tensorcast_input_namecast_output_nameinput_cast_nodetranspose_permtranspose_input_nametranspose_output_nameinput_transpose_noder[   graph_outputoutput_name_after_node_insertqnn_output_tensoroutput_cast_nodeoutput_transpose_noder   node_input_index
node_inputnode_output_indexnode_outputs                              r   mainr      s   lF n3Wbfmpq
l!Wbfmp   D #%'BCIIdoo&EL"${{(( )v::+6+;+;(:;;K;KL++559I9X9XX">#2[#@ "("2"2)+,-."''33==# :J9X9X  ,,6##_$56/?,@P+K,<,<=4[5E5E5Q5Q5W5W5[5[]m]q]qr!:3{?O?O?[?[?a?a?e?e;f!g'C$(<|(K%'-'7'7.0123'($ ##%9$:;@U+K,<,<= s;#3#3#?#?#E#E#I#IJK bAJZJ^J^_`JaK$$0066::1=Gb !!<{?O?O!ORt!tuuS)vV ** +y ;;,8,=,=) ;L<M<M N  ,,66:K:Z:ZZ#@ "2["@#)#3#3(+,-.(77$  ;L:Z:Z!!--7##%5$670?-AP+L,=,=>4\5F5F5R5R5X5X5\5\^o^s^st!9#l>O>O>[>[>a>a>e>e:f!g(E%'<|'K$(.(8(8-0123')% ##%:$;<AU+L,=,=> s<#4#4#@#@#F#F#J#JKL AKf$))Lc!LL%%1177;;A>H
 !!=@Q@Q!QTw!wxxW+yZ    	Z,5djj,A 	W(j88/J:/V

+,	W
 /8.D 	Z*{991L[1Y-.	Z	Z 
KKL)5;;' 	IIeT__,,W6GHIr1   __main__)rM   argparser   rx   r   r   r'   r)   rF   rW   r`   rh   rj   r   r2   r	   r1   r   <module>r      sZ     #  $1$h #%L0U
{J| zF r1   