+
    hhj4v                    ^  a 0 t $ R t^ RIHt ^ RIt^ RIHtHt ^RIH	t	H
t
HtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtH t H!t!H"t"H#t#H$t$H%t%H&t&H't'H(t( ^RI)H*t* ^ t+^t,^t-^t.^t/R5w  t0t1t2t3t4^t5^t6R6w  t7t8t9t:^^ut;t<^^ut=t>R7w  t?t@tAtBtCtD^tE^tF^ tG^!tH^"tI^#tJ^$tK^%tL^&tM^'tN^(tO^)tP^*tQ^+tR^,tS^-tT^.tU^/tVR8w  tWtXtYtZ/ R]0bR]1bR]2bR	]3bR
]4bR]7bR]8bR]9bR]=bR]>bR]?bR]@bR]AbR]BbR]CbR]Dbt[R]6R]:/t\R]Q^^3R]P^^3R]O^^3R]N^^3R]R^R3R]S^R3R]T^R3R]U^R3/t]R]^R &   ]]P                  4        U Uu/ uF  w  rW^ ,          bK  	  upp t`R!]5R"]ZR#]YR$]XR%]WR&]V/ta ! R' R(]b4      tc] ! R) R*4      4       td ! R+ R,4      teR- R. ltf] ! R/ R04      4       tg ! R1 R24      thR3 R4 ltiR# u upp i )9a  Bytecode code generator.

Emits the Roboteq MicroBasic bytecode reverse-engineered in
docs/reverse_engineering.md. Every opcode used here is backed by evidence
in that document (5 batches of real RoborunPlus-compiled output, decoded
byte-for-byte with zero leftovers across ~90 test programs plus a 70-byte
composite script). Where this module makes an assumption beyond what was
directly confirmed, it's called out in a comment -- search this file for
"ASSUMPTION" to find every one of them.

Two-pass design:
  1. `collect_declarations` walks the whole AST for `Dim` statements (in
     source order, including inside nested blocks) and allocates variable
     slots. Integer and Boolean variables have separate slot-numbering
     spaces, confirmed in batch 4.
  2. `emit_block` walks the AST again and emits bytecode. Forward
     references (a `GoTo`/`GoSub` to a label that appears later in the
     source) are handled with a simple patch list, resolved once the whole
     program has been emitted.
)annotationsN)	dataclassfield) 
AssignStmtBinaryOpBoolLiteralCallContinueStmtDimStmtDoLoopUntilStmtDoLoopWhileStmtDoUntilStmtExitStmtExprExprStmtForCStyleStmtForTraditionalStmt	GosubStmtGotoStmtIfStmt
IncDecExpr
IncDecStmt
IntLiteralLabelOptionExplicitStmt	PrintStmtProgram
ReturnStmtStmtStringLiteralTerminateStmtUnaryOpVarRefWaitStmt	WhileStmt)resolve_command_code+-*/modandorxorz<<z>>=z<>>z>=<z<=notgetvalue
setcommand	getconfig	setconfiggettimercountsettimercountsettimerstategettimerstatez&dict[str, tuple[int, int, int | None]]DEVICE_IO_SPECSabsatancossinsqrttoboolc                      ] tR t^tRtR# )CodegenError N)__name__
__module____qualname____firstlineno____static_attributes__rC       m\\thalassa.shore.mbari.org\ProjectLibrary\ESP\FIDO\PumpController\compiler\src\microbasic_compiler\codegen.pyrB   rB      s    rI   rB   c                  6    ] tR t^t$ R]R&   R]R&   R]R&   RtR# )	ArrayInfoint	base_slotlengthboolis_boolrC   N)rD   rE   rF   rG   __annotations__rH   rC   rI   rJ   rL   rL      s    NKMrI   rL   c                  R    ] tR t^tR R ltR R ltR R ltR R ltR	 R
 ltRt	R# )SymbolTablec                   V ^8  d   QhRR/#    returnNonerC   )formats   "rJ   __annotate__SymbolTable.__annotate__   s      $ rI   c                	L    / V n         / V n        / V n        ^ V n        ^ V n        R# )    N)int_scalarsbool_scalarsarraysnext_int	next_boolselfs   &rJ   __init__SymbolTable.__init__   s'    +-,.,.rI   c               (    V ^8  d   QhRRRRRRRR/# )rW   namestrvar_type	array_lenz
int | NonerX   rY   rC   )rZ   s   "rJ   r[   r\      s(      C 3 : $ rI   c                	p   VP                  4       pW@P                  9   g!   W@P                  9   g   W@P                  9   d   \	        R V R24      hVR8H  pVep   V'       d'   V P
                  pV ;P
                  V,          un        M%V P                  pV ;P                  V,          un        \        WcVR7      V P                  V&   R# V'       d5   V P
                  V P                  V&   V ;P
                  ^,          un        R# V P                  V P                  V&   V ;P                  ^,          un        R# )z
variable 'z' declared more than onceBooleanN)rN   rO   rQ   )lowerr_   r`   ra   rB   rc   rb   rL   )re   ri   rk   rl   keyrQ   bases   &&&&   rJ   declareSymbolTable.declare   s    jjl"""c->->&>#BTD61JKLLi'  ~~)+}}*(4SZ[DKK%)^^Dc"NNaN$(MMDS!MMQMrI   c                    V ^8  d   QhRRRR/# )rW   ri   rj   rX   ztuple[int, bool]rC   )rZ   s   "rJ   r[   r\      s     , ,3 ,+; ,rI   c                	   VP                  4       pW P                  9   d   V P                  V,          R 3# W P                  9   d   V P                  V,          R3# W P                  9   d   \	        RV RV R24      hV P
                  V P                  V&   V ;P
                  ^,          un        V P                  V,          R 3# )FT'z$' is an array -- use an index, e.g. z[0])ro   r_   r`   ra   rB   rb   )re   ri   rp   s   && rJ   resolve_scalarSymbolTable.resolve_scalar   s    jjl"""##C(%//###$$S)4//++4&(LTFRUVWW !%$e++rI   c                    V ^8  d   QhRRRR/# )rW   ri   rj   rX   ztuple[int, bool, int]rC   )rZ   s   "rJ   r[   r\      s     9 9# 9*? 9rI   c                	    VP                  4       pW P                  9  d   \        R V R24      hV P                  V,          pVP                  VP                  VP
                  3# )zarray 'z' was not declared with Dim)ro   ra   rB   rN   rQ   rO   )re   ri   rp   infos   &&  rJ   resolve_arraySymbolTable.resolve_array   sS    jjlkk!.IJKK{{3~~t||T[[88rI   c                   V ^8  d   QhRR/# )rW   rX   rM   rC   )rZ   s   "rJ   r[   r\      s      s rI   c                P    V P                   pV ;P                   ^,          un         V# )zxFor the traditional For loop's compiler-synthesized limit/step
variables (confirmed in reverse_engineering.md, batch 3).)rb   )re   slots   & rJ   alloc_hidden_int_slot!SymbolTable.alloc_hidden_int_slot   s      }}rI   )ra   r`   r_   rc   rb   N)
rD   rE   rF   rG   rf   rr   rw   r|   r   rH   rC   rI   rJ   rT   rT      s     4,9 rI   rT   c                   V ^8  d   QhRR/# )rW   stmts
list[Stmt]rC   )rZ   s   "rJ   r[   r[      s     4 4
 4rI   c           
   #    "   V  F  pVx  \        V\        4      '       dy   \        VP                  4       R j  xL
  VP                   F  w  r#\        V4       R j  xL
  K  	  VP
                  '       d    \        VP
                  4       R j  xL
  K  K  \        V\        \        \        \        \        \        34      '       g   K  \        VP                  4       R j  xL
  K  	  R #  L L La L5iN)
isinstancer   _iter_all_statements
then_blockelseif_clauses
else_blockr$   r   r   r   r   r   body)r   s_r   s   &   rJ   r   r      s     a  +ALL999++/555 ,|||/=== I{O_/@ A A+AFF333  :5= 4sQ   8C7C/#C7C1C79C7C35C7C7$C5%C71C73C75C7c                  Z    ] tR t^t$ R]R&   ]! ]R7      tR]R&   ]! ]R7      tR]R&   Rt	R# )	LoopContextrj   kind)default_factoryz	list[int]continue_patchesexit_patchesrC   N)
rD   rE   rF   rG   rR   r   listr   r   rH   rC   rI   rJ   r   r      s&    
I"'"=i=#D9L)9rI   r   c                  ^   ] tR t^tR R ltR R ltR R ltR R ltR	 R
 ltR R lt	R R lt
R R ltR R ltR9R R lltR R ltR R ltR R ltR R ltR R ltR  R! ltR" R# ltR$ R% ltR& R' ltR( R) ltR* R+ ltR, R- ltR. R/ ltR0 R1 ltR2 R3 ltR4 R5 ltR6 R7 ltR8tR# ):CodeGeneratorc                   V ^8  d   QhRR/# rV   rC   )rZ   s   "rJ   r[   CodeGenerator.__annotate__   s     0 0$ 0rI   c                	l    \        4       V n        \        4       V n        / V n        . V n        . V n        R # r   )	bytearraycoderT   symtablabel_addrslabel_patches
loop_stackrd   s   &rJ   rf   CodeGenerator.__init__   s+    K	!m+-46-/rI   c                    V ^8  d   QhRRRR/# rW   programr   rX   bytesrC   )rZ   s   "rJ   r[   r     s          E  rI   c                	    V P                  V4       V P                  VP                  4       V P                  P	                  ^ 4       V P                  4        \        V P                  4      # )r^   )collect_declarations
emit_block
statementsr   append_resolve_label_patchesr   )re   r   s   &&rJ   generateCodeGenerator.generate  sO    !!'***+		##%TYYrI   c                    V ^8  d   QhRRRR/# )rW   r   r   rX   rY   rC   )rZ   s   "rJ   r[   r   	  s     E EG E ErI   c                	    \        VP                  4       FV  p\        V\        4      '       g   K  V P                  P                  VP                  VP                  VP                  4       KX  	  R # r   )	r   r   r   r
   r   rr   ri   rk   rl   )re   r   r   s   && rJ   r   "CodeGenerator.collect_declarations	  sF    %g&8&89A!W%%##AFFAJJD :rI   c                   V ^8  d   QhRR/# rV   rC   )rZ   s   "rJ   r[   r     s     ? ? ?rI   c                	    V P                    FV  w  rVP                  4       pW0P                  9  d   \        R V R24      hV P	                  WP                  V,          4       KX  	  R# )zundefined label 'rv   N)r   ro   r   rB   patch_branch)re   patch_atlabelrp   s   &   rJ   r   $CodeGenerator._resolve_label_patches  sY    #11OH++-C***"%6ugQ#?@@h(8(8(=>	  2rI   c                    V ^8  d   QhRRRR/# )rW   valuerM   rX   rY   rC   )rZ   s   "rJ   r[   r     s     2 2# 2$ 2rI   c                <   V^ 8  g   VR8  d   \        RV R24      hV^ 8X  d   V P                  P                  ^4       R# V^8:  d9   V P                  P                  ^4       V P                  P                  V4       R# VR8:  dL   V P                  P                  ^4       V ;P                  \        P                  ! RV4      ,          un        R# V P                  P                  ^4       V ;P                  \        P                  ! RV4      ,          un        R# )zrVariable-length operand encoding, confirmed in batch 4: used for
both literal values and variable-slot references.    zoperand value z out of representable range  <Hz<IN)rB   r   r   structpack)re   r   s   &&rJ   emit_operandCodeGenerator.emit_operand  s     19
*w6QRSSA:IIT"d]IIT"IIU#f_IIT"IIT511IIIT"IIT511IrI   c                    V ^8  d   QhRRRR/# )rW   verbrM   rX   rC   )rZ   s   "rJ   r[   r   (  s        rI   c                    V P                   P                  ^4       \        V P                   4      pV ;P                   R,          un         V P                   P                  V4       V# )zEmit [0x03][2-byte placeholder address][verb]; return the offset
of the 2-byte field so the caller can patch it once the target
address is known.s     )r   r   len)re   r   r   s   && rJ   emit_branchCodeGenerator.emit_branch(  sH     			tyy>		[ 			rI   c               $    V ^8  d   QhRRRRRR/# )rW   r   rM   targetrX   rY   rC   )rZ   s   "rJ   r[   r   2  s&     G GS G# G$ GrI   c                	    V^ 8  g   VR8  d   \        R4      h\        P                  ! RV4      V P                  W^,           % R# )r^   r   zbranch target exceeds the 2-byte address field -- program too large (this limit was never actually confirmed against real hardware/RoborunPlus, only assumed from every test program being small)r   N)rB   r   r   r   )re   r   r   s   &&&rJ   r   CodeGenerator.patch_branch2  s@    A:&'  .4[[v-F		(\*rI   c               $    V ^8  d   QhRRRRRR/# )rW   r   rM   r   rX   rY   rC   )rZ   s   "rJ   r[   r   <  s!     : :3 : : :rI   c                	H    V P                  V P                  V4      V4       R # r   )r   r   )re   r   r   s   &&&rJ   emit_goto_addrCodeGenerator.emit_goto_addr<  s    $**40&9rI   c                    V ^8  d   QhRRRR/# )rW   exprr   rX   rY   rC   )rZ   s   "rJ   r[   r   A  s     I Id It IrI   c                	:   \        V\        4      '       d   V P                  VP                  4       R# \        V\        4      '       d(   T P                  VP                  '       d   R M^ 4       R# \        V\
        4      '       d   V P                  V4       R# \        V\        4      '       dN   V P                  VP                  4       V P                  P                  \        VP                  ,          4       R# \        V\        4      '       di   V P                  VP                  4       V P                  VP                   4       V P                  P                  \"        VP                  ,          4       R# \        V\$        4      '       d   V P'                  V4       R# \        V\(        4      '       d4   V P+                  VP,                  VP                  VP.                  4       R# \        V\0        4      '       d   \3        R4      h\3        RV: 24      h)r   z3string literals can only be used as Print argumentszunsupported expression node: N)r   r   r   r   r   r"   _emit_load_refr!   	emit_exproperandr   r   UNARY_OPCODESopr   leftrightBINOP_OPCODESr   	emit_callr   _emit_incdecvarprefixr   rB   )re   r   s   &&rJ   r   CodeGenerator.emit_exprA  sQ   dJ''djj)k**DJJJjA>f%%%g&&NN4<<(II]47734h''NN499%NN4::&II]47734d##NN4 j))dhh=m,,TUU!>thGHHrI   Nc               $    V ^8  d   QhRRRRRR/# )rW   refr"   r   z
str | NonerX   rY   rC   )rZ   s   "rJ   r[   r   Y  s&     C C& C
 Cd CrI   c                	   VP                   P                  R 4      '       dP   VP                  e   \        RVP                    R24      hV P	                  \        VP                   VR7      4       R# VP                  es   V P                  P                  VP                   4      w  r4pV P                  W1P                  4       V P                  P                  V'       d   \        M\        4       R# V P                  P                  VP                   4      w  rdV P	                  V4       V P                  P                  V'       d   \        4       R# \        4       R# )r   Nrv   z%' is a command constant, not an arrayr   )ri   
startswithindexrB   r   r%   r   r|   _emit_array_addressr   r   OP_LOAD_BOOLOP_LOAD_INTrw   )re   r   r   rq   rQ   _lengthr   s   &&&    rJ   r   CodeGenerator._emit_load_refY  s    88s##yy$"Qsxxj0U#VWW2388$GH99 %)[[%>%>sxx%H"D7$$T995IIW\+F22388<$		BkBrI   c                    V ^8  d   QhRRRR/# )rW   r   r"   rX   rY   rC   )rZ   s   "rJ   r[   r   h  s     E E6 Ed ErI   c                	   VP                   es   V P                  P                  VP                  4      w  r#pV P	                  W!P                   4       V P
                  P                  V'       d   \        M\        4       R # V P                  P                  VP                  4      w  rSV P                  V4       V P
                  P                  V'       d   \        4       R # \        4       R # r   )r   r   r|   ri   r   r   r   OP_STORE_BOOLOP_STORE_INTrw   r   )re   r   rq   rQ   r   r   s   &&    rJ   _emit_store_refCodeGenerator._emit_store_refh  s    99 %)[[%>%>sxx%H"D7$$T995IIg]<H22388<$		'D|DrI   c               $    V ^8  d   QhRRRRRR/# )rW   rN   rM   
index_exprr   rX   rY   rC   )rZ   s   "rJ   r[   r   r  s!     ! !S !d !t !rI   c                	    V P                  V4       V P                  V4       V P                  P                  \        4       R # r   )r   r   r   r   OP_ADD)re   rN   r   s   &&&rJ   r   !CodeGenerator._emit_array_addressr  s.    )$z"		 rI   c                    V ^8  d   QhRRRR/# )rW   callr   rX   rY   rC   )rZ   s   "rJ   r[   r   w  s     &> &>d &>t &>rI   c           	     	:   VP                   P                  4       pV\        9   EdW   \        V,          w  r4p\        VP                  4      p\        V4      V8X  d   M~Ve8   \        V4      V^,
          8X  d!   VR V \        ^ 4      .,           WeR  ,           pMCV R2pVe   VRV^,
           R2,          p\        VP                    RV R\        V4       24      hV^ ,          p\        V\        4      '       d5   VP                   P                  R4      '       d   V P                  WR7       MV P                  V4       VR,           F  p	V P                  V	4       K  	  V P                  P                  V4       R # V\        9   d}   \        VP                  4      ^8w  d   \        VP                    R	24      hV P                  VP                  ^ ,          4       V P                  P                  \        V,          4       R # \        R
VP                    R24      h)Nz
 argumentsz (or z, omitting the optional Index)z	 expects z, got r   r   :   NNz expects exactly 1 argumentzunknown function 'rv   )ri   ro   r:   r   argsr   r   rB   r   r"   r   r   r   r   r   BUILTIN_UNARY_VERBS)
re   r   ri   r   
full_arityoptional_posr   expecteditem_argargs
   &&        rJ   r   CodeGenerator.emit_callw  s   yy ?"-<T-B*Dl		?D4yJ&)c$i:>.I
 M\*jm_<tM?RR(\4+%
Q'77U VVH"dii[	(6#d)#UVV AwH(F++0H0H0M0M##H#8x(Bxxs#  IIT"&&499~""dii[0K#LMMNN499Q<(II067/		{!<==rI   c               (    V ^8  d   QhRRRRRRRR/# )rW   r   rj   r   r   rP   rX   rY   rC   )rZ   s   "rJ   r[   r     s.     D D D Dd Dt DrI   c                	L   V P                   P                  V4      w  rEV'       d   \        R 4      hVR8X  d   \        M\        pV'       d   V P                  V4       V P                  P                  \        4       V P                  P                  V4       V P                  V4       V P                  P                  \        4       V P                  V4       V P                  P                  \        4       R# V P                  V4       V P                  P                  \        4       V P                  V4       V P                  P                  \        4       V P                  P                  V4       V P                  V4       V P                  P                  \        4       R# z0'++'/'--' are not supported on Boolean variablesz++N)
r   rw   rB   OP_INCOP_DECr   r   r   r   r   )re   r   r   r   r   rQ   r   s   &&&&   rJ   r   CodeGenerator._emit_incdec  s   2237QRRtvd#TYY%5%5k%BIIT"d#TYY%5%5l%Cd#TYY%5%5k%B d#TYY%5%5k%Bd#TYY%5%5k%BIIT"d#TYY%5%5l%CrI   c                    V ^8  d   QhRRRR/# )rW   r   r   rX   rY   rC   )rZ   s   "rJ   r[   r     s      
 t rI   c                	:    V F  pV P                  V4       K  	  R # r   )	emit_stmt)re   r   r   s   && rJ   r   CodeGenerator.emit_block  s    ANN1 rI   c                    V ^8  d   QhRRRR/# )rW   stmtr   rX   rY   rC   )rZ   s   "rJ   r[   r     s     7D 7Dd 7Dt 7DrI   c                		   \        V\        4      '       d   R # \        V\        4      '       d   R # \        V\        4      '       d   V P	                  V4       R # \        V\
        4      '       d9   V P                  VP                  4       V P                  VP                  4       R # \        V\        4      '       d   V P                  V4       R # \        V\        4      '       d   V P                  V4       R # \        V\        4      '       d   V P                  V4       R # \        V\         4      '       d   V P#                  V4       R # \        V\$        4      '       d   V P'                  V4       R # \        V\(        4      '       d   V P+                  V4       R # \        V\,        4      '       d   V P/                  V4       R # \        V\0        4      '       d>   V P3                  \4        4      pV P6                  P9                  W!P:                  34       R # \        V\<        4      '       d>   V P3                  \>        4      pV P6                  P9                  W!P:                  34       R # \        V\@        4      '       d"   V PB                  P9                  \D        4       R # \        V\F        4      '       d"   V PB                  P9                  \H        4       R # \        V\J        4      '       d=   V P                  VPL                  4       V PB                  P9                  \N        4       R # \        V\P        4      '       d   V PS                  V4       R # \        V\T        4      '       dL   V PW                  VPX                  4      pVPZ                  P9                  V P3                  \4        4      4       R # \        V\\        4      '       dL   V PW                  VPX                  4      pVP^                  P9                  V P3                  \4        4      4       R # \        V\`        4      '       d   V Pc                  V4       R # \        V\d        4      '       d   V Pg                  VPh                  4       R # \k        RV: 24      h)Nzunsupported statement node: )6r   r
   r   r   _emit_labelr   r   r   r   r   r   _emit_ifr$   _emit_whiler   _emit_do_untilr   _emit_do_loop_whiler   _emit_do_loop_untilr   _emit_for_traditionalr   _emit_for_cstyler   r   V_GOTOr   r   r   r   V_GOSUBr   r   	OP_RETURNr    OP_TERMINATEr#   millisecondsOP_WAITr   _emit_printr   _find_loop_ctxr   r   r	   r   r   _emit_incdec_stmtr   r   r   rB   )re   r  pctxs   &&  rJ   r
  CodeGenerator.emit_stmt  s   dG$$d.//dE""T"FdJ''NN4::&  -dF##MM$dI&&T"FdK((%vdO,,$$T*FdO,,$$T*Fd.//&&t,fdM**!!$'dH%%  (A%%q**o6dI&&  )A%%q**o6dJ''IIY'dM**II\*FdH%%NN4,,-IIW%dI&&T"FdH%%%%dii0C##D$4$4V$<=dL))%%dii0C  ''(8(8(@AdJ''""4(&dH%%NN499%v9$BCCrI   c                    V ^8  d   QhRRRR/# )rW   r  r   rX   rY   rC   )rZ   s   "rJ   r[   r     s     / / /$ /rI   c                	    VP                   P                  4       pW P                  9   d   \        R VP                    R24      h\	        V P
                  4      V P                  V&   R# )zlabel 'z' defined more than onceN)ri   ro   r   rB   r   r   )re   r  rp   s   && rJ   r  CodeGenerator._emit_label  sO    iioo"""3KLMM #DIIrI   c                    V ^8  d   QhRRRR/# )rW   r  r   rX   rY   rC   )rZ   s   "rJ   r[   r     s     @ @j @T @rI   c                	   V P                   P                  VP                  4      w  r#V'       d   \        R 4      hVP                  R8X  d   \
        M\        pV P                  V4       V P                  P                  \        4       V P                  P                  V4       V P                  V4       V P                  P                  \        4       R# r  )r   rw   r   rB   r   r  r  r   r   r   r   r   )re   r  r   rQ   r   s   &&   rJ   r  CodeGenerator._emit_incdec_stmt  s    22488<QRRDvf$!1!1+!>		$!1!1,!?rI   c                    V ^8  d   QhRRRR/# )rW   r  r   rX   rY   rC   )rZ   s   "rJ   r[   r      s      /  /	  /d  /rI   c                	   VP                    EF  p\        V\        4      '       d   VP                  P	                  R RR7      p\        ^ \        V4      ^ 4       Uu. uF  qCWD^ ,            NK  	  pp\        V4       F  w  rgV^ 8  d:   V P                  \        ^4      4       V P                  P                  \        4       V P                  P                  \        4       V P                  P                  \        V4      4       V ;P                  V,          un
        K  	  EK  \        V\        4      '       d   VP                  P!                  4       R8X  dj   \        VP                   4      ^8w  d   \#        R4      hV P                  VP                   ^ ,          4       V P                  P                  \$        4       EK  V P                  V4       V P                  P                  \&        4       EK  	  R# u upi )zlatin-1replace)errorsr@   z!ToBool expects exactly 1 argumentN)r   r   r   r   encoderanger   	enumerater   r   r   r   r  	OP_STRINGr   ri   ro   rB   OP_PRINT_BOOLOP_PRINT_INT)re   r  r   dataichunksidxchunks   &&      rJ   r  CodeGenerator._emit_print   sY   99C#}--yy''	)'D 5:!SY4KL4Kqqr6*4KL"+F"3JCQwz!}5		((1II$$Y/II$$SZ0II&I #4 C&&388>>+;x+Gsxx=A%&'JKKsxx{+		  /s#		  .?   Ms   G9c                    V ^8  d   QhRRRR/# )rW   r   rj   rX   r   rC   )rZ   s   "rJ   r[   r   "  s     V V3 V; VrI   c                	    \        V P                  4       F  pVP                  V8X  g   K  Vu # 	  \        R V R24      h)rv   z/' Exit/Continue used outside of a matching loop)reversedr   r   rB   )re   r   r!  s   && rJ   r  CodeGenerator._find_loop_ctx"  s=    DOO,Cxx4
 - Qtf$STUUrI   c                    V ^8  d   QhRRRR/# )rW   r  r   rX   rY   rC   )rZ   s   "rJ   r[   r   *  s     + +V + +rI   c                	   VP                   VP                  3.VP                  ,           pVP                  R Jp\	        V4      p. p\        V4       F  w  pw  rxV P                  V4       V P                  \        4      p	V P                  V4       Wd^,
          8H  ;'       d    V'       * p
V
'       g%   VP                  V P                  \        4      4       V P                  V	\	        V P                  4      4       K  	  V'       d   V P                  VP                  4       \	        V P                  4      pV F  pV P                  W4       K  	  R # r   )	conditionr   r   r   r   r/  r   r   V_BRANCH_IF_FALSEr   r   r  r   r   )re   r  clauseshas_elsenend_patchesr4  condr   false_patchis_last_clauseend_addrr   s   &&           rJ   r  CodeGenerator._emit_if*  s    NNDOO458K8KK??$.L!#(1OA|NN4 **+<=KOOD!q5j::(lN!""4#3#3F#;<k3tyy>:  2 OODOO,tyy>Aa* rI   c                    V ^8  d   QhRRRR/# )rW   r  r$   rX   rY   rC   )rZ   s   "rJ   r[   r   =  s     + +	 +d +rI   c                	P   \        V P                  4      pV P                  VP                  4       V P	                  \
        4      p\        R R7      pV P                  P                  V4       V P                  VP                  4       V P                  P                  4        VP                   F  pV P                  WR4       K  	  V P                  \        V4       \        V P                  4      pV P                  W64       VP                    F  pV P                  WV4       K  	  R# )Whiler   N)r   r   r   r?  r   r@  r   r   r   r   r   popr   r   r   r  r   re   r  top
exit_patchr!  r   rH  s   &&     rJ   r  CodeGenerator._emit_while=  s    $))nt~~&%%&78
w's#		"%%Aa% &FC(tyy>*/!!Aa* "rI   c                    V ^8  d   QhRRRR/# )rW   r  r   rX   rY   rC   )rZ   s   "rJ   r[   r   M  s     + +; +4 +rI   c                	P   \        V P                  4      pV P                  VP                  4       V P	                  \
        4      p\        R R7      pV P                  P                  V4       V P                  VP                  4       V P                  P                  4        VP                   F  pV P                  WR4       K  	  V P                  \        V4       \        V P                  4      pV P                  W64       VP                    F  pV P                  WV4       K  	  R# DorM  N)r   r   r   r?  r   V_BRANCH_IF_TRUEr   r   r   r   r   rN  r   r   r   r  r   rO  s   &&     rJ   r  CodeGenerator._emit_do_untilM  s    $))nt~~&%%&67
t$s#		"%%Aa% &FC(tyy>*/!!Aa* "rI   c                    V ^8  d   QhRRRR/# )rW   r  r   rX   rY   rC   )rZ   s   "rJ   r[   r   ]       + + +D +rI   c                	.   \        V P                  4      p\        R R7      pV P                  P	                  V4       V P                  VP                  4       V P                  P                  4        \        V P                  4      pVP                   F  pV P                  WT4       K  	  V P                  VP                  4       V P                  \        V4       \        V P                  4      pVP                   F  pV P                  WV4       K  	  R# rU  )r   r   r   r   r   r   r   rN  r   r   r   r?  r   rW  r   re   r  rP  r!  	cond_addrr   rH  s   &&     rJ   r  !CodeGenerator._emit_do_loop_while]  s    $))nt$s#		"		N	%%Aa+ &t~~&,c2tyy>!!Aa* "rI   c                    V ^8  d   QhRRRR/# )rW   r  r   rX   rY   rC   )rZ   s   "rJ   r[   r   l  rZ  rI   c                	.   \        V P                  4      p\        R R7      pV P                  P	                  V4       V P                  VP                  4       V P                  P                  4        \        V P                  4      pVP                   F  pV P                  WT4       K  	  V P                  VP                  4       V P                  \        V4       \        V P                  4      pVP                   F  pV P                  WV4       K  	  R# rU  )r   r   r   r   r   r   r   rN  r   r   r   r?  r   r@  r   r\  s   &&     rJ   r  !CodeGenerator._emit_do_loop_untill  s    $))nt$s#		"		N	%%Aa+ &t~~&-s3tyy>!!Aa* "rI   c                    V ^8  d   QhRRRR/# )rW   r  r   rX   rY   rC   )rZ   s   "rJ   r[   r   {  s     8+ 8+*< 8+ 8+rI   c                	
   V P                   P                  VP                  4      w  r#V'       d   \        R 4      hV P                   P	                  4       pV P                   P	                  4       pV P                  VP                  4       V P                  V4       V P                  P                  \        4       V P                  VP                  4       V P                  V4       V P                  P                  \        4       VP                  e   V P                  VP                  4      MV P                  ^4       V P                  V4       V P                  P                  \        4       \        V P                  4      pV P                  V4       V P                  P                  \        4       V P                  ^ 4       V P                  P                  \        4       V P                  V4       V P                  P                  \        4       V P                  V4       V P                  P                  \        4       V P                  P                  \         4       V P                  P                  \"        4       V P                  V4       V P                  P                  \        4       V P                  ^ 4       V P                  P                  \$        4       V P                  V4       V P                  P                  \        4       V P                  V4       V P                  P                  \        4       V P                  P                  \$        4       V P                  P                  \"        4       V P                  P                  \&        4       V P)                  \*        4      p\-        RR7      pV P.                  P                  V4       V P1                  VP2                  4       V P.                  P5                  4        \        V P                  4      p	VP6                   F  p
V P9                  W4       K  	  V P                  V4       V P                  P                  \        4       V P                  V4       V P                  P                  \        4       V P                  P                  \:        4       V P                  V4       V P                  P                  \        4       V P=                  \>        V4       \        V P                  4      pV P9                  W{4       VP@                   F  p
V P9                  W4       K  	  R# )!For loop variable must be IntegerNForrM  )!r   rw   r   rB   r   r   initr   r   r   r   limitstepr   r   OP_GEOP_GTOP_ANDOP_LTOP_ORr   rW  r   r   r   r   rN  r   r   r   r   r  r   )re   r  var_slotrQ   
limit_slot	step_slotr]  rQ  r!  	incr_addrr   rH  s   &&          rJ   r  #CodeGenerator._emit_for_traditional{  s    KK66txx@BCC[[668
KK557	tyy!(#TYY%5%5l%Ctzz"*%tyy'7'7'E%)YY%:tyy!@Q@QRS@T)$dii&6&6|&D		N	 	)$dii&6&6{&C!		(#TYY%5%5k%B*%tyy'7'7'D				 )$dii&6&6{&C!		(#TYY%5%5k%B*%tyy'7'7'D				 		%%&67
u%s#		" 		N	%%Aa+ &(#TYY%5%5k%B)$dii&6&6{&C		 (#TYY%5%5l%CFI.tyy>*/!!Aa* "rI   c                    V ^8  d   QhRRRR/# )rW   r  r   rX   rY   rC   )rZ   s   "rJ   r[   r     s     "+ "+] "+t "+rI   c                	   V P                   P                  VP                  4      w  r#V'       d   \        R 4      hV P	                  VP
                  4       V P                  V4       V P                  P                  \        4       \        V P                  4      pV P	                  VP                  4       V P                  \        4      p\        RR7      pV P                  P                  V4       V P!                  VP"                  4       V P                  P%                  4        \        V P                  4      pVP&                   F  pV P)                  W4       K  	  VP*                  e   V P-                  VP*                  4       MV P                  V4       V P                  P                  \.        4       V P                  P                  \0        4       V P                  V4       V P                  P                  \        4       V P3                  \4        V4       \        V P                  4      p	V P)                  WY4       VP6                   F  pV P)                  W4       K  	  R# )rd  re  rM  N)r   rw   r   rB   r   rf  r   r   r   r   r   r?  r   r@  r   r   r   r   rN  r   r   evaluater
  r   r  r   r  r   )
re   r  rn  rQ   rP  rQ  r!  evaluate_addrr   rH  s
   &&        rJ   r  CodeGenerator._emit_for_cstyle  s    KK66txx@BCCtyy!(#TYY%5%5l%C$))nt~~&%%&78
u%s#		"
 DII%%Aa/ &==$NN4==) h')9)9+)FIIV$h')9)9,)GFC(tyy>*/!!Aa* "rI   )r   r   r   r   r   r   ) rD   rE   rF   rG   rf   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
  r  r  r  r  r  r  r  r  r  r  r  rH   rC   rI   rJ   r   r      s    0 E
?2"G:
I0CE!
&>PD*7Dr/@ /DV+&+ + ++8+t"+ "+rI   r   c                    V ^8  d   QhRRRR/# r   rC   )rZ   s   "rJ   r[   r[     s     - -w -5 -rI   c                4    \        4       P                  V 4      # r   )r   r   )r   s   &rJ   generate_bytecoderz    s    ?##G,,rI   )	   
            )            )                  )<   =   >   ?   )j__conditional_annotations____doc__
__future__r   r   dataclassesr   r   	ast_nodesr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   commandsr%   r  r   r   r   r   r   OP_SUBOP_MULOP_DIVOP_MODOP_ABSOP_NEGrk  rm  OP_XOROP_NOTr  r  OP_SHLOP_SHROP_EQOP_NErj  ri  rl  OP_LErW  r@  r  r  r  r  r0  r2  r1  OP_SETCONFIGOP_GETCONFIGOP_SETCOMMANDOP_GETVALUEOP_GETTIMERCOUNTOP_SETTIMERCOUNTOP_SETTIMERSTATEOP_GETTIMERSTATE	OP_TOBOOLOP_SQRTOP_SINOP_COSOP_ATANr   r   r:   rR   itemsDEVICE_IO_VERBSr   	ExceptionrB   rL   rT   r   r   r   rz  )ri   specr  s   00@rJ   <module>r     s  * #  (! ! ! ! ! ! ! ! !D + )E &		 6 vvtt+M (ueUE5  	
	
	    	#9  f!6+.8=v	6 %v 	&  	 e	 !%	 *.u	 7:5	 CG	 feV,2 a#=!Q',1%,1%&40&40&40&40
;7 
 4C3H3H3JK3JZT4a=3JK	667E65&
GXy 	9 	   = =@4 : : :_+ _+D-W Ls   8F)