
    UHj\M                    H   d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	  ee
      j                         j                  d   Zedz  ZdZd	Zd
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(dZd)dZ d)dZ!efd*dZ"d+dZ#e$dk(  r e#        yy),zHSummarize provenance for the route-blocking selectionBuffer[0x20] value.    )annotationsN)Path)Any   outmap1_01amap2_02d
0x00540714
0x00501808
0x00478364c                    t        | d       S )Nc                @    | j                  d      rt        | d      S | S )N0x   )
startswithintvalues    R/home/exedev/hwanse/tools/summarize_save_selector_selection_buffer20_provenance.py<lambda>zsort_hex.<locals>.<lambda>   s    e>N>Nt>TCrN Z_     key)sorted)valuess    r   sort_hexr      s    &_``r   c                    t               }g }| D ]S  }t        |t              rt        j                  |dd      n|}||v r2|j                  |       |j                  |       U |S )NTF)	sort_keysensure_ascii)set
isinstancedictjsondumpsaddappend)r   seenresultr   r   s        r   uniquer)      se    5DF GQRWY]G^djj$UCdi$;e Mr   c                    g }| xs i j                  d      xs g D ],  }|j                  d      }|s||vs|j                  |       . |S )NfieldRecordsmap)getr&   )contextmapsrecordnames       r   
field_mapsr2   %   sU    D=b%%n5; zz% D$KK Kr   c                F    t        | xs i j                  d      xs g       S Nlabels)listr-   )r.   s    r   r5   r5   .   s!    B##H-344r   c                v    t         |v }t        |v }| t        k(  ry| t        k(  ry| t        k(  ry|r|ry|ry|ryy)Nzcurrent-route-rootzsource-side-rootzpredecessor-target-side-rootzroute-pair-rootztarget-side-rootzunrelated-root)SOURCETARGETCURRENT_ROOTSOURCE_SIDE_ROOTPREDECESSOR_ROOT)root_hexr/   
has_source
has_targets       r   	root_roler@   2   sN    4J4J<###!##-j !!r   c                ~   i }| j                  d      xs g D ]J  }|j                  d      xs i }|j                  d      xs d}|j                  ||g g ddg d      }t        |d   t        |      z         |d<   t        |d   t	        |      z         |d<   |j                  d	      d
k(  r|dxx   dz  cc<   n!|j                  d	      dk(  r|dxx   dz  cc<   t        |d         dk  s|d   j                  |j                  d      |j                  d	      |j                  d      |j                  d      |j                  d      |j                  d      d       M |j                         D ]D  }|d   }t        |v |d<   t        |v |d<   t        |v xr t        |v |d<   t        |d   |      |d<   F |S )NinterestingOffsetRowsselectorRootContextselectedPointerHexunattributedr   )rootHexr5   	fieldMapswriterCountreaderCount
sampleRowsr5   rG   	operationwriterrH   r   readerrI   rJ      vaHex	opcodeHexvalueHex
stateTablemeaning)rO   rK   rP   rQ   rR   rS   hasSourceMaphasTargetMapcontainsRoutePairrF   role)r-   
setdefaultr)   r5   r2   lenr&   r   r8   r9   r@   )selection_writersrootsrowr.   r=   summaryr/   s          r   build_root_summariesr^   D   s   E $$%<=C ''/06B;;34F""#   

 #78#4vg#FG%gk&:Z=P&PQ77;8+M"a'"WW[!X-M"a'"w|$%)L!(() WW[1 WW[1GGJ/!ggl3779-* +< <<> >{#"(D."(D.'-~'H&D.#$#GI$6=> Lr   c                d    | j                         D ]  }||j                  d      xs g v s|c S  y r4   )r   r-   )r[   labelr]   s      r   root_by_labelra   m   s7    <<> W[[*0b1N r   c                `    | j                  |      xs t        | |      xs ||gg ddddddg d
S )Nr   Fmissing)
rF   r5   rG   rH   rI   rT   rU   rV   rW   rJ   )r-   ra   )r[   r=   r`   s      r   root_or_emptyrd   t   sL    99X -u"= '"B r   c                <   | j                  d      xs g }|D ci c]  }|j                  d      | }}g }|D ]  }|j                  |j                  d            xs i }|j                  |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d	      |j                  d
      d        t        d |D        d d       }t        |      ||dS c c}w )N+currentFrontierRootWritersBeforeFirstReaderwriterVaHexrO   rQ   rP   rR   rS   streamStartHexclassificationnextQuestion)rg   writerValueHexrP   rR   rS   rh   ri   rj   c              3  D   K   | ]  }|j                  d       s|  yw)rg   Nr-   .0r\   s     r   	<genexpr>z'local_writer_summary.<locals>.<genexpr>   s     <SWW]%;<s     c                     t        | d   d      S )Nrg   r   )r   r\   s    r   r   z&local_writer_summary.<locals>.<lambda>   s    C.3 r   )r   default)!localWriterCountBeforeFirstReaderlocalWritersBeforeFirstReadernearestCurrentWriter)r-   r&   maxrY   )rZ   current_writer_pathswriter_rowsr\   	by_writer	decoratedpathnearests           r   local_writer_summaryr~      s   #''(UV\Z\K8LM',MIMI }}SWWW-.4"777+!ggj1-'',/wwy)"hh'78"hh'78 HH^4	
 		 <	<3G .1^)2 ' ' Ns   Dc                   t        |       }t        d |j                         D              }t        d |j                         D              }t        |t        d      }t        |t
        d      }t        |t        d      }|j                         D cg c]H  }|j                  d      s3|j                  d      s"|j                  d      t        t
        t        hv r|J }	}|	j                  d	 
       t        |j                         d 
      d d }
t        |j                         d 
      d d }| j                  d      xs g }|r|d   nd }t        | |      }|j                  d      xs i }d}i dt        dt        ddd| j                  d      d| j                  d      d|d|d|d|d|d|	d|
d|d |r|j                  d!      |j                  d"      |j                  d#      |j                  d$      |j                  d%      |j                  d&      |j                  d'      xs i j                  d(      |j                  d)      xs i j                  d*      d+nd d,|d-d.j                  |j                  d/      xs g       |j                  d      |j                  d0      |j                  d1      |||j                  d2      |r|j                  d!      nd d.j                  |j                  d/      xs g       d.j                  |j                  d/      xs g       d3d4d5d3g d6|d7S c c}w )8Nc              3  L   K   | ]  }|j                  d d      dkD  sd  yw)rH   r   r   Nrm   rn   s     r   rp   z build_summary.<locals>.<genexpr>   $     Y#377=RS;TWX;XAY   $$c              3  L   K   | ]  }|j                  d d      dkD  sd  yw)rI   r   r   Nrm   rn   s     r   rp   z build_summary.<locals>.<genexpr>   r   r   z2:0z0:0z1:0rT   rU   rF   c                   | j                  d      t        k(  rdn[| j                  d      t        k(  rdnA| j                  d      t        k(  rdn'| j                  d      rdn| j                  d      rdnd	| j                  d      xs d
fS )NrF   r   r      rV      rT          )r-   r:   r;   r<   rr   s    r   r   zbuild_summary.<locals>.<lambda>   su    #|3A#'77A#'77A,-A(AGGI$"
 r   r   c                R    | j                  dd       | j                  d      xs dfS )NrH   r   rF   r   rm   rr   s    r   r   zbuild_summary.<locals>.<lambda>   '    #''-33SWWY5G5M2N r      c                R    | j                  dd       | j                  d      xs dfS )NrI   r   rF   r   rm   rr   s    r   r   zbuild_summary.<locals>.<lambda>   r   r   currentFrontierRowsr   rv   a|  selectionBuffer[0x20] is a broad VM selection slot. The current 2:0 root contains both source and target scene records, but source-only 0:0 and predecessor target-only 1:0 roots show that root-level reader/writer counts are not enough to promote map1_01a -> map2_02d. Runtime branch-state values, control flow to the 0x00542b0c reader, and a strict source hotspot remain required.sourcetargetselectionBufferOffsetHex0x20writerCountFor0x20readerCountFor0x20writerRootCountreaderRootCountcurrentRootsourceSideRootpredecessorRootrouteRelatedRootstopWriterRootstopReaderRootsfrontierReaderrO   rQ   rR   rS   branchTargetHexbranchTargetKindselectorContextleafPointerHexrC   rD   )readerVaHexrQ   rR   	conditionr   r   r   rF   currentLocalWritersbrief,r5   rH   rI   rg   blocked)currentSelectorcurrentRootHexcurrentWriterCountcurrentReaderCountr   r   rv   r   sourceSideSelectorpredecessorSelectorpromotionStatusr   )zUCapture or emulate the runtime branch-state values used by 0x005428bc and 0x00542b0c.zJProve the control path that reaches the 0x00542b0c reader in selector 2:0.z>Find a strict map1_01a source coordinate/hotspot for map2_02d.)remainingProofs
conclusion)r^   sumr   rd   r:   r;   r<   r-   sortr   r~   r8   r9   join)rZ   rx   r[   writer_root_countreader_root_countcurrent_rootsource_side_rootpredecessor_rootr\   route_related_rootstop_writer_rootstop_reader_rootsfrontier_rowsfrontier_readerlocal_writersr}   r   s                    r   build_summaryr      s    !23EYYYYYY e<L$U,<eD$U,<eD||~77>"cggn&=ASXdfv  yI  XJ  BJ 	  
  
 N 
r N 
r &))*?@FBM*7mA&TO():<PQM 67=2G	^ -&-&- 	#F- 	/334HI	-
 	/334HI- 	,- 	,- 	|- 	*- 	+- 	0- 	*- 	*- 	  +..w7'++J7)--l;(,,Y7.223DE / 3 34F G.223DEKPPQab'++,ABHbMMNbc	
 #'/-0 	}1-2 	"xx(8(8(B(HbI*..y9"."2"2="A"."2"2="A00$+KK$>>Mo11':SW"%((+;+?+?+I+OR"P#&88,<,@,@,J,Pb#Q(
3-L 	9M-N

 !Y- -Cs   AM c                    dj                  | j                  d      xs g       xs d}| d| j                  d      xs d S )Nr   r5   - rF   )r   r-   )r\   labels_texts     r   
root_labelr      sC    ((3778,23:sK]!CGGI.5#677r   c                    | j                  d      xs g }|sydj                  |d |       }t        |      |kD  r|dt        |      |z
   z  }|S )NrG   r   z, z, +)r-   r   rY   )r\   limitr/   texts       r   	maps_textr      s[    77;%2D99T&5\"D
4y5#c$i%'())Kr   c                	   | d   }| d   }| d   }| j                  d      xs i j                  d      xs i }| j                  d      xs i }ddd	| d
    d| d    dd| j                  d       dd| j                  d       dd| j                  d       dd| j                  d       dd|j                  d       d|j                  d       d|j                  d       d|j                  d       d	d|j                  d       d|j                  d       d|j                  d       d |j                  d!      xr |j                  d"        d	d#|j                  d       d|j                  d       d|j                  d       d$|j                  d"      xr |j                  d!        d	d%|j                  d&      xs d' d(|j                  d)      xs d' dd*|j                  d+      xs d' d(|j                  d,      xs d' dd-| j                  d.       dd| j                  d/      xs ddd0dd1d2g}| j                  d3      xs g D ]  }|j                  d4|j                  d5       d6t        |       d6|j                  d       d6|j                  d       d6|j                  d!       d6|j                  d"       d6t        |       d7        |j	                  g d8       | j                  d      xs i j                  d9      xs g D ]z  }|j                  d4|j                  d&       d:|j                  d)       d;|j                  d<      xs d' d6|j                  d=      xs d' d6|j                  d>      xs d' d7       | |j	                  g d?       | j                  d@      xs g D ]c  }|j                  d4t        |       d6|j                  d       d6|j                  d       d6|j                  d5       d6t        |dA       d7       e |j	                  g dB       | j                  dC      xs g D ]  }|j                  dD|         |j                  d       dEj                  |      S )FNr   r   r   r   rv   r   z"# Selection Buffer 0x20 Provenancer   z- source -> target: `r   z -> r   z`.z- writer candidates: r   .z- reader candidates: r   z- writer roots: r   z- reader roots: r   z- current root 2:0: `rF   z
` writers=rH   	 readers=rI    routePair=rV   z- source-side root 0:0: ` sourceOnly=rT   rU   z- predecessor root 1:0: ` targetOnly=z- nearest current writer: rg   r   z `rk   z- frontier reader: r   rQ   z- promotion status: r   r   z## Route Related Rootsz<| role | root | writers | readers | source | target | maps |z-| --- | --- | ---: | ---: | --- | --- | --- |r   z| rW   z | z |)r   z'## Local Writers Before Frontier Readerr   z2| writer | value | stream | kind | next question |z| --- | --- | --- | --- | --- |ru   z | `z` | rh   ri   rj   )r   z## Top Writer Rootsr   z*| root | writers | readers | role | maps |z!| --- | ---: | ---: | --- | --- |r   r   )r   z## Remaining Proofsr   r   z- 
)r-   r&   r   r   extendr   )	r]   currentsource_sidepredecessorr}   rM   linesr\   proofs	            r   markdownr     s   m$G*+K+,K{{017R<<=STZXZG[[)*0bF,

 12$wx7H6IL
,@ AB!D
,@ AB!D
7;;'89:!<
7;;'89:!<
I 67z'++mB\A]]fgngrgr  tA  hB  gC  CN  OV  OZ  OZ  [n  Oo  Np  pq  	r
#KOOI$>#?z+//ZgJhIiirs~  tC  tC  DQ  tR  sS  S_  `k  `o  `o  p~  `  `g  HS  HW  HW  Xf  Hg  Dg  _h  hi  	j
#KOOI$>#?z+//ZgJhIiirs~  tC  tC  DQ  tR  sS  S_  `k  `o  `o  p~  `  `g  HS  HW  HW  Xf  Hg  Dg  _h  hi  	j
$W[[%?%F3$Gr'++VfJgJnknIooqr
fjj7>3?r&**ZBXB_\_A``bc
w{{+<=>a@
L!'R
 
F7)E, {{./52 
!Z_$5S9O8PPSTWT[T[\iTjSkknww~&'s377>+B*C3yQT~FVVXZ	


 
LL   128b==>]^dbd 
'(SWW5E-F,GtCGGTdLeLlilKmmpww'(/C0CGGN4K4Rs3SSUW	


 
LL   {{+,2 
C!SWW]%;$<C@V?WWZ[^[b[bci[jZkknoxy|~  pA  oB  BD  E	

 
LL  
 ./52 #r%\"#	LL99Ur   c                 b   d[d| d   }| d   }| d   }| j                  d      xs i j                  d      xs i }| j                  d      xs i }g }| j                  d      xs g D ]  }|j                  d	 |j                  d
             d |j                  d             d dj                  |j                  d      xs g       xs d       d |j                  d             d |j                  d             d |j                  d             d |j                  d             d t        |             d        g }| j                  d      xs i j                  d      xs g D ]  }|j                  d |j                  d             d |j                  d             d |j                  d      xs d       d |j                  d      xs d       d |j                  d      xs d       d        g }	| j                  d       xs g D ]  }|	j                  d |j                  d             d dj                  |j                  d      xs g       xs d       d |j                  d             d |j                  d             d |j                  d
             d t        |d!             d        d"j                  fd#| j                  d$      xs g D              }
d%j                  d&d'd(d)d*d+d,d-d.d/d0 | d1          d2 | d3          d4 | j                  d5             d6 | j                  d7             d8 | j                  d9             d: | j                  d;             d<d= |j                  d             d> |j                  d             d? |j                  d             d@ |j                  dA             d<	dB |j                  d             d> |j                  d             d? |j                  d             dC |j                  d      xr |j                  d              d<	dD |j                  d             d> |j                  d             d? |j                  d             dE |j                  d      xr |j                  d              d<	dF |j                  d      xs d       dG |j                  dH      xs d       dI | j                  dJ             d<dK | j                  dL      xs d"       dMdNdOdPd"j                  |       dQdRdSdPd"j                  |       dQdTdUdPd"j                  |	       dQdVdW|
 dXdYdZd"g      S )\Nc                >    t        j                  t        |             S )N)htmlescapestrr   s    r   esczhtml_page.<locals>.escJ  s    {{3u:&&r   r   r   r   r   rv   r   r   z<tr><td>rW   z</td><td><code>rF   z</code><br>r   r5   r   z	</td><td>rH   rI   rT   rU   z
</td></tr>ru   z<tr><td><code>rg   z</code></td><td><code>rk   rh   z</code></td><td>ri   rj   r   r   r   c              3  6   K   | ]  }d  |       d  yw)z<li>z</li>N )ro   r   r   s     r   rp   zhtml_page.<locals>.<genexpr>u  s     euDUE2es   r   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">z1  <title>Selection Buffer 0x20 Provenance</title>a    <style>body{margin:24px;background:#101010;color:#eee;font:14px system-ui,sans-serif}table{border-collapse:collapse;width:100%;margin:16px 0 28px}th,td{border:1px solid #333;padding:6px 8px;vertical-align:top}th{background:#1d1d1d;position:sticky;top:0}code{color:#f5d76e}</style>z</head>z<body>z+  <h1>Selection Buffer 0x20 Provenance</h1>z  <p><code>r   z</code> -&gt; <code>r   z</code>. Writers: r   z. Readers: r   z. writer roots: r   z. reader roots: r   z.</p>z  <p>current root 2:0: <code>z</code> writers=r   r   rV   z!  <p>source-side root 0:0: <code>r   z!  <p>predecessor root 1:0: <code>r   z#  <p>nearest current writer: <code>z </code>. frontier reader: <code>r   z</code>. promotion status: r   z  <p>r   z</p>z  <h2>Route Related Roots</h2>z  <table><thead><tr><th>role</th><th>root</th><th>writers</th><th>readers</th><th>source</th><th>target</th><th>maps</th></tr></thead>z	  <tbody>z</tbody></table>z/  <h2>Local Writers Before Frontier Reader</h2>zp  <table><thead><tr><th>writer</th><th>value</th><th>stream</th><th>kind</th><th>next question</th></tr></thead>z  <h2>Top Writer Roots</h2>zh  <table><thead><tr><th>root</th><th>writers</th><th>readers</th><th>role</th><th>maps</th></tr></thead>z  <h2>Remaining Proofs</h2>z  <ul>z</ul>z</body>z</html>)r   r   returnr   )r-   r&   r   r   )r]   r   r   r   r}   rM   
route_rowsr\   ry   top_rowsproof_itemsr   s              @r   	html_pager   I  s   ' m$G*+K+,K{{017R<<=STZXZG[[)*0bFJ{{./52 
swwv'( )SWWY/01S#''RZJ[Ja_aAbAifi=j<k lsww}-./ 0sww}-./ 0sww~./0 1sww~./0 1y~&' (
	

 K128b==>]^dbd 	
SWW]345 6SWW%5678 9SWW%56=#>? @sww/07C89 :sww~.5#67 8	
	
 H{{+,2 	
SWWY/01S#''RZJ[Ja_aAbAifi=j<k lsww}-./ 0sww}-./ 0swwv'( )ya()* +	
	
 ''eL]@^@dbdeeK99"P; 	e5
c'(+,--A#ghFWBXAY Z$89:;;s7;;WkKlGmFn oW[[):;<==McRYR]R]^oRpNqMrrw	y (GKK	,B(C'DDTUXY`YdYderYsUtTuu~  @C  DK  DO  DO  P]  D^  @_  `  `k  lo  pw  p{  p{  |O  pP  lQ  kR  RW  	X
+C	0J,K+LL\]`alapapq~a  ^A  ]B  BK  LO  P[  P_  P_  `m  Pn  Lo  Kp  p|  }@  AL  AP  AP  Q_  A`  AH  it  ix  ix  yG  iH  eH  }I  |J  JO  	P
+C	0J,K+LL\]`alapapq~a  ^A  ]B  BK  LO  P[  P_  P_  `m  Pn  Lo  Kp  p|  }@  AL  AP  AP  Q_  A`  AH  it  ix  ix  yG  iH  eH  }I  |J  JO  	P
-c'++m2L2SPS.T-UUuvy  {A  {E  {E  FS  {T  {[  X[  w\  v]  ]x  y|  }D  }H  }H  IZ  }[  y\  x]  ]b  	c
GKK-345T:( 	Q
BGGJ'((899z
BGGK())9:%r
BGGH%&&67%
U#
A! ! !r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       |d
z  j                  t	        |       d	       y )NT)parentsexist_okz0save_selector_selection_buffer20_provenance.jsonFr   )r   indentr   utf-8encoding0save_selector_selection_buffer20_provenance.html)mkdir
write_textr#   r$   r   )r]   out_dirs     r   write_outputsr     sf    MM$M.AAMM

7q9D@ N  AAMMiX_N`krMsr   c            	     R   t        j                  t              } | j                  dt        t
        dz         | j                  dt        t
        dz         | j                  dt        t
               | j                         }t        t        j                  |j                  j                  d	            t        j                  |j                  j                  d	                  }t        ||j                         t        d
|d    d|d    d|j                  dz          y )N)descriptionz--selection-writersz$save_selector_selection_writers.json)typers   z--current-writer-pathsz'save_selector_current_writer_paths.jsonz	--out-dirr   r   z(wrote selectionBuffer[0x20] provenance (r   z writer roots, r   z reader roots) -> r   )argparseArgumentParser__doc__add_argumentr   OUT
parse_argsr   r#   loadsrZ   	read_textrx   r   r   print)parserargsr]   s      r   mainr     s	   $$9F
-D#HnBno
0tSKtEtu
$<D

4))33W3EF

4,,666HIG '4<<(		%&'w?P7Q6R SllOOP	Rr   __main__)r   	list[str]r   r   )r   	list[Any]r   r  )r.   dict | Noner   r   )r=   r   r/   r   r   r   )rZ   r"   r   dict[str, dict])r[   r  r`   r   r   r  )r[   r  r=   r   r`   r   r   r"   )rZ   r"   rx   z
list[dict]r   r"   )r\   r"   r   r   )rN   )r\   r"   r   r   r   r   )r]   r"   r   r   )r]   r"   r   r   r   None)r   r  )%r   
__future__r   r   r   r#   pathlibr   typingr   __file__resolver   ROOTr   r8   r9   r:   r;   r<   r   r)   r2   r5   r@   r^   ra   rd   r~   r   r   r   r   r   r   r   __name__r   r   r   <module>r     s    N "      H~''*
Ul		  a	5$&R8Up8
@FNb 25 t$ zF r   