
    UHjH                       d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ddl
mZ ej                  j                  d e e	e      j!                         j"                               ddlmZmZ  e	e      j!                         j*                  d   Zedz  Zd	Zd
ZddZddZddZddZddZd dZd!dZ d"dZ!d#dZ"d$dZ#	 	 	 	 	 	 	 	 	 	 d%dZ$d&dZ%d&dZ&efd'dZ'	 	 	 	 	 	 	 	 	 	 d%dZ(d(dZ)e*dk(  r e)        yy))zYCheck whether the current frontier branch reuses the slot selected by the nearest writer.    )annotationsN)Path)Any)read_sectionsva_to_offset   outmap1_01amap2_02dc                    d| dS )N0x08x values    L/home/exedev/hwanse/tools/summarize_save_selector_branch_gate_consistency.pyhex32r          c{    c                    d| dS )Nr   02xr   r   s    r   hex8r      r   r   c                "    | rt        | d      S d S )N   )intr   s    r   	parse_hexr       s    "3ub>,,r   c                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)pathfallbacks     r   	load_jsonr'   $   s*    ;;=::dnngn677r   c                v    t        ||      }||dz   t        |       kD  ry t        j                  d| |      d   S )N   z<Ir   )r   lenstructunpack_from)exesectionsvaoffsets       r   dword_atr1   *   s?    (B'F~!c#h.dC033r   c                    | dk(  rdS dS )Nr   primaryBranchStatesecondaryBranchStater   )stream_plus_1s    r   state_tabler6   1   s    #0A#5Q;QQr   c                Z   | dz  }| dz	  dz  }| dz	  dz  }t        |      }|t        |      | t        |       |t        |      t        |      |t        |      |d
}|dk(  r"d|d<   ||d<   t        |      |d<   |d	k  |d
<   |S |dk(  rd|d<   |S |dk(  rd|d<   |S |dk(  rd|d<   |S d|d<   |S )N      r   )
r/   vaHexr   valueHexopcode	opcodeHexstreamPlus1HexselectionBufferOffsetselectionBufferOffsetHex
stateTablefillBranchStateTable	operationhelperArgumenthelperArgumentHex   validHelperDispatch   readSelectedStateAndBranch   selectActiveStateSlot   selectMatchingRuntimeSlotother)r6   r   r   )r   r/   r<   r5   stream_plus_2tablerows          r   decode_selection_wordrR   5   s   T\FaZ4'Mb[D(M&Er%L&\}-!.$($7C ~1K -#'#6 %2d%:!" J 
47K J 
42K
 J	 
46K J #KJr   c                    g }t        ||d      D ]7  }t        | ||      }|t        ||      }|d   dv s'|j                  |       9 |S )Nr)   r<   >   r   rH   rJ   rL   )ranger1   rR   append)r-   r.   start_vaend_varowsr/   r   rQ   s           r   scan_selection_wordsrY   V   sa    DHfa( h+=#E2.x=44KK Kr   c                D    t        | D ch c]  }|d   	 c}      S c c}w )Nr@   )sortedrX   rQ   s     r   offset_hexesr]   b   s!    dCs312CDDCs   c                ~    | D ]7  }|j                  d      t        k(  s|j                  d      t        k(  s5|c S  i S )Nsourcetarget)getROUTE_SOURCEROUTE_TARGETr\   s     r   first_routerd   f   s>     778,1Bl1RJ Ir   c           
     J   t        |       }t        |      }t        |      }|j                  d      xs i }t        |j                  d            }t        |j                  d            }	||	t	        d      t        | ||      }
t        | ||	      }|
|t	        d      t        |
|      }t        ||	      }t        | |||	      }|D cg c]  }|d   |kD  s| }}|D cg c]  }|d   dv r|d	   |d	   k(  r| }}|D cg c]  }|d   d
k(  r|d	   |d	   k(  r| }}|D cg c]  }|d   dv r|d	   |d	   k7  r| }}|D cg c]%  }|d   dk(  r|d   dk(  r|j                  d      r|' }}|D cg c]%  }|d   dk(  r|d   dk(  r|j                  d      s|' }}|d   dk(  xr" |d   d
k(  xr |d   |d   k(  xr |d	   |d	   k(  }|j                  d      xs i }|j                  d      xs i }|j                  d      du }|j                  d      du }|xr | xr | xr |xr |}|rdnd}d}i dt        dt        d|d   d|d   d|d|d|d|r|d   nd d|r|d    nd d!|d    d"|d    d#t        |      d$t        |      d%t        |      d&t        |      d't        |      d(t        |      d)t        |      i d*t        |      d+|d,|d-|d.|d/|d0|d1|j                  d2      |||j                  d3      d4d5|j                  d6      |j                  d7      |j                  d8      |j                  d9      |j                  d:      d;d<|d=|d>dd?dd@ddAdBdC|S c c}w c c}w c c}w c c}w c c}w c c}w )DNnearestLinearWriterwriterVaHexfrontierReaderVaHexz(missing current writer/reader route rowsz#could not read writer/reader dwordsr/   r<   >   rJ   rL   r?   rH   r   rA   r4   rG   rJ   helpernoDirectGlobalSecondaryWriterT#onlyDirectCallInsideOpcode10Handlerz+same-selection-slot-preserved-known-opcodesz%same-selection-slot-preservation-openaR  The nearest writer and frontier reader use the same secondaryBranchState table and selectionBuffer[0x20]. Between 0x005428bc and 0x00542b0c, the scan finds no later selectionBuffer[0x20] writer/read and no valid secondaryBranchState opcode 0x10 fill. The later selection writes use other offsets and the intervening secondary fills use out-of-range helper arguments, so the known-opcode model preserves the selected slot. This still does not prove the selected state value is 1, does not prove the control path reaches the frontier reader, and does not provide a strict map1_01a source hotspot.r_   r`   nearestWriterVaHexr:   writerreadersameTableAndOffsetsameTableNamesameSelectionBufferOffsetHexr@   scanRangeHexz..selectionOpcodeRowsBetweenCountpostWriterSameOffsetWriteCountpostWriterSameOffsetReadCountpostWriterOtherOffsetWriteCount$postWriterOtherOffsetWriteOffsetsHexvalidSecondaryFillBetweenCount invalidSecondaryFillBetweenCountinvalidSecondaryFillOffsetsHexsameOffsetWritesAfterWritersameOffsetReadsAfterWriterotherOffsetWritesAfterWritervalidSecondaryFillsBetweeninvalidSecondaryFillsBetweenselectionOpcodeRowsBetweensecondaryResetScoperangeHexglobalResetRuledOut)secondaryRangeHexrj   %helperOnlyCalledInsideOpcode10Handlerr   gateBoundarydispatchStopVaHexdispatchStopOpcodeHexdispatchStopHandlerVaHexdispatchStopHandlerSectiondispatchStopIsCodeHandler)r   r   r   r   r   "knownOpcodeStatePreservationStatusstatePreservedByKnownOpcodes%branchStateValueStillRuntimeDependentcontrolPathStillUnprovenstrictHotspotStillMissingpromotionStatusblocked
conclusion)r   rd   ra   r   
ValueErrorr1   rR   rY   rb   rc   r*   r]   )r-   writer_chain_rowsgate_path_rowssecondary_reset_scoper.   chaingatenearest	writer_va	reader_vawriter_valuereader_valuerm   rn   between_rowsrQ   after_writer_rowssame_offset_writes_aftersame_offset_reads_afterother_offset_writes_aftervalid_secondary_fills_betweeninvalid_secondary_fills_betweensame_table_and_offsetsecondary_tableri   !no_direct_global_secondary_writerhelper_only_opcode10state_preservedpreservation_statusr   s                                 r   summarize_betweenr   m   s    S!H)*E~&Dii-.4"G'++m45I%))$9:;II-CDDC95LC95L|3>??"<;F"<;F'Xy)LL(4ND	I8MNN( x=L('(F3J,KK 	    )x=D '(F3J,KK 	  )!x=L('(F3J,KK 	! ! )%x=D !77GG)* 	%! % )'x=D !77-. 	'# ' 	xD  	O8$	O< F<$88	O *+v6M/NN	  ,//0FGM2O"&&x06BF(=(A(ABa(bfj(j%!::&KLPTT 	!((	!--	! .	! !   	64 	^ -,-,- 	fWo- 	vg	-
 	&- 	&- 	3- 	1F-D- 	'Nc/I(Jim- 	6'?+2fWo->?- 	*3|+<- 	)#.F*G- 	(-D)E- 	*3/H+I- 	/=V0W-  	)#.K*L!-" 	+C0O,P#-$ 	),7V*W%-& 	&'?'-( 	%&=)-* 	'(A+-, 	%&C--. 	'(G/-0 	%l1-2 	!0!4!4Z!@-N5I#8#<#<=R#S	 
3-> 	!%*=!>%)XX.E%F(,1K(L*.((3O*P)-2M)N
?-L 	-.AM-N 	'O-P 	0Q-R 	#DS-T 	$TU-V 	9W-X 	jY- -w O 

!
%'s*   NN%NN(N	*N9*N c                n   | d   }| d   }| d   }| d   }g ddd| d    d	| d
    d| d    d|d    d|d    d| d    d|d    d|d    d| d    d| d    d| d    dd| d    d| d    d| d    d d!j                  | d"         xs d# dd$| d%    d&| d'    d d!j                  | d(         xs d# dd)|d*    d+|d,    d-| d.    d/d0| d1    d2| d3    d4| d5    d6| d7    d8| d9    d| d:   dd;dd<|d=    d/d>|d?    d@|dA    dB|dC    dD|dE    ddFddGdH}| dI   D ]P  }|j                  dJ      }|j                  dK|dL    dM|d    dM|dN    dO|d    dP|dQ    dR|dS    dO||nd# dT       R |j                  d       dUj                  |      S )VNrm   rn   r   r   z'# Save Selector Branch Gate Consistency z	- route: r_   z -> r`   z- writer: `rl   z` `r;   z` rC   z- reader: `rh   z- same table and offset: ro    (rp   z `rq   z`)z- later same-offset writes: rt   z2- later same-offset reads before frontier reader: ru   z- later other-offset writes: rv   z (`, rw   -z!- valid secondary fills between: rx   z#- invalid secondary fills between: ry   rz   z%- no direct global secondary writer: rj   z1- helper only called inside opcode 0x10 handler: r   z%- known-opcode preservation status: `r   `z$- state preserved by known opcodes: r   z.- branch state value still runtime-dependent: r   z- control path still unproven: r   z - strict hotspot still missing: r   z- promotion status: r   r   z## Boundaryz- secondary table: `r   z- dispatch stop: `r   z
` opcode `r   z` handler `r   z` in r   z2## Selection Opcode Rows Between Writer And Readerz@| va | value | op | operation | table | offset | helper valid? |z+| --- | --- | --- | --- | --- | --- | --- |r   rG   z| `r:   z` | `r=   z` | z | rA   z | `r@   z |
)joinra   rU   )summaryrm   rn   resetr   linesrQ   helper_valids           r   markdownr      sk   XFXF)*E>"D 1 
  GH%&d78+<*=>  g234Cz8J7K2fU`NaMbc	 
 g345S
9K8LBvVaObNcd  $G,@$A#B"W_E]D^^`ah  jH  bI  aJ  JL  	M  'w/O'P&QR  =WEd=e<fg  (0Q(R'SSVW[W`W`ah  jP  bQ  XR  XY  VY  WZ  Z\  	]  ,G4T,U+VW  .g6X.Y-ZZ]^b^g^gho  qQ  iR  _S  _Z  WZ  ^[  []  	^  06U0V/WX  <EBi<j;kl  08\0]/^^_`  /w7U/V.WX   9Ah9i8jk! " *'2L*M)NO# $ +73N+O*PQ% & w'89:;' ( 	) * 	+ , 	- . 	/ 0 	1 2 u%89:!<3 4 T"567z$G^B_A``klp  rL  mM  lN  NS  TX  Yu  Tv  Sw  	x5 6 	7 8 	=9 : 	; < 	K= > 	6? EB 34 
ww45#g,uS_$5U3{;K:LD; C$5#6d3?Y;Z:[[_+7|SAE	

 
LL99Ur   c                   | d   }| d   }| d   }| d   }g }| d   D ]  }|j                  d      }|j                  dt        j                  |d          d	t        j                  |d
          d	t        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  t	        ||nd             d        dj                  g dddddddddddd d!d"d#d$d%d&d'd(d)t        j                  | d*          d+t        j                  | d,          d-t        j                  | d.          d/t        j                  |d
          d0t        j                  | d1          d/t        j                  |d
          d2d3j                  g d4| d5    d6t        j                  t	        | d7                d8t        j                  t	        | d9                d:| d;    d<| d=    d>| d?    d6t        j                  d@j                  | dA         xs d       dB| dC    dD| dE    d6t        j                  d@j                  | dF         xs d       dGt        j                  | dH          dI| dJ    dK| dL    dM| dN    dOt        j                  | dP          dQ      dRt        j                  | dS          dTdUdVt        j                  t	        |dW                dX|dY    dZ|d[    d\t        j                  t	        |d]                d^t        j                  t	        |d_                d`t        j                  t	        |da                dbt        j                  t	        |dc                dQddde|dfdgdhd3      S )iNrm   rn   r   r   r   rG   z<tr><td><code>r:   z</code></td><td><code>r;   r=   z</code></td><td>rC   z	</td><td>rA   z</td><td><code>r@   r   z
</td></tr>r   z<!doctype html>z<html lang="en">z<head>z  <meta charset="utf-8">zF  <meta name="viewport" content="width=device-width, initial-scale=1">z6  <title>Save Selector Branch Gate Consistency</title>z	  <style>zg    :root { color-scheme: dark; font-family: system-ui, sans-serif; background: #101010; color: #eee; }z&    body { margin: 0; padding: 24px; }z,    h1 { margin: 0 0 8px; font-size: 24px; }z/    h2 { margin: 24px 0 8px; font-size: 18px; }z<    p { max-width: 1120px; color: #bbb; line-height: 1.45; }z[    table { width: 100%; border-collapse: collapse; margin: 12px 0 20px; font-size: 13px; }zi    th, td { border-bottom: 1px solid #303030; padding: 7px 8px; text-align: left; vertical-align: top; }zF    th { position: sticky; top: 0; background: #181818; color: #ddd; }z    code { color: #d7f0ff; }z
  </style>z</head>z<body>z0  <h1>Save Selector Branch Gate Consistency</h1>z  <p>route <code>r_   z</code> -&gt; <code>r`   z</code>; writer <code>rl   z</code> <code>z</code>; reader <code>rh   z</code>.</p>r   z  <p>same table and offset: ro   r   rp   z <code>rq   z$</code>); later same-offset writes: rt   z2; later same-offset reads before frontier reader: ru   z; later other-offset writes: rv   r   rw   z"); valid secondary fills between: rx   z#; invalid secondary fills between: ry   rz   z+); known-opcode preservation status: <code>r   z+</code>; state preserved by known opcodes: r   z.; branch state value still runtime-dependent: r   z ; strict hotspot still missing: r   z; promotion status: r   z.</p>z  <p>r   z</p>z  <h2>Boundary</h2>z  <p>secondary table <code>r   z,</code>; no direct global secondary writer: rj   z1; helper only called inside opcode 0x10 handler: r   z; dispatch stop <code>r   z</code> opcode <code>r   z</code> handler <code>r   z</code> in r   z:  <h2>Selection Opcode Rows Between Writer And Reader</h2>z  <table><thead><tr><th>va</th><th>value</th><th>op</th><th>operation</th><th>table</th><th>offset</th><th>helper valid?</th></tr></thead><tbody>z  </tbody></table>z</body>z</html>)ra   rU   htmlescapestrr   )r   rm   rn   r   r   rX   rQ   r   s           r   	html_pager     sB   XFXF)*E>"DD34 
ww45S\23 4S_56 7S%567 8;;s;/01 2;;s<012 3S)C%DEF G;;s<3K<QTUVW X
	

 99 /// 	/ 	#	/
 	Q/ 	A/ 	/ 	r/ 	1/ 	7/ 	:/ 	G/ 	f/ 	t/ 	Q/  	'!/" 	#/$ 	%/& 	'/( 	;)/* DKK(9:;;OPTP[P[\cdl\mPnOo pG,@$ABC>RVR]R]^deo^pRqQr sG,A$BCDNSWS^S^_efp_qSrRss	A+/0
	L 
	L
& 
	Lw/C'D&E 
	LR 
	LTWX_`oXpTqHrGs 
	Lsz 
	L{  |G  |G  HK  LS  Tr  Ls  Ht  |u  {v 
	L v% 
	L%,-M%N$O
	LP;
	L;BCb;c:d
	Le&
	L '..O&P%Q
	L RT
	L UYT_T_`d`i`ijq  sY  kZ  a[  ab  _b  Uc  Td
	Ld*
	L +22R*S)T	
	LU,	
	L
 -44V,W+X
	L
 Y[
	L
 \`[f[fgkgpgpqx  zZ  r[  h\  hc  `c  \d  [e
	L
e3
	L 48;;wGk?l3m2n
	Lo-
	L .55S-T,U
	LV7
	L 8??f7g6h
	Li)
	L *11L)M(N
	LO
	L "[[1B)CDE
	L FK
	L1/F GL12348G/H 	I/J &dkk#e<O6P2Q&R%SS  AF  Gf  Ag  @h h::?@g:h9i j#{{3t4G/H+IJKK`aealalmpqu  wN  rO  nP  bQ  aR  Rh  im  it  it  ux  y}  ~X  yY  uZ  i[  h\  \g  hl  hs  hs  tw  x|  }Y  xZ  t[  h\  g]  ]b	cK/P 	EQ/R 	\S/T 
U/V 	W/X 	Y/Z 	[/\ 	]/ / /r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       |d
z  j                  t	        |       d	       y )NT)parentsexist_okz*save_selector_branch_gate_consistency.jsonF   )ensure_asciiindentr   r   r   *save_selector_branch_gate_consistency.html)mkdir
write_textr"   dumpsr   )r   out_dirs     r   write_outputsr   c  sf    MM$M.;;GG

7q9D@ H  ;;GG	RYHZelGmr   c                    t        | |||      S )N)r   )r-   r   r   r   s       r   build_summaryr   l  s     S"3^EZ[[r   c            	        t        j                  t              } | j                  dt        t
        dz         | j                  dt        t        dz         | j                  dt        t        dz         | j                  d	t        t        d
z         | j                  dt        t               | j                         }t        |j                  j                         t        |j                  g       t        |j                  g       t        |j                  i             }t        ||j                          t#        d|j                   dz          y )N)descriptionz--exezHwanse2.exe)typedefaultz--writer-chainzsave_selector_writer_chain.jsonz--gate-pathszsave_selector_gate_paths.jsonz--secondary-reset-scopez(save_selector_secondary_reset_scope.jsonz	--out-dirz/wrote save selector branch gate consistency -> r   )argparseArgumentParser__doc__add_argumentr   ROOTOUT
parse_argsr   r-   
read_bytesr'   writer_chain
gate_pathsr   r   r   print)parserargsr   s      r   mainr   u  s   $$9F
dD=4HI
(tSCd=de
T3A`;`a
1cLvFvw
$<D$##R($//2&$,,b1	G '4<<(	;DLLKw<w;x
yzr   __main__)r   r   returnr   )r   z
str | Noner   
int | None)r%   r   r&   r   r   r   )r-   bytesr.   
list[dict]r/   r   r   r   )r5   r   r   r   )r   r   r/   r   r   dict)
r-   r   r.   r   rV   r   rW   r   r   r   )rX   r   r   z	list[str])rX   r   r   r   )
r-   r   r   r   r   r   r   r   r   r   )r   r   r   r   )r   r   r   r   r   None)r   r   )+r   
__future__r   r   r   r"   r+   syspathlibr   typingr   r%   insertr   __file__resolveparentprobe_exe_scene_tablesr   r   r   r   r   rb   rc   r   r   r   r'   r1   r6   rR   rY   r]   rd   r   r   r   r   r   r   __name__r   r   r   <module>r      sY   _ "     
   3tH~--/667 8 > H~''*
Ul-84RB	E}	}!} }  	}
 
}@.bBJ 25 n\	\!\ \  	\
 
\{$ zF r   