From ba3930777a5ea818cd55e7db3f341e1e4327e7fc Mon Sep 17 00:00:00 2001 From: Stephen Henry Date: Mon, 18 May 2020 13:10:32 +0100 Subject: [PATCH] Support display/scan %u/%z (#2324) (#2332) --- include/verilated.cpp | 91 +- src/V3EmitC.cpp | 2 + test_regress/t/t_sys_file_basic_uz.dat | Bin 0 -> 15360 bytes test_regress/t/t_sys_file_basic_uz.out | 2048 ++++++++++++++++++++++++ test_regress/t/t_sys_file_basic_uz.pl | 27 + test_regress/t/t_sys_file_basic_uz.v | 137 ++ 6 files changed, 2278 insertions(+), 27 deletions(-) create mode 100644 test_regress/t/t_sys_file_basic_uz.dat create mode 100644 test_regress/t/t_sys_file_basic_uz.out create mode 100755 test_regress/t/t_sys_file_basic_uz.pl create mode 100644 test_regress/t/t_sys_file_basic_uz.v diff --git a/include/verilated.cpp b/include/verilated.cpp index cf9a8e909..a393404ce 100644 --- a/include/verilated.cpp +++ b/include/verilated.cpp @@ -846,25 +846,22 @@ void _vl_vsformat(std::string& output, const char* formatp, va_list ap) VL_MT_SA + ((VL_BITISSETLIMIT_W(lwp, lbits, lsb + 2)) ? 4 : 0)); } break; - case 'u': // Packed 2-state - output.reserve(output.size() + 4 * VL_WORDS_I(lbits)); - for (int i = 0; i < VL_WORDS_I(lbits); ++i) { - output += static_cast((lwp[i]) & 0xff); - output += static_cast((lwp[i] >> 8) & 0xff); - output += static_cast((lwp[i] >> 16) & 0xff); - output += static_cast((lwp[i] >> 24) & 0xff); - } - break; - case 'z': // Packed 4-state - output.reserve(output.size() + 8 * VL_WORDS_I(lbits)); - for (int i = 0; i < VL_WORDS_I(lbits); ++i) { - output += static_cast((lwp[i]) & 0xff); - output += static_cast((lwp[i] >> 8) & 0xff); - output += static_cast((lwp[i] >> 16) & 0xff); - output += static_cast((lwp[i] >> 24) & 0xff); - output += "\0\0\0\0"; // No tristate + case 'u': + case 'z': { // Packed 4-state + const bool is_4_state = (fmt == 'z'); + output.reserve(output.size() + ((is_4_state ? 2 : 1) * VL_WORDS_I(lbits))); + int bytes_to_go = VL_BYTES_I(lbits); + int bit = 0; + while (bytes_to_go > 0) { + const int wr_bytes = std::min(4, bytes_to_go); + for (int byte = 0; byte < wr_bytes; byte++, bit += 8) + output += static_cast(VL_BITRSHIFT_W(lwp, bit) & 0xff); + output.append(4 - wr_bytes, (char)0); + if (is_4_state) output.append(4, (char)0); + bytes_to_go -= wr_bytes; } break; + } case 'v': // Strength; assume always strong for (lsb = lbits - 1; lsb >= 0; --lsb) { if (VL_BITRSHIFT_W(lwp, lsb) & 1) { @@ -932,8 +929,8 @@ static inline void _vl_vsss_skipspace(FILE* fp, int& floc, WDataInP fromp, _vl_vsss_advance(fp, floc); } } -static inline void _vl_vsss_read(FILE* fp, int& floc, WDataInP fromp, const std::string& fstr, - char* tmpp, const char* acceptp) VL_MT_SAFE { +static inline void _vl_vsss_read_str(FILE* fp, int& floc, WDataInP fromp, const std::string& fstr, + char* tmpp, const char* acceptp) VL_MT_SAFE { // Read into tmp, consisting of characters from acceptp list char* cp = tmpp; while (true) { @@ -947,6 +944,19 @@ static inline void _vl_vsss_read(FILE* fp, int& floc, WDataInP fromp, const std: *cp++ = '\0'; // VL_DBG_MSGF(" _read got='"< 0) { + const int c = _vl_vsss_peek(fp, floc, fromp, fstr); + if (c == EOF) return NULL; + if (!inhibit) *beginp++ = c; + _vl_vsss_advance(fp, floc); + } + return beginp; +} static inline void _vl_vsss_setbit(WDataOutP owp, int obits, int lsb, int nbits, IData ld) VL_MT_SAFE { for (; nbits && lsb < obits; nbits--, lsb++, ld >>= 1) { @@ -1045,7 +1055,7 @@ IData _vl_vsscanf(FILE* fp, // If a fscanf } case 's': { _vl_vsss_skipspace(fp, floc, fromp, fstr); - _vl_vsss_read(fp, floc, fromp, fstr, tmp, NULL); + _vl_vsss_read_str(fp, floc, fromp, fstr, tmp, NULL); if (!tmp[0]) goto done; int lpos = (static_cast(strlen(tmp))) - 1; int lsb = 0; @@ -1057,7 +1067,7 @@ IData _vl_vsscanf(FILE* fp, // If a fscanf } case 'd': { // Signed decimal _vl_vsss_skipspace(fp, floc, fromp, fstr); - _vl_vsss_read(fp, floc, fromp, fstr, tmp, "0123456789+-xXzZ?_"); + _vl_vsss_read_str(fp, floc, fromp, fstr, tmp, "0123456789+-xXzZ?_"); if (!tmp[0]) goto done; vlsint64_t ld; sscanf(tmp, "%30" VL_PRI64 "d", &ld); @@ -1068,7 +1078,7 @@ IData _vl_vsscanf(FILE* fp, // If a fscanf case 'e': case 'g': { // Real number _vl_vsss_skipspace(fp, floc, fromp, fstr); - _vl_vsss_read(fp, floc, fromp, fstr, tmp, "+-.0123456789eE"); + _vl_vsss_read_str(fp, floc, fromp, fstr, tmp, "+-.0123456789eE"); if (!tmp[0]) goto done; // cppcheck-suppress unusedStructMember // It's used union { @@ -1082,7 +1092,7 @@ IData _vl_vsscanf(FILE* fp, // If a fscanf case 't': // FALLTHRU // Time case '#': { // Unsigned decimal _vl_vsss_skipspace(fp, floc, fromp, fstr); - _vl_vsss_read(fp, floc, fromp, fstr, tmp, "0123456789+-xXzZ?_"); + _vl_vsss_read_str(fp, floc, fromp, fstr, tmp, "0123456789+-xXzZ?_"); if (!tmp[0]) goto done; QData ld; sscanf(tmp, "%30" VL_PRI64 "u", &ld); @@ -1091,25 +1101,52 @@ IData _vl_vsscanf(FILE* fp, // If a fscanf } case 'b': { _vl_vsss_skipspace(fp, floc, fromp, fstr); - _vl_vsss_read(fp, floc, fromp, fstr, tmp, "01xXzZ?_"); + _vl_vsss_read_str(fp, floc, fromp, fstr, tmp, "01xXzZ?_"); if (!tmp[0]) goto done; _vl_vsss_based(owp, obits, 1, tmp, 0, strlen(tmp)); break; } case 'o': { _vl_vsss_skipspace(fp, floc, fromp, fstr); - _vl_vsss_read(fp, floc, fromp, fstr, tmp, "01234567xXzZ?_"); + _vl_vsss_read_str(fp, floc, fromp, fstr, tmp, "01234567xXzZ?_"); if (!tmp[0]) goto done; _vl_vsss_based(owp, obits, 3, tmp, 0, strlen(tmp)); break; } case 'x': { _vl_vsss_skipspace(fp, floc, fromp, fstr); - _vl_vsss_read(fp, floc, fromp, fstr, tmp, "0123456789abcdefABCDEFxXzZ?_"); + _vl_vsss_read_str(fp, floc, fromp, fstr, tmp, "0123456789abcdefABCDEFxXzZ?_"); if (!tmp[0]) goto done; _vl_vsss_based(owp, obits, 4, tmp, 0, strlen(tmp)); break; } + case 'u': { + // Read packed 2-value binary data + const int bytes = VL_BYTES_I(obits); + char* out = reinterpret_cast(owp); + if (!_vl_vsss_read_bin(fp, floc, fromp, fstr, out, bytes)) goto done; + const int last = bytes % 4; + if (last != 0 + && !_vl_vsss_read_bin(fp, floc, fromp, fstr, out, 4 - last, true)) + goto done; + break; + } + case 'z': { + // Read packed 4-value binary data + char* out = reinterpret_cast(owp); + int bytes = VL_BYTES_I(obits); + while (bytes > 0) { + const int abytes = std::min(4, bytes); + // aval (4B) read {0, 1} state + out = _vl_vsss_read_bin(fp, floc, fromp, fstr, out, abytes); + if (!out) goto done; + // bval (4B) disregard {X, Z} state and align to new 8B boundary. + out = _vl_vsss_read_bin(fp, floc, fromp, fstr, out, 8 - abytes, true); + if (!out) goto done; + bytes -= abytes; + } + break; + } default: std::string msg = std::string("Unknown _vl_vsscanf code: ") + pos[0]; VL_FATAL_MT(__FILE__, __LINE__, "", msg.c_str()); @@ -1336,7 +1373,7 @@ void VL_FWRITEF(IData fpi, const char* formatp, ...) VL_MT_SAFE { const int n = VerilatedImp::fdToFp(fpi, fp, 30); for (std::size_t i = 0; i < n; i++) { if (VL_UNLIKELY(!fp[i])) continue; - fputs(output.c_str(), fp[i]); + fwrite(output.c_str(), 1, output.size(), fp[i]); } } diff --git a/src/V3EmitC.cpp b/src/V3EmitC.cpp index 4746d908a..be35cc98f 100644 --- a/src/V3EmitC.cpp +++ b/src/V3EmitC.cpp @@ -2182,6 +2182,8 @@ void EmitCStmts::displayNode(AstNode* nodep, AstScopeName* scopenamep, const str case 'g': displayArg(nodep, &elistp, isScan, vfmt, ignore, 'g'); break; case '^': displayArg(nodep, &elistp, isScan, vfmt, ignore, '^'); break; // Realtime case 'v': displayArg(nodep, &elistp, isScan, vfmt, ignore, 'v'); break; + case 'u': displayArg(nodep, &elistp, isScan, vfmt, ignore, 'u'); break; + case 'z': displayArg(nodep, &elistp, isScan, vfmt, ignore, 'z'); break; case 'm': { UASSERT_OBJ(scopenamep, nodep, "Display with %m but no AstScopeName"); string suffix = scopenamep->scopePrettySymName(); diff --git a/test_regress/t/t_sys_file_basic_uz.dat b/test_regress/t/t_sys_file_basic_uz.dat new file mode 100644 index 0000000000000000000000000000000000000000..03a38c52b14d43a57955406d3dd2d511eda00486 GIT binary patch literal 15360 zcmXw;cNmak7l&1RvNze;*?X_-?2x^(H`zszy~$o7gzUXnb_gM4hwQyq`0o3C&+lC4 zT=)At?{)tCJsBPJ#~6O#~=5|a^=6H^dV5>pXV6VnjW z64MdW6EhGq5;GB9h?$95h*^o*h}nrbh&hR_#9YMO#5}~j#C*j3!~#S&VnJddVqszt zVo_o-VsT;#Vo72tVrgO-Vp(E2VtHZ(Vnt#lVr60#VpU=_Vs)ZBu?Ddwu@x@g(sS@ig%a@htHiF@kuW zc!7A47)iWDyiB}8j3QnoUL#&7MiXxkZxU}2V~DqjcZhe1_lWn24~P$mvBXEj$HXVZ zIO0>{GvagN3*t-SE8=V78{%8yJK}rd2jWNKC*o(~7vfjqH{y5V58_YaFXC@vJn;|l zFYzCt_&an&|DDkPgy?@F^#4EfKQa36jQ%G<|C6Hs$U_#JNlmk{m+U1yQ2TO(Er@%e;)Kd zFZ!Pk{m+m77eN2r(EozyeI76e>D2sJA|C7-F$>{$S^nWV)KMnn#j{eU;|7W8Av(W$9=>Ht_KM4Jw zi~i3;|L3Fs3()_C=>H=0e=+*M1pQx%{x3uSm!to|=>H1zeIPCe>eKS2mRlR z{_jKo_oM#@(Eo$z{~`4MF#3N4{XdHSA4C6-qyORP{|WT}B>H~}{XdQVpF#i6qW|a6 z{|NN|JoHA$|0eo>3;mBl|8JxJ zchLX4=>I+R|33Qv0R4Z6{>P&KkI?_e=>HS+KMwtWivB-C|DU7(FVO#&=>IG9|26vm z2K|4F{=Y;2-=qH@(EpF<|0neSGy4Ap{r`&oe?$MjqyIn9|DWjpFZBO6`X7(}|3Ux% zqW}M*|BjtHbnG-CJ`w&ud}6#aJ_$Z4J{dkaJ_SA{J{3MSJ`FxCJ{>+iJ_9}@J`>&r zpBbM8pB0}CpBtm&BLC zm&TXDm&KREm&aGYSHxGsSH@StSH)MuSI4{KYv60*YvF6->)`9+>)}1{_3;hx4e^ce zjqy$JP4S-iX87j#7I-gwOMEMQYkV7gTYNiwdwd6cM|>xIXS_GQ3%)D98@@Zf2fio1 z7rr;X556zHAHF|+0Dd5T5Z(tr7(WC*6h90<96tg-67P%m!;iv`#{1&~@MG{}@qzep z`0@A&_=)&Q_{sPw_^J45`04l=_?h@w_}Tb5_#pgT{5<@8`~v(!{385f{1W_9{4)G< zd@z0mekFbtJ_NrSzXrb+ABtaxUyt8_55sT7Z^CcJZ^3WHZ^LiL@4)ZG@51lK@4@fI z@5ArMAHW~PAHpBTAHg5RAHyHVhvQG+PvTGEPvg(v&*IPFBk2Z%BsyKhnfF8(+b_&RrfWTO%6BzdBzpiZdYrs(`<6s z`Oh=2(4$@TSijli@bjN%U}2+nwb91SCWoQ_JQE8&+f~oanoSNz|9M6hdbO)wTQ-{< zmj3h1ENs)Rw%NAXK?LW`(LjQKve?YUzVeUWA^uoY)HSoA*lf&JAp7Dhf+trCD zHJcpv{`1T)oZ7BVJ+0Z~@b{m0K;g`Gb>>;kCYOQ#yb}t8+SQHo1KK=N(kIrCr@}YqQB^mg_+^5YZm#zQ2a|>Uzt1rH6Ho1KL=N(-5rd@sWZL`T`>_6}1!Vm50haa0wE@%IF zM;Cr+SHJw)Y;sxq&pW&DN4xst&t{X$+kf8Sh4Jlb{6Ebmm%0DE(+kx3t|sVE=-940 zc4{`c-2LYrU-;hyWgUtgi=B!S7AGnuVd7eME>2RMv^ZID^5PW5DT`ATr!G!YoVGY! zar)v6#Tkn;6}uE?F3wV%wK!XG_Tn7HIg4G3a~0<<&QqMXIA3x8;sV8P#RZEC6&Efp zQe3pSSaI><62&EpOBI(cE>m2#xLk4h;tItTiz^jZF0N8swYXYw^YZccn zu2WpMxL&bGasA>3#SM!a6*n$!QrxuIv$$Dt^Wql8Ud1hoTNSr1Zd2U0xLtAk;ts_f zi#ru}F7__&Qrxw;TXFZ|9>qP2dlmOC?o-^ixLLrDJhymW@%-Wi#S4oU6)!GcQoOWyS@H7X;NlgQhc=dSn=`V z@ZuB2CyP%NpDsRAe75*paYXU?;tRzWizACK6<;pCQXEx$wfI``_2TH_8^t$^ZxzQB z-!8sWe7E>s@%`cl#Se>Piysv~E`CxRSNyd2S@HAY7sW4&UlqSDepCFm_+9b);t$0i zi$4{AF8)&dwfI}{_u?PLKZ}1A|1OR%{!{$7_+POZ{_*V$KywbDISbI72WZX&H0J`E zvjNTdfaZ)qb55W+E6|)5XwD2Y=LVXy1I_t?<_tk|j-WY9(3~e|&J;A~3YxP8&G~}n zj6rkGpgC*MoHuCB95m+++MHb*H1h|)oIz;LAv9+Zn)3+FnS|zCLUT5uIiJv+QE1L7 zG-nl>^9s$Gh34Esb9SLQztEgvXwES-XBnFF49%H_=3GN_wxK!S(428-&N(z^9h&nF z&6$Vh+(TQvdxK{F;g>TI%{hqXEJSl2qB#@MoQr7AMl|Omnllp3If>@1L~~xEIWy6m zn`q8XH0LLpGZf7^ismdubDp9(Q_-BOXwFtN=PQ~s7R@<}=B!0?-l92k(VV+zJNItT z%wPO+2BSHL(VWF-&SNxZGMaN4&Do6Rd`5FdqdBM1oYiQ~YcyvznsXb?*^TD>MstRv zImgkQ(TlTXgT1Rmd<^&V+S^9=0AQp1JaxW zY0iQ)=Ruk?A_~Hdq&Y*Irq{YAKsvufBEGMOmhyVISbRAhiT5lH0NTPvoX#2nC6U3 zb55o?E7P2pY0k_v=VqF-GtK##<_t}9j;1+F)10Si&eSyLYMQe(&H0+DY)12{XfBoI^@9{02_i4`jG~WM> z6})C0NqQy1j^PhRSP zV)K_UPxZ*hUBGwNM7oQWt*2-bh~Rj^w5O zNM7oYXhWAUP)f+mgJ>=NnYxhYU`I-br5S zp5&$eNnYxpZIhQUP@l-rsSo5N?z)ya66Y z-b!BTuH>cuN?z))a^sgUQ1r;w&bOLOJ3@@b&Ho-b-HUzT~C;OJ3^0cr%wUQAx<#^j}bOkV29dfS&-b`NV&g7;3OkV2HUh2~1r9Mqw>eS?=UQJ%=*5svrOfGd|-c4TW-sGkJOg435UQS->=H#V*PG0Kh zg?pD-cDZX?&PKZPG0Kph$ELUQb@?_T;60 zPhRTyip!T-cMfY{^X_pPhQ>u$;*2nd3hHkFYklo<(-hcycd#} zcSG{>en?*45y{JYB6)dNBrorazmn1LmljP-{ zlDxcEl9zW&^74L3Ufwau%X=nydDkQ_@0;Z1os+!0caoQPPxA8qNnYMT$;*2vd3hHl zFYlw|<(-tgyqA)fcT@86eo9{6QOV1DDtUQVB`@!*k4^8QL*-eJkh zdn|c*mnARnv*hKSmb|>zl9zW|^74L5UfyxZ%X=<)dDkT`@4MvXotM14_mY=)U-I() zOJ3fA$;*2%d3hHmFYm+T<(-(kycd&~cVqJMeoS88k;%(@GI@DdCNJ;HC?dDkW{@7v_% zotwP8caxWQZ}Rf~Op1dpvo0mnSdp^W^27p1i!*lb3gU^74L9Uf%J^ P%R4@KdB-O&@A&@%<<{}j literal 0 HcmV?d00001 diff --git a/test_regress/t/t_sys_file_basic_uz.out b/test_regress/t/t_sys_file_basic_uz.out new file mode 100644 index 000000000..6cd8f845b --- /dev/null +++ b/test_regress/t/t_sys_file_basic_uz.out @@ -0,0 +1,2048 @@ +00 +01 +02 +03 +04 +05 +06 +07 +08 +09 +0a +0b +0c +0d +0e +0f +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +1a +1b +1c +1d +1e +1f +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +2a +2b +2c +2d +2e +2f +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +3a +3b +3c +3d +3e +3f +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +4a +4b +4c +4d +4e +4f +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +5a +5b +5c +5d +5e +5f +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +6a +6b +6c +6d +6e +6f +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +7a +7b +7c +7d +7e +7f +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +8a +8b +8c +8d +8e +8f +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +9a +9b +9c +9d +9e +9f +a0 +a1 +a2 +a3 +a4 +a5 +a6 +a7 +a8 +a9 +aa +ab +ac +ad +ae +af +b0 +b1 +b2 +b3 +b4 +b5 +b6 +b7 +b8 +b9 +ba +bb +bc +bd +be +bf +c0 +c1 +c2 +c3 +c4 +c5 +c6 +c7 +c8 +c9 +ca +cb +cc +cd +ce +cf +d0 +d1 +d2 +d3 +d4 +d5 +d6 +d7 +d8 +d9 +da +db +dc +dd +de +df +e0 +e1 +e2 +e3 +e4 +e5 +e6 +e7 +e8 +e9 +ea +eb +ec +ed +ee +ef +f0 +f1 +f2 +f3 +f4 +f5 +f6 +f7 +f8 +f9 +fa +fb +fc +fd +fe +ff +0100 +0201 +0302 +0403 +0504 +0605 +0706 +0807 +0908 +0a09 +0b0a +0c0b +0d0c +0e0d +0f0e +100f +1110 +1211 +1312 +1413 +1514 +1615 +1716 +1817 +1918 +1a19 +1b1a +1c1b +1d1c +1e1d +1f1e +201f +2120 +2221 +2322 +2423 +2524 +2625 +2726 +2827 +2928 +2a29 +2b2a +2c2b +2d2c +2e2d +2f2e +302f +3130 +3231 +3332 +3433 +3534 +3635 +3736 +3837 +3938 +3a39 +3b3a +3c3b +3d3c +3e3d +3f3e +403f +4140 +4241 +4342 +4443 +4544 +4645 +4746 +4847 +4948 +4a49 +4b4a +4c4b +4d4c +4e4d +4f4e +504f +5150 +5251 +5352 +5453 +5554 +5655 +5756 +5857 +5958 +5a59 +5b5a +5c5b +5d5c +5e5d +5f5e +605f +6160 +6261 +6362 +6463 +6564 +6665 +6766 +6867 +6968 +6a69 +6b6a +6c6b +6d6c +6e6d +6f6e +706f +7170 +7271 +7372 +7473 +7574 +7675 +7776 +7877 +7978 +7a79 +7b7a +7c7b +7d7c +7e7d +7f7e +807f +8180 +8281 +8382 +8483 +8584 +8685 +8786 +8887 +8988 +8a89 +8b8a +8c8b +8d8c +8e8d +8f8e +908f +9190 +9291 +9392 +9493 +9594 +9695 +9796 +9897 +9998 +9a99 +9b9a +9c9b +9d9c +9e9d +9f9e +a09f +a1a0 +a2a1 +a3a2 +a4a3 +a5a4 +a6a5 +a7a6 +a8a7 +a9a8 +aaa9 +abaa +acab +adac +aead +afae +b0af +b1b0 +b2b1 +b3b2 +b4b3 +b5b4 +b6b5 +b7b6 +b8b7 +b9b8 +bab9 +bbba +bcbb +bdbc +bebd +bfbe +c0bf +c1c0 +c2c1 +c3c2 +c4c3 +c5c4 +c6c5 +c7c6 +c8c7 +c9c8 +cac9 +cbca +cccb +cdcc +cecd +cfce +d0cf +d1d0 +d2d1 +d3d2 +d4d3 +d5d4 +d6d5 +d7d6 +d8d7 +d9d8 +dad9 +dbda +dcdb +dddc +dedd +dfde +e0df +e1e0 +e2e1 +e3e2 +e4e3 +e5e4 +e6e5 +e7e6 +e8e7 +e9e8 +eae9 +ebea +eceb +edec +eeed +efee +f0ef +f1f0 +f2f1 +f3f2 +f4f3 +f5f4 +f6f5 +f7f6 +f8f7 +f9f8 +faf9 +fbfa +fcfb +fdfc +fefd +fffe +00ff +03020100 +04030201 +05040302 +06050403 +07060504 +08070605 +09080706 +0a090807 +0b0a0908 +0c0b0a09 +0d0c0b0a +0e0d0c0b +0f0e0d0c +100f0e0d +11100f0e +1211100f +13121110 +14131211 +15141312 +16151413 +17161514 +18171615 +19181716 +1a191817 +1b1a1918 +1c1b1a19 +1d1c1b1a +1e1d1c1b +1f1e1d1c +201f1e1d +21201f1e +2221201f +23222120 +24232221 +25242322 +26252423 +27262524 +28272625 +29282726 +2a292827 +2b2a2928 +2c2b2a29 +2d2c2b2a +2e2d2c2b +2f2e2d2c +302f2e2d +31302f2e +3231302f +33323130 +34333231 +35343332 +36353433 +37363534 +38373635 +39383736 +3a393837 +3b3a3938 +3c3b3a39 +3d3c3b3a +3e3d3c3b +3f3e3d3c +403f3e3d +41403f3e +4241403f +43424140 +44434241 +45444342 +46454443 +47464544 +48474645 +49484746 +4a494847 +4b4a4948 +4c4b4a49 +4d4c4b4a +4e4d4c4b +4f4e4d4c +504f4e4d +51504f4e +5251504f +53525150 +54535251 +55545352 +56555453 +57565554 +58575655 +59585756 +5a595857 +5b5a5958 +5c5b5a59 +5d5c5b5a +5e5d5c5b +5f5e5d5c +605f5e5d +61605f5e +6261605f +63626160 +64636261 +65646362 +66656463 +67666564 +68676665 +69686766 +6a696867 +6b6a6968 +6c6b6a69 +6d6c6b6a +6e6d6c6b +6f6e6d6c +706f6e6d +71706f6e +7271706f +73727170 +74737271 +75747372 +76757473 +77767574 +78777675 +79787776 +7a797877 +7b7a7978 +7c7b7a79 +7d7c7b7a +7e7d7c7b +7f7e7d7c +807f7e7d +81807f7e +8281807f +83828180 +84838281 +85848382 +86858483 +87868584 +88878685 +89888786 +8a898887 +8b8a8988 +8c8b8a89 +8d8c8b8a +8e8d8c8b +8f8e8d8c +908f8e8d +91908f8e +9291908f +93929190 +94939291 +95949392 +96959493 +97969594 +98979695 +99989796 +9a999897 +9b9a9998 +9c9b9a99 +9d9c9b9a +9e9d9c9b +9f9e9d9c +a09f9e9d +a1a09f9e +a2a1a09f +a3a2a1a0 +a4a3a2a1 +a5a4a3a2 +a6a5a4a3 +a7a6a5a4 +a8a7a6a5 +a9a8a7a6 +aaa9a8a7 +abaaa9a8 +acabaaa9 +adacabaa +aeadacab +afaeadac +b0afaead +b1b0afae +b2b1b0af +b3b2b1b0 +b4b3b2b1 +b5b4b3b2 +b6b5b4b3 +b7b6b5b4 +b8b7b6b5 +b9b8b7b6 +bab9b8b7 +bbbab9b8 +bcbbbab9 +bdbcbbba +bebdbcbb +bfbebdbc +c0bfbebd +c1c0bfbe +c2c1c0bf +c3c2c1c0 +c4c3c2c1 +c5c4c3c2 +c6c5c4c3 +c7c6c5c4 +c8c7c6c5 +c9c8c7c6 +cac9c8c7 +cbcac9c8 +cccbcac9 +cdcccbca +cecdcccb +cfcecdcc +d0cfcecd +d1d0cfce +d2d1d0cf +d3d2d1d0 +d4d3d2d1 +d5d4d3d2 +d6d5d4d3 +d7d6d5d4 +d8d7d6d5 +d9d8d7d6 +dad9d8d7 +dbdad9d8 +dcdbdad9 +dddcdbda +dedddcdb +dfdedddc +e0dfdedd +e1e0dfde +e2e1e0df +e3e2e1e0 +e4e3e2e1 +e5e4e3e2 +e6e5e4e3 +e7e6e5e4 +e8e7e6e5 +e9e8e7e6 +eae9e8e7 +ebeae9e8 +ecebeae9 +edecebea +eeedeceb +efeeedec +f0efeeed +f1f0efee +f2f1f0ef +f3f2f1f0 +f4f3f2f1 +f5f4f3f2 +f6f5f4f3 +f7f6f5f4 +f8f7f6f5 +f9f8f7f6 +faf9f8f7 +fbfaf9f8 +fcfbfaf9 +fdfcfbfa +fefdfcfb +fffefdfc +00fffefd +0100fffe +020100ff +0706050403020100 +0807060504030201 +0908070605040302 +0a09080706050403 +0b0a090807060504 +0c0b0a0908070605 +0d0c0b0a09080706 +0e0d0c0b0a090807 +0f0e0d0c0b0a0908 +100f0e0d0c0b0a09 +11100f0e0d0c0b0a +1211100f0e0d0c0b +131211100f0e0d0c +14131211100f0e0d +1514131211100f0e +161514131211100f +1716151413121110 +1817161514131211 +1918171615141312 +1a19181716151413 +1b1a191817161514 +1c1b1a1918171615 +1d1c1b1a19181716 +1e1d1c1b1a191817 +1f1e1d1c1b1a1918 +201f1e1d1c1b1a19 +21201f1e1d1c1b1a +2221201f1e1d1c1b +232221201f1e1d1c +24232221201f1e1d +2524232221201f1e +262524232221201f +2726252423222120 +2827262524232221 +2928272625242322 +2a29282726252423 +2b2a292827262524 +2c2b2a2928272625 +2d2c2b2a29282726 +2e2d2c2b2a292827 +2f2e2d2c2b2a2928 +302f2e2d2c2b2a29 +31302f2e2d2c2b2a +3231302f2e2d2c2b +333231302f2e2d2c +34333231302f2e2d +3534333231302f2e +363534333231302f +3736353433323130 +3837363534333231 +3938373635343332 +3a39383736353433 +3b3a393837363534 +3c3b3a3938373635 +3d3c3b3a39383736 +3e3d3c3b3a393837 +3f3e3d3c3b3a3938 +403f3e3d3c3b3a39 +41403f3e3d3c3b3a +4241403f3e3d3c3b +434241403f3e3d3c +44434241403f3e3d +4544434241403f3e +464544434241403f +4746454443424140 +4847464544434241 +4948474645444342 +4a49484746454443 +4b4a494847464544 +4c4b4a4948474645 +4d4c4b4a49484746 +4e4d4c4b4a494847 +4f4e4d4c4b4a4948 +504f4e4d4c4b4a49 +51504f4e4d4c4b4a +5251504f4e4d4c4b +535251504f4e4d4c +54535251504f4e4d +5554535251504f4e +565554535251504f +5756555453525150 +5857565554535251 +5958575655545352 +5a59585756555453 +5b5a595857565554 +5c5b5a5958575655 +5d5c5b5a59585756 +5e5d5c5b5a595857 +5f5e5d5c5b5a5958 +605f5e5d5c5b5a59 +61605f5e5d5c5b5a +6261605f5e5d5c5b +636261605f5e5d5c +64636261605f5e5d +6564636261605f5e +666564636261605f +6766656463626160 +6867666564636261 +6968676665646362 +6a69686766656463 +6b6a696867666564 +6c6b6a6968676665 +6d6c6b6a69686766 +6e6d6c6b6a696867 +6f6e6d6c6b6a6968 +706f6e6d6c6b6a69 +71706f6e6d6c6b6a +7271706f6e6d6c6b +737271706f6e6d6c +74737271706f6e6d +7574737271706f6e +767574737271706f +7776757473727170 +7877767574737271 +7978777675747372 +7a79787776757473 +7b7a797877767574 +7c7b7a7978777675 +7d7c7b7a79787776 +7e7d7c7b7a797877 +7f7e7d7c7b7a7978 +807f7e7d7c7b7a79 +81807f7e7d7c7b7a +8281807f7e7d7c7b +838281807f7e7d7c +84838281807f7e7d +8584838281807f7e +868584838281807f +8786858483828180 +8887868584838281 +8988878685848382 +8a89888786858483 +8b8a898887868584 +8c8b8a8988878685 +8d8c8b8a89888786 +8e8d8c8b8a898887 +8f8e8d8c8b8a8988 +908f8e8d8c8b8a89 +91908f8e8d8c8b8a +9291908f8e8d8c8b +939291908f8e8d8c +94939291908f8e8d +9594939291908f8e +969594939291908f +9796959493929190 +9897969594939291 +9998979695949392 +9a99989796959493 +9b9a999897969594 +9c9b9a9998979695 +9d9c9b9a99989796 +9e9d9c9b9a999897 +9f9e9d9c9b9a9998 +a09f9e9d9c9b9a99 +a1a09f9e9d9c9b9a +a2a1a09f9e9d9c9b +a3a2a1a09f9e9d9c +a4a3a2a1a09f9e9d +a5a4a3a2a1a09f9e +a6a5a4a3a2a1a09f +a7a6a5a4a3a2a1a0 +a8a7a6a5a4a3a2a1 +a9a8a7a6a5a4a3a2 +aaa9a8a7a6a5a4a3 +abaaa9a8a7a6a5a4 +acabaaa9a8a7a6a5 +adacabaaa9a8a7a6 +aeadacabaaa9a8a7 +afaeadacabaaa9a8 +b0afaeadacabaaa9 +b1b0afaeadacabaa +b2b1b0afaeadacab +b3b2b1b0afaeadac +b4b3b2b1b0afaead +b5b4b3b2b1b0afae +b6b5b4b3b2b1b0af +b7b6b5b4b3b2b1b0 +b8b7b6b5b4b3b2b1 +b9b8b7b6b5b4b3b2 +bab9b8b7b6b5b4b3 +bbbab9b8b7b6b5b4 +bcbbbab9b8b7b6b5 +bdbcbbbab9b8b7b6 +bebdbcbbbab9b8b7 +bfbebdbcbbbab9b8 +c0bfbebdbcbbbab9 +c1c0bfbebdbcbbba +c2c1c0bfbebdbcbb +c3c2c1c0bfbebdbc +c4c3c2c1c0bfbebd +c5c4c3c2c1c0bfbe +c6c5c4c3c2c1c0bf +c7c6c5c4c3c2c1c0 +c8c7c6c5c4c3c2c1 +c9c8c7c6c5c4c3c2 +cac9c8c7c6c5c4c3 +cbcac9c8c7c6c5c4 +cccbcac9c8c7c6c5 +cdcccbcac9c8c7c6 +cecdcccbcac9c8c7 +cfcecdcccbcac9c8 +d0cfcecdcccbcac9 +d1d0cfcecdcccbca +d2d1d0cfcecdcccb +d3d2d1d0cfcecdcc +d4d3d2d1d0cfcecd +d5d4d3d2d1d0cfce +d6d5d4d3d2d1d0cf +d7d6d5d4d3d2d1d0 +d8d7d6d5d4d3d2d1 +d9d8d7d6d5d4d3d2 +dad9d8d7d6d5d4d3 +dbdad9d8d7d6d5d4 +dcdbdad9d8d7d6d5 +dddcdbdad9d8d7d6 +dedddcdbdad9d8d7 +dfdedddcdbdad9d8 +e0dfdedddcdbdad9 +e1e0dfdedddcdbda +e2e1e0dfdedddcdb +e3e2e1e0dfdedddc +e4e3e2e1e0dfdedd +e5e4e3e2e1e0dfde +e6e5e4e3e2e1e0df +e7e6e5e4e3e2e1e0 +e8e7e6e5e4e3e2e1 +e9e8e7e6e5e4e3e2 +eae9e8e7e6e5e4e3 +ebeae9e8e7e6e5e4 +ecebeae9e8e7e6e5 +edecebeae9e8e7e6 +eeedecebeae9e8e7 +efeeedecebeae9e8 +f0efeeedecebeae9 +f1f0efeeedecebea +f2f1f0efeeedeceb +f3f2f1f0efeeedec +f4f3f2f1f0efeeed +f5f4f3f2f1f0efee +f6f5f4f3f2f1f0ef +f7f6f5f4f3f2f1f0 +f8f7f6f5f4f3f2f1 +f9f8f7f6f5f4f3f2 +faf9f8f7f6f5f4f3 +fbfaf9f8f7f6f5f4 +fcfbfaf9f8f7f6f5 +fdfcfbfaf9f8f7f6 +fefdfcfbfaf9f8f7 +fffefdfcfbfaf9f8 +00fffefdfcfbfaf9 +0100fffefdfcfbfa +020100fffefdfcfb +03020100fffefdfc +0403020100fffefd +050403020100fffe +06050403020100ff +00 +01 +02 +03 +04 +05 +06 +07 +08 +09 +0a +0b +0c +0d +0e +0f +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +1a +1b +1c +1d +1e +1f +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +2a +2b +2c +2d +2e +2f +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +3a +3b +3c +3d +3e +3f +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +4a +4b +4c +4d +4e +4f +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +5a +5b +5c +5d +5e +5f +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +6a +6b +6c +6d +6e +6f +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +7a +7b +7c +7d +7e +7f +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +8a +8b +8c +8d +8e +8f +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +9a +9b +9c +9d +9e +9f +a0 +a1 +a2 +a3 +a4 +a5 +a6 +a7 +a8 +a9 +aa +ab +ac +ad +ae +af +b0 +b1 +b2 +b3 +b4 +b5 +b6 +b7 +b8 +b9 +ba +bb +bc +bd +be +bf +c0 +c1 +c2 +c3 +c4 +c5 +c6 +c7 +c8 +c9 +ca +cb +cc +cd +ce +cf +d0 +d1 +d2 +d3 +d4 +d5 +d6 +d7 +d8 +d9 +da +db +dc +dd +de +df +e0 +e1 +e2 +e3 +e4 +e5 +e6 +e7 +e8 +e9 +ea +eb +ec +ed +ee +ef +f0 +f1 +f2 +f3 +f4 +f5 +f6 +f7 +f8 +f9 +fa +fb +fc +fd +fe +ff +0100 +0201 +0302 +0403 +0504 +0605 +0706 +0807 +0908 +0a09 +0b0a +0c0b +0d0c +0e0d +0f0e +100f +1110 +1211 +1312 +1413 +1514 +1615 +1716 +1817 +1918 +1a19 +1b1a +1c1b +1d1c +1e1d +1f1e +201f +2120 +2221 +2322 +2423 +2524 +2625 +2726 +2827 +2928 +2a29 +2b2a +2c2b +2d2c +2e2d +2f2e +302f +3130 +3231 +3332 +3433 +3534 +3635 +3736 +3837 +3938 +3a39 +3b3a +3c3b +3d3c +3e3d +3f3e +403f +4140 +4241 +4342 +4443 +4544 +4645 +4746 +4847 +4948 +4a49 +4b4a +4c4b +4d4c +4e4d +4f4e +504f +5150 +5251 +5352 +5453 +5554 +5655 +5756 +5857 +5958 +5a59 +5b5a +5c5b +5d5c +5e5d +5f5e +605f +6160 +6261 +6362 +6463 +6564 +6665 +6766 +6867 +6968 +6a69 +6b6a +6c6b +6d6c +6e6d +6f6e +706f +7170 +7271 +7372 +7473 +7574 +7675 +7776 +7877 +7978 +7a79 +7b7a +7c7b +7d7c +7e7d +7f7e +807f +8180 +8281 +8382 +8483 +8584 +8685 +8786 +8887 +8988 +8a89 +8b8a +8c8b +8d8c +8e8d +8f8e +908f +9190 +9291 +9392 +9493 +9594 +9695 +9796 +9897 +9998 +9a99 +9b9a +9c9b +9d9c +9e9d +9f9e +a09f +a1a0 +a2a1 +a3a2 +a4a3 +a5a4 +a6a5 +a7a6 +a8a7 +a9a8 +aaa9 +abaa +acab +adac +aead +afae +b0af +b1b0 +b2b1 +b3b2 +b4b3 +b5b4 +b6b5 +b7b6 +b8b7 +b9b8 +bab9 +bbba +bcbb +bdbc +bebd +bfbe +c0bf +c1c0 +c2c1 +c3c2 +c4c3 +c5c4 +c6c5 +c7c6 +c8c7 +c9c8 +cac9 +cbca +cccb +cdcc +cecd +cfce +d0cf +d1d0 +d2d1 +d3d2 +d4d3 +d5d4 +d6d5 +d7d6 +d8d7 +d9d8 +dad9 +dbda +dcdb +dddc +dedd +dfde +e0df +e1e0 +e2e1 +e3e2 +e4e3 +e5e4 +e6e5 +e7e6 +e8e7 +e9e8 +eae9 +ebea +eceb +edec +eeed +efee +f0ef +f1f0 +f2f1 +f3f2 +f4f3 +f5f4 +f6f5 +f7f6 +f8f7 +f9f8 +faf9 +fbfa +fcfb +fdfc +fefd +fffe +00ff +03020100 +04030201 +05040302 +06050403 +07060504 +08070605 +09080706 +0a090807 +0b0a0908 +0c0b0a09 +0d0c0b0a +0e0d0c0b +0f0e0d0c +100f0e0d +11100f0e +1211100f +13121110 +14131211 +15141312 +16151413 +17161514 +18171615 +19181716 +1a191817 +1b1a1918 +1c1b1a19 +1d1c1b1a +1e1d1c1b +1f1e1d1c +201f1e1d +21201f1e +2221201f +23222120 +24232221 +25242322 +26252423 +27262524 +28272625 +29282726 +2a292827 +2b2a2928 +2c2b2a29 +2d2c2b2a +2e2d2c2b +2f2e2d2c +302f2e2d +31302f2e +3231302f +33323130 +34333231 +35343332 +36353433 +37363534 +38373635 +39383736 +3a393837 +3b3a3938 +3c3b3a39 +3d3c3b3a +3e3d3c3b +3f3e3d3c +403f3e3d +41403f3e +4241403f +43424140 +44434241 +45444342 +46454443 +47464544 +48474645 +49484746 +4a494847 +4b4a4948 +4c4b4a49 +4d4c4b4a +4e4d4c4b +4f4e4d4c +504f4e4d +51504f4e +5251504f +53525150 +54535251 +55545352 +56555453 +57565554 +58575655 +59585756 +5a595857 +5b5a5958 +5c5b5a59 +5d5c5b5a +5e5d5c5b +5f5e5d5c +605f5e5d +61605f5e +6261605f +63626160 +64636261 +65646362 +66656463 +67666564 +68676665 +69686766 +6a696867 +6b6a6968 +6c6b6a69 +6d6c6b6a +6e6d6c6b +6f6e6d6c +706f6e6d +71706f6e +7271706f +73727170 +74737271 +75747372 +76757473 +77767574 +78777675 +79787776 +7a797877 +7b7a7978 +7c7b7a79 +7d7c7b7a +7e7d7c7b +7f7e7d7c +807f7e7d +81807f7e +8281807f +83828180 +84838281 +85848382 +86858483 +87868584 +88878685 +89888786 +8a898887 +8b8a8988 +8c8b8a89 +8d8c8b8a +8e8d8c8b +8f8e8d8c +908f8e8d +91908f8e +9291908f +93929190 +94939291 +95949392 +96959493 +97969594 +98979695 +99989796 +9a999897 +9b9a9998 +9c9b9a99 +9d9c9b9a +9e9d9c9b +9f9e9d9c +a09f9e9d +a1a09f9e +a2a1a09f +a3a2a1a0 +a4a3a2a1 +a5a4a3a2 +a6a5a4a3 +a7a6a5a4 +a8a7a6a5 +a9a8a7a6 +aaa9a8a7 +abaaa9a8 +acabaaa9 +adacabaa +aeadacab +afaeadac +b0afaead +b1b0afae +b2b1b0af +b3b2b1b0 +b4b3b2b1 +b5b4b3b2 +b6b5b4b3 +b7b6b5b4 +b8b7b6b5 +b9b8b7b6 +bab9b8b7 +bbbab9b8 +bcbbbab9 +bdbcbbba +bebdbcbb +bfbebdbc +c0bfbebd +c1c0bfbe +c2c1c0bf +c3c2c1c0 +c4c3c2c1 +c5c4c3c2 +c6c5c4c3 +c7c6c5c4 +c8c7c6c5 +c9c8c7c6 +cac9c8c7 +cbcac9c8 +cccbcac9 +cdcccbca +cecdcccb +cfcecdcc +d0cfcecd +d1d0cfce +d2d1d0cf +d3d2d1d0 +d4d3d2d1 +d5d4d3d2 +d6d5d4d3 +d7d6d5d4 +d8d7d6d5 +d9d8d7d6 +dad9d8d7 +dbdad9d8 +dcdbdad9 +dddcdbda +dedddcdb +dfdedddc +e0dfdedd +e1e0dfde +e2e1e0df +e3e2e1e0 +e4e3e2e1 +e5e4e3e2 +e6e5e4e3 +e7e6e5e4 +e8e7e6e5 +e9e8e7e6 +eae9e8e7 +ebeae9e8 +ecebeae9 +edecebea +eeedeceb +efeeedec +f0efeeed +f1f0efee +f2f1f0ef +f3f2f1f0 +f4f3f2f1 +f5f4f3f2 +f6f5f4f3 +f7f6f5f4 +f8f7f6f5 +f9f8f7f6 +faf9f8f7 +fbfaf9f8 +fcfbfaf9 +fdfcfbfa +fefdfcfb +fffefdfc +00fffefd +0100fffe +020100ff +0706050403020100 +0807060504030201 +0908070605040302 +0a09080706050403 +0b0a090807060504 +0c0b0a0908070605 +0d0c0b0a09080706 +0e0d0c0b0a090807 +0f0e0d0c0b0a0908 +100f0e0d0c0b0a09 +11100f0e0d0c0b0a +1211100f0e0d0c0b +131211100f0e0d0c +14131211100f0e0d +1514131211100f0e +161514131211100f +1716151413121110 +1817161514131211 +1918171615141312 +1a19181716151413 +1b1a191817161514 +1c1b1a1918171615 +1d1c1b1a19181716 +1e1d1c1b1a191817 +1f1e1d1c1b1a1918 +201f1e1d1c1b1a19 +21201f1e1d1c1b1a +2221201f1e1d1c1b +232221201f1e1d1c +24232221201f1e1d +2524232221201f1e +262524232221201f +2726252423222120 +2827262524232221 +2928272625242322 +2a29282726252423 +2b2a292827262524 +2c2b2a2928272625 +2d2c2b2a29282726 +2e2d2c2b2a292827 +2f2e2d2c2b2a2928 +302f2e2d2c2b2a29 +31302f2e2d2c2b2a +3231302f2e2d2c2b +333231302f2e2d2c +34333231302f2e2d +3534333231302f2e +363534333231302f +3736353433323130 +3837363534333231 +3938373635343332 +3a39383736353433 +3b3a393837363534 +3c3b3a3938373635 +3d3c3b3a39383736 +3e3d3c3b3a393837 +3f3e3d3c3b3a3938 +403f3e3d3c3b3a39 +41403f3e3d3c3b3a +4241403f3e3d3c3b +434241403f3e3d3c +44434241403f3e3d +4544434241403f3e +464544434241403f +4746454443424140 +4847464544434241 +4948474645444342 +4a49484746454443 +4b4a494847464544 +4c4b4a4948474645 +4d4c4b4a49484746 +4e4d4c4b4a494847 +4f4e4d4c4b4a4948 +504f4e4d4c4b4a49 +51504f4e4d4c4b4a +5251504f4e4d4c4b +535251504f4e4d4c +54535251504f4e4d +5554535251504f4e +565554535251504f +5756555453525150 +5857565554535251 +5958575655545352 +5a59585756555453 +5b5a595857565554 +5c5b5a5958575655 +5d5c5b5a59585756 +5e5d5c5b5a595857 +5f5e5d5c5b5a5958 +605f5e5d5c5b5a59 +61605f5e5d5c5b5a +6261605f5e5d5c5b +636261605f5e5d5c +64636261605f5e5d +6564636261605f5e +666564636261605f +6766656463626160 +6867666564636261 +6968676665646362 +6a69686766656463 +6b6a696867666564 +6c6b6a6968676665 +6d6c6b6a69686766 +6e6d6c6b6a696867 +6f6e6d6c6b6a6968 +706f6e6d6c6b6a69 +71706f6e6d6c6b6a +7271706f6e6d6c6b +737271706f6e6d6c +74737271706f6e6d +7574737271706f6e +767574737271706f +7776757473727170 +7877767574737271 +7978777675747372 +7a79787776757473 +7b7a797877767574 +7c7b7a7978777675 +7d7c7b7a79787776 +7e7d7c7b7a797877 +7f7e7d7c7b7a7978 +807f7e7d7c7b7a79 +81807f7e7d7c7b7a +8281807f7e7d7c7b +838281807f7e7d7c +84838281807f7e7d +8584838281807f7e +868584838281807f +8786858483828180 +8887868584838281 +8988878685848382 +8a89888786858483 +8b8a898887868584 +8c8b8a8988878685 +8d8c8b8a89888786 +8e8d8c8b8a898887 +8f8e8d8c8b8a8988 +908f8e8d8c8b8a89 +91908f8e8d8c8b8a +9291908f8e8d8c8b +939291908f8e8d8c +94939291908f8e8d +9594939291908f8e +969594939291908f +9796959493929190 +9897969594939291 +9998979695949392 +9a99989796959493 +9b9a999897969594 +9c9b9a9998979695 +9d9c9b9a99989796 +9e9d9c9b9a999897 +9f9e9d9c9b9a9998 +a09f9e9d9c9b9a99 +a1a09f9e9d9c9b9a +a2a1a09f9e9d9c9b +a3a2a1a09f9e9d9c +a4a3a2a1a09f9e9d +a5a4a3a2a1a09f9e +a6a5a4a3a2a1a09f +a7a6a5a4a3a2a1a0 +a8a7a6a5a4a3a2a1 +a9a8a7a6a5a4a3a2 +aaa9a8a7a6a5a4a3 +abaaa9a8a7a6a5a4 +acabaaa9a8a7a6a5 +adacabaaa9a8a7a6 +aeadacabaaa9a8a7 +afaeadacabaaa9a8 +b0afaeadacabaaa9 +b1b0afaeadacabaa +b2b1b0afaeadacab +b3b2b1b0afaeadac +b4b3b2b1b0afaead +b5b4b3b2b1b0afae +b6b5b4b3b2b1b0af +b7b6b5b4b3b2b1b0 +b8b7b6b5b4b3b2b1 +b9b8b7b6b5b4b3b2 +bab9b8b7b6b5b4b3 +bbbab9b8b7b6b5b4 +bcbbbab9b8b7b6b5 +bdbcbbbab9b8b7b6 +bebdbcbbbab9b8b7 +bfbebdbcbbbab9b8 +c0bfbebdbcbbbab9 +c1c0bfbebdbcbbba +c2c1c0bfbebdbcbb +c3c2c1c0bfbebdbc +c4c3c2c1c0bfbebd +c5c4c3c2c1c0bfbe +c6c5c4c3c2c1c0bf +c7c6c5c4c3c2c1c0 +c8c7c6c5c4c3c2c1 +c9c8c7c6c5c4c3c2 +cac9c8c7c6c5c4c3 +cbcac9c8c7c6c5c4 +cccbcac9c8c7c6c5 +cdcccbcac9c8c7c6 +cecdcccbcac9c8c7 +cfcecdcccbcac9c8 +d0cfcecdcccbcac9 +d1d0cfcecdcccbca +d2d1d0cfcecdcccb +d3d2d1d0cfcecdcc +d4d3d2d1d0cfcecd +d5d4d3d2d1d0cfce +d6d5d4d3d2d1d0cf +d7d6d5d4d3d2d1d0 +d8d7d6d5d4d3d2d1 +d9d8d7d6d5d4d3d2 +dad9d8d7d6d5d4d3 +dbdad9d8d7d6d5d4 +dcdbdad9d8d7d6d5 +dddcdbdad9d8d7d6 +dedddcdbdad9d8d7 +dfdedddcdbdad9d8 +e0dfdedddcdbdad9 +e1e0dfdedddcdbda +e2e1e0dfdedddcdb +e3e2e1e0dfdedddc +e4e3e2e1e0dfdedd +e5e4e3e2e1e0dfde +e6e5e4e3e2e1e0df +e7e6e5e4e3e2e1e0 +e8e7e6e5e4e3e2e1 +e9e8e7e6e5e4e3e2 +eae9e8e7e6e5e4e3 +ebeae9e8e7e6e5e4 +ecebeae9e8e7e6e5 +edecebeae9e8e7e6 +eeedecebeae9e8e7 +efeeedecebeae9e8 +f0efeeedecebeae9 +f1f0efeeedecebea +f2f1f0efeeedeceb +f3f2f1f0efeeedec +f4f3f2f1f0efeeed +f5f4f3f2f1f0efee +f6f5f4f3f2f1f0ef +f7f6f5f4f3f2f1f0 +f8f7f6f5f4f3f2f1 +f9f8f7f6f5f4f3f2 +faf9f8f7f6f5f4f3 +fbfaf9f8f7f6f5f4 +fcfbfaf9f8f7f6f5 +fdfcfbfaf9f8f7f6 +fefdfcfbfaf9f8f7 +fffefdfcfbfaf9f8 +00fffefdfcfbfaf9 +0100fffefdfcfbfa +020100fffefdfcfb +03020100fffefdfc +0403020100fffefd +050403020100fffe +06050403020100ff diff --git a/test_regress/t/t_sys_file_basic_uz.pl b/test_regress/t/t_sys_file_basic_uz.pl new file mode 100755 index 000000000..e2be86bfc --- /dev/null +++ b/test_regress/t/t_sys_file_basic_uz.pl @@ -0,0 +1,27 @@ +#!/usr/bin/env perl +if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; } +# DESCRIPTION: Verilator: Verilog Test driver/expect definition +# +# Copyright 2003 by Wilson Snyder. This program is free software; you +# can redistribute it and/or modify it under the terms of either the GNU +# Lesser General Public License Version 3 or the Perl Artistic License +# Version 2.0. +# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0 + +scenarios(simulator => 1); + +unlink("$Self->{obj_dir}/t_sys_file_basic_uz_test.log"); + +compile(); + +execute( + check_finished => 1, + ); + +files_identical("$Self->{obj_dir}/t_sys_file_basic_uz_test.log", $Self->{golden_filename}); + +files_identical("$Self->{obj_dir}/t_sys_file_basic_uz_test.bin", + "$Self->{t_dir}/t_sys_file_basic_uz.dat"); + +ok(1); +1; diff --git a/test_regress/t/t_sys_file_basic_uz.v b/test_regress/t/t_sys_file_basic_uz.v new file mode 100644 index 000000000..a407299f1 --- /dev/null +++ b/test_regress/t/t_sys_file_basic_uz.v @@ -0,0 +1,137 @@ +// DESCRIPTION: Verilator: Verilog Test module +// +// This file ONLY is placed under the Creative Commons Public Domain, for +// any use, without warranty, 2030 by Stephen Henry. +// SPDX-License-Identifier: CC0-1.0 + +module t; + + int fdin_bin, fdout_txt, fdout_bin; +`define STRINGIFY(x) `"x`" + +`define checkh(gotv,expv) \ + do if ((gotv) !== (expv)) begin\ + $write("%%Error: %s:%0d: got='h%x exp='h%x\n", `__FILE__,`__LINE__, (gotv), (expv));\ + end while(0) + + // + // + task automatic test1; begin + for (int i = 0; i < 256; i++) begin + byte actual, expected; + expected = i[7:0]; + $fscanf(fdin_bin, "%u", actual); + `checkh(actual, expected); + $fdisplay(fdout_txt, "%h", actual); + $fwrite(fdout_bin, "%u", actual); + end + + for (int i = 0; i < 256; i++) begin + shortint actual, expected; + for (int j = 0; j < 2; j++) + expected[(8 * j)+:8] = i[7:0] + j[7:0]; + $fscanf(fdin_bin, "%u", actual); + `checkh(actual, expected); + $fdisplay(fdout_txt, "%h", actual); + $fwrite(fdout_bin, "%u", actual); + end + + for (int i = 0; i < 256; i++) begin + int actual, expected; + for (int j = 0; j < 4; j++) + expected[(8 * j)+:8] = i[7:0] + j[7:0]; + $fscanf(fdin_bin, "%u", actual); + `checkh(actual, expected); + $fdisplay(fdout_txt, "%h", actual); + $fwrite(fdout_bin, "%u", actual); + end + + for (int i = 0; i < 256; i++) begin + longint actual, expected; + for (int j = 0; j < 8; j++) + expected[(8 * j)+:8] = i[7:0] + j[7:0]; + $fscanf(fdin_bin, "%u", actual); + `checkh(actual, expected); + $fdisplay(fdout_txt, "%h", actual); + $fwrite(fdout_bin, "%u", actual); + end + end endtask + + // + // + task automatic test2; begin + for (int i = 0; i < 256; i++) begin + byte actual, expected; + expected = i[7:0]; + $fscanf(fdin_bin, "%z", actual); + `checkh(actual, expected); + $fdisplay(fdout_txt, "%h", actual); + $fwrite(fdout_bin, "%z", actual); + end + + for (int i = 0; i < 256; i++) begin + shortint actual, expected; + for (int j = 0; j < 2; j++) + expected[(8 * j)+:8] = i[7:0] + j[7:0]; + $fscanf(fdin_bin, "%z", actual); + `checkh(actual, expected); + $fdisplay(fdout_txt, "%h", actual); + $fwrite(fdout_bin, "%z", actual); + end + + for (int i = 0; i < 256; i++) begin + int actual, expected; + for (int j = 0; j < 4; j++) + expected[(8 * j)+:8] = i[7:0] + j[7:0]; + $fscanf(fdin_bin, "%z", actual); + `checkh(actual, expected); + $fdisplay(fdout_txt, "%h", actual); + $fwrite(fdout_bin, "%z", actual); + end + + for (int i = 0; i < 256; i++) begin + longint actual, expected; + for (int j = 0; j < 8; j++) + expected[(8 * j)+:8] = i[7:0] + j[7:0]; + $fscanf(fdin_bin, "%z", actual); + `checkh(actual, expected); + $fdisplay(fdout_txt, "%h", actual); + $fwrite(fdout_bin, "%z", actual); + end + end endtask + + initial begin : main_PROC + + string filename; + + filename = "t/t_sys_file_basic_uz.dat"; + fdin_bin = $fopen(filename, "rb"); + +`ifdef IVERILOG + filename = $sformatf("%s/t_sys_file_basic_uz_test.log","obj_iv/t_sys_file_basic_uz"); +`else + filename = $sformatf("%s/t_sys_file_basic_uz_test.log",`STRINGIFY(`TEST_OBJ_DIR)); +`endif + fdout_txt = $fopen(filename, "w"); + +`ifdef IVERILOG + filename = $sformatf("%s/t_sys_file_basic_uz_test.bin","obj_iv/t_sys_file_basic_uz"); +`else + filename = $sformatf("%s/t_sys_file_basic_uz_test.bin",`STRINGIFY(`TEST_OBJ_DIR)); +`endif + $display(filename); + fdout_bin = $fopen(filename, "wb"); + + test1; + test2; + + $fclose(fdin_bin); + $fclose(fdout_txt); + + $write("*-* All Finished *-*\n"); + $finish(0); // Test arguments to finish + + end // block: main_PROC + +`undef STRINGIFY +endmodule // t