diff --git a/crates/cpu/tests/expected/next_pc.vcd b/crates/cpu/tests/expected/next_pc.vcd index ff6db88..c64ceee 100644 --- a/crates/cpu/tests/expected/next_pc.vcd +++ b/crates/cpu/tests/expected/next_pc.vcd @@ -22334,18 +22334,36 @@ b100 2 b1 : b100 ; b100 < +sCall\x20(4) = +b10100000000 > +b10100000000 ? +b10100000000 @ +b10100000000 A +b10100000000 B b10 C sHdlSome\x20(1) q< b100 u< b1 }< b100 ~< b100 != +sCall\x20(4) "= +b10100000000 #= +b10100000000 $= +b10100000000 %= +b10100000000 &= +b10100000000 '= b10 (= sHdlSome\x20(1) VX b100 ZX b1 bX b100 cX b100 dX +sCall\x20(4) eX +b10100000000 fX +b10100000000 gX +b10100000000 hX +b10100000000 iX +b10100000000 jX b10 kX b0 pX b101 sX @@ -22358,6 +22376,12 @@ b100 1Y b1 9Y b100 :Y b100 ;Y +sCall\x20(4) Y +b10100000000 ?Y +b10100000000 @Y +b10100000000 AY b10 BY b0 GY b101 JY @@ -22443,6 +22467,12 @@ b100 I/ b1 Q/ b100 R/ b100 S/ +sCall\x20(4) T/ +b10100000000 U/ +b10100000000 V/ +b10100000000 W/ +b10100000000 X/ +b10100000000 Y/ b10 Z/ 190 1;0 @@ -22508,6 +22538,12 @@ b100 .K b1 6K b100 7K b100 8K +sCall\x20(4) 9K +b10100000000 :K +b10100000000 ;K +b10100000000 K b10 ?K 1|K 1~K @@ -22520,18 +22556,36 @@ b0 2 b0 : b0 ; b0 < +sNonBranch\x20(0) = +b0 > +b0 ? +b0 @ +b0 A +b0 B b0 C sHdlNone\x20(0) q< b0 u< b0 }< b0 ~< b0 != +sNonBranch\x20(0) "= +b0 #= +b0 $= +b0 %= +b0 &= +b0 '= b0 (= sHdlNone\x20(0) VX b0 ZX b0 bX b0 cX b0 dX +sNonBranch\x20(0) eX +b0 fX +b0 gX +b0 hX +b0 iX +b0 jX b0 kX b1000 oX b100 pX @@ -22547,6 +22601,12 @@ b0 1Y b0 9Y b0 :Y b0 ;Y +sNonBranch\x20(0) Y +b0 ?Y +b0 @Y +b0 AY b0 BY b1000 FY b100 GY @@ -22637,6 +22697,12 @@ b100 b0 b1 j0 b100 k0 b100 l0 +sCall\x20(4) m0 +b10100000000 n0 +b10100000000 o0 +b10100000000 p0 +b10100000000 q0 +b10100000000 r0 b10 s0 1`1 1b1 @@ -22704,6 +22770,12 @@ b100 GL b1 OL b100 PL b100 QL +sCall\x20(4) RL +b10100000000 SL +b10100000000 TL +b10100000000 UL +b10100000000 VL +b10100000000 WL b10 XL 1EM 1GM @@ -22737,192 +22809,64 @@ b100 UY 1"Y 1WY 1)\ -b110000 & -b110 ' -b100 J -b1 R -b100 S -b100 T -b10 [ -1," -0." -b111000 i# -b111 j# -b110000 l# -b111000 m# -b110 w# -0P$ -1R$ -b101000 x$ -b110000 y$ -b101 %% -1;% -0=% -b100 E( -b100000 F( -b101 =) -b101000 ++ -b110000 ,+ -b101 6+ -b0 7+ -b0 8+ -b0 9+ -b0 :+ -b0 ;+ -b0 <+ -b0 =+ -b0 >+ -b0 ?+ -b0 @+ -b0 A+ -b0 B+ -b0 C+ -b0 D+ -b0 E+ -b0 F+ -b110 ~. +sHdlNone\x20(0) % +b0 & +b0 ' +sHdlSome\x20(1) ) +b100 * +0F 1^1 0b1 -b100 h1 -b100 o1 -b0 t1 -b0 u1 -b0 v1 -b0 w1 -b0 x1 -b0 y1 -b0 z1 -b0 {1 -b0 |1 -b0 }1 -b0 ~1 -b0 !2 -b0 "2 -b0 #2 -b0 $2 -b0 %2 -b1 /2 -b100 02 -b100 12 -b1000 82 -b0 =2 -b0 >2 -b0 ?2 -b0 @2 -b0 A2 -b0 B2 -b0 C2 -b0 D2 -b0 E2 -b0 F2 -b0 G2 -b0 H2 -b0 I2 -b0 J2 -b0 K2 -b0 L2 -b10 G3 -1I3 -b110000 i< -b110 j< -b100 /= -b1 7= -b100 8= -b100 9= -b10 @= -1o= -0q= -b111000 N? -b111 O? -b110000 Q? -b111000 R? -b110 \? -05@ -17@ -b101000 ]@ -b110000 ^@ -b101 h@ -1~@ -0"A -b100 *D -b100000 +D -b101 "E -b101000 nF -b110000 oF -b101 yF -b0 zF -b0 {F -b0 |F -b0 }F -b0 ~F -b0 !G -b0 "G -b0 #G -b0 $G -b0 %G -b0 &G -b0 'G -b0 (G -b0 )G -b0 *G -b0 +G -b110 cJ +sHdlSome\x20(1) )< +sHdlSome\x20(1) ?< +b10100000000 @< +b1000 A< +b100 B< +b1000 C< +sCall\x20(1) D< +1K< +b1 L< +b1 N< +1P< +b1 Q< +b11 S< +1U< +b100 V< +sHdlNone\x20(0) h< +b0 i< +b0 j< +sHdlSome\x20(1) l< +b100 m< +0+= 1CM 0GM -b100 MM -b100 TM -b0 YM -b0 ZM -b0 [M -b0 \M -b0 ]M -b0 ^M -b0 _M -b0 `M -b0 aM -b0 bM -b0 cM -b0 dM -b0 eM -b0 fM -b0 gM -b0 hM -b1 rM -b100 sM -b100 tM -b1000 {M -b0 "N -b0 #N -b0 $N -b0 %N -b0 &N -b0 'N -b0 (N -b0 )N -b0 *N -b0 +N -b0 ,N -b0 -N -b0 .N -b0 /N -b0 0N -b0 1N -b10 ,O -1.O -b110000 NX -b110 OX -b110000 %Y -b110 &Y -b100 \Y -b1 dY -b100 eY -b100 fY -b10 mY -b100 .\ -b1 6\ -b100 7\ -b100 8\ -b10 ?\ +sHdlSome\x20(1) lW +sHdlSome\x20(1) $X +b10100000000 %X +b1000 &X +b100 'X +b1000 (X +sCall\x20(1) )X +10X +b1 1X +b1 3X +15X +b1 6X +b11 8X +1:X +b100 ;X +sHdlNone\x20(0) MX +b0 NX +b0 OX +sHdlSome\x20(1) QX +b100 RX +0nX +sHdlNone\x20(0) $Y +b0 %Y +b0 &Y +sHdlSome\x20(1) (Y +b100 )Y +0EY 0( 0k< 0PX @@ -22955,178 +22899,104 @@ b101 UY 1"Y 1WY 1)\ -b0 J -b0 R -b0 S -b0 T -b0 [ -1r -0," -1." -b1000000 i# -b1000 j# -b111000 /$ -b1000000 0$ -b111 :$ -0R$ -0;% -b101 L( -b101000 M( -b110 =) -b10 E3 -0I3 -b100 O3 -b100 V3 -b0 [3 -b0 \3 -b0 ]3 -b0 ^3 -b0 _3 -b0 `3 -b0 a3 -b0 b3 -b0 c3 -b0 d3 -b0 e3 -b0 f3 -b0 g3 -b0 h3 -b0 i3 -b0 j3 -b1 t3 -b100 u3 -b100 v3 -b1000 }3 -b0 $4 -b0 %4 -b0 &4 -b0 '4 -b0 (4 -b0 )4 -b0 *4 -b0 +4 -b0 ,4 -b0 -4 -b0 .4 -b0 /4 -b0 04 -b0 14 -b0 24 -b0 34 -b10 j; -1l; -b0 /= -b0 7= -b0 8= -b0 9= -b0 @= -1W= -0o= -1q= -b1000000 N? -b1000 O? -b111000 r? -b1000000 s? -b111 }? -07@ -0~@ -b101 1D -b101000 2D -b110 "E -b10 *O -0.O -b100 4O -b100 ;O -b0 @O -b0 AO -b0 BO -b0 CO -b0 DO -b0 EO -b0 FO -b0 GO -b0 HO -b0 IO -b0 JO -b0 KO -b0 LO -b0 MO -b0 NO -b0 OO -b1 YO -b100 ZO -b100 [O -b1000 bO -b0 gO -b0 hO -b0 iO -b0 jO -b0 kO -b0 lO -b0 mO -b0 nO -b0 oO -b0 pO -b0 qO -b0 rO -b0 sO -b0 tO -b0 uO -b0 vO -b10 OW -1QW -b0 \Y -b0 dY -b0 eY -b0 fY -b0 mY -1&Z -b0 .\ -b0 6\ -b0 7\ -b0 8\ -b0 ?\ -1V\ +sHdlNone\x20(0) ) +b0 * +0." +sHdlSome\x20(1) V" +b10100000000 X" +b1000 Y" +b100 Z" +b1000 [" +sCall\x20(1) \" +b10 h# +b0 i# +1R$ +0T$ +0=% +b1 =) +0?) +b1 ~. +0"/ +sHdlNone\x20(0) )< +sHdlNone\x20(0) ?< +b0 @< +b0 A< +b0 B< +b0 C< +sBranch\x20(0) D< +0K< +b0 L< +b0 N< +0P< +b0 Q< +b0 S< +0U< +b0 V< +sHdlNone\x20(0) l< +b0 m< +0q= +sHdlSome\x20(1) ;> +b10100000000 => +b1000 >> +b100 ?> +b1000 @> +sCall\x20(1) A> +b10 M? +b0 N? +17@ +09@ +0"A +b1 "E +0$E +b1 cJ +0eJ +sHdlNone\x20(0) lW +sHdlNone\x20(0) $X +b0 %X +b0 &X +b0 'X +b0 (X +sBranch\x20(0) )X +00X +b0 1X +b0 3X +05X +b0 6X +b0 8X +0:X +b0 ;X +sHdlNone\x20(0) QX +b0 RX +sHdlNone\x20(0) (Y +b0 )Y +1( +1k< +1PX b1 pX -b10 vX -b10 |X +b0 rX +b0 tX +b0 uX +b0 vX +b0 wX +b0 xX +b0 zX +b0 {X +b0 |X +b0 }X +b1 ~X +1'Y b1 GY -b10 MY -b10 SY -sHdlSome\x20(1) ` -b100 b -b1 o -b1 u -b10 *" -sHdlSome\x20(1) E= -b100 G= -b1 T= -b1 Z= -b10 m= -sHdlSome\x20(1) rY -b100 tY -b1 #Z -b1 )Z -b10 -b11000 ? -b11000 @ -b11000 A -b11000 B +sBranchCond\x20(2) = +b10000000 > +b10000000 ? +b10000000 @ +b10000000 A +b10000000 B b10 C sHdlSome\x20(1) q< b1 r< b10 s< b1000 t< b100 u< -sBranchCond\x20(2) v< -b100 w< -b100 x< -b100 y< -b100 z< -b100 {< +sCall\x20(4) v< +b100000000 w< +b100000000 x< +b100000000 y< +b100000000 z< +b100000000 {< b1 |< b11 }< b1100 ~< b100 != -sCall\x20(4) "= -b11000 #= -b11000 $= -b11000 %= -b11000 &= -b11000 '= +sBranchCond\x20(2) "= +b10000000 #= +b10000000 $= +b10000000 %= +b10000000 &= +b10000000 '= b10 (= sHdlSome\x20(1) VX b1 WX b10 XX b1000 YX b100 ZX -sBranchCond\x20(2) [X -b100 \X -b100 ]X -b100 ^X -b100 _X -b100 `X +sCall\x20(4) [X +b100000000 \X +b100000000 ]X +b100000000 ^X +b100000000 _X +b100000000 `X b1 aX b11 bX b1100 cX b100 dX -sCall\x20(4) eX -b11000 fX -b11000 gX -b11000 hX -b11000 iX -b11000 jX +sBranchCond\x20(2) eX +b10000000 fX +b10000000 gX +b10000000 hX +b10000000 iX +b10000000 jX b10 kX b0 pX -b1 vX -b1 |X sHdlSome\x20(1) -Y b1 .Y b10 /Y b1000 0Y b100 1Y -sBranchCond\x20(2) 2Y -b100 3Y -b100 4Y -b100 5Y -b100 6Y -b100 7Y +sCall\x20(4) 2Y +b100000000 3Y +b100000000 4Y +b100000000 5Y +b100000000 6Y +b100000000 7Y b1 8Y b11 9Y b1100 :Y b100 ;Y -sCall\x20(4) Y -b11000 ?Y -b11000 @Y -b11000 AY +sBranchCond\x20(2) Y +b10000000 ?Y +b10000000 @Y +b10000000 AY b10 BY b0 GY -b1 MY -b1 SY -sHdlNone\x20(0) ` -b0 b -b0 o -b1 t -b0 u -b1 *" -sHdlNone\x20(0) E= -b0 G= -b0 T= -b1 Y= -b0 Z= -b1 m= -sHdlNone\x20(0) rY -b0 tY -b0 #Z -b1 (Z -b0 )Z -b1 +b1 )> +b10100000000 N? +b111 O? +b0 r? +b10100000000 s? +sHdlSome\x20(1) t? +b10 u? +b10100000000 w? +b1000 x? +b100 y? +b1000 z? +sCall\x20(1) {? +b110 }? +07@ +19@ +sHdlSome\x20(1) MX +b110 OX +sHdlSome\x20(1) $Y +b110 &Y b100 0 -b10000 1 -sBranch\x20(1) 3 -b10100 4 -b10100 5 -b10100 6 -b10100 7 -b10100 8 -b10 9 b101 : -b10100 ; -sBranch\x20(1) = -b10000 > -b10000 ? -b10000 @ -b10000 A -b10000 B -1k< -b10 r< b100 s< -b10000 t< -sBranch\x20(1) v< -b10100 w< -b10100 x< -b10100 y< -b10100 z< -b10100 {< -b10 |< b101 }< -b10100 ~< -sBranch\x20(1) "= -b10000 #= -b10000 $= -b10000 %= -b10000 &= -b10000 '= -1PX -b10 WX b100 XX -b10000 YX -sBranch\x20(1) [X -b10100 \X -b10100 ]X -b10100 ^X -b10100 _X -b10100 `X -b10 aX b101 bX -b10100 cX -sBranch\x20(1) eX -b10000 fX -b10000 gX -b10000 hX -b10000 iX -b10000 jX -b10000 oX -b10 qX -b11000 rX -b11 tX -b100000 uX -b0 vX -b100 wX -b101000 xX -b101 zX -b0 {X -b0 |X -b0 }X -b100 ~X -1'Y -b10 .Y b100 /Y -b10000 0Y -sBranch\x20(1) 2Y -b10100 3Y -b10100 4Y -b10100 5Y -b10100 6Y -b10100 7Y -b10 8Y b101 9Y -b10100 :Y -sBranch\x20(1) Y -b10000 ?Y -b10000 @Y -b10000 AY -b10000 FY -b10 HY -b11000 IY -b11 KY -b100000 LY -b0 MY -b100 NY -b101000 OY -b101 QY -b0 RY -b0 SY -b0 TY -b100 UY -b100 HZ -b100 x\ #268000000 0! 0# @@ -23521,296 +23195,104 @@ b100 x\ 1"Y 1WY 1)\ -b111000 & +b10100000000 & b111 ' -1P$ -0T$ -b110000 W$ -b111000 X$ +1F +0," +1." +b10100001000 i# +b1000 j# +b10100000000 l# +b10100001000 m# +b111 w# +b1000 x# +b1 *$ +b1 ,$ +0P$ +1R$ +b0 W$ +b10100000000 X$ +sHdlSome\x20(1) Y$ +b10 Z$ +b10100000000 \$ +b1000 ]$ +b100 ^$ +b1000 _$ +sCall\x20(1) `$ b110 b$ 1=% 1?% -b10 ;) -0?) -b110000 L+ -b111000 M+ -b110 W+ -b0 X+ -b0 Y+ -b0 Z+ -b0 [+ -b0 \+ -b0 ]+ -b0 ^+ -b0 _+ -b0 `+ -b0 a+ -b0 b+ -b0 c+ -b0 d+ -b0 e+ -b0 f+ -b0 g+ -b11 |. -b111 ~. -b10000 %/ -b11000 &/ -b10 0/ -b10 F/ -b100 G/ -b10000 H/ -sBranch\x20(1) J/ -b10100 K/ -b10100 L/ -b10100 M/ -b10100 N/ -b10100 O/ -b10 P/ -b101 Q/ -b10100 R/ -sBranch\x20(1) T/ -b10000 U/ -b10000 V/ -b10000 W/ -b10000 X/ -b10000 Y/ -070 -190 -b1000 }0 -b10000 ~0 -b1 *1 -b0 +1 -b0 ,1 -b0 -1 -b0 .1 -b0 /1 -b0 01 -b0 11 -b0 21 -b0 31 -b0 41 -b0 51 -b0 61 -b0 71 -b0 81 -b0 91 -b0 :1 -b1 @1 -b10 A1 -b1000 B1 -b100 C1 -sBranchCond\x20(2) D1 -b100 E1 -b100 F1 -b100 G1 -b100 H1 -b100 I1 -b1 J1 -b11 K1 -b1100 L1 -b100 M1 -sCall\x20(4) N1 -b11000 O1 -b11000 P1 -b11000 Q1 -b11000 R1 -b11000 S1 -b10 T1 -b1 W1 -b1000 X1 -0`1 -1b1 -b111000 i< +b0 c) +b10100000000 d) +sHdlSome\x20(1) e) +b10 f) +b10100000000 h) +b1000 i) +b100 j) +b1000 k) +sCall\x20(1) l) +b110 n) +b10 ~. +1"/ +b10100000000 i< b111 j< -15@ -09@ -b110000 <@ -b111000 =@ +1+= +0o= +1q= +b10100001000 N? +b1000 O? +b10100000000 Q? +b10100001000 R? +b111 \? +b1000 ]? +b1 m? +b1 o? +05@ +17@ +b0 <@ +b10100000000 =@ +sHdlSome\x20(1) >@ +b10 ?@ +b10100000000 A@ +b1000 B@ +b100 C@ +b1000 D@ +sCall\x20(1) E@ b110 G@ 1"A 1$A -b10 ~D -0$E -b110000 1G -b111000 2G -b110 G -b0 ?G -b0 @G -b0 AG -b0 BG -b0 CG -b0 DG -b0 EG -b0 FG -b0 GG -b0 HG -b0 IG -b0 JG -b0 KG -b0 LG -b11 aJ -b111 cJ -b10000 hJ -b11000 iJ -b10 sJ -b10 +K -b100 ,K -b10000 -K -sBranch\x20(1) /K -b10100 0K -b10100 1K -b10100 2K -b10100 3K -b10100 4K -b10 5K -b101 6K -b10100 7K -sBranch\x20(1) 9K -b10000 :K -b10000 ;K -b10000 K -0zK -1|K -b1000 bL -b10000 cL -b1 mL -b0 nL -b0 oL -b0 pL -b0 qL -b0 rL -b0 sL -b0 tL -b0 uL -b0 vL -b0 wL -b0 xL -b0 yL -b0 zL -b0 {L -b0 |L -b0 }L -b1 %M -b10 &M -b1000 'M -b100 (M -sBranchCond\x20(2) )M -b100 *M -b100 +M -b100 ,M -b100 -M -b100 .M -b1 /M -b11 0M -b1100 1M -b100 2M -sCall\x20(4) 3M -b11000 4M -b11000 5M -b11000 6M -b11000 7M -b11000 8M -b10 9M -b1 -b0 ? -b0 @ -b0 A -b0 B -b11 r< b110 s< -b11000 t< -b11100 w< -b11100 x< -b11100 y< -b11100 z< -b11100 {< -b11 |< b111 }< -b11100 ~< -sRet\x20(7) "= -b0 #= -b0 $= -b0 %= -b0 &= -b0 '= -b11 WX b110 XX -b11000 YX -b11100 \X -b11100 ]X -b11100 ^X -b11100 _X -b11100 `X -b11 aX b111 bX -b11100 cX -sRet\x20(7) eX -b0 fX -b0 gX -b0 hX -b0 iX -b0 jX -b11000 oX -b11 qX -b100000 rX -b100 tX -b101000 uX -b101 wX -b110000 xX -b111 yX -b110 zX -b11 .Y +b111 sX +b110 tX +b10 ~X b110 /Y -b11000 0Y -b11100 3Y -b11100 4Y -b11100 5Y -b11100 6Y -b11100 7Y -b11 8Y b111 9Y -b11100 :Y -sRet\x20(7) Y -b0 ?Y -b0 @Y -b0 AY -b11000 FY -b11 HY -b100000 IY -b100 KY -b101000 LY -b101 NY -b110000 OY -b111 PY -b110 QY -b11 HZ -b11 x\ +b111 JY +b110 KY +b10 UY #269000000 0! 0# @@ -23827,5211 +23309,3 @@ b11 x\ 1"Y 1WY 1)\ -sHdlNone\x20(0) % -b0 & -b0 ' -sHdlSome\x20(1) ) -b100 * -0F -b11 ;) -170 -0;0 -b10000 >0 -b11000 ?0 -b10 I0 -b10 _0 -b100 `0 -b10000 a0 -sBranch\x20(1) c0 -b10100 d0 -b10100 e0 -b10100 f0 -b10100 g0 -b10100 h0 -b10 i0 -b101 j0 -b10100 k0 -sBranch\x20(1) m0 -b10000 n0 -b10000 o0 -b10000 p0 -b10000 q0 -b10000 r0 -b10 v0 -b10000 w0 -0^1 -1`1 -0b1 -sHdlSome\x20(1) )< -b1000 >< -sHdlSome\x20(1) ?< -b100 @< -b100 A< -sCondTaken\x20(2) E< -1K< -b10 L< -b1 N< -1P< -b1 Q< -b11 S< -1U< -b100 V< -b1 [< -sHdlNone\x20(0) h< -b0 i< -b0 j< -sHdlSome\x20(1) l< -b100 m< -0+= -b11 ~D -1zK -0~K -b10000 #L -b11000 $L -b10 .L -b10 DL -b100 EL -b10000 FL -sBranch\x20(1) HL -b10100 IL -b10100 JL -b10100 KL -b10100 LL -b10100 ML -b10 NL -b101 OL -b10100 PL -sBranch\x20(1) RL -b10000 SL -b10000 TL -b10000 UL -b10000 VL -b10000 WL -b10 [L -b10000 \L -0CM -1EM -0GM -sHdlSome\x20(1) lW -b1000 #X -sHdlSome\x20(1) $X -b100 %X -b100 &X -sCondTaken\x20(2) *X -10X -b10 1X -b1 3X -15X -b1 6X -b11 8X -1:X -b100 ;X -b1 @X -sHdlNone\x20(0) MX -b0 NX -b0 OX -sHdlSome\x20(1) QX -b100 RX -0nX -sHdlNone\x20(0) $Y -b0 %Y -b0 &Y -sHdlSome\x20(1) (Y -b100 )Y -0EY -b100 / -b1000 0 -b100000 1 -b0 2 -sInterrupt\x20(9) 3 -b11111111000000000000000000000000 4 -b11111111000000000000000000000000 5 -b11111111000000000000000000000000 6 -b11111111000000000000000000000000 7 -b11111111000000000000000000000000 8 -b0 9 -b0 : -b0 ; -b0 < -sNonBranch\x20(0) = -b1 C -b100 r< -b1000 s< -b100000 t< -b0 u< -sInterrupt\x20(9) v< -b11111111000000000000000000000000 w< -b11111111000000000000000000000000 x< -b11111111000000000000000000000000 y< -b11111111000000000000000000000000 z< -b11111111000000000000000000000000 {< -b0 |< -b0 }< -b0 ~< -b0 != -sNonBranch\x20(0) "= -b1 (= -b100 WX -b1000 XX -b100000 YX -b0 ZX -sInterrupt\x20(9) [X -b11111111000000000000000000000000 \X -b11111111000000000000000000000000 ]X -b11111111000000000000000000000000 ^X -b11111111000000000000000000000000 _X -b11111111000000000000000000000000 `X -b0 aX -b0 bX -b0 cX -b0 dX -sNonBranch\x20(0) eX -b1 kX -b100000 oX -b100 qX -b101000 rX -b101 tX -b110000 uX -b110 vX -b110 wX -b111000 xX -b10 yX -b111 zX -b100 .Y -b1000 /Y -b100000 0Y -b0 1Y -sInterrupt\x20(9) 2Y -b11111111000000000000000000000000 3Y -b11111111000000000000000000000000 4Y -b11111111000000000000000000000000 5Y -b11111111000000000000000000000000 6Y -b11111111000000000000000000000000 7Y -b0 8Y -b0 9Y -b0 :Y -b0 ;Y -sNonBranch\x20(0) < -sHdlNone\x20(0) ?< -b0 @< -b0 A< -sUnconditional\x20(0) E< -0K< -b0 L< -b0 N< -0P< -b0 Q< -b0 S< -0U< -b0 V< -b0 [< -sHdlNone\x20(0) l< -b0 m< -0s= -sHdlSome\x20(1) ;> -b1000 <> -b100 => -b100 >> -sCondTaken\x20(2) B> -b10 M? -b1000 N? -17@ -0"A -0$A -b11 "E -b11 cJ -0EM -sHdlNone\x20(0) lW -b0 #X -sHdlNone\x20(0) $X -b0 %X -b0 &X -sUnconditional\x20(0) *X -00X -b0 1X -b0 3X -05X -b0 6X -b0 8X -0:X -b0 ;X -b0 @X -sHdlNone\x20(0) QX -b0 RX -sHdlNone\x20(0) (Y -b0 )Y -sHdlNone\x20(0) . -b0 / -b0 0 -b0 1 -sNonBranch\x20(0) 3 -b0 4 -b0 5 -b0 6 -b0 7 -b0 8 -b0 C -sHdlNone\x20(0) q< -b0 r< -b0 s< -b0 t< -sNonBranch\x20(0) v< -b0 w< -b0 x< -b0 y< -b0 z< -b0 {< -b0 (= -sHdlNone\x20(0) VX -b0 WX -b0 XX -b0 YX -sNonBranch\x20(0) [X -b0 \X -b0 ]X -b0 ^X -b0 _X -b0 `X -b0 kX -b0 oX -b0 qX -b0 rX -b0 tX -b0 uX -b0 vX -b0 wX -b0 xX -b0 yX -b0 zX -b0 ~X -sHdlNone\x20(0) -Y -b0 .Y -b0 /Y -b0 0Y -sNonBranch\x20(0) 2Y -b0 3Y -b0 4Y -b0 5Y -b0 6Y -b0 7Y -b0 BY -b0 FY -b0 HY -b0 IY -b0 KY -b0 LY -b0 MY -b0 NY -b0 OY -b0 PY -b0 QY -b0 UY -b1 HZ -b1 x\ -#271000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#271500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -1." -10" -1q= -1s= -sHdlSome\x20(1) ` -b1 a -b1000 b -b1 o -sHdlSome\x20(1) E= -b1 F= -b1000 G= -b1 T= -sHdlSome\x20(1) rY -b1 sY -b1000 tY -b1 #Z -b0 HZ -sHdlSome\x20(1) D\ -b1 E\ -b1000 F\ -b1 S\ -b0 x\ -#272000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#272500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -sHdlSome\x20(1) % -b1000 & -b1000 ' -1," -0." -00" -b100 i# -b1001 j# -b1000 /$ -b100 0$ -sHdlSome\x20(1) 1$ -b10 2$ -b100 4$ -b100 5$ -sCondTaken\x20(2) 9$ -b1000 :$ -0R$ -1T$ -sHdlSome\x20(1) h< -b1000 i< -b1000 j< -1o= -0q= -0s= -b100 N? -b1001 O? -b1000 r? -b100 s? -sHdlSome\x20(1) t? -b10 u? -b100 w? -b100 x? -sCondTaken\x20(2) |? -b1000 }? -07@ -19@ -sHdlSome\x20(1) MX -b1000 NX -b1000 OX -sHdlSome\x20(1) $Y -b1000 %Y -b1000 &Y -#273000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#273500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -b100 & -b1001 ' -1F -0," -1." -b1000 i# -b1010 j# -b100 l# -b1000 m# -b1001 w# -0P$ -1R$ -b1000 W$ -b100 X$ -sHdlSome\x20(1) Y$ -b10 Z$ -b100 \$ -b100 ]$ -sCondTaken\x20(2) a$ -b1000 b$ -1=% -1?% -b1000 G* -b100 H* -sHdlSome\x20(1) I* -b10 J* -b100 L* -b100 M* -sCondTaken\x20(2) Q* -b1000 R* -b100 ~. -1"/ -b100 i< -b1001 j< -1+= -0o= -1q= -b1000 N? -b1010 O? -b100 Q? -b1000 R? -b1001 \? -05@ -17@ -b1000 <@ -b100 =@ -sHdlSome\x20(1) >@ -b10 ?@ -b100 A@ -b100 B@ -sCondTaken\x20(2) F@ -b1000 G@ -1"A -1$A -b1000 ,F -b100 -F -sHdlSome\x20(1) .F -b10 /F -b100 1F -b100 2F -sCondTaken\x20(2) 6F -b1000 7F -b100 cJ -1eJ -b100 NX -b1001 OX -1nX -b100 %Y -b1001 &Y -1EY -b1000 oX -b110 pX -b1000 qX -b1 ~X -b1000 FY -b110 GY -b1000 HY -b1 UY -#274000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#274500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -sHdlNone\x20(0) % -b0 & -b0 ' -sHdlSome\x20(1) ) -b10 * -0F -1P$ -0T$ -b100 x$ -b1000 y$ -b1001 %% -1;% -0=% -0?% -b100 h* -b1000 i* -b1001 s* -b101 ~. -sHdlSome\x20(1) )< -b1000 >< -sHdlSome\x20(1) ?< -b100 @< -b100 A< -sCondNotTaken\x20(3) E< -sHdlSome\x20(1) F< -b10 G< -1K< -b1 L< -b1 Q< -1U< -b10 V< -sHdlNone\x20(0) h< -b0 i< -b0 j< -sHdlSome\x20(1) l< -b10 m< -0+= -15@ -09@ -b100 ]@ -b1000 ^@ -b1001 h@ -1~@ -0"A -0$A -b100 MF -b1000 NF -b1001 XF -b101 cJ -sHdlSome\x20(1) lW -b1000 #X -sHdlSome\x20(1) $X -b100 %X -b100 &X -sCondNotTaken\x20(3) *X -sHdlSome\x20(1) +X -b10 ,X -10X -b1 1X -b1 6X -1:X -b10 ;X -sHdlNone\x20(0) MX -b0 NX -b0 OX -sHdlSome\x20(1) QX -b10 RX -0nX -sHdlNone\x20(0) $Y -b0 %Y -b0 &Y -sHdlSome\x20(1) (Y -b10 )Y -0EY -b101 pX -b100 rX -b1 sX -b1001 tX -b10 ~X -b101 GY -b100 IY -b1 JY -b1001 KY -b10 UY -#275000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#275500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -sHdlNone\x20(0) ) -b0 * -0." -sCondNotTaken\x20(3) ]" -1=% -b11 ~. -0"/ -sHdlNone\x20(0) )< -b0 >< -sHdlNone\x20(0) ?< -b0 @< -b0 A< -sUnconditional\x20(0) E< -sHdlNone\x20(0) F< -b0 G< -0K< -b0 L< -b0 Q< -0U< -b0 V< -sHdlNone\x20(0) l< -b0 m< -0q= -sCondNotTaken\x20(3) B> -1"A -b11 cJ -0eJ -sHdlNone\x20(0) lW -b0 #X -sHdlNone\x20(0) $X -b0 %X -b0 &X -sUnconditional\x20(0) *X -sHdlNone\x20(0) +X -b0 ,X -00X -b0 1X -b0 6X -0:X -b0 ;X -sHdlNone\x20(0) QX -b0 RX -sHdlNone\x20(0) (Y -b0 )Y -b0 oX -b0 pX -b0 qX -b0 rX -b0 sX -b0 tX -b0 ~X -b0 FY -b0 GY -b0 HY -b0 IY -b0 JY -b0 KY -b0 UY -#276000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#276500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -1." -10" -1q= -1s= -#277000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#277500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -sHdlSome\x20(1) % -b1000 & -b1010 ' -1," -0." -00" -b1100 i# -b1011 j# -b1100 0$ -sCondNotTaken\x20(3) 9$ -b1010 :$ -0R$ -1T$ -sHdlSome\x20(1) h< -b1000 i< -b1010 j< -1o= -0q= -0s= -b1100 N? -b1011 O? -b1100 s? -sCondNotTaken\x20(3) |? -b1010 }? -07@ -19@ -sHdlSome\x20(1) MX -b1000 NX -b1010 OX -sHdlSome\x20(1) $Y -b1000 %Y -b1010 &Y -#278000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#278500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -b1100 & -b1011 ' -1F -0," -1." -b10000 i# -b1100 j# -b1100 l# -b10000 m# -b1011 w# -0P$ -1R$ -b1000 x$ -b1100 y$ -sHdlSome\x20(1) z$ -b10 {$ -b100 }$ -b100 ~$ -sCondNotTaken\x20(3) $% -b1010 %% -0=% -1?% -b1100 H* -sCondNotTaken\x20(3) Q* -b1010 R* -b100 ~. -1"/ -b1100 i< -b1011 j< -1+= -0o= -1q= -b10000 N? -b1100 O? -b1100 Q? -b10000 R? -b1011 \? -05@ -17@ -b1000 ]@ -b1100 ^@ -sHdlSome\x20(1) _@ -b10 `@ -b100 b@ -b100 c@ -sCondNotTaken\x20(3) g@ -b1010 h@ -0"A -1$A -b1100 -F -sCondNotTaken\x20(3) 6F -b1010 7F -b100 cJ -1eJ -b1100 NX -b1011 OX -1nX -b1100 %Y -b1011 &Y -1EY -b1000 oX -b11 pX -b1010 qX -b1 ~X -b1000 FY -b11 GY -b1010 HY -b1 UY -#279000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#279500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -b10000 & -b1100 ' -1," -0." -b11000 i# -b1101 j# -b10000 /$ -b11000 0$ -sHdlNone\x20(0) 1$ -b0 2$ -b0 4$ -b0 5$ -sUnconditional\x20(0) 9$ -b1100 :$ -1P$ -0R$ -b1100 W$ -b10000 X$ -sHdlNone\x20(0) Y$ -b0 Z$ -b0 \$ -b0 ]$ -sUnconditional\x20(0) a$ -b1011 b$ -0;% -1=% -0?% -b1010 >( -b1000 ?( -sHdlSome\x20(1) A( -b10001000 B( -b100 =) -1?) -b1100 h* -b10000 i* -b1011 s* -b101 ~. -b10000 i< -b1100 j< -1o= -0q= -b11000 N? -b1101 O? -b10000 r? -b11000 s? -sHdlNone\x20(0) t? -b0 u? -b0 w? -b0 x? -sUnconditional\x20(0) |? -b1100 }? -15@ -07@ -b1100 <@ -b10000 =@ -sHdlNone\x20(0) >@ -b0 ?@ -b0 A@ -b0 B@ -sUnconditional\x20(0) F@ -b1011 G@ -0~@ -1"A -0$A -b1010 #D -b1000 $D -sHdlSome\x20(1) &D -b10001000 'D -b100 "E -1$E -b1100 MF -b10000 NF -b1011 XF -b101 cJ -b10000 NX -b1100 OX -b10000 %Y -b1100 &Y -b10 pX -b1100 rX -b110 sX -b1011 tX -b10 ~X -b10 GY -b1100 IY -b110 JY -b1011 KY -b10 UY -#280000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#280500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -b11000 & -b1101 ' -0," -1." -b100000 i# -b1110 j# -b11000 l# -b100000 m# -b1101 w# -0P$ -1R$ -b10000 x$ -b11000 y$ -sHdlNone\x20(0) z$ -b0 {$ -b0 }$ -b0 ~$ -sUnconditional\x20(0) $% -b1100 %% -1;% -0=% -b1011 E( -b1100 F( -b101 =) -b10000 ++ -b11000 ,+ -b1100 6+ -b110 ~. -b11000 i< -b1101 j< -0o= -1q= -b100000 N? -b1110 O? -b11000 Q? -b100000 R? -b1101 \? -05@ -17@ -b10000 ]@ -b11000 ^@ -sHdlNone\x20(0) _@ -b0 `@ -b0 b@ -b0 c@ -sUnconditional\x20(0) g@ -b1100 h@ -1~@ -0"A -b1011 *D -b1100 +D -b101 "E -b10000 nF -b11000 oF -b1100 yF -b110 cJ -b11000 NX -b1101 OX -b11000 %Y -b1101 &Y -b1 pX -b101 sX -b10000 uX -b1 vX -b1100 wX -b11 ~X -b1 GY -b101 JY -b10000 LY -b1 MY -b1100 NY -b11 UY -#281000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#281500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -b100000 & -b1110 ' -1," -0." -b101000 i# -b1111 j# -b100000 /$ -b101000 0$ -b1110 :$ -1P$ -0R$ -b11000 W$ -b100000 X$ -b1101 b$ -0;% -1=% -b1100 L( -b10000 M( -b110 =) -b11000 L+ -b100000 M+ -b1101 W+ -b111 ~. -b100000 i< -b1110 j< -1o= -0q= -b101000 N? -b1111 O? -b100000 r? -b101000 s? -b1110 }? -15@ -07@ -b11000 <@ -b100000 =@ -b1101 G@ -0~@ -1"A -b1100 1D -b10000 2D -b110 "E -b11000 1G -b100000 2G -b1101 -b11000 ? -b11000 @ -b11000 A -b11000 B -b10 C -sHdlSome\x20(1) q< -b1010 r< -b1001 s< -b1000 t< -b100 u< -sBranchCond\x20(2) v< -b100 w< -b100 x< -b100 y< -b100 z< -b100 {< -b1010 |< -b1010 }< -b1100 ~< -b100 != -sCall\x20(4) "= -b11000 #= -b11000 $= -b11000 %= -b11000 &= -b11000 '= -b10 (= -sHdlSome\x20(1) VX -b1010 WX -b1001 XX -b1000 YX -b100 ZX -sBranchCond\x20(2) [X -b100 \X -b100 ]X -b100 ^X -b100 _X -b100 `X -b1010 aX -b1010 bX -b1100 cX -b100 dX -sCall\x20(4) eX -b11000 fX -b11000 gX -b11000 hX -b11000 iX -b11000 jX -b10 kX -b0 pX -b100 sX -b0 vX -b11000 xX -b101 yX -b1101 zX -b100 ~X -sHdlSome\x20(1) -Y -b1010 .Y -b1001 /Y -b1000 0Y -b100 1Y -sBranchCond\x20(2) 2Y -b100 3Y -b100 4Y -b100 5Y -b100 6Y -b100 7Y -b1010 8Y -b1010 9Y -b1100 :Y -b100 ;Y -sCall\x20(4) Y -b11000 ?Y -b11000 @Y -b11000 AY -b10 BY -b0 GY -b100 JY -b0 MY -b11000 OY -b101 PY -b1101 QY -b100 UY -#282000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#282500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -b101000 & -b1111 ' -0," -1." -b110000 i# -b10000 j# -b101000 l# -b110000 m# -b1111 w# -0P$ -1R$ -b100000 x$ -b101000 y$ -b1110 %% -1;% -0=% -b1101 S( -b11000 T( -b111 =) -b100000 m+ -b101000 n+ -b1110 x+ -b0 y+ -b0 z+ -b0 {+ -b0 |+ -b0 }+ -b0 ~+ -b0 !, -b0 ", -b0 #, -b0 $, -b0 %, -b0 &, -b0 ', -b0 (, -b0 ), -b0 *, -b100 |. -b1000 ~. -0"/ -b1100 ^/ -sHdlSome\x20(1) _/ -b10 `/ -b100 b/ -b100 c/ -sCondNotTaken\x20(3) g/ -b1010 h/ -b1010 ~/ -b1001 !0 -b1010 *0 -b1010 +0 -090 -1;0 -b101000 i< -b1111 j< -0o= -1q= -b110000 N? -b10000 O? -b101000 Q? -b110000 R? -b1111 \? -05@ -17@ -b100000 ]@ -b101000 ^@ -b1110 h@ -1~@ -0"A -b1101 8D -b11000 9D -b111 "E -b100000 RG -b101000 SG -b1110 ]G -b0 ^G -b0 _G -b0 `G -b0 aG -b0 bG -b0 cG -b0 dG -b0 eG -b0 fG -b0 gG -b0 hG -b0 iG -b0 jG -b0 kG -b0 lG -b0 mG -b100 aJ -b1000 cJ -0eJ -b1100 CK -sHdlSome\x20(1) DK -b10 EK -b100 GK -b100 HK -sCondNotTaken\x20(3) LK -b1010 MK -b1010 cK -b1001 dK -b1010 mK -b1010 nK -0|K -1~K -b101000 NX -b1111 OX -b101000 %Y -b1111 &Y -sHdlNone\x20(0) . -b0 / -b0 0 -b0 1 -b0 2 -sNonBranch\x20(0) 3 -b0 4 -b0 5 -b0 6 -b0 7 -b0 8 -b0 9 -b0 : -b0 ; -b0 < -sNonBranch\x20(0) = -b0 > -b0 ? -b0 @ -b0 A -b0 B -b0 C -sHdlNone\x20(0) q< -b0 r< -b0 s< -b0 t< -b0 u< -sNonBranch\x20(0) v< -b0 w< -b0 x< -b0 y< -b0 z< -b0 {< -b0 |< -b0 }< -b0 ~< -b0 != -sNonBranch\x20(0) "= -b0 #= -b0 $= -b0 %= -b0 &= -b0 '= -b0 (= -sHdlNone\x20(0) VX -b0 WX -b0 XX -b0 YX -b0 ZX -sNonBranch\x20(0) [X -b0 \X -b0 ]X -b0 ^X -b0 _X -b0 `X -b0 aX -b0 bX -b0 cX -b0 dX -sNonBranch\x20(0) eX -b0 fX -b0 gX -b0 hX -b0 iX -b0 jX -b0 kX -b1100 oX -b11 pX -b1011 qX -b10000 rX -b0 sX -b1100 tX -b11000 uX -b100 vX -b1101 wX -b100000 xX -b0 yX -b1110 zX -sHdlNone\x20(0) -Y -b0 .Y -b0 /Y -b0 0Y -b0 1Y -sNonBranch\x20(0) 2Y -b0 3Y -b0 4Y -b0 5Y -b0 6Y -b0 7Y -b0 8Y -b0 9Y -b0 :Y -b0 ;Y -sNonBranch\x20(0) Y -b0 ?Y -b0 @Y -b0 AY -b0 BY -b1100 FY -b11 GY -b1011 HY -b10000 IY -b0 JY -b1100 KY -b11000 LY -b100 MY -b1101 NY -b100000 OY -b0 PY -b1110 QY -#283000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#283500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -b110000 & -b10000 ' -1," -0." -b111000 i# -b10001 j# -b110000 /$ -b111000 0$ -b10000 :$ -1P$ -0R$ -b101000 W$ -b110000 X$ -b1111 b$ -0;% -1=% -b1110 Z( -b100000 [( -b100 ;) -b1000 =) -b101000 0, -b110000 1, -b1111 ;, -b0 <, -b0 =, -b0 >, -b0 ?, -b0 @, -b0 A, -b0 B, -b0 C, -b0 D, -b0 E, -b0 F, -b0 G, -b0 H, -b0 I, -b0 J, -b0 K, -b1001 ~. -1"/ -070 -0;0 -b1000 >0 -b1100 ?0 -sHdlSome\x20(1) @0 -b10 A0 -b100 C0 -b100 D0 -sCondNotTaken\x20(3) H0 -b1010 I0 -b1010 _0 -b1001 `0 -b1000 a0 -sBranchCond\x20(2) c0 -b100 d0 -b100 e0 -b100 f0 -b100 g0 -b100 h0 -b1010 i0 -b1010 j0 -b1100 k0 -sCall\x20(4) m0 -b11000 n0 -b11000 o0 -b11000 p0 -b11000 q0 -b11000 r0 -b1010 v0 -b1000 w0 -sHdlSome\x20(1) y0 -b10001000 z0 -1`1 -1b1 -b110000 i< -b10000 j< -1o= -0q= -b111000 N? -b10001 O? -b110000 r? -b111000 s? -b10000 }? -15@ -07@ -b101000 <@ -b110000 =@ -b1111 G@ -0~@ -1"A -b1110 ?D -b100000 @D -b100 ~D -b1000 "E -b101000 sG -b110000 tG -b1111 ~G -b0 !H -b0 "H -b0 #H -b0 $H -b0 %H -b0 &H -b0 'H -b0 (H -b0 )H -b0 *H -b0 +H -b0 ,H -b0 -H -b0 .H -b0 /H -b0 0H -b1001 cJ -1eJ -0zK -0~K -b1000 #L -b1100 $L -sHdlSome\x20(1) %L -b10 &L -b100 (L -b100 )L -sCondNotTaken\x20(3) -L -b1010 .L -b1010 DL -b1001 EL -b1000 FL -sBranchCond\x20(2) HL -b100 IL -b100 JL -b100 KL -b100 LL -b100 ML -b1010 NL -b1010 OL -b1100 PL -sCall\x20(4) RL -b11000 SL -b11000 TL -b11000 UL -b11000 VL -b11000 WL -b1010 [L -b1000 \L -sHdlSome\x20(1) ^L -b10001000 _L -1EM -1GM -b110000 NX -b10000 OX -b110000 %Y -b10000 &Y -0( -0k< -0PX -b10 pX -b11 vX -b101000 {X -b11 |X -b1111 }X -b101 ~X -0'Y -b10 GY -b11 MY -b101000 RY -b11 SY -b1111 TY -b101 UY -#284000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#284500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -b1010 G -b1001 H -b1000 I -b100 J -sBranchCond\x20(2) K -b100 L -b100 M -b100 N -b100 O -b100 P -b1 [ -0," -1." -b1000000 i# -b10010 j# -b111000 l# -b1000000 m# -b10001 w# -1R$ -1;% -b1111 a( -b101000 b( -b1001 =) -1^1 -0b1 -b1010 U2 -b1001 V2 -b1000 W2 -b100 X2 -sBranchCond\x20(2) Y2 -b100 Z2 -b100 [2 -b100 \2 -b100 ]2 -b100 ^2 -b100 _2 -sHdlSome\x20(1) `2 -b10 a2 -b0 d2 -b0 e2 -b0 f2 -b0 g2 -b0 h2 -b0 i2 -b0 j2 -b0 k2 -b0 l2 -b0 m2 -b0 n2 -b0 o2 -b0 p2 -b0 q2 -b0 r2 -b0 s2 -sHdlSome\x20(1) x2 -b10001000 y2 -b11 G3 -1I3 -b1010 ,= -b1001 -= -b1000 .= -b100 /= -sBranchCond\x20(2) 0= -b100 1= -b100 2= -b100 3= -b100 4= -b100 5= -b1 @= -0o= -1q= -b1000000 N? -b10010 O? -b111000 Q? -b1000000 R? -b10001 \? -17@ -1~@ -b1111 FD -b101000 GD -b1001 "E -1CM -0GM -b1010 :N -b1001 ;N -b1000 N -b100 ?N -b100 @N -b100 AN -b100 BN -b100 CN -b100 DN -sHdlSome\x20(1) EN -b10 FN -b0 IN -b0 JN -b0 KN -b0 LN -b0 MN -b0 NN -b0 ON -b0 PN -b0 QN -b0 RN -b0 SN -b0 TN -b0 UN -b0 VN -b0 WN -b0 XN -sHdlSome\x20(1) ]N -b10001000 ^N -b11 ,O -1.O -b1010 YY -b1001 ZY -b1000 [Y -b100 \Y -sBranchCond\x20(2) ]Y -b100 ^Y -b100 _Y -b100 `Y -b100 aY -b100 bY -b1 mY -b1010 +\ -b1001 ,\ -b1000 -\ -b100 .\ -sBranchCond\x20(2) /\ -b100 0\ -b100 1\ -b100 2\ -b100 3\ -b100 4\ -b1 ?\ -b1 pX -b10 vX -b10 |X -b1 GY -b10 MY -b10 SY -#285000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#285500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -b0 G -b0 H -b0 I -b0 J -sNonBranch\x20(0) K -b0 L -b0 M -b0 N -b0 O -b0 P -b0 [ -1r -0." -10" -b11 E3 -0I3 -b1010 <4 -b1001 =4 -b1000 >4 -b100 ?4 -sBranchCond\x20(2) @4 -b100 A4 -b100 B4 -b100 C4 -b100 D4 -b100 E4 -b100 F4 -sHdlSome\x20(1) G4 -b10 H4 -b0 K4 -b0 L4 -b0 M4 -b0 N4 -b0 O4 -b0 P4 -b0 Q4 -b0 R4 -b0 S4 -b0 T4 -b0 U4 -b0 V4 -b0 W4 -b0 X4 -b0 Y4 -b0 Z4 -sHdlSome\x20(1) _4 -b10001000 `4 -b11 j; -1l; -b0 ,= -b0 -= -b0 .= -b0 /= -sNonBranch\x20(0) 0= -b0 1= -b0 2= -b0 3= -b0 4= -b0 5= -b0 @= -1W= -0q= -1s= -b11 *O -0.O -b1010 !P -b1001 "P -b1000 #P -b100 $P -sBranchCond\x20(2) %P -b100 &P -b100 'P -b100 (P -b100 )P -b100 *P -b100 +P -sHdlSome\x20(1) ,P -b10 -P -b0 0P -b0 1P -b0 2P -b0 3P -b0 4P -b0 5P -b0 6P -b0 7P -b0 8P -b0 9P -b0 :P -b0 ;P -b0

P -b0 ?P -sHdlSome\x20(1) DP -b10001000 EP -b11 OW -1QW -b0 YY -b0 ZY -b0 [Y -b0 \Y -sNonBranch\x20(0) ]Y -b0 ^Y -b0 _Y -b0 `Y -b0 aY -b0 bY -b0 mY -1&Z -b0 +\ -b0 ,\ -b0 -\ -b0 .\ -sNonBranch\x20(0) /\ -b0 0\ -b0 1\ -b0 2\ -b0 3\ -b0 4\ -b0 ?\ -1V\ -sHdlSome\x20(1) . -b1011 / -b1011 0 -b1100 1 -b100 2 -sCall\x20(4) 3 -b11000 4 -b11000 5 -b11000 6 -b11000 7 -b11000 8 -b1 C -sHdlSome\x20(1) q< -b1011 r< -b1011 s< -b1100 t< -b100 u< -sCall\x20(4) v< -b11000 w< -b11000 x< -b11000 y< -b11000 z< -b11000 {< -b1 (= -sHdlSome\x20(1) VX -b1011 WX -b1011 XX -b1100 YX -b100 ZX -sCall\x20(4) [X -b11000 \X -b11000 ]X -b11000 ^X -b11000 _X -b11000 `X -b1 kX -b0 pX -b1 vX -b1 |X -sHdlSome\x20(1) -Y -b1011 .Y -b1011 /Y -b1100 0Y -b100 1Y -sCall\x20(4) 2Y -b11000 3Y -b11000 4Y -b11000 5Y -b11000 6Y -b11000 7Y -b1 BY -b0 GY -b1 MY -b1 SY -b1001 u -b10 *" -b1001 Z= -b10 m= -b1001 )Z -b10 K -b1 ?K -1|K -1~K -b10 MW -0QW -b1 aW -b100 bW -0fW -1hW -0&Z -0V\ -1( -b1100 / -b1100 0 -b10000 1 -sBranch\x20(1) 3 -b10100 4 -b10100 5 -b10100 6 -b10100 7 -b10100 8 -b1100 9 -b1101 : -b10100 ; -b100 < -sBranch\x20(1) = -b10000 > -b10000 ? -b10000 @ -b10000 A -b10000 B -b10 C -1k< -b1100 r< -b1100 s< -b10000 t< -sBranch\x20(1) v< -b10100 w< -b10100 x< -b10100 y< -b10100 z< -b10100 {< -b1100 |< -b1101 }< -b10100 ~< -b100 != -sBranch\x20(1) "= -b10000 #= -b10000 $= -b10000 %= -b10000 &= -b10000 '= -b10 (= -1PX -b1100 WX -b1100 XX -b10000 YX -sBranch\x20(1) [X -b10100 \X -b10100 ]X -b10100 ^X -b10100 _X -b10100 `X -b1100 aX -b1101 bX -b10100 cX -b100 dX -sBranch\x20(1) eX -b10000 fX -b10000 gX -b10000 hX -b10000 iX -b10000 jX -b10 kX -b10000 oX -b1100 qX -b11000 rX -b1101 tX -b100000 uX -b0 vX -b1110 wX -b101000 xX -b1111 zX -b0 {X -b0 |X -b0 }X -b100 ~X -1'Y -b1100 .Y -b1100 /Y -b10000 0Y -sBranch\x20(1) 2Y -b10100 3Y -b10100 4Y -b10100 5Y -b10100 6Y -b10100 7Y -b1100 8Y -b1101 9Y -b10100 :Y -b100 ;Y -sBranch\x20(1) Y -b10000 ?Y -b10000 @Y -b10000 AY -b10 BY -b10000 FY -b1100 HY -b11000 IY -b1101 KY -b100000 LY -b0 MY -b1110 NY -b101000 OY -b1111 QY -b0 RY -b0 SY -b0 TY -b100 UY -sHdlNone\x20(0) ` -b0 a -b0 b -b0 o -b1001 t -b0 u -b1 *" -sHdlNone\x20(0) E= -b0 F= -b0 G= -b0 T= -b1001 Y= -b0 Z= -b1 m= -sHdlNone\x20(0) rY -b0 sY -b0 tY -b0 #Z -b1001 (Z -b0 )Z -b1 Z -b1001 ?Z -b1000 @Z -sBranchCond\x20(2) BZ -b100 CZ -b100 DZ -b100 EZ -b100 FZ -b100 GZ -b101 HZ -b0 IZ -b0 JZ -b1110111011101110111011101110111011101110111011101110111011101110 KZ -b0 LZ -sNonBranch\x20(0) MZ -b0 NZ -b0 OZ -b0 PZ -b0 QZ -b0 RZ -b0 SZ -b1 '\ -sHdlNone\x20(0) D\ -b0 E\ -b0 F\ -b0 S\ -b1001 X\ -b0 Y\ -b1 l\ -b1010 n\ -b1001 o\ -b1000 p\ -sBranchCond\x20(2) r\ -b100 s\ -b100 t\ -b100 u\ -b100 v\ -b100 w\ -b101 x\ -b0 y\ -b0 z\ -b1110111011101110111011101110111011101110111011101110111011101110 {\ -b0 |\ -sNonBranch\x20(0) }\ -b0 ~\ -b0 !] -b0 "] -b0 #] -b0 $] -b0 %] -b1 W^ -#287000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#287500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -b111000 & -b10001 ' -0P$ -0T$ -b110000 x$ -b111000 y$ -b10000 %% -0=% -1?% -b101 ;) -0?) -b110000 Q, -b111000 R, -b10000 \, -b0 ], -b0 ^, -b0 _, -b0 `, -b0 a, -b0 b, -b0 c, -b0 d, -b0 e, -b0 f, -b0 g, -b0 h, -b0 i, -b0 j, -b0 k, -b0 l, -b110 |. -b1010 ~. -b10000 ]/ -b11000 ^/ -sHdlNone\x20(0) _/ -b0 `/ -b0 b/ -b0 c/ -sUnconditional\x20(0) g/ -b1100 h/ -b1100 ~/ -b1100 !0 -b10000 "0 -sBranch\x20(1) $0 -b10100 %0 -b10100 &0 -b10100 '0 -b10100 (0 -b10100 )0 -b1100 *0 -b1101 +0 -b10100 ,0 -sBranch\x20(1) .0 -b10000 /0 -b10000 00 -b10000 10 -b10000 20 -b10000 30 -170 -090 -b1100 }0 -b1011 *1 -b1011 @1 -b1011 A1 -b1100 B1 -sCall\x20(4) D1 -b11000 E1 -b11000 F1 -b11000 G1 -b11000 H1 -b11000 I1 -b0 J1 -b0 K1 -b0 L1 -b0 M1 -sNonBranch\x20(0) N1 -b0 O1 -b0 P1 -b0 Q1 -b0 R1 -b0 S1 -b1 T1 -b1011 W1 -b1100 X1 -0`1 -1b1 -0!< -0%< -b111000 i< -b10001 j< -05@ -09@ -b110000 ]@ -b111000 ^@ -b10000 h@ -0"A -1$A -b101 ~D -0$E -b110000 6H -b111000 7H -b10000 AH -b0 BH -b0 CH -b0 DH -b0 EH -b0 FH -b0 GH -b0 HH -b0 IH -b0 JH -b0 KH -b0 LH -b0 MH -b0 NH -b0 OH -b0 PH -b0 QH -b110 aJ -b1010 cJ -b10000 BK -b11000 CK -sHdlNone\x20(0) DK -b0 EK -b0 GK -b0 HK -sUnconditional\x20(0) LK -b1100 MK -b1100 cK -b1100 dK -b10000 eK -sBranch\x20(1) gK -b10100 hK -b10100 iK -b10100 jK -b10100 kK -b10100 lK -b1100 mK -b1101 nK -b10100 oK -sBranch\x20(1) qK -b10000 rK -b10000 sK -b10000 tK -b10000 uK -b10000 vK -1zK -0|K -b1100 bL -b1011 mL -b1011 %M -b1011 &M -b1100 'M -sCall\x20(4) )M -b11000 *M -b11000 +M -b11000 ,M -b11000 -M -b11000 .M -b0 /M -b0 0M -b0 1M -b0 2M -sNonBranch\x20(0) 3M -b0 4M -b0 5M -b0 6M -b0 7M -b0 8M -b1 9M -b1011 -b0 ? -b0 @ -b0 A -b0 B -b1101 r< -b1110 s< -b11000 t< -b11100 w< -b11100 x< -b11100 y< -b11100 z< -b11100 {< -b1101 |< -b1111 }< -b11100 ~< -sRet\x20(7) "= -b0 #= -b0 $= -b0 %= -b0 &= -b0 '= -b1101 WX -b1110 XX -b11000 YX -b11100 \X -b11100 ]X -b11100 ^X -b11100 _X -b11100 `X -b1101 aX -b1111 bX -b11100 cX -sRet\x20(7) eX -b0 fX -b0 gX -b0 hX -b0 iX -b0 jX -b11000 oX -b1101 qX -b100000 rX -b1110 tX -b101000 uX -b1111 wX -b110000 xX -b111 yX -b10000 zX -b1101 .Y -b1110 /Y -b11000 0Y -b11100 3Y -b11100 4Y -b11100 5Y -b11100 6Y -b11100 7Y -b1101 8Y -b1111 9Y -b11100 :Y -sRet\x20(7) Y -b0 ?Y -b0 @Y -b0 AY -b11000 FY -b1101 HY -b100000 IY -b1110 KY -b101000 LY -b1111 NY -b110000 OY -b111 PY -b10000 QY -b100 HZ -b100 x\ -#288000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#288500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -sHdlNone\x20(0) % -b0 & -b0 ' -sHdlSome\x20(1) ) -b100 * -0F -b110 ;) -070 -0;0 -b10000 >0 -b11000 ?0 -sHdlNone\x20(0) @0 -b0 A0 -b0 C0 -b0 D0 -sUnconditional\x20(0) H0 -b1100 I0 -b1100 _0 -b1100 `0 -b10000 a0 -sBranch\x20(1) c0 -b10100 d0 -b10100 e0 -b10100 f0 -b10100 g0 -b10100 h0 -b1100 i0 -b1101 j0 -b10100 k0 -sBranch\x20(1) m0 -b10000 n0 -b10000 o0 -b10000 p0 -b10000 q0 -b10000 r0 -b1100 v0 -b10000 w0 -sHdlNone\x20(0) y0 -b0 z0 -0^1 -1`1 -0b1 -sHdlSome\x20(1) )< -b1100 >< -sHdlSome\x20(1) ?< -b11000 @< -b100 A< -b100 C< -sCall\x20(1) D< -1K< -b10 L< -b1 N< -1P< -b1 Q< -b11 S< -1U< -b100 V< -b1 [< -sHdlNone\x20(0) h< -b0 i< -b0 j< -sHdlSome\x20(1) l< -b100 m< -0+= -b110 ~D -0zK -0~K -b10000 #L -b11000 $L -sHdlNone\x20(0) %L -b0 &L -b0 (L -b0 )L -sUnconditional\x20(0) -L -b1100 .L -b1100 DL -b1100 EL -b10000 FL -sBranch\x20(1) HL -b10100 IL -b10100 JL -b10100 KL -b10100 LL -b10100 ML -b1100 NL -b1101 OL -b10100 PL -sBranch\x20(1) RL -b10000 SL -b10000 TL -b10000 UL -b10000 VL -b10000 WL -b1100 [L -b10000 \L -sHdlNone\x20(0) ^L -b0 _L -0CM -1EM -0GM -sHdlSome\x20(1) lW -b1100 #X -sHdlSome\x20(1) $X -b11000 %X -b100 &X -b100 (X -sCall\x20(1) )X -10X -b10 1X -b1 3X -15X -b1 6X -b11 8X -1:X -b100 ;X -b1 @X -sHdlNone\x20(0) MX -b0 NX -b0 OX -sHdlSome\x20(1) QX -b100 RX -0nX -sHdlNone\x20(0) $Y -b0 %Y -b0 &Y -sHdlSome\x20(1) (Y -b100 )Y -0EY -b1110 / -b10000 0 -b100000 1 -b0 2 -sInterrupt\x20(9) 3 -b11111111000000000000000000000000 4 -b11111111000000000000000000000000 5 -b11111111000000000000000000000000 6 -b11111111000000000000000000000000 7 -b11111111000000000000000000000000 8 -b0 9 -b0 : -b0 ; -b0 < -sNonBranch\x20(0) = -b1 C -b1110 r< -b10000 s< -b100000 t< -b0 u< -sInterrupt\x20(9) v< -b11111111000000000000000000000000 w< -b11111111000000000000000000000000 x< -b11111111000000000000000000000000 y< -b11111111000000000000000000000000 z< -b11111111000000000000000000000000 {< -b0 |< -b0 }< -b0 ~< -b0 != -sNonBranch\x20(0) "= -b1 (= -b1110 WX -b10000 XX -b100000 YX -b0 ZX -sInterrupt\x20(9) [X -b11111111000000000000000000000000 \X -b11111111000000000000000000000000 ]X -b11111111000000000000000000000000 ^X -b11111111000000000000000000000000 _X -b11111111000000000000000000000000 `X -b0 aX -b0 bX -b0 cX -b0 dX -sNonBranch\x20(0) eX -b1 kX -b100000 oX -b1110 qX -b101000 rX -b1111 tX -b110000 uX -b110 vX -b10000 wX -b111000 xX -b10 yX -b10001 zX -b1110 .Y -b10000 /Y -b100000 0Y -b0 1Y -sInterrupt\x20(9) 2Y -b11111111000000000000000000000000 3Y -b11111111000000000000000000000000 4Y -b11111111000000000000000000000000 5Y -b11111111000000000000000000000000 6Y -b11111111000000000000000000000000 7Y -b0 8Y -b0 9Y -b0 :Y -b0 ;Y -sNonBranch\x20(0) < -sHdlNone\x20(0) ?< -b0 @< -b0 A< -b0 C< -sBranch\x20(0) D< -0K< -b0 L< -b0 N< -0P< -b0 Q< -b0 S< -0U< -b0 V< -b0 [< -sHdlNone\x20(0) l< -b0 m< -0s= -sHdlSome\x20(1) K> -b1100 L> -b11000 M> -b100 N> -b100 P> -sCall\x20(1) Q> -b100 M? -b1100 N? -07@ -1"A -0$A -b110 "E -b110 cJ -0EM -sHdlNone\x20(0) lW -b0 #X -sHdlNone\x20(0) $X -b0 %X -b0 &X -b0 (X -sBranch\x20(0) )X -00X -b0 1X -b0 3X -05X -b0 6X -b0 8X -0:X -b0 ;X -b0 @X -sHdlNone\x20(0) QX -b0 RX -sHdlNone\x20(0) (Y -b0 )Y -sHdlNone\x20(0) . -b0 / -b0 0 -b0 1 -sNonBranch\x20(0) 3 -b0 4 -b0 5 -b0 6 -b0 7 -b0 8 -b0 C -sHdlNone\x20(0) q< -b0 r< -b0 s< -b0 t< -sNonBranch\x20(0) v< -b0 w< -b0 x< -b0 y< -b0 z< -b0 {< -b0 (= -sHdlNone\x20(0) VX -b0 WX -b0 XX -b0 YX -sNonBranch\x20(0) [X -b0 \X -b0 ]X -b0 ^X -b0 _X -b0 `X -b0 kX -b0 oX -b0 qX -b0 rX -b0 tX -b0 uX -b0 vX -b0 wX -b0 xX -b0 yX -b0 zX -b0 ~X -sHdlNone\x20(0) -Y -b0 .Y -b0 /Y -b0 0Y -sNonBranch\x20(0) 2Y -b0 3Y -b0 4Y -b0 5Y -b0 6Y -b0 7Y -b0 BY -b0 FY -b0 HY -b0 IY -b0 KY -b0 LY -b0 MY -b0 NY -b0 OY -b0 PY -b0 QY -b0 UY -b10 HZ -b10 x\ -#290000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#290500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -1." -10" -1q= -1s= -b1 HZ -b1 x\ -#291000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#291500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -sHdlSome\x20(1) % -b1100 & -b10010 ' -1," -0." -00" -b10000 2" -b1 B" -b1 D" -b11000 i# -b10011 j# -b1100 l# -b11000 m# -sHdlSome\x20(1) n# -b100 o# -b11000 q# -b100 r# -b100 t# -sCall\x20(1) u# -b10010 w# -1R$ -1T$ -sHdlSome\x20(1) h< -b1100 i< -b10010 j< -1o= -0q= -0s= -b10000 u= -b1 '> -b1 )> -b11000 N? -b10011 O? -b1100 Q? -b11000 R? -sHdlSome\x20(1) S? -b100 T? -b11000 V? -b100 W? -b100 Y? -sCall\x20(1) Z? -b10010 \? -17@ -19@ -sHdlSome\x20(1) MX -b1100 NX -b10010 OX -sHdlSome\x20(1) $Y -b1100 %Y -b10010 &Y -sHdlSome\x20(1) ` -b1001 a -b100 b -sHdlSome\x20(1) e -1f -b1 o -sHdlSome\x20(1) E= -b1001 F= -b100 G= -sHdlSome\x20(1) J= -1K= -b1 T= -sHdlSome\x20(1) rY -b1001 sY -b100 tY -sHdlSome\x20(1) wY -1xY -b1 #Z -b0 HZ -sHdlSome\x20(1) D\ -b1001 E\ -b100 F\ -sHdlSome\x20(1) I\ -1J\ -b1 S\ -b0 x\ -#292000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#292500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -b11000 & -b10011 ' -1F -0," -1." -b100000 i# -b10100 j# -b11000 /$ -b100000 0$ -b10011 :$ -b10000 ;$ -b1 K$ -b1 M$ -1P$ -0R$ -b1100 x$ -b11000 y$ -sHdlSome\x20(1) z$ -b100 {$ -b11000 }$ -b100 ~$ -b100 "% -sCall\x20(1) #% -b10010 %% -0=% -1?% -b1100 L+ -b11000 M+ -sHdlSome\x20(1) N+ -b100 O+ -b11000 Q+ -b100 R+ -b100 T+ -sCall\x20(1) U+ -b10010 W+ -b111 ~. -1"/ -b11000 i< -b10011 j< -1+= -0o= -1q= -b100000 N? -b10100 O? -b11000 r? -b100000 s? -b10011 }? -b10000 ~? -b1 0@ -b1 2@ -15@ -07@ -b1100 ]@ -b11000 ^@ -sHdlSome\x20(1) _@ -b100 `@ -b11000 b@ -b100 c@ -b100 e@ -sCall\x20(1) f@ -b10010 h@ -0"A -1$A -b1100 1G -b11000 2G -sHdlSome\x20(1) 3G -b100 4G -b11000 6G -b100 7G -b100 9G -sCall\x20(1) :G -b10010 0 -sHdlSome\x20(1) @0 -b100 A0 -b11000 C0 -b100 D0 -b100 F0 -sCall\x20(1) G0 -b10010 I0 -b10010 _0 -b10001 `0 -b1100 a0 -sCall\x20(4) c0 -b11000 d0 -b11000 e0 -b11000 f0 -b11000 g0 -b11000 h0 -b0 i0 -b0 j0 -b0 k0 -b0 l0 -sNonBranch\x20(0) m0 -b0 n0 -b0 o0 -b0 p0 -b0 q0 -b0 r0 -b1 s0 -b10010 v0 -b1100 w0 -1`1 -1b1 -b1000000 i< -b11000 j< -05@ -09@ -b111000 <@ -b1000000 =@ -b10111 G@ -1"A -1$A -b111 ~D -0$E -b111000 xH -b1000000 yH -b10111 %I -b10000 &I -b0 'I -b0 (I -b0 )I -b0 *I -b0 +I -b0 ,I -b0 -I -b0 .I -b0 /I -b0 0I -b0 1I -b0 2I -b0 3I -b0 4I -b0 5I -b1 6I -b1 8I -b1000 aJ -b1100 cJ -b11000 BK -b100000 CK -b10011 MK -b10000 NK -b1 ^K -b1 `K -b10011 cK -b10010 dK -b11000 eK -b11100 hK -b11100 iK -b11100 jK -b11100 kK -b11100 lK -b10011 mK -b10011 nK -b11100 oK -sRet\x20(7) qK -b0 rK -b0 sK -b0 tK -b0 uK -b0 vK -1zK -0|K -b1100 #L -sHdlSome\x20(1) %L -b100 &L -b11000 (L -b100 )L -b100 +L -sCall\x20(1) ,L -b10010 .L -b10010 DL -b10001 EL -b1100 FL -sCall\x20(4) HL -b11000 IL -b11000 JL -b11000 KL -b11000 LL -b11000 ML -b0 NL -b0 OL -b0 PL -b0 QL -sNonBranch\x20(0) RL -b0 SL -b0 TL -b0 UL -b0 VL -b0 WL -b1 XL -b10010 [L -b1100 \L -1EM -1GM -b1000000 NX -b11000 OX -b1000000 %Y -b11000 &Y -b10100 / -b10100 0 -b100000 1 -b0 2 -sInterrupt\x20(9) 3 -b11111111000000000000000000000000 4 -b11111111000000000000000000000000 5 -b11111111000000000000000000000000 6 -b11111111000000000000000000000000 7 -b11111111000000000000000000000000 8 -b0 9 -b0 : -b0 ; -b0 < -sNonBranch\x20(0) = -b1 C -b10100 r< -b10100 s< -b100000 t< -b0 u< -sInterrupt\x20(9) v< -b11111111000000000000000000000000 w< -b11111111000000000000000000000000 x< -b11111111000000000000000000000000 y< -b11111111000000000000000000000000 z< -b11111111000000000000000000000000 {< -b0 |< -b0 }< -b0 ~< -b0 != -sNonBranch\x20(0) "= -b1 (= -b10100 WX -b10100 XX -b100000 YX -b0 ZX -sInterrupt\x20(9) [X -b11111111000000000000000000000000 \X -b11111111000000000000000000000000 ]X -b11111111000000000000000000000000 ^X -b11111111000000000000000000000000 _X -b11111111000000000000000000000000 `X -b0 aX -b0 bX -b0 cX -b0 dX -sNonBranch\x20(0) eX -b1 kX -b100000 oX -b10100 qX -b101000 rX -b1 sX -b10101 tX -b110000 uX -b0 vX -b10110 wX -b111000 xX -b101 yX -b10111 zX -b10100 .Y -b10100 /Y -b100000 0Y -b0 1Y -sInterrupt\x20(9) 2Y -b11111111000000000000000000000000 3Y -b11111111000000000000000000000000 4Y -b11111111000000000000000000000000 5Y -b11111111000000000000000000000000 6Y -b11111111000000000000000000000000 7Y -b0 8Y -b0 9Y -b0 :Y -b0 ;Y -sNonBranch\x20(0) 0 -b101000 ?0 -sHdlNone\x20(0) @0 -b0 A0 -b0 C0 -b0 D0 -b0 F0 -sBranch\x20(0) G0 -b10100 I0 -b10000 J0 -b1 Z0 -b1 \0 -b10100 _0 -b10100 `0 -b100000 a0 -b0 b0 -sInterrupt\x20(9) c0 -b11111111000000000000000000000000 d0 -b11111111000000000000000000000000 e0 -b11111111000000000000000000000000 f0 -b11111111000000000000000000000000 g0 -b11111111000000000000000000000000 h0 -b10100 v0 -b100000 w0 -0^1 -1`1 -b0 E3 -0I3 -b10010 c4 -b10001 d4 -b1100 e4 -b100 f4 -sCall\x20(4) g4 -b11000 h4 -b11000 i4 -b11000 j4 -b11000 k4 -b11000 l4 -b11000 m4 -sHdlSome\x20(1) n4 -b100 o4 -b0 r4 -b0 s4 -b0 t4 -b0 u4 -b0 v4 -b0 w4 -b0 x4 -b0 y4 -b0 z4 -b0 {4 -b0 |4 -b0 }4 -b0 ~4 -b0 !5 -b0 "5 -b0 #5 -b100 j; -1l; -sHdlSome\x20(1) )< -b10000 *< -b1 :< -b1 << -b11000 >< -sHdlSome\x20(1) ?< -b11100 @< -b100 A< -1K< -b1 L< -b1 N< -1P< -b1 Q< -b11 S< -1U< -b100 V< -b1 [< -sHdlNone\x20(0) h< -b0 i< -b0 j< -sHdlSome\x20(1) l< -b100 m< -0+= -b0 ,= -b0 -= -b0 .= -b0 /= -sNonBranch\x20(0) 0= -b0 1= -b0 2= -b0 3= -b0 4= -b0 5= -b0 @= -b1001 ~D -0$E -1zK -0~K -b100000 #L -b101000 $L -sHdlNone\x20(0) %L -b0 &L -b0 (L -b0 )L -b0 +L -sBranch\x20(0) ,L -b10100 .L -b10000 /L -b1 ?L -b1 AL -b10100 DL -b10100 EL -b100000 FL -b0 GL -sInterrupt\x20(9) HL -b11111111000000000000000000000000 IL -b11111111000000000000000000000000 JL -b11111111000000000000000000000000 KL -b11111111000000000000000000000000 LL -b11111111000000000000000000000000 ML -b10100 [L -b100000 \L -0CM -1EM -b0 *O -0.O -b10010 HP -b10001 IP -b1100 JP -b100 KP -sCall\x20(4) LP -b11000 MP -b11000 NP -b11000 OP -b11000 PP -b11000 QP -b11000 RP -sHdlSome\x20(1) SP -b100 TP -b0 WP -b0 XP -b0 YP -b0 ZP -b0 [P -b0 \P -b0 ]P -b0 ^P -b0 _P -b0 `P -b0 aP -b0 bP -b0 cP -b0 dP -b0 eP -b0 fP -b100 OW -1QW -sHdlSome\x20(1) lW -b10000 mW -b1 }W -b1 !X -b11000 #X -sHdlSome\x20(1) $X -b11100 %X -b100 &X -10X -b1 1X -b1 3X -15X -b1 6X -b11 8X -1:X -b100 ;X -b1 @X -sHdlNone\x20(0) MX -b0 NX -b0 OX -sHdlSome\x20(1) QX -b100 RX -0nX -sHdlNone\x20(0) $Y -b0 %Y -b0 &Y -sHdlSome\x20(1) (Y -b100 )Y -0EY -b0 YY -b0 ZY -b0 [Y -b0 \Y -sNonBranch\x20(0) ]Y -b0 ^Y -b0 _Y -b0 `Y -b0 aY -b0 bY -b0 mY -b0 +\ -b0 ,\ -b0 -\ -b0 .\ -sNonBranch\x20(0) /\ -b0 0\ -b0 1\ -b0 2\ -b0 3\ -b0 4\ -b0 ?\ -b10110 / -b10110 0 -b110000 1 -b10110 r< -b10110 s< -b110000 t< -b10110 WX -b10110 XX -b110000 YX -b110000 oX -b10110 qX -b111000 rX -b11 sX -b10111 tX -b1000000 uX -b0 vX -b11000 wX -b1001000 xX -b11 yX -b11001 zX -b10110 .Y -b10110 /Y -b110000 0Y -b110000 FY -b10110 HY -b111000 IY -b11 JY -b10111 KY -b1000000 LY -b0 MY -b11000 NY -b1001000 OY -b11 PY -b11001 QY -b10001 u -b10 *" -b10001 Z= -b10 m= -b10001 )Z -b10 < -sHdlNone\x20(0) ?< -b0 @< -b0 A< -0K< -b0 L< -b0 N< -0P< -b0 Q< -b0 S< -0U< -b0 V< -b0 [< -sHdlNone\x20(0) l< -b0 m< -1W= -0q= -sHdlSome\x20(1) k> -b11000 l> -b11100 m> -b100 n> -b1000 M? -b11000 N? -17@ -09@ -1"A -b1001 "E -b1001 cJ -0EM -sHdlNone\x20(0) lW -b0 mW -b0 }W -b0 !X -b0 #X -sHdlNone\x20(0) $X -b0 %X -b0 &X -00X -b0 1X -b0 3X -05X -b0 6X -b0 8X -0:X -b0 ;X -b0 @X -sHdlNone\x20(0) QX -b0 RX -sHdlNone\x20(0) (Y -b0 )Y -1&Z -1V\ -sHdlNone\x20(0) . -b0 / -b0 0 -b0 1 -sNonBranch\x20(0) 3 -b0 4 -b0 5 -b0 6 -b0 7 -b0 8 -b0 C -sHdlNone\x20(0) q< -b0 r< -b0 s< -b0 t< -sNonBranch\x20(0) v< -b0 w< -b0 x< -b0 y< -b0 z< -b0 {< -b0 (= -sHdlNone\x20(0) VX -b0 WX -b0 XX -b0 YX -sNonBranch\x20(0) [X -b0 \X -b0 ]X -b0 ^X -b0 _X -b0 `X -b0 kX -b0 oX -b0 qX -b0 rX -b0 sX -b0 tX -b0 uX -b0 wX -b0 xX -b0 yX -b0 zX -b0 ~X -sHdlNone\x20(0) -Y -b0 .Y -b0 /Y -b0 0Y -sNonBranch\x20(0) 2Y -b0 3Y -b0 4Y -b0 5Y -b0 6Y -b0 7Y -b0 BY -b0 FY -b0 HY -b0 IY -b0 JY -b0 KY -b0 LY -b0 NY -b0 OY -b0 PY -b0 QY -b0 UY -b1100 SZ -b1100 %] -#304000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#304500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -0r -1." -10" -sWeaklyTaken\x20(2) l& -b11 h; -0l; -sHdlSome\x20(1) o; -b10001000 p; -1r; -b1010 s; -b1001 t; -b1000 u; -1#< -1%< -0W= -1q= -1s= -sWeaklyTaken\x20(2) QB -b11 MW -0QW -sHdlSome\x20(1) TW -b10001000 UW -1WW -b1010 XW -b1001 YW -b1000 ZW -1fW -1hW -0&Z -0V\ -b0 ] -sHdlNone\x20(0) ` -b0 a -b0 b -sHdlNone\x20(0) e -0f -b0 o -sHdlNone\x20(0) s -b0 t -b0 u -b0 *" -b0 B= -sHdlNone\x20(0) E= -b0 F= -b0 G= -sHdlNone\x20(0) J= -0K= -b0 T= -sHdlNone\x20(0) X= -b0 Y= -b0 Z= -b0 m= -b0 oY -sHdlNone\x20(0) rY -b0 sY -b0 tY -sHdlNone\x20(0) wY -0xY -b0 #Z -sHdlNone\x20(0) 'Z -b0 (Z -b0 )Z -b0 Z -b10001 ?Z -b1100 @Z -sCall\x20(4) BZ -b11000 CZ -b11000 DZ -b11000 EZ -b11000 FZ -b11000 GZ -b1011 HZ -b0 IZ -b0 JZ -b1110111011101110111011101110111011101110111011101110111011101110 KZ -b0 LZ -sNonBranch\x20(0) MZ -b0 NZ -b0 OZ -b0 PZ -b0 QZ -b0 RZ -b0 SZ -b1 '\ -b0 A\ -sHdlNone\x20(0) D\ -b0 E\ -b0 F\ -sHdlNone\x20(0) I\ -0J\ -b0 S\ -sHdlNone\x20(0) W\ -b0 X\ -b0 Y\ -b0 l\ -b10010 n\ -b10001 o\ -b1100 p\ -sCall\x20(4) r\ -b11000 s\ -b11000 t\ -b11000 u\ -b11000 v\ -b11000 w\ -b1011 x\ -b0 y\ -b0 z\ -b1110111011101110111011101110111011101110111011101110111011101110 {\ -b0 |\ -sNonBranch\x20(0) }\ -b0 ~\ -b0 !] -b0 "] -b0 #] -b0 $] -b0 %] -b1 W^ -#305000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#305500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ -sHdlSome\x20(1) % -b11000 & -b11010 ' -1," -0." -00" -b11100 i# -b11011 j# -b11000 /$ -b11100 0$ -sHdlSome\x20(1) 1$ -b1000 2$ -b11100 4$ -b100 5$ -b11010 :$ -0R$ -1T$ -1!< -0%< -sHdlSome\x20(1) h< -b11000 i< -b11010 j< -1o= -0q= -0s= -b11100 N? -b11011 O? -b11000 r? -b11100 s? -sHdlSome\x20(1) t? -b1000 u? -b11100 w? -b100 x? -b11010 }? -07@ -19@ -1dW -0hW -sHdlSome\x20(1) MX -b11000 NX -b11010 OX -sHdlSome\x20(1) $Y -b11000 %Y -b11010 &Y -b10 ] -sHdlSome\x20(1) s -b10 B= -sHdlSome\x20(1) X= -b10 oY -sHdlSome\x20(1) 'Z -b0 >Z -b0 ?Z -b1110111011101110111011101110111011101110111011101110111011101110 @Z -b0 AZ -sNonBranch\x20(0) BZ -b0 CZ -b0 DZ -b0 EZ -b0 FZ -b0 GZ -b0 HZ -b0 '\ -b10 A\ -sHdlSome\x20(1) W\ -b0 n\ -b0 o\ -b1110111011101110111011101110111011101110111011101110111011101110 p\ -b0 q\ -sNonBranch\x20(0) r\ -b0 s\ -b0 t\ -b0 u\ -b0 v\ -b0 w\ -b0 x\ -b0 W^ -#306000000 -0! -0# -0f< -0KX -0"Y -0WY -0)\ -#306500000 -1! -1# -1f< -1KX -1"Y -1WY -1)\ diff --git a/crates/cpu/tests/next_pc.rs b/crates/cpu/tests/next_pc.rs index 516941d..1e0fcc3 100644 --- a/crates/cpu/tests/next_pc.rs +++ b/crates/cpu/tests/next_pc.rs @@ -13,6 +13,7 @@ use cpu::{ util::array_vec::ArrayVec, }; use fayalite::{ + intern::{Intern, Interned}, prelude::*, sim::vcd::VcdWriterDecls, util::{DebugAsDisplay, RcWriter}, @@ -20,137 +21,441 @@ use fayalite::{ use std::{ cell::Cell, collections::{BTreeMap, BTreeSet, VecDeque}, + fmt, num::NonZeroUsize, + ops::Range, u64, }; -#[derive(Copy, Clone, Debug)] +macro_rules! make_regs { + ( + $($Name:ident = $value:literal,)* + ) => { + #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)] + #[allow(dead_code)] + enum MockReg { + $($Name = $value,)* + } + + impl MockReg { + const REGS: [Self; [$(Self::$Name),*].len()] = [$(Self::$Name),*]; + } + + const _: () = { + let mut i = 0; + while i < MockReg::REGS.len() { + // verify the values are correct + assert!(i == MockReg::REGS[i] as usize); + i += 1; + } + }; + }; +} + +make_regs! { + Zero = 0, + R1 = 1, + R2 = 2, + R3 = 3, + R4 = 4, + R5 = 5, + R6 = 6, + R7 = 7, +} + +#[derive(Clone, Hash, PartialEq, Eq)] +struct MockRegs([u64; MockReg::REGS.len()]); + +impl fmt::Debug for MockRegs { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut debug_map = f.debug_map(); + for reg in MockReg::REGS { + debug_map.entry(®, &format_args!("{:#x}", self.read(reg))); + } + debug_map.finish() + } +} + +impl MockRegs { + fn new() -> Self { + Self([0; _]) + } + fn write(&mut self, reg: MockReg, value: u64) { + match reg { + MockReg::Zero => { + // writing to the zero reg does nothing + } + MockReg::R1 + | MockReg::R2 + | MockReg::R3 + | MockReg::R4 + | MockReg::R5 + | MockReg::R6 + | MockReg::R7 => self.0[reg as usize] = value, + } + } + fn read(&self, reg: MockReg) -> u64 { + self.0[reg as usize] + } +} + +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] +#[allow(dead_code)] +enum MockIntCmp { + Eq, + Ne, + Ult, + Ule, + Ugt, + Uge, + Slt, + Sle, + Sgt, + Sge, +} + +impl MockIntCmp { + fn cmp(self, lhs_u: u64, rhs_u: u64) -> bool { + let lhs_s = lhs_u as i64; + let rhs_s = rhs_u as i64; + match self { + MockIntCmp::Eq => lhs_u == rhs_u, + MockIntCmp::Ne => lhs_u != rhs_u, + MockIntCmp::Ult => lhs_u < rhs_u, + MockIntCmp::Ule => lhs_u <= rhs_u, + MockIntCmp::Ugt => lhs_u > rhs_u, + MockIntCmp::Uge => lhs_u >= rhs_u, + MockIntCmp::Slt => lhs_s < rhs_s, + MockIntCmp::Sle => lhs_s <= rhs_s, + MockIntCmp::Sgt => lhs_s > rhs_s, + MockIntCmp::Sge => lhs_s >= rhs_s, + } + } +} + +#[derive(Copy, Clone, PartialEq, Eq, Hash)] +#[allow(dead_code)] enum MockInsn { - Nop4, - Jump { target: u64 }, - CondBranch { target: u64 }, - Call { target: u64 }, + ReadInputByte { + dest: MockReg, + }, + WriteOutputByte { + src: MockReg, + }, + AddI { + dest: MockReg, + src: MockReg, + immediate: u64, + }, + Jump { + target: u64, + }, + BrCond { + target: u64, + cond: MockIntCmp, + lhs: MockReg, + rhs: MockReg, + }, + BrCondI { + target: u64, + cond: MockIntCmp, + lhs: MockReg, + rhs: u64, + }, + Call { + target: u64, + }, Ret, + ExitSysCall, + Illegal, +} + +impl fmt::Debug for MockInsn { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + macro_rules! u64_hex { + ($v:expr) => { + &format_args!("{:#x}", $v) + }; + } + match self { + Self::ReadInputByte { dest } => { + f.debug_struct("ReadInputByte").field("dest", dest).finish() + } + Self::WriteOutputByte { src } => { + f.debug_struct("WriteOutputByte").field("src", src).finish() + } + Self::AddI { + dest, + src, + immediate, + } => f + .debug_struct("AddI") + .field("dest", dest) + .field("src", src) + .field("immediate", u64_hex!(immediate)) + .finish(), + Self::Jump { target } => f + .debug_struct("Jump") + .field("target", u64_hex!(target)) + .finish(), + Self::BrCond { + target, + cond, + lhs, + rhs, + } => f + .debug_struct("BrCond") + .field("target", u64_hex!(target)) + .field("cond", cond) + .field("lhs", lhs) + .field("rhs", rhs) + .finish(), + Self::BrCondI { + target, + cond, + lhs, + rhs, + } => f + .debug_struct("BrCondI") + .field("target", u64_hex!(target)) + .field("cond", cond) + .field("lhs", lhs) + .field("rhs", u64_hex!(rhs)) + .finish(), + Self::Call { target } => f + .debug_struct("Call") + .field("target", u64_hex!(target)) + .finish(), + Self::Ret => write!(f, "Ret"), + Self::ExitSysCall => write!(f, "ExitSysCall"), + Self::Illegal => write!(f, "Illegal"), + } + } } impl MockInsn { fn byte_len(self) -> u64 { + // TODO: change later + 4 // all instructions are 4 bytes long for now + } + const READ_INPUT_REG_EOF: u64 = u64::MAX; + fn targets_mut(&mut self) -> impl Iterator { match self { - MockInsn::Nop4 => 4, - MockInsn::Jump { .. } => 4, - MockInsn::CondBranch { .. } => 4, - MockInsn::Call { .. } => 4, - MockInsn::Ret => 4, + MockInsn::ReadInputByte { .. } + | MockInsn::WriteOutputByte { .. } + | MockInsn::Ret + | MockInsn::ExitSysCall + | MockInsn::Illegal + | MockInsn::AddI { .. } => None, + MockInsn::Jump { target } + | MockInsn::BrCond { target, .. } + | MockInsn::BrCondI { target, .. } + | MockInsn::Call { target } => Some(target), + } + .into_iter() + } + #[hdl] + fn wip_decoded_insn_kind(self) -> SimValue { + match self { + MockInsn::ReadInputByte { .. } + | MockInsn::WriteOutputByte { .. } + | MockInsn::AddI { .. } => + { + #[hdl(sim)] + WipDecodedInsnKind::NonBranch() + } + MockInsn::Jump { target } => + { + #[hdl(sim)] + WipDecodedInsnKind::Branch(target) + } + MockInsn::BrCond { target, .. } | MockInsn::BrCondI { target, .. } => + { + #[hdl(sim)] + WipDecodedInsnKind::BranchCond(target) + } + MockInsn::Call { target } => + { + #[hdl(sim)] + WipDecodedInsnKind::Call(target) + } + MockInsn::Ret => + { + #[hdl(sim)] + WipDecodedInsnKind::Ret() + } + MockInsn::ExitSysCall => + { + #[hdl(sim)] + WipDecodedInsnKind::Call(EXIT_PC) + } + MockInsn::Illegal => + { + #[hdl(sim)] + WipDecodedInsnKind::Interrupt(DEMO_ILLEGAL_INSN_TRAP) + } } } - const INSNS: &'static [(u64, Self)] = &[ - (0x0, MockInsn::Nop4), - (0x4, MockInsn::Nop4), - (0x8, MockInsn::CondBranch { target: 0x4 }), - (0xC, MockInsn::Call { target: 0x18 }), - (0x10, MockInsn::Jump { target: 0x14 }), - (0x14, MockInsn::Jump { target: 0x10 }), - (0x18, MockInsn::Jump { target: 0x1C }), - (0x1C, MockInsn::Ret), - ]; - const RETIRE_SEQ_INIT: &'static [RetireSeqEntry] = &[ + #[hdl] + fn call_stack_op(self, pc: u64) -> SimValue { + match self { + MockInsn::ReadInputByte { .. } + | MockInsn::WriteOutputByte { .. } + | MockInsn::AddI { .. } + | MockInsn::Jump { .. } + | MockInsn::BrCond { .. } + | MockInsn::BrCondI { .. } + | MockInsn::Illegal => + { + #[hdl(sim)] + CallStackOp::None() + } + MockInsn::Call { .. } | MockInsn::ExitSysCall => + { + #[hdl(sim)] + CallStackOp::Push(pc.wrapping_add(self.byte_len())) + } + MockInsn::Ret => + { + #[hdl(sim)] + CallStackOp::Pop() + } + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +struct MockMachineState { + call_stack: Vec, + input: &'static [u8], + output: Vec, + regs: MockRegs, + pc: u64, + insns: MockInsns, +} + +/// match Microwatt's reset PC +const RESET_PC: u64 = 0; + +const EXIT_PC: u64 = u64::from_be_bytes(*b"ExitExit"); + +impl MockMachineState { + fn new(insns: MockInsns, input: impl AsRef<[u8]>) -> Self { + Self { + call_stack: Vec::with_capacity(16), + input: Interned::into_inner(input.as_ref().intern()), + output: Vec::with_capacity(16), + regs: MockRegs::new(), + pc: RESET_PC, + insns, + } + } + fn run_one(&mut self, trace: bool) -> RetireSeqEntry { + let orig_pc = self.pc; + let insn = self + .insns + .insns + .get(&self.pc) + .copied() + .unwrap_or(MockInsn::Illegal); + if trace { + println!("{orig_pc:#x}: {insn:?}"); + } + let mut next_pc = self.pc.wrapping_add(insn.byte_len()); + let mut cond_br_taken = None; + let mut cond_br = |target: u64, cond: MockIntCmp, lhs: u64, rhs: u64| { + let taken = cond.cmp(lhs, rhs); + cond_br_taken = Some(taken); + if taken { + next_pc = target; + } + }; + let reg = |reg| { + let retval = self.regs.read(reg); + if trace { + println!("read: {reg:?} -> {retval:#x}"); + } + retval + }; + let write_reg = |this: &mut Self, reg, value| { + if trace { + println!("write: {reg:?} <- {value:#x}"); + } + this.regs.write(reg, value); + }; + match insn { + MockInsn::ReadInputByte { dest } => { + let value = self + .input + .split_off_first() + .copied() + .map(u64::from) + .unwrap_or(MockInsn::READ_INPUT_REG_EOF); + write_reg(self, dest, value); + } + MockInsn::WriteOutputByte { src } => self.output.push(reg(src) as u8), + MockInsn::AddI { + dest, + src, + immediate, + } => { + let value = reg(src).wrapping_add(immediate); + write_reg(self, dest, value); + } + MockInsn::Jump { target } => next_pc = target, + MockInsn::BrCond { + target, + cond, + lhs, + rhs, + } => cond_br(target, cond, reg(lhs), reg(rhs)), + MockInsn::BrCondI { + target, + cond, + lhs, + rhs, + } => cond_br(target, cond, reg(lhs), rhs), + MockInsn::Call { target } => { + self.call_stack.push(next_pc); + next_pc = target; + } + MockInsn::Ret => next_pc = self.call_stack.pop().unwrap_or(DEMO_ILLEGAL_INSN_TRAP), + MockInsn::ExitSysCall => next_pc = EXIT_PC, + MockInsn::Illegal => next_pc = DEMO_ILLEGAL_INSN_TRAP, + } + self.pc = next_pc; RetireSeqEntry { - pc: 0x0, - cond_br_taken: None, - kind: MockInsn::Nop4, - }, - RetireSeqEntry { - pc: 0x4, - cond_br_taken: None, - kind: MockInsn::Nop4, - }, - RetireSeqEntry { - pc: 0x8, - cond_br_taken: Some(true), - kind: MockInsn::CondBranch { target: 0x4 }, - }, - RetireSeqEntry { - pc: 0x4, - cond_br_taken: None, - kind: MockInsn::Nop4, - }, - RetireSeqEntry { - pc: 0x8, - cond_br_taken: Some(true), - kind: MockInsn::CondBranch { target: 0x4 }, - }, - RetireSeqEntry { - pc: 0x4, - cond_br_taken: None, - kind: MockInsn::Nop4, - }, - RetireSeqEntry { - pc: 0x8, - cond_br_taken: Some(true), - kind: MockInsn::CondBranch { target: 0x4 }, - }, - RetireSeqEntry { - pc: 0x4, - cond_br_taken: None, - kind: MockInsn::Nop4, - }, - RetireSeqEntry { - pc: 0x8, - cond_br_taken: Some(false), - kind: MockInsn::CondBranch { target: 0x4 }, - }, - RetireSeqEntry { - pc: 0xC, - cond_br_taken: None, - kind: MockInsn::Call { target: 0x18 }, - }, - RetireSeqEntry { - pc: 0x18, - cond_br_taken: None, - kind: MockInsn::Jump { target: 0x1C }, - }, - RetireSeqEntry { - pc: 0x1C, - cond_br_taken: None, - kind: MockInsn::Ret, - }, - ]; - const RETIRE_SEQ_CYCLE: &'static [RetireSeqEntry] = &[ - RetireSeqEntry { - pc: 0x10, - cond_br_taken: None, - kind: MockInsn::Jump { target: 0x14 }, - }, - RetireSeqEntry { - pc: 0x14, - cond_br_taken: None, - kind: MockInsn::Jump { target: 0x10 }, - }, - ]; + pc: orig_pc, + cond_br_taken, + insn, + } + } + fn run_until_exit(&mut self, limit: u64, trace: bool) -> Result { + for _ in 0..limit { + let v = self.run_one(trace); + match v.insn { + MockInsn::ExitSysCall => return Ok(self.regs.read(MockReg::R1)), + MockInsn::Illegal => return Err(format!("illegal instruction at {:#x}", v.pc)), + _ => {} + } + } + Err(format!("reached instruction count limit at {:#x}", self.pc)) + } } #[derive(Copy, Clone, Debug)] struct RetireSeqEntry { pc: u64, cond_br_taken: Option, - kind: MockInsn, + insn: MockInsn, } #[derive(Clone)] -struct RetireSeq { - iter: std::iter::Chain< - std::slice::Iter<'static, RetireSeqEntry>, - std::iter::Cycle>, - >, -} +struct RetireSeq(MockMachineState); impl RetireSeq { - fn new() -> Self { - Self { - iter: MockInsn::RETIRE_SEQ_INIT - .iter() - .chain(MockInsn::RETIRE_SEQ_CYCLE.iter().cycle()), - } + fn new(mock_machine: MockMachineState) -> Self { + Self(mock_machine) } } @@ -158,21 +463,16 @@ impl Iterator for RetireSeq { type Item = RetireSeqEntry; fn next(&mut self) -> Option { - self.iter.next().copied() + Some(self.0.run_one(false)) } } -#[derive(Debug)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] struct MockInsns { - insns: BTreeMap, + insns: Interned>, } impl MockInsns { - fn new() -> Self { - Self { - insns: BTreeMap::from_iter(MockInsn::INSNS.iter().copied()), - } - } fn fetch_block(&self, pc_range: std::ops::Range) -> impl Iterator { self.insns .range(pc_range.clone()) @@ -186,6 +486,260 @@ impl MockInsns { } } +struct MockInsnsBuilder { + insns: BTreeMap, + labels: BTreeMap, Option)>, + available_labels: Range, + next_pc: u64, +} + +impl MockInsnsBuilder { + fn new() -> Self { + Self { + insns: BTreeMap::new(), + labels: BTreeMap::new(), + available_labels: Self::LABEL_RANGE, + next_pc: RESET_PC, + } + } + const LABEL_RANGE: Range = { + let start = u64::from_be_bytes(*b"Label\0\0\0"); + start..start + 0xFFFFFFu64 + }; + #[track_caller] + fn new_label(&mut self) -> u64 { + let Some(label) = self.available_labels.next() else { + panic!("too many labels"); + }; + self.labels + .insert(label, (std::panic::Location::caller(), None)); + label + } + #[track_caller] + fn define_label(&mut self, label: u64) { + let Some((location, address)) = self.labels.get_mut(&label) else { + panic!("invalid label id: {label:#x}"); + }; + if address.is_some() { + panic!("label already defined. at: {location}"); + } + *address = Some(self.next_pc); + *location = std::panic::Location::caller(); + } + #[track_caller] + fn advance_to(&mut self, pc: u64) { + assert!(self.next_pc < pc); + self.next_pc = pc; + } + #[track_caller] + fn insn(&mut self, insn: MockInsn) { + self.insns.insert(self.next_pc, insn); + self.next_pc = self.next_pc.wrapping_add(insn.byte_len()); + } + #[track_caller] + fn finish(mut self) -> MockInsns { + for insn in self.insns.values_mut() { + for target in insn.targets_mut() { + let label = *target; + if !Self::LABEL_RANGE.contains(&label) { + continue; + } + match self.labels.get(&label) { + Some((_location, Some(address))) => *target = *address, + Some((location, None)) => { + panic!("label not defined. label created at: {location}"); + } + None => panic!("invalid label id: {label:#x}"), + } + } + } + MockInsns { + insns: self.insns.intern_sized(), + } + } + #[track_caller] + fn call(&mut self, target: u64) { + self.insn(MockInsn::Call { target }); + } + #[track_caller] + fn br_cond(&mut self, target: u64, cond: MockIntCmp, lhs: MockReg, rhs: MockReg) { + self.insn(MockInsn::BrCond { + target, + cond, + lhs, + rhs, + }); + } + #[track_caller] + fn br_cond_i(&mut self, target: u64, cond: MockIntCmp, lhs: MockReg, rhs: u64) { + self.insn(MockInsn::BrCondI { + target, + cond, + lhs, + rhs, + }); + } + #[track_caller] + fn add_i(&mut self, dest: MockReg, src: MockReg, immediate: u64) { + self.insn(MockInsn::AddI { + dest, + src, + immediate, + }); + } + #[track_caller] + fn imm(&mut self, dest: MockReg, immediate: u64) { + self.add_i(dest, MockReg::Zero, immediate); + } + #[track_caller] + fn print_string(&mut self, temp_reg: MockReg, s: &str) { + for b in s.bytes() { + self.imm(temp_reg, b as u64); + self.insn(MockInsn::WriteOutputByte { src: temp_reg }); + } + } +} + +fn mock_program_expr_parser() -> MockInsns { + let mut b = MockInsnsBuilder::new(); + + let peek_reg = MockReg::R7; + let expr = b.new_label(); + let mul_div = b.new_label(); + let unary = b.new_label(); + let atom = b.new_label(); + let space = b.new_label(); + let error = b.new_label(); + + b.insn(MockInsn::ReadInputByte { dest: peek_reg }); + b.call(space); + b.call(expr); + b.br_cond_i( + error, + MockIntCmp::Ne, + peek_reg, + MockInsn::READ_INPUT_REG_EOF, + ); + b.print_string(MockReg::R1, "Success\n"); + b.imm(MockReg::R1, 0); + b.insn(MockInsn::ExitSysCall); + + b.advance_to(0x80); + b.define_label(error); + b.print_string(MockReg::R1, "Error\n"); + b.imm(MockReg::R1, 1); + b.insn(MockInsn::ExitSysCall); + + let not_add = b.new_label(); + let not_sub = b.new_label(); + b.advance_to(0x100); + b.define_label(expr); + b.call(mul_div); + b.br_cond_i(not_add, MockIntCmp::Ne, peek_reg, b'+' as u64); + b.insn(MockInsn::ReadInputByte { dest: peek_reg }); + b.call(space); + b.insn(MockInsn::Jump { target: expr }); + + b.define_label(not_add); + b.br_cond_i(not_sub, MockIntCmp::Ne, peek_reg, b'-' as u64); + b.insn(MockInsn::ReadInputByte { dest: peek_reg }); + b.call(space); + b.insn(MockInsn::Jump { target: expr }); + + b.define_label(not_sub); + b.insn(MockInsn::Ret); + + let not_mul = b.new_label(); + let not_div = b.new_label(); + b.advance_to(0x200); + b.define_label(mul_div); + b.call(unary); + b.br_cond_i(not_mul, MockIntCmp::Ne, peek_reg, b'*' as u64); + b.insn(MockInsn::ReadInputByte { dest: peek_reg }); + b.call(space); + b.insn(MockInsn::Jump { target: expr }); + + b.define_label(not_mul); + b.br_cond_i(not_div, MockIntCmp::Ne, peek_reg, b'/' as u64); + b.insn(MockInsn::ReadInputByte { dest: peek_reg }); + b.call(space); + b.insn(MockInsn::Jump { target: expr }); + + b.define_label(not_div); + b.insn(MockInsn::Ret); + + let not_neg = b.new_label(); + b.advance_to(0x300); + b.define_label(unary); + b.br_cond_i(not_neg, MockIntCmp::Ne, peek_reg, b'-' as u64); + b.insn(MockInsn::ReadInputByte { dest: peek_reg }); + b.call(space); + b.insn(MockInsn::Jump { target: unary }); + + b.define_label(not_neg); + b.call(atom); + b.insn(MockInsn::Ret); + + let not_num = b.new_label(); + b.advance_to(0x400); + b.define_label(atom); + b.br_cond_i(not_num, MockIntCmp::Ult, peek_reg, b'0' as u64); + b.br_cond_i(not_num, MockIntCmp::Ugt, peek_reg, b'9' as u64); + let parse_num = b.new_label(); + b.define_label(parse_num); + b.insn(MockInsn::ReadInputByte { dest: peek_reg }); + b.br_cond_i(space, MockIntCmp::Ult, peek_reg, b'0' as u64); + b.br_cond_i(space, MockIntCmp::Ugt, peek_reg, b'9' as u64); + b.insn(MockInsn::Jump { target: parse_num }); + + b.define_label(not_num); + b.br_cond_i(error, MockIntCmp::Ne, peek_reg, b'(' as u64); + b.insn(MockInsn::ReadInputByte { dest: peek_reg }); + b.call(space); + b.call(expr); + b.br_cond_i(error, MockIntCmp::Ne, peek_reg, b')' as u64); + b.insn(MockInsn::ReadInputByte { dest: peek_reg }); + b.insn(MockInsn::Jump { target: space }); + + let found_space = b.new_label(); + b.advance_to(0x500); + b.define_label(space); + b.br_cond_i(found_space, MockIntCmp::Eq, peek_reg, b' ' as u64); + b.br_cond_i(found_space, MockIntCmp::Eq, peek_reg, b'\t' as u64); + b.br_cond_i(found_space, MockIntCmp::Eq, peek_reg, b'\r' as u64); + b.br_cond_i(found_space, MockIntCmp::Eq, peek_reg, b'\n' as u64); + b.insn(MockInsn::Ret); + b.define_label(found_space); + b.insn(MockInsn::ReadInputByte { dest: peek_reg }); + b.insn(MockInsn::Jump { target: space }); + + b.finish() +} + +#[test] +fn test_program_expr_parser() { + #[track_caller] + fn test(expected_output: &str, expected_exit_code: u64, input: &str) { + println!("starting new test case: input={input:?}\n\n"); + let mut state = MockMachineState::new(mock_program_expr_parser(), input); + let exit_code = state.run_until_exit(10000, true).unwrap(); + println!("output: {:?}", str::from_utf8(&state.output)); + println!("exit code: {exit_code}"); + assert!(expected_output.as_bytes() == state.output); + assert_eq!(expected_exit_code, exit_code); + } + test("Success\n", 0, "123 + 456 * 789"); + test("Success\n", 0, "123"); + test("Success\n", 0, "(123 + 456) * 8 - 9"); + test("Success\n", 0, "-5"); + test("Success\n", 0, "3"); + test("Success\n", 0, TEST_NEXT_PC_INPUT); + test("Error\n", 1, "3-"); + test("Error\n", 1, "(123 + 456) + "); + test("Error\n", 1, "(123 + 456"); + test("Error\n", 1, "123 ** 456"); +} + const FETCH_PIPE_QUEUE_SIZE: usize = 5; const DEMO_ILLEGAL_INSN_TRAP: u64 = 0xFF000000u64; @@ -222,7 +776,7 @@ impl FetchPipeQueueEntry { } #[hdl_module(extern)] -fn mock_fetch_pipe(config: PhantomConst) { +fn mock_fetch_pipe(config: PhantomConst, insns: MockInsns) { #[hdl] let cd: ClockDomain = m.input(); #[hdl] @@ -236,8 +790,8 @@ fn mock_fetch_pipe(config: PhantomConst) { m.output(); m.register_clock_for_past(cd.clk); m.extern_module_simulation_fn( - (cd, from_fetch, to_post_decode, queue_debug), - |(cd, from_fetch, to_post_decode, queue_debug), mut sim| async move { + (cd, from_fetch, to_post_decode, queue_debug, insns), + |(cd, from_fetch, to_post_decode, queue_debug, insns), mut sim| async move { // intentionally have a different sequence each time we're reset let delay_sequence_index = Cell::new(0); sim.resettable( @@ -263,6 +817,7 @@ fn mock_fetch_pipe(config: PhantomConst) { to_post_decode, queue_debug, &delay_sequence_index, + insns, sim, ) }, @@ -277,10 +832,10 @@ fn mock_fetch_pipe(config: PhantomConst) { to_post_decode: Expr>>, queue_debug: Expr>>, delay_sequence_index: &Cell, + mock_insns: MockInsns, mut sim: ExternModuleSimulationState, ) { let config = from_fetch.config.ty(); - let mock_insns = MockInsns::new(); let mut queue: VecDeque> = VecDeque::new(); let mut next_id = 0u32; loop { @@ -314,20 +869,13 @@ fn mock_fetch_pipe(config: PhantomConst) { break; } expected_pc = next_pc; - let kind = match insn { - MockInsn::Nop4 => WipDecodedInsnKind.NonBranch(), - MockInsn::Jump { target } => WipDecodedInsnKind.Branch(target), - MockInsn::CondBranch { target } => WipDecodedInsnKind.BranchCond(target), - MockInsn::Call { target } => WipDecodedInsnKind.Call(target), - MockInsn::Ret => WipDecodedInsnKind.Ret(), - }; let insn = #[hdl(sim)] WipDecodedInsn { fetch_block_id, id: next_id.cast_to_static::>(), pc, size_in_bytes: insn.byte_len().cast_to_static::>(), - kind, + kind: insn.wip_decoded_insn_kind(), }; match ArrayVec::try_push_sim(&mut insns, insn) { Ok(()) => next_id = next_id.wrapping_add(1), @@ -452,9 +1000,6 @@ impl ExecuteRetirePipeQueueEntry { } } -/// an arbitrary value -const END_PC: u64 = u64::from_be_bytes(*b"EndInsns"); - #[derive(Clone)] struct MockExecuteState { queue: VecDeque>, @@ -465,11 +1010,11 @@ struct MockExecuteState { } impl MockExecuteState { - fn new(config: PhantomConst) -> Self { + fn new(config: PhantomConst, retire_seq: RetireSeq) -> Self { Self { queue: VecDeque::new(), used_ids: BTreeSet::new(), - retire_seq: RetireSeq::new(), + retire_seq, canceling: false, config, } @@ -496,56 +1041,19 @@ impl MockExecuteState { let RetireSeqEntry { pc, cond_br_taken, - kind, + insn: mock_insn, } = self .retire_seq .next() .ok_or_else(|| "expected no more instructions to retire")?; - let next_pc = self - .retire_seq - .clone() - .next() - .map(|v| v.pc) - .unwrap_or(END_PC); - let (expected_kind, call_stack_op) = match kind { - MockInsn::Nop4 => ( - #[hdl(sim)] - WipDecodedInsnKind::NonBranch(), - #[hdl(sim)] - CallStackOp::None(), - ), - MockInsn::Jump { target } => ( - #[hdl(sim)] - WipDecodedInsnKind::Branch(target), - #[hdl(sim)] - CallStackOp::None(), - ), - MockInsn::CondBranch { target } => ( - #[hdl(sim)] - WipDecodedInsnKind::BranchCond(target), - #[hdl(sim)] - CallStackOp::None(), - ), - MockInsn::Call { target } => ( - #[hdl(sim)] - WipDecodedInsnKind::Call(target), - #[hdl(sim)] - CallStackOp::Push(pc.wrapping_add(kind.byte_len())), - ), - MockInsn::Ret => ( - #[hdl(sim)] - WipDecodedInsnKind::Ret(), - #[hdl(sim)] - CallStackOp::Pop(), - ), - }; + let next_pc = self.retire_seq.0.pc; let expected_insn = #[hdl(sim)] WipDecodedInsn { fetch_block_id: &insn.fetch_block_id, id: &insn.id, pc, - size_in_bytes: kind.byte_len().cast_to_static::>(), - kind: expected_kind, + size_in_bytes: mock_insn.byte_len().cast_to_static::>(), + kind: mock_insn.wip_decoded_insn_kind(), }; if *expected_insn.cmp_ne(&insn) { return Err(format!( @@ -569,7 +1077,7 @@ impl MockExecuteState { RetireToNextPcInterfacePerInsn::<_> { id: &insn.id, next_pc, - call_stack_op, + call_stack_op: mock_insn.call_stack_op(pc), cond_br_taken: if let Some(cond_br_taken) = cond_br_taken { #[hdl(sim)] HdlSome(cond_br_taken) @@ -643,7 +1151,11 @@ impl MockExecuteState { } #[hdl_module(extern)] -fn mock_execute_retire_pipe(config: PhantomConst) { +fn mock_execute_retire_pipe( + config: PhantomConst, + mock_insns: MockInsns, + mock_input: Interned, +) { #[hdl] let cd: ClockDomain = m.input(); #[hdl] @@ -659,8 +1171,16 @@ fn mock_execute_retire_pipe(config: PhantomConst) { > = m.output(); m.register_clock_for_past(cd.clk); m.extern_module_simulation_fn( - (cd, from_post_decode, retire_output, queue_debug), - |(cd, from_post_decode, retire_output, queue_debug), mut sim| async move { + ( + cd, + from_post_decode, + retire_output, + queue_debug, + mock_insns, + mock_input, + ), + |args, mut sim| async move { + let (cd, from_post_decode, retire_output, queue_debug, mock_insns, mock_input) = args; // intentionally have a different sequence each time we're reset let delay_sequence_index = Cell::new(0); sim.resettable( @@ -692,6 +1212,8 @@ fn mock_execute_retire_pipe(config: PhantomConst) { retire_output, queue_debug, &delay_sequence_index, + mock_insns, + mock_input, sim, ) }, @@ -708,10 +1230,15 @@ fn mock_execute_retire_pipe(config: PhantomConst) { ArrayVec>, >, delay_sequence_index: &Cell, + mock_insns: MockInsns, + mock_input: Interned, mut sim: ExternModuleSimulationState, ) { let config = from_post_decode.config.ty(); - let mut state = MockExecuteState::new(config); + let mut state = MockExecuteState::new( + config, + RetireSeq::new(MockMachineState::new(mock_insns, mock_input)), + ); let empty_retire_insn = #[hdl(sim)] RetireToNextPcInterfacePerInsn::<_> { id: 0_hdl_u12, @@ -820,7 +1347,7 @@ fn mock_execute_retire_pipe(config: PhantomConst) { } #[hdl_module] -fn dut(config: PhantomConst) { +fn dut(config: PhantomConst, mock_insns: MockInsns, mock_input: Interned) { #[hdl] let cd: ClockDomain = m.input(); #[hdl] @@ -836,7 +1363,7 @@ fn dut(config: PhantomConst) { } = next_pc; connect(next_pc_cd, cd); #[hdl] - let mock_fetch_pipe = instance(mock_fetch_pipe(config)); + let mock_fetch_pipe = instance(mock_fetch_pipe(config, mock_insns)); #[hdl] let mock_fetch_pipe { cd: mock_fetch_pipe_cd, @@ -848,7 +1375,8 @@ fn dut(config: PhantomConst) { connect(mock_fetch_pipe_from_fetch, next_pc_to_fetch); connect(next_pc_from_decode, mock_fetch_pipe_to_post_decode); #[hdl] - let mock_execute_retire_pipe = instance(mock_execute_retire_pipe(config)); + let mock_execute_retire_pipe = + instance(mock_execute_retire_pipe(config, mock_insns, mock_input)); #[hdl] let mock_execute_retire_pipe { cd: mock_execute_retire_pipe_cd, @@ -864,6 +1392,8 @@ fn dut(config: PhantomConst) { ); } +const TEST_NEXT_PC_INPUT: &str = "(123 + -(456 + 3)) * 7 / 5 + 3"; + #[hdl] #[test] fn test_next_pc() { @@ -876,7 +1406,11 @@ fn test_next_pc() { NonZeroUsize::new(20).unwrap(), ); config.fetch_width = NonZeroUsize::new(2).unwrap(); - let m = dut(PhantomConst::new_sized(config)); + let m = dut( + PhantomConst::new_sized(config), + mock_program_expr_parser(), + TEST_NEXT_PC_INPUT.intern(), + ); let mut sim = Simulation::new(m); let writer = RcWriter::default(); sim.add_trace_writer(VcdWriterDecls::new(writer.clone()));