
    fPi4                         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             dS dS )    N)ArgumentParser)TensorProtohelperc                 8   dgt          | j                  z  }i }g }t          | j                  D ]\  }}t          d |j        D                       ||<   ||         dk    r!|                    | j        |                    S|j        D ](}||vr|g||<   ||                             |           )d | j        D             }d | j        D             }||z   }	|	                                 d }
|	D ]T}|
|k    r	|}
||v rE||         D ]<}||         dz
  ||<   ||         dk    r |                    | j        |                    =Ud}t          |          }||k     ri||         j        D ]P}||v rJ||         D ]A}||         dz
  ||<   ||         dk    r%|                    | j        |                    |dz   }BQ|dz   }||k     i|t          | j                  k    s
J d            | 	                    d           | j        
                    |           d S )Nr   c              3      K   | ]}|d V  	dS )   N ).0_s     x/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/onnxruntime/tools/qnn/add_trans_cast.py	<genexpr>z)graph_topological_sort.<locals>.<genexpr>   s'      ">">A">1">">">">">">    c                     g | ]	}|j         
S r	   name)r
   inits     r   
<listcomp>z*graph_topological_sort.<locals>.<listcomp>   s    AAAtAAAr   c                     g | ]	}|j         
S r	   r   )r
   inputs     r   r   z*graph_topological_sort.<locals>.<listcomp>    s    ======r   r   zGraph is not a DAGnode)lenr   	enumeratesumr   appendinitializersortoutput
ClearFieldextend)graph
deps_countdeps_to_nodessorted_nodesnode_idxr   
input_nameinitializer_namesgraph_input_namesinput_namesprev_input_namestartendr   s                 r   graph_topological_sortr,      s   s5:&JML#EJ// ; ;$"">">dj">">">>>
8h1$$
8 4555* 	; 	;J..-5Jj))j)00::::		; BAu/@AAA=====#&77KO! 	> 	>
j(($&&)*5 > >'1(';a'?
8$h'1,, ''
8(<===E
l

C
#++"5)0 	& 	&F&& -f 5 & &H+5h+?!+CJx(!(+q00$++EJx,@AAA!Ag	 #++ #ej//!!!#7!!!	V	Jl#####r   c                       e Zd Zd ZdS )QnnTensorStructc                 D    d| _         t          j        | _        g | _        d S )N )r   r   FLOATonnx_data_typedim)selfs    r   __init__zQnnTensorStruct.__init__B   s    	)/r   N)__name__
__module____qualname__r5   r	   r   r   r.   r.   A   s#            r   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FLOAT16r1   BOOL	UNDEFINED)qnn_data_types    r   qnn_data_type_to_onnx_data_typerJ   H   s#   -6"9"9  	&	 	 MV$;$;!!	&	 	 MV$;$;!!	&	 	 !!	&	 	 MV$;$;	&	 	 MV$;$;  	&	 	 MV$;$;  	&	 	   	&	 	 ""	&	 	   	&	 	 $$r   c                 &   t          |           5 }t          j        |          }d|v s
J d            d|d         v s
J d            |d         d                                         D ]t\  }}d|v rd|v rd|v s
J d            |d         d	k    s|d         d
k    rAt	                      }||_        t          |d                   |_        |d         |_        |||<   u	 d d d            n# 1 swxY w Y   t          |          d
k    s
J d            d S )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   rJ   r2   r3   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_filer[   n   s   	 	!	! J]9]++("""$Z"""HW----/g---5=g5Fy5Q5W5W5Y5Y 	J 	J1O1 ...#7772222U 323 $F+q004H4PTU4U4U,..
"1
,KL`alLm,n,n
)!5f!=
?I+O<	J	J J J J J J J J J J J J J J J$ *++a///T 0////s   CC))C-0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   F   K   | ]}|         j         |         k    V  d S )N)	dim_value)r
   i	onnx_dimsqnn_dimss     r   r   z4compare_onnx_shape_with_qnn_shape.<locals>.<genexpr>   s3      TTy|%!4TTTTTTr   )r   allrange)r`   ra   s   ``r   !compare_onnx_shape_with_qnn_shaperd      s^    y>>S]]***,Z***TTTTTeC	NN>S>STTTTTTr   c                     | dk    s
J d            g }|                     d           |                     | dz
             t          d| dz
            D ]}|                     |           |S N   z,Shape rank should >2 for the Transpose node.r   r   r   rc   rankpermr_   s      r   gen_to_channel_first_permrl      ss    !888C888DKKNNNKKq1dQh  AKr   c                     | dk    s
J d            g }|                     d           t          d|           D ]}|                     |           |                     d           |S rf   rh   ri   s      r   gen_to_channel_last_permrn      sf    !888C888DKKNNN1d^^  AKKNNNKr   c                  	   t          d          } |                     ddddt                     |                     ddd	dt                     |                                 }i }t	          |j        |           t          j        |j                  }g }i }|j	        j
        D ]}|j        |v r|j        }||j                 }|j        j        j        |j        k    ri|}	|	d
z   }
t!          j        d|
|	g|
g|j        j        j                  }|j        |j        j        _        |                    |g           |
}|
||j        <   t'          |j        j        j        j        |j                  st-          t/          |j        j        j        j                            }|}|dz   }t!          j        d||g|g|          }|                    |g           |||j        <   t1          t/          |j        j        j        j                            D ].}|j        |         |j        j        j        j        |         _        /t5          d|j        z   dz             |j	        j        D ]}|j        |v r|j        }||j                 }|j        j        j        |j        k    r_|}
|
d
z   }	t!          j        d|	|	g|
g|j                  }|j        |j        j        _        |                    |g           |	}|	||j        <   t'          |j        j        j        j        |j                  st9          t/          |j        j        j        j                            }|}|dz   }t!          j        d||g|g|          }|                    |g           |||j        <   t1          t/          |j        j        j        j                            D ]9}||j                 j        |         |j        j        j        j        |         _        :t5          d|j        z   dz             |j	        j        D ]^}t=          |j
                  D ]\  }}||v r||         |j
        |<   t=          |j                  D ]\  }}||v r||         |j        |<   _|j	        j                            |           t?          |j	                   t          j         ||j        !                    dd                     d S )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requiredrM   z-qz
--qnn_jsonz4Required. Path to Qnn converted model_net.json file.	_qnn_castCast)r   inputsoutputsto
_qnn_trans	Transpose)r   rt   ru   rk   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_argsr[   rW   onnxrR   
onnx_modelr    r   r   rM   tensor_type	elem_typer2   r   	make_noder   rd   shaper3   rl   r   rc   r^   AssertionErrorr   rn   r   r   r,   savereplace)parserargsrU   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qq
l!Wbfmp     D #%'BCCCIdo&&EL"${( )v )v:::+6+;(:;;KL+59I9XXX">#2[#@ "("2)+,-."'3=# # # :J9X ,6##_$5666/?,@P+K,<=4[5E5Q5W5[]m]qrr b!:3{?O?[?a?e;f;f!g!g'C$(<|(K%'-'7.0123'( ( ($ ##%9$:;;;@U+K,<= s;#3#?#E#IJJKK b bAJZJ^_`JaK$06:1=GG !<{?O!ORt!tuuu* +y +y ;;;,8,=) ;L<M N ,6:K:ZZZ#@ "2["@#)#3(+,-.(7$ $ $  ;L:Z!-7##%5$67770?-AP+L,=>4\5F5R5X5\^o^stt !9#l>O>[>a>e:f:f!g!g(E%'<|'K$(.(8-0123') ) )% ##%:$;<<<AU+L,=> s<#4#@#F#JKKLL  AKf$)L!LL%17;A>HH !!=@Q!QTw!wxxx  	Z 	Z,5dj,A,A 	W 	W(j888/J:/V
+,.7.D.D 	Z 	Z*{9991L[1Y-.	Z
 
KL)))5;''' 	IeT_,,W6GHHIIIIIr   __main__)rQ   argparser   r|   r   r   r,   r.   rJ   r[   rd   rl   rn   r   r6   r	   r   r   <module>r      s    # # # # # #  $ $ $ $ $ $ $ $1$ 1$ 1$h       #% #% #%L  0U U U
    {J {J {J| zDFFFFF r   