diff --git a/wally-pipelined/config/rv64icfd/wally-config.vh b/wally-pipelined/config/rv64icfd/wally-config.vh index a7605021..c6523f81 100644 --- a/wally-pipelined/config/rv64icfd/wally-config.vh +++ b/wally-pipelined/config/rv64icfd/wally-config.vh @@ -46,7 +46,7 @@ `define MEM_DCACHE 0 `define MEM_DTIM 1 `define MEM_ICACHE 0 -`define MEM_VIRTMEM 0\1 +`define MEM_VIRTMEM 1 `define VECTORED_INTERRUPTS_SUPPORTED 1 `define ITLB_ENTRIES 32 @@ -56,10 +56,7 @@ `define PMP_ENTRIES 16 // Address space -`define RESET_VECTOR 64'h0000000080000000 - -// Bus Interface width -`define AHBW 64 +`define RESET_VECTOR 64'h80000000 // Peripheral Addresses // Peripheral memory space extends from BASE to BASE+RANGE @@ -84,6 +81,9 @@ `define PLIC_BASE 56'h0C000000 `define PLIC_RANGE 56'h03FFFFFF +// Bus Interface width +`define AHBW 64 + // Test modes // Tie GPIO outputs back to inputs diff --git a/wally-pipelined/regression/wave-dos/default-waves.do b/wally-pipelined/regression/wave-dos/default-waves.do index 4a39ec50..7c164958 100644 --- a/wally-pipelined/regression/wave-dos/default-waves.do +++ b/wally-pipelined/regression/wave-dos/default-waves.do @@ -8,7 +8,7 @@ add wave /testbench/clk add wave /testbench/reset add wave -divider #add wave /testbench/dut/hart/ebu/IReadF -add wave /testbench/dut/hart/DataStall +#add wave /testbench/dut/hart/DataStall add wave /testbench/dut/hart/ICacheStallF add wave /testbench/dut/hart/StallF add wave /testbench/dut/hart/StallD diff --git a/wally-pipelined/src/fpu/FMA/add.sv b/wally-pipelined/src/fpu/FMA/add.sv deleted file mode 100644 index 4c85c01f..00000000 --- a/wally-pipelined/src/fpu/FMA/add.sv +++ /dev/null @@ -1,65 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Block Name: add.v -// Author: David Harris -// Date: 11/12/1995 -// -// Block Description: -// This block performs the addition of the product and addend. It also -// contains logic necessary to adjust the signs for effective subtracts -// and negative results. -//////////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////////// -module add(rM, sM, tM, sum, - negsum, invz, selsum1, negsum0, negsum1, killprodM); -//////////////////////////////////////////////////////////////////////////////// - - input logic [105:0] rM; // partial product 1 - input logic [105:0] sM; // partial product 2 - input logic [163:0] tM; // aligned addend - input logic invz; // invert addend - input logic selsum1; // select +1 mode of compound adder - input logic killprodM; // z >> product - input logic negsum; // Negate sum - output logic [163:0] sum; // sum - output logic negsum0; // sum was negative in +0 mode - output logic negsum1; // sum was negative in +1 mode - - // Internal nodes - - wire [105:0] r2; // partial product possibly zeroed out - wire [105:0] s2; // partial product possibly zeroed out - wire [164:0] t2; // addend after inversion if necessary - wire [164:0] sum0; // sum of compound adder +0 mode - wire [164:0] sum1; // sum of compound adder +1 mode - wire [163:0] prodshifted; // sum of compound adder +1 mode - wire [164:0] tmp; // sum of compound adder +1 mode - - // Invert addend if z'sM sign is diffrent from the product'sM sign - - assign t2 = invz ? ~{1'b0,tM} : {1'b0,tM}; - - // Zero out product if Z >> product or product really should be - - assign r2 = killprodM ? 106'b0 : rM; - assign s2 = killprodM ? 106'b0 : sM; - - //***replace this with a more structural cpa that synthisises better - // Compound adder - // Consists of 3:2 CSA followed by long compound CPA - //assign prodshifted = killprodM ? 0 : {56'b0, r2+s2, 2'b0}; - //assign tmp = ({{57{r2[105]}},r2, 2'b0} + {{57{s2[105]}},s2, 2'b0}); - assign sum0 = t2 + 164'b0 + {57'b0, r2+s2, 2'b0}; - assign sum1 = t2 + 164'b1 + {57'b0, r2+s2, 2'b0}; // +1 from invert of z above - - // Check sign bits in +0/1 modes - assign negsum0 = sum0[164]; - assign negsum1 = sum1[164]; - - // Mux proper result (+Oil mode and inversion) using 4:1 mux - //assign sumzero = |sum; - assign sum = selsum1 ? (negsum ? -sum1[163:0] : sum1[163:0]) : (negsum ? -sum0[163:0] : sum0[163:0]); - -endmodule - diff --git a/wally-pipelined/src/fpu/FMA/align.sv b/wally-pipelined/src/fpu/FMA/align.sv deleted file mode 100644 index e0382b7d..00000000 --- a/wally-pipelined/src/fpu/FMA/align.sv +++ /dev/null @@ -1,88 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// Block Name: align.v -// Author: David Harris -// Date: 11/2/1995 -// -// Block Description: -// This block implements the alignment shifter. It is responsible for -// adjusting the fraction portion of the addend relative to the fraction -// produced in the multiplier array. -// -///////////////////////////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////////////////////////// -module align(zman, aligncntE, xzeroE, yzeroE, zzeroE, zdenormE, tE, bsE, - killprodE, sumshiftE, sumshiftzeroE); -///////////////////////////////////////////////////////////////////////////// - - input logic [51:0] zman; // Fraction of addend z; - input logic [12:0] aligncntE; // amount to shift - input logic xzeroE; // Input X = 0 - input logic yzeroE; // Input Y = 0 - input logic zzeroE; // Input Z = 0 - input logic zdenormE; // Input Z is denormalized - output logic [163:0] tE; // aligned addend (54 bits left of bpt) - output logic bsE; // sticky bit of addend - output logic killprodE; // Z >> product - output logic [8:0] sumshiftE; - output logic sumshiftzeroE; - - // Internal nodes - - reg [215:0] shift; // aligned addend from shifter - logic [12:0] tmp; - - - - always_comb - begin - - // Default to clearing sticky bits - bsE = 0; - - // And to using product as primary operand in adder I exponent gen - killprodE = xzeroE | yzeroE; - // d = aligncntE - // p = 53 - //***try reducing this hardware to use one shifter - if ($signed(aligncntE) <= $signed(-(13'd105))) begin //d<=-2p+1 - //product ancored case with saturated shift - sumshiftE = 163; // 3p+4 - sumshiftzeroE = 0; - shift = {1'b1,zman,163'b0} >> sumshiftE; - tE = zzeroE ? 0 : {shift[215:52]}; - bsE = |(shift[51:0]); - - end else if($signed(aligncntE) <= $signed(13'd2)) begin // -2p+1> sumshiftE; - tE = zzeroE ? 0 : {shift[215:52]}; - bsE = |(shift[51:0]); - - end else if ($signed(aligncntE)<=$signed(13'd55)) begin // 2 < d <= p+2 - // addend ancored case - // used to be 56 \/ somthing doesn't seem right too many typos - tmp = 13'd57-aligncntE; - sumshiftE = tmp[8:0]; - sumshiftzeroE = 0; - shift = {~zdenormE,zman, 163'b0} >> sumshiftE; - tE = zzeroE ? 0 : {shift[215:52]}; - bsE = |(shift[51:0]); - - end else begin // d >= p+3 - // addend anchored case with saturated shift - sumshiftE = 0; - sumshiftzeroE = 1; - shift = {~zdenormE,zman, 163'b0} >> sumshiftE; - tE = zzeroE ? 0 : {shift[215:52]}; - bsE = |(shift[51:0]); - killprodE = 1; - - end - end - -endmodule - diff --git a/wally-pipelined/src/fpu/FMA/booth.sv b/wally-pipelined/src/fpu/FMA/booth.sv deleted file mode 100644 index f43cb584..00000000 --- a/wally-pipelined/src/fpu/FMA/booth.sv +++ /dev/null @@ -1,53 +0,0 @@ -module booth(xExt, choose, add1, e, pp); -///////////////////////////////////////////////////////////////////////////// - - input logic [53:0] xExt; // multiplicand xExt - input logic [2:0] choose; // bits needed to choose which encoding - output logic [1:0] add1; // do you add 1 - output logic e; - output logic [54:0] pp; // the resultant encoding - - logic [54:0] temp; - logic [53:0] negx; - //logic temp; - - assign negx = ~xExt; - - always_comb - case (choose) - 3'b000 : pp = 55'b0; // 0 - 3'b001 : pp = {1'b0, xExt}; // 1 - 3'b010 : pp = {1'b0, xExt}; // 1 - 3'b011 : pp = {xExt, 1'b0}; // 2 - 3'b100 : pp = {negx, 1'b0}; // -2 - 3'b101 : pp = {1'b1, negx}; // -1 - 3'b110 : pp = {1'b1, negx}; // -1 - 3'b111 : pp = '1; // -0 - endcase - - always_comb - case (choose) - 3'b000 : e = 0; // 0 - 3'b001 : e = 0; // 1 - 3'b010 : e = 0; // 1 - 3'b011 : e = 0; // 2 - 3'b100 : e = 1; // -2 - 3'b101 : e = 1; // -1 - 3'b110 : e = 1; // -1 - 3'b111 : e = 1; // -0 - endcase - // assign add1 = (choose[2] == 1'b1) ? ((choose[1:0] == 2'b11) ? 1'b0 : 1'b1) : 1'b0; - // assign add1 = choose[2]; - always_comb - case (choose) - 3'b000 : add1 = 2'b0; // 0 - 3'b001 : add1 = 2'b0; // 1 - 3'b010 : add1 = 2'b0; // 1 - 3'b011 : add1 = 2'b0; // 2 - 3'b100 : add1 = 2'b10; // -2 - 3'b101 : add1 = 2'b1; // -1 - 3'b110 : add1 = 2'b1; // -1 - 3'b111 : add1 = 2'b1; // -0 - endcase - -endmodule diff --git a/wally-pipelined/src/fpu/FMA/compressors.sv b/wally-pipelined/src/fpu/FMA/compressors.sv deleted file mode 100644 index 0c2bece8..00000000 --- a/wally-pipelined/src/fpu/FMA/compressors.sv +++ /dev/null @@ -1,90 +0,0 @@ -module add3comp2(a, b, c, carry, sum); -///////////////////////////////////////////////////////////////////////////// -//look into diffrent implementations of the compressors? - - parameter BITS = 4; - input logic [BITS-1:0] a; - input logic [BITS-1:0] b; - input logic [BITS-1:0] c; - output logic [BITS-1:0] carry; - output logic [BITS-1:0] sum; - genvar i; - - generate - for(i= 0; i> product - input sumzero; // sum exactly equals zero - input resultdenorm; // postnormalize rounded result - input [8:0] normcnt; // normalization shift count - input infinity; // generate infinity on overflow - input [4:0] FmaFlagsM; // Result invalid - input inf; // Some input is infinity - input nan; // Some input is NaN - input [12:0] de0; // X is NaN NaN - input xnan; // X is NaN - input ynan; // Y is NaN - input znan; // Z is NaN - input xdenorm; // Z is denorm - input ydenorm; // Z is denorm - input zdenorm; // Z is denorm - input xzero; // Z is denorm - input yzero; // Z is denorm - input expplus1; - input proddenorm; // product is denorm - input specialsel; // Select special result - input zexpsel; // Select special result - output [12:0] aligncnt; // shift count for alignment shifter - output [62:52] wexp; // Exponent of result - output prodof; // X*Y exponent out of bounds - output sumof; // X*Y+Z exponent out of bounds - output sumuf; // X*Y+Z exponent underflows - output denorm0; // exponent = 0 for denorm - output [12:0] ae; //exponent of multiply - - // Internal nodes - - - wire [12:0] aligncnt0; // Shift count for alignment - wire [12:0] aligncnt1; // Shift count for alignment - wire [12:0] be; // Exponent of multiply - wire [12:0] de1; // Normalized exponent - wire [12:0] de; // Normalized exponent - wire [10:0] infinityres; // Infinity or max number - wire [10:0] nanres; // Nan propagated or generated - wire [10:0] specialres; // Exceptional case result - - // Compute exponent of multiply - // Note that the exponent does not have to be incremented on a postrounding - // normalization of X because the mantissa was already increased. Report - // if exponent is out of bounds - - - assign ae = xzero|yzero ? 0 : xexp + yexp -1023; - - assign prodof = (ae > 2046 && ~ae[12]); - - // Compute alignment shift count - // Adjust for postrounding normalization of Z. - // This should not increas the critical path because the time to - // check if a round overflows is shorter than the actual round and - // is masked by the bypass mux and two 10 bit adder delays. - assign aligncnt0 = - 1 + ~xdenorm + ~ydenorm - ~zdenorm; - assign aligncnt1 = - 1 + {12'b0,~xdenorm} + {12'b0,~ydenorm} - {12'b0,~zdenorm}; - assign aligncnt = zexp -ae - 1 + {12'b0,~xdenorm} + {12'b0,~ydenorm} - {12'b0,~zdenorm}; - //assign aligncnt = zexp -ae - 1 + ~xdenorm + ~ydenorm - ~zdenorm; - //assign aligncnt = zexp - ae;// KEP use all of ae - - // Select exponent (usually from product except in case of huge addend) - - //assign be = zexpsel ? zexp : ae; - - // Adjust exponent based on normalization - // A compound adder takes care of the case of post-rounding normalization - // requiring an extra increment - - //assign de0 = sumzero ? 13'b0 : be + normcnt + 2; - // assign de1 = sumzero ? 13'b0 : be + normcnt + 2; - - // If the exponent becomes exactly zero (denormalized) - // signal such to adjust R bit before rounding - - assign denorm0 = (de0 == 0); - - // check for exponent out of bounds after add - - assign de = resultdenorm | sumzero ? 0 : de0; - assign sumof = ~de[12] && de > 2046; - assign sumuf = de == 0 && ~sumzero && ~resultdenorm; - - // bypass occurs before rounding or taking early results - - //assign wbypass = de0[10:0]; - - // In a non-critical special mux, we combine the early result from other - // FPU blocks with the results of exceptional conditions. Overflow - // produces either infinity or the largest finite number, depending on the - // rounding mode. NaNs are propagated or generated. - - assign specialres = FmaFlagsM[4] | nan ? nanres : // invalid - FmaFlagsM[2] ? infinityres : //overflow - inf ? 11'b11111111111 : - FmaFlagsM[1] ? 11'b0 : 11'bx; //underflow - - assign infinityres = infinity ? 11'b11111111111 : 11'b11111111110; - - // IEEE 754-2008 section 6.2.3 states: - // "If two or more inputs are NaN, then the payload of the resulting NaN should be - // identical to the payload of one of the input NaNs if representable in the destination - // format. This standard does not specify which of the input NaNs will provide the payload." - assign nanres = xnan ? xexp : (ynan ? yexp : (znan? zexp : 11'b11111111111)); - - // A mux selects the early result from other FPU blocks or the - // normalized FMAC result. Special cases are also detected. - - assign wexp = specialsel ? specialres[10:0] : de[10:0] + expplus1; -endmodule - diff --git a/wally-pipelined/src/fpu/FMA/expgen1.sv b/wally-pipelined/src/fpu/FMA/expgen1.sv deleted file mode 100644 index 4aa66fc0..00000000 --- a/wally-pipelined/src/fpu/FMA/expgen1.sv +++ /dev/null @@ -1,90 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// Block Name: expgen.v -// Author: David Harris -// Date: 11/2/1995 -// -// Block Description: -// This block implements the exponent path of the FMAC. It performs the -// following operations: -// -// 1) Compute exponent of multiply. -// 2) Compare multiply and add exponents to generate alignment shift count -// 3) Adjust exponent based on normalization -// 4) Increment exponent based on postrounding renormalization -// -///////////////////////////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////////////////////////// -module expgen1(xexp, yexp, zexp, xzeroE, yzeroE, - xdenormE, ydenormE, zdenormE, - aligncntE, prodof, aeE); -///////////////////////////////////////////////////////////////////////////// - - input logic [62:52] xexp; // Exponent of multiplicand x - input logic [62:52] yexp; // Exponent of multiplicand y - input logic [62:52] zexp; // Exponent of addend z - input logic xdenormE; // Z is denorm - input logic ydenormE; // Z is denorm - input logic zdenormE; // Z is denorm - input logic xzeroE; // Z is denorm - input logic yzeroE; // Z is denorm - output logic [12:0] aligncntE; // shift count for alignment shifter - output logic prodof; // X*Y exponent out of bounds - output logic [12:0] aeE; //exponent of multiply - - // Internal nodes - - - wire [12:0] aligncnt0; // Shift count for alignment - wire [12:0] aligncnt1; // Shift count for alignment - wire [12:0] be; // Exponent of multiply - wire [12:0] de1; // Normalized exponent - wire [12:0] de; // Normalized exponent - wire [10:0] infinityres; // Infinity or max number - wire [10:0] nanres; // Nan propagated or generated - wire [10:0] specialres; // Exceptional case result - - // Compute exponent of multiply - // Note that the exponent does not have to be incremented on a postrounding - // normalization of X because the mantissa was already increased. Report - // if exponent is out of bounds - - - assign aeE = xzeroE|yzeroE ? 0 : {2'b0,xexp} + {2'b0,yexp} - 13'd1023; - - assign prodof = (aeE > 2046 && ~aeE[12]); - - // Compute alignment shift count - // Adjust for postrounding normalization of Z. - // This should not increas the critical path because the time to - // check if a round overflows is shorter than the actual round and - // is masked by the bypass mux and two 10 bit adder delays. - // assign aligncnt0 = - 1 + ~xdenormE + ~ydenormE - ~zdenormE; - // assign aligncnt1 = - 1 + {12'b0,~xdenormE} + {12'b0,~ydenormE} - {12'b0,~zdenormE}; - assign aligncntE = {2'b0,zexp} -aeE - 1 + {12'b0,~xdenormE} + {12'b0,~ydenormE} - {12'b0,~zdenormE}; - //assign aligncntE = zexp -aeE - 1 + ~xdenormE + ~ydenormE - ~zdenormE; - //assign aligncntE = zexp - aeE;// KEP use all of aeE - - // Select exponent (usually from product except in case of huge addend) - - //assign be = zexpsel ? zexp : aeE; - - // Adjust exponent based on normalization - // A compound adder takes care of the case of post-rounding normalization - // requiring an extra increment - - //assign de0 = sumzero ? 13'b0 : be + normcnt + 2; - // assign de1 = sumzero ? 13'b0 : be + normcnt + 2; - - - // bypass occurs before rounding or taking early results - - //assign wbypass = de0[10:0]; - - // In a non-critical special mux, we combine the early result from other - // FPU blocks with the results of exceptional conditions. Overflow - // produces either infinity or the largest finite number, depending on the - // rounding mode. NaNs are propagated or generated. -endmodule - - diff --git a/wally-pipelined/src/fpu/FMA/expgen2.sv b/wally-pipelined/src/fpu/FMA/expgen2.sv deleted file mode 100644 index e99d133d..00000000 --- a/wally-pipelined/src/fpu/FMA/expgen2.sv +++ /dev/null @@ -1,108 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// Block Name: expgen.v -// Author: David Harris -// Date: 11/2/1995 -// -// Block Description: -// This block implements the exponent path of the FMAC. It performs the -// following operations: -// -// 1) Compute exponent of multiply. -// 2) Compare multiply and add exponents to generate alignment shift count -// 3) Adjust exponent based on normalization -// 4) Increment exponent based on postrounding renormalization -// -///////////////////////////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////////////////////////// -module expgen2(xexp, yexp, zexp, - sumzero, resultdenorm, infinity, - FmaFlagsM, inf, expplus1, - nanM, de0, xnanM, ynanM, znanM, specialsel, - wexp, - sumof, sumuf); -///////////////////////////////////////////////////////////////////////////// - - input logic [62:52] xexp; // Exponent of multiplicand x - input logic [62:52] yexp; // Exponent of multiplicand y - input logic [62:52] zexp; // Exponent of addend z - input logic sumzero; // sum exactly equals zero - input logic resultdenorm; // postnormalize rounded result - input logic infinity; // generate infinity on overflow - input logic [4:0] FmaFlagsM; // Result invalid - input logic inf; // Some input is infinity - input logic nanM; // Some input is NaN - input logic [12:0] de0; // X is NaN NaN - input logic xnanM; // X is NaN - input logic ynanM; // Y is NaN - input logic znanM; // Z is NaN - input logic expplus1; - input logic specialsel; // Select special result - output logic [62:52] wexp; // Exponent of result - output logic sumof; // X*Y+Z exponent out of bounds - output logic sumuf; // X*Y+Z exponent underflows - - // Internal nodes - - - wire [12:0] aligncnt0; // Shift count for alignment - wire [12:0] aligncnt1; // Shift count for alignment - wire [12:0] be; // Exponent of multiply - wire [12:0] de1; // Normalized exponent - wire [12:0] de; // Normalized exponent - wire [10:0] infinityres; // Infinity or max number - wire [10:0] nanres; // Nan propagated or generated - wire [10:0] specialres; // Exceptional case result - - // Compute exponent of multiply - // Note that the exponent does not have to be incremented on a postrounding - // normalization of X because the mantissa was already increased. Report - // if exponent is out of bounds - - // Select exponent (usually from product except in case of huge addend) - - //assign be = zexpsel ? zexp : ae; - - // Adjust exponent based on normalization - // A compound adder takes care of the case of post-rounding normalization - // requiring an extra increment - - //assign de0 = sumzero ? 13'b0 : be + normcnt + 2; - // assign de1 = sumzero ? 13'b0 : be + normcnt + 2; - - - // check for exponent out of bounds after add - - assign de = resultdenorm | sumzero ? 0 : de0; - assign sumof = ~de[12] && de > 2046; - assign sumuf = de == 0 && ~sumzero && ~resultdenorm; - - // bypass occurs before rounding or taking early results - - //assign wbypass = de0[10:0]; - - // In a non-critical special mux, we combine the early result from other - // FPU blocks with the results of exceptional conditions. Overflow - // produces either infinity or the largest finite number, depending on the - // rounding mode. NaNs are propagated or generated. - - assign specialres = FmaFlagsM[4] | nanM ? nanres : // invalid - FmaFlagsM[2] ? infinityres : //overflow - inf ? 11'b11111111111 : - FmaFlagsM[1] ? 11'b0 : 11'bx; //underflow - - assign infinityres = infinity ? 11'b11111111111 : 11'b11111111110; - - // IEEE 754-2008 section 6.2.3 states: - // "If two or more inputs are NaN, then the payload of the resulting NaN should be - // identical to the payload of one of the input NaNs if representable in the destination - // format. This standard does not specify which of the input NaNs will provide the payload." - assign nanres = xnanM ? xexp : (ynanM ? yexp : (znanM? zexp : 11'b11111111111)); - - // A mux selects the early result from other FPU blocks or the - // normalized FMAC result. Special cases are also detected. - - assign wexp = specialsel ? specialres[10:0] : de[10:0] + {10'b0,expplus1}; -endmodule - - diff --git a/wally-pipelined/src/fpu/FMA/flag.sv b/wally-pipelined/src/fpu/FMA/flag.sv deleted file mode 100644 index d32654ab..00000000 --- a/wally-pipelined/src/fpu/FMA/flag.sv +++ /dev/null @@ -1,88 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// Block Name: flag.v -// Author: David Harris -// Date: 12/6/1995 -// -// Block Description: -// This block generates the flags: invalid, overflow, underflow, inexact. -///////////////////////////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////////////////////////// -module flag(xnan, ynan, znan, xinf, yinf, zinf, prodof, sumof, sumuf, - psign, zsign, xzero, yzero, zzero, vbits, killprod, - inf, nan, FmaFlagsM,sticky); -///////////////////////////////////////////////////////////////////////////// - - input xnan; // X is NaN - input ynan; // Y is NaN - input znan; // Z is NaN - input sticky; // X is Inf - input xinf; // X is Inf - input yinf; // Y is Inf - input zinf; // Z is Inf - input prodof; // X*Y overflows exponent - input sumof; // X*Y + z underflows exponent - input sumuf; // X*Y + z underflows exponent - input psign; // Sign of product - input zsign; // Sign of z - input xzero; // x = 0 - input yzero; // y = 0 - input zzero; // y = 0 - input killprod; - input [1:0] vbits; // R and S bits of result - output inf; // Some source is Inf - output nan; // Some source is NaN - output [4:0] FmaFlagsM; - - // Internal nodes - - wire prodinf; // X*Y larger than max possible - wire suminf; // X*Y+Z larger than max possible - - // If any input is NaN, propagate the NaN - - assign nan = xnan || ynan || znan; - - // Same with infinity (inf - inf and O * inf don't propagate inf - // but it's ok becaue illegal op takes higher precidence) - - assign inf= xinf || yinf || zinf || suminf;//KEP added suminf - //assign inf= xinf || yinf || zinf;//original - - // Generate infinity checks - - assign prodinf = prodof && ~xnan && ~ynan; - //KEP added if the product is infinity then sum is infinity - assign suminf = sumof && ~xnan && ~ynan && ~znan; - - // Set invalid flag for following cases: - // 1) Inf - Inf - // 2) 0 * Inf - // 3) Output = NaN (this is not part of the IEEE spec, only 486 proj) - - assign FmaFlagsM[4] = (xinf || yinf || prodinf) && zinf && (psign ^ zsign) || - xzero && yinf || yzero && xinf;// KEP remove case 3) above - - assign FmaFlagsM[3] = 0; // divide by zero flag - - - // Set the overflow flag for the following cases: - // 1) Rounded multiply result would be out of bounds - // 2) Rounded add result would be out of bounds - - assign FmaFlagsM[2] = suminf && ~inf; - - // Set the underflow flag for the following cases: - // 1) Any input is denormalized - // 2) Output would be denormalized or smaller - - assign FmaFlagsM[1] = (sumuf && ~inf && ~prodinf && ~nan) || (killprod & zzero & ~(yzero | xzero)); - - // Set the inexact flag for the following cases: - // 1) Multiplication inexact - // 2) Addition inexact - // One of these cases occurred if the R or S bit is set - - assign FmaFlagsM[0] = (vbits[0] || vbits[1] ||sticky || suminf) && ~(inf || nan); - -endmodule diff --git a/wally-pipelined/src/fpu/FMA/flag1.sv b/wally-pipelined/src/fpu/FMA/flag1.sv deleted file mode 100644 index f9553c71..00000000 --- a/wally-pipelined/src/fpu/FMA/flag1.sv +++ /dev/null @@ -1,34 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// Block Name: flag.v -// Author: David Harris -// Date: 12/6/1995 -// -// Block Description: -// This block generates the flags: invalid, overflow, underflow, inexact. -///////////////////////////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////////////////////////// -module flag1(xnanE, ynanE, znanE, prodof, prodinfE, nanE); -///////////////////////////////////////////////////////////////////////////// - - input logic xnanE; // X is NaN - input logic ynanE; // Y is NaN - input logic znanE; // Z is NaN - input logic prodof; // X*Y overflows exponent - output logic nanE; // Some source is NaN - - // Internal nodes - - output logic prodinfE; // X*Y larger than max possible - - // If any input logic is NaN, propagate the NaN - - assign nanE = xnanE || ynanE || znanE; - - - // Generate infinity checks - - assign prodinfE = prodof && ~xnanE && ~ynanE; - - -endmodule diff --git a/wally-pipelined/src/fpu/FMA/flag2.sv b/wally-pipelined/src/fpu/FMA/flag2.sv deleted file mode 100644 index 9931f5a6..00000000 --- a/wally-pipelined/src/fpu/FMA/flag2.sv +++ /dev/null @@ -1,80 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// Block Name: flag.v -// Author: David Harris -// Date: 12/6/1995 -// -// Block Description: -// This block generates the flags: invalid, overflow, underflow, inexact. -///////////////////////////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////////////////////////// -module flag2(xsign,ysign,zsign, xnanM, ynanM, znanM, xinfM, yinfM, zinfM, sumof, sumuf, - xzeroM, yzeroM, zzeroM, vbits, killprodM, - inf, nanM, FmaFlagsM,sticky,prodinfM); -///////////////////////////////////////////////////////////////////////////// - - input logic xnanM; // X is NaN - input logic ynanM; // Y is NaN - input logic znanM; // Z is NaN - input logic xsign; // Sign of z - input logic ysign; // Sign of z - input logic zsign; // Sign of z - input logic sticky; // X is Inf - input logic prodinfM; - input logic xinfM; // X is Inf - input logic yinfM; // Y is Inf - input logic zinfM; // Z is Inf - input logic sumof; // X*Y + z underflows exponent - input logic sumuf; // X*Y + z underflows exponent - input logic xzeroM; // x = 0 - input logic yzeroM; // y = 0 - input logic zzeroM; // y = 0 - input logic killprodM; - input logic [1:0] vbits; // R and S bits of result - output logic inf; // Some source is Inf - input logic nanM; // Some source is NaN - output logic [4:0] FmaFlagsM; - - // Internal nodes - -logic suminf; - - // Same with infinity (inf - inf and O * inf don't propagate inf - // but it's ok becaue illegal op takes higher precidence) - - assign inf= xinfM || yinfM || zinfM || suminf;//KEP added suminf - //assign inf= xinfM || yinfM || zinfM;//original - - assign suminf = sumof && ~xnanM && ~ynanM && ~znanM; - - - // Set the overflow flag for the following cases: - // 1) Rounded multiply result would be out of bounds - // 2) Rounded add result would be out of bounds - - assign FmaFlagsM[2] = suminf && ~inf; - - // Set the underflow flag for the following cases: - // 1) Any input logic is denormalized - // 2) output logic would be denormalized or smaller - - assign FmaFlagsM[1] = (sumuf && ~inf && ~prodinfM && ~nanM) || (killprodM & zzeroM & ~(yzeroM | xzeroM)); - - // Set the inexact flag for the following cases: - // 1) Multiplication inexact - // 2) Addition inexact - // One of these cases occurred if the R or S bit is set - - assign FmaFlagsM[0] = (vbits[0] || vbits[1] ||sticky || suminf) && ~(inf || nanM); - - // Set invalid flag for following cases: - // 1) Inf - Inf - // 2) 0 * Inf - // 3) output logic = NaN (this is not part of the IEEE spec, only 486 proj) - - assign FmaFlagsM[4] = (xinfM || yinfM || prodinfM) && zinfM && (xsign ^ ysign ^ zsign) || - xzeroM && yinfM || yzeroM && xinfM;// KEP remove case 3) above - - assign FmaFlagsM[3] = 0; // divide by zero flag - -endmodule diff --git a/wally-pipelined/src/fpu/FMA/fma.sv b/wally-pipelined/src/fpu/FMA/fma.sv deleted file mode 100644 index ddd3b3d7..00000000 --- a/wally-pipelined/src/fpu/FMA/fma.sv +++ /dev/null @@ -1,132 +0,0 @@ - //////////////////////////////////////////////////////////////////////////////// -// Block Name: fmac.v -// Author: David Harris -// Date: 11/2/1995 -// -// Block Description: -// This is the top level block of a floating-point multiply/accumulate -// unit(FMAC). It instantiates the following sub-blocks: -// -// array Booth encoding, partial product generation, product summation -// expgen Exponent summation, compare, and adjust -// align Alignment shifter -// add Carry-save adder for accumulate, carry propagate adder -// lza Leading zero anticipator to control normalization shifter -// normalize Normalization shifter -// round Rounding of result -// exception Handles exceptional cases -// bypass Handles bypass of result to ReadData1E or ReadData3E inputs -// sign One bit sign handling block -// special Catch special cases (inputs = 0 / infinity / etc.) -// -// The FMAC computes FmaResultM=ReadData1E*ReadData2E+ReadData3E, rounded with the mode specified by -// RN, RZ, RM, or RP. The result is optionally bypassed back to -// the ReadData1E or ReadData3E inputs for use on the next cycle. In addition, four signals -// are produced: trap, overflow, underflow, and inexact. Trap indicates -// an infinity, NaN, or denormalized number to be handled in software; -// the other three signals are IEEE flags. -// -///////////////////////////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////////////////////////// -module fma(ReadData1E, ReadData2E, ReadData3E, FrmE, - FmaResultM, FmaFlagsM, aligncnt); -///////////////////////////////////////////////////////////////////////////// - - input [63:0] ReadData1E; // input 1 - input [63:0] ReadData2E; // input 2 - input [63:0] ReadData3E; // input 3 - input [2:0] FrmE; // Rounding mode - output [63:0] FmaResultM; // output FmaResultM=ReadData1E*ReadData2E+ReadData3E - output [4:0] FmaFlagsM; // status flags - output [12:0] aligncnt; // status flags - -// Internal nodes - - logic [105:0] r; // one result of partial product sum - logic [105:0] s; // other result of partial products - logic [163:0] t; // output of alignment shifter - logic [163:0] sum; // output of carry prop adder - logic [53:0] v; // normalized sum, R, S bits -// logic [12:0] aligncnt; // shift count for alignment - logic [8:0] normcnt; // shift count for normalizer - logic [12:0] ae; // multiplier expoent - logic bs; // sticky bit of addend - logic ps; // sticky bit of product - logic killprod; // ReadData3E >> product - logic negsum; // negate sum - logic invz; // invert addend - logic selsum1; // select +1 mode of sum - logic negsum0; // sum +0 < 0 - logic negsum1; // sum +1 < 0 - logic sumzero; // sum = 0 - logic infinity; // generate infinity on overflow - logic prodof; // ReadData1E*ReadData2E out of range - logic sumof; // result out of range - logic xzero; - logic yzero; - logic zzero; - logic xdenorm; - logic ydenorm; - logic zdenorm; - logic proddenorm; - logic zexpsel; - logic denorm0; - logic resultdenorm; - logic inf; - logic xinf; - logic yinf; - logic zinf; - logic xnan; - logic ynan; - logic znan; - logic specialsel; - logic expplus1; - logic nan; - logic sumuf; - logic psign; - logic sticky; - logic [8:0] sumshift; - logic sumshiftzero; - logic [12:0] de0; - logic isAdd; - - assign isAdd = 1; - - - - - - - - - - - - - - -// Instantiate fraction datapath - - multiply multiply(.xman(ReadData1E[51:0]), .yman(ReadData2E[51:0]), .*); - align align(.zman(ReadData3E[51:0]),.*); - add add(.*); - lza lza(.*); - normalize normalize(.zexp(ReadData3E[62:52]),.*); - round round(.xman(ReadData1E[51:0]), .yman(ReadData2E[51:0]),.zman(ReadData3E[51:0]), .wman(FmaResultM[51:0]),.wsign(FmaResultM[63]),.*); - -// Instantiate exponent datapath - - expgen expgen(.xexp(ReadData1E[62:52]),.yexp(ReadData2E[62:52]),.zexp(ReadData3E[62:52]),.wexp(FmaResultM[62:52]),.*); -// Instantiate special case detection across datapath & exponent path - - special special(.*); - - -// Instantiate control logic - -sign sign(.xsign(ReadData1E[63]),.ysign(ReadData2E[63]),.zsign(ReadData3E[63]),.wsign(FmaResultM[63]),.*); -flag flag(.zsign(ReadData3E[63]),.vbits(v[1:0]),.*); - -endmodule - diff --git a/wally-pipelined/src/fpu/FMA/fma1.sv b/wally-pipelined/src/fpu/FMA/fma1.sv deleted file mode 100644 index 1d9bfa99..00000000 --- a/wally-pipelined/src/fpu/FMA/fma1.sv +++ /dev/null @@ -1,165 +0,0 @@ -module fma1( - - input logic [63:0] FInput1E, // X - input logic [63:0] FInput2E, // Y - input logic [63:0] FInput3E, // Z - input logic [2:0] FOpCtrlE, // 000 = fmadd (X*Y)+Z, 001 = fmsub (X*Y)-Z, 010 = fnmsub -(X*Y)+Z, 011 = fnmadd -(X*Y)-Z, 100 = fmul (X*Y) - input logic FmtE, // precision 1 = double 0 = single - output logic [105:0] ProdManE, // 1.X frac * 1.Y frac - output logic [161:0] AlignedAddendE, // Z aligned for addition - output logic [12:0] ProdExpE, // X exponent + Y exponent - bias - output logic AddendStickyE, // sticky bit that is calculated during alignment - output logic KillProdE, // set the product to zero before addition if the product is too small to matter - output logic XZeroE, YZeroE, ZZeroE, // inputs are zero - output logic XInfE, YInfE, ZInfE, // inputs are infinity - output logic XNaNE, YNaNE, ZNaNE); // inputs are NaN - - logic [51:0] XFrac,YFrac,ZFrac; // input fraction - logic [52:0] XMan,YMan,ZMan; // input mantissa (with leading one) - logic [12:0] XExp,YExp,ZExp; // input exponents - logic XSgn,YSgn,ZSgn; // input signs - logic [12:0] AlignCnt; // how far to shift the addend to align with the product - logic [211:0] Shift; // output of the alignment shifter including sticky bit - logic XDenormE, YDenormE, ZDenormE; // inputs are denormal - logic [63:0] FInput3E2; // value to add (Z or zero) - logic [12:0] Bias; // 1023 for double, 127 for single - logic XExpZero, YExpZero, ZExpZero; // input exponent zero - logic XFracZero, YFracZero, ZFracZero; // input fraction zero - logic XExpMax, YExpMax, ZExpMax; // input exponent all 1s - - // Set addend to zero if FMUL instruction - assign FInput3E2 = FOpCtrlE[2] ? 64'b0 : FInput3E; - - // split inputs into the sign bit, fraction, and exponent and handle single or double precision - // - single precision is in the top half of the inputs - assign XSgn = FInput1E[63]; - assign YSgn = FInput2E[63]; - assign ZSgn = FInput3E2[63]; - - assign XExp = FmtE ? {2'b0, FInput1E[62:52]} : {5'b0, FInput1E[62:55]}; - assign YExp = FmtE ? {2'b0, FInput2E[62:52]} : {5'b0, FInput2E[62:55]}; - assign ZExp = FmtE ? {2'b0, FInput3E2[62:52]} : {5'b0, FInput3E2[62:55]}; - - assign XFrac = FmtE ? FInput1E[51:0] : {FInput1E[54:32], 29'b0}; - assign YFrac = FmtE ? FInput2E[51:0] : {FInput2E[54:32], 29'b0}; - assign ZFrac = FmtE ? FInput3E2[51:0] : {FInput3E2[54:32], 29'b0}; - - assign XMan = {~XExpZero, XFrac}; - assign YMan = {~YExpZero, YFrac}; - assign ZMan = {~ZExpZero, ZFrac}; - - assign Bias = FmtE ? 13'h3ff : 13'h7f; - - - - // determine if an input is a special value - assign XExpZero = ~|XExp; - assign YExpZero = ~|YExp; - assign ZExpZero = ~|ZExp; - - assign XFracZero = ~|XFrac; - assign YFracZero = ~|YFrac; - assign ZFracZero = ~|ZFrac; - - assign XExpMax = FmtE ? &XExp[10:0] : &XExp[7:0]; - assign YExpMax = FmtE ? &YExp[10:0] : &YExp[7:0]; - assign ZExpMax = FmtE ? &ZExp[10:0] : &ZExp[7:0]; - - assign XNaNE = XExpMax & ~XFracZero; - assign YNaNE = YExpMax & ~YFracZero; - assign ZNaNE = ZExpMax & ~ZFracZero; - - assign XDenormE = XExpZero & ~XFracZero; - assign YDenormE = YExpZero & ~YFracZero; - assign ZDenormE = ZExpZero & ~ZFracZero; - - assign XInfE = XExpMax & XFracZero; - assign YInfE = YExpMax & YFracZero; - assign ZInfE = ZExpMax & ZFracZero; - - assign XZeroE = XExpZero & XFracZero; - assign YZeroE = YExpZero & YFracZero; - assign ZZeroE = ZExpZero & ZFracZero; - - - - - // Calculate the product's exponent - // - When multipliying two fp numbers, add the exponents - // - Subtract the bias (XExp + YExp has two biases, one from each exponent) - // - Denormal numbers have an an exponent value of 1, however they are - // represented with an exponent of 0. add one if there is a denormal number - assign ProdExpE = (XZeroE|YZeroE) ? 13'b0 : - XExp + YExp - Bias + XDenormE + YDenormE; - - // Calculate the product's mantissa - // - Add the assumed one. If the number is denormalized or zero, it does not have an assumed one. - assign ProdManE = XMan * YMan; - - - - // determine the shift count for alignment - // - negitive means Z is larger, so shift Z left - // - positive means the product is larger, so shift Z right - // - Denormal numbers have an an exponent value of 1, however they are - // represented with an exponent of 0. add one to the exponent if it is a denormal number - assign AlignCnt = ProdExpE - ZExp - ZDenormE; - - // Alignment shifter - - // Defualt Addition without shifting - // | 55'b0 | 106'b(product) | 2'b0 | - // |1'b0| addnend | - - // the 1'b0 before the added is because the product's mantissa has two bits before the binary point (xx.xxxxxxxxxx...) - - always_comb - begin - - // Set default values - AddendStickyE = 0; - KillProdE = 0; - - // If the product is too small to effect the sum, kill the product - - // | 55'b0 | 106'b(product) | 2'b0 | - // | addnend | - if ($signed(AlignCnt) <= $signed(-13'd56)) begin - KillProdE = 1; - AlignedAddendE = {107'b0, ZMan,2'b0}; - AddendStickyE = ~(XZeroE|YZeroE); - - // If the Addend is shifted left (negitive AlignCnt) - - // | 55'b0 | 106'b(product) | 2'b0 | - // | addnend | - end else if($signed(AlignCnt) <= $signed(13'd0)) begin - Shift = {55'b0, ZMan, 104'b0} << -AlignCnt; - AlignedAddendE = Shift[211:50]; - AddendStickyE = |(Shift[49:0]); - - // If the Addend is shifted right (positive AlignCnt) - - // | 55'b0 | 106'b(product) | 2'b0 | - // | addnend | - end else if ($signed(AlignCnt)<=$signed(13'd105)) begin - Shift = {55'b0, ZMan, 104'b0} >> AlignCnt; - AlignedAddendE = Shift[211:50]; - AddendStickyE = |(Shift[49:0]); - - // If the addend is too small to effect the addition - // - The addend has to shift two past the end of the addend to be considered too small - // - The 2 extra bits are needed for rounding - - // | 55'b0 | 106'b(product) | 2'b0 | - // | addnend | - end else begin - AlignedAddendE = 162'b0; - AddendStickyE = ~ZZeroE; - - - end - end - -endmodule - diff --git a/wally-pipelined/src/fpu/FMA/fma2.sv b/wally-pipelined/src/fpu/FMA/fma2.sv deleted file mode 100644 index cde64a50..00000000 --- a/wally-pipelined/src/fpu/FMA/fma2.sv +++ /dev/null @@ -1,282 +0,0 @@ -module fma2( - - input logic [63:0] FInput1M, - input logic [63:0] FInput2M, - input logic [63:0] FInput3M, - input logic [2:0] FrmM, - input logic [105:0] ProdManM, - input logic [161:0] AlignedAddendM, - input logic [12:0] ProdExpM, - input logic FmtM, - input logic AddendStickyM, - input logic KillProdM, - input logic [2:0] FOpCtrlM, - input logic XZeroM, YZeroM, ZZeroM, - input logic XInfM, YInfM, ZInfM, - input logic XNaNM, YNaNM, ZNaNM, - output logic [63:0] FmaResultM, - output logic [4:0] FmaFlagsM); - - - - logic [51:0] XMan, YMan, ZMan, WMan; - logic [10:0] XExp, YExp, ZExp, WExp; - logic XSgn, YSgn, ZSgn, WSgn, PSgn; - logic [105:0] ProdMan2; - logic [162:0] AlignedAddend2; - logic [161:0] Sum; - logic [162:0] SumTmp; - logic [12:0] SumExp; - logic [12:0] SumExpMinus1; - logic [12:0] SumExpTmp, SumExpTmpMinus1, WExpTmp; - logic [53:0] NormSum; - logic [161:0] NormSumTmp; - logic [8:0] NormCnt; - logic NormSumSticky; - logic SumZero; - logic NegSum; - logic InvZ; - logic ResultDenorm; - logic Sticky; - logic Plus1, Minus1, Plus1Tmp, Minus1Tmp; - logic Invalid,Underflow,Overflow,Inexact; - logic [8:0] DenormShift; - logic ProdInf, ProdOf, ProdUf; - logic [63:0] FmaResultTmp; - logic SubBySmallNum; - logic [63:0] FInput3M2; - logic ZeroSgn, ResultSgn; - - // Set addend to zero if FMUL instruction - assign FInput3M2 = FOpCtrlM[2] ? 64'b0 : FInput3M; - - // split inputs into the sign bit, mantissa, and exponent for readability - - assign XSgn = FInput1M[63]; - assign YSgn = FInput2M[63]; - assign ZSgn = FInput3M2[63]^FOpCtrlM[0]; //Negate Z if subtraction - - assign XExp = FmtM ? FInput1M[62:52] : {3'b0, FInput1M[62:55]}; - assign YExp = FmtM ? FInput2M[62:52] : {3'b0, FInput2M[62:55]}; - assign ZExp = FmtM ? FInput3M2[62:52] : {3'b0, FInput3M2[62:55]}; - - assign XMan = FmtM ? FInput1M[51:0] : {FInput1M[54:32], 29'b0}; - assign YMan = FmtM ? FInput2M[51:0] : {FInput2M[54:32], 29'b0}; - assign ZMan = FmtM ? FInput3M2[51:0] : {FInput3M2[54:32], 29'b0}; - - - - // Calculate the product's sign - // Negate product's sign if FNMADD or FNMSUB - assign PSgn = XSgn ^ YSgn ^ FOpCtrlM[1]; - - - - - // Addition - - // Negate Z when doing one of the following opperations: - // -prod + Z - // prod - Z - assign InvZ = ZSgn ^ PSgn; - - // Choose an inverted or non-inverted addend - the one is added later - assign AlignedAddend2 = InvZ ? ~{1'b0,AlignedAddendM} : {1'b0,AlignedAddendM}; - // Kill the product if the product is too small to effect the addition (determined in fma1.sv) - assign ProdMan2 = KillProdM ? 106'b0 : ProdManM; - - // Do the addition - // - add one to negate if the added was inverted - // - the 2 extra bits at the begining and end are needed for rounding - assign SumTmp = AlignedAddend2 + {55'b0, ProdMan2,2'b0} + {162'b0, InvZ}; - - // Is the sum negitive - assign NegSum = SumTmp[162]; - // If the sum is negitive, negate the sum. - assign Sum = NegSum ? -SumTmp[161:0] : SumTmp[161:0]; - - - - - - - // Leading one detector - logic [8:0] i; - always_comb begin - i = 0; - while (~Sum[161-i] && $unsigned(i) <= $unsigned(9'd161)) i = i+1; // search for leading one - NormCnt = i+1; // compute shift count - end - - - - - - - - - - - - // Normalization - - - // Determine if the sum is zero - assign SumZero = ~(|Sum); - - logic [12:0] ManLen; - assign ManLen = FmtM ? 13'd52 : 13'd23; - // Determine if the result is denormal - assign ResultDenorm = $signed(SumExpTmp)<=0 & ($signed(SumExpTmp)>=$signed(-ManLen)); - - // Determine the shift needed for denormal results - assign SumExpTmpMinus1 = SumExpTmp-1; - assign DenormShift = ResultDenorm ? SumExpTmpMinus1[8:0] : 9'b0; - - // Normalize the sum - assign NormSumTmp = SumZero ? 162'b0 : Sum << NormCnt+DenormShift; - assign NormSum = NormSumTmp[161:108]; - // Calculate the sticky bit - assign NormSumSticky = FmtM ? (|NormSumTmp[107:0]) : (|NormSumTmp[136:0]); - assign Sticky = AddendStickyM | NormSumSticky; - - // Determine sum's exponent - assign SumExpTmp = KillProdM ? {2'b0, ZExp} : ProdExpM + -({4'b0, NormCnt} - 13'd56); - assign SumExp = SumZero ? 13'b0 : - ResultDenorm ? 13'b0 : - SumExpTmp; - - - - - - // Rounding - - // round to nearest even - // {Gaurd, Round, Sticky} - // 0xx - do nothing - // 100 - tie - Plus1 if NormSum[2] = 1 - // - don't add 1 if there was supposed to be a subtraction by a small number that didn't happen - // 101/110/111 - Plus1 - - // round to zero - do nothing - // - subtract 1 if a small number was supposed to be subtracted from the positive result - - // round to -infinity - Plus1 if negitive - // - don't add 1 if there was supposed to be a subtraction by a small number that didn't happen - // - subtract 1 if a small number was supposed to be subtracted from the positive result - - // round to infinity - Plus1 if positive - - // - don't add 1 if there was supposed to be a subtraction by a small number that didn't happen - // - subtract 1 if a small number was supposed to be subtracted from the negitive result - - // round to nearest max magnitude - // {Gaurd, Round, Sticky} - // 0xx - do nothing - // 100 - tie - Plus1 - // - don't add 1 if there was supposed to be a subtraction by a small number that didn't happen - // 101/110/111 - Plus1 - - // Deterimine if the result was supposed to be subtrated by a small number - logic Gaurd, Round; - assign Gaurd = FmtM ? NormSum[1] : NormSum[30]; - assign Round = FmtM ? NormSum[0] : NormSum[29]; - assign SubBySmallNum = AddendStickyM&InvZ&~NormSumSticky; - - always_comb begin - // Determine if you add 1 - case (FrmM) - 3'b000: Plus1Tmp = Gaurd & (Round | (Sticky&~(~Round&SubBySmallNum)) | (~Round&~Sticky&NormSum[2]));//round to nearest even - 3'b001: Plus1Tmp = 0;//round to zero - 3'b010: Plus1Tmp = WSgn & ~(SubBySmallNum);//round down - 3'b011: Plus1Tmp = ~WSgn & ~(SubBySmallNum);//round up - 3'b100: Plus1Tmp = (Gaurd & (Round | (Sticky&~(~Round&SubBySmallNum)) | (~Round&~Sticky)));//round to nearest max magnitude - default: Plus1Tmp = 1'bx; - endcase - // Determine if you subtract 1 - case (FrmM) - 3'b000: Minus1Tmp = 0;//round to nearest even - 3'b001: Minus1Tmp = SubBySmallNum;//round to zero - 3'b010: Minus1Tmp = ~WSgn & SubBySmallNum;//round down - 3'b011: Minus1Tmp = WSgn & SubBySmallNum;//round up - 3'b100: Minus1Tmp = 0;//round to nearest max magnitude - default: Minus1Tmp = 1'bx; - endcase - - end - - // If an answer is exact don't round - assign Plus1 = Sticky | (Gaurd|Round) ? Plus1Tmp : 1'b0; - assign Minus1 = Sticky | (Gaurd|Round) ? Minus1Tmp : 1'b0; - // Compute rounded result - assign {WExpTmp, WMan} = FmtM ? {SumExp, NormSum[53:2]} - {64'b0, Minus1} + {64'b0, Plus1} : {{SumExp, NormSum[53:31]} - {35'b0, Minus1} + {35'b0, Plus1}, 28'b0}; - assign WExp = WExpTmp[10:0]; - - - - - - - - // Sign calculation - - - // Determine the sign if the sum is zero - // if product underflows then use psign - // otherwise - // if cancelation then 0 unless round to -inf - // otherwise psign - assign ZeroSgn = Underflow & ~ResultDenorm ? PSgn : - (PSgn^ZSgn ? FrmM == 3'b010 : PSgn); - - // is the result negitive - // if p - z is the Sum negitive - // if -p + z is the Sum positive - // if -p - z then the Sum is negitive - assign ResultSgn = InvZ&(ZSgn)&NegSum | InvZ&PSgn&~NegSum | ((ZSgn)&PSgn); - assign WSgn = SumZero ? ZeroSgn : ResultSgn; - - // Select the result - assign FmaResultM = XNaNM ? (FmtM ? {XSgn, FInput1M[62:52], 1'b1,FInput1M[50:0]} : {XSgn, FInput1M[62:55], 1'b1,FInput1M[53:0]}) : - YNaNM ? (FmtM ? {YSgn, FInput2M[62:52], 1'b1,FInput2M[50:0]} : {YSgn, FInput2M[62:55], 1'b1,FInput2M[53:0]}) : - ZNaNM ? (FmtM ? {ZSgn, FInput3M2[62:52], 1'b1,FInput3M2[50:0]} : {ZSgn, FInput3M2[62:55], 1'b1,FInput3M2[53:0]}) : - Invalid ? (FmtM ? {WSgn, 11'h7ff, 1'b1, 51'b0} : {WSgn, 8'h7f8, 1'b1, 54'b0}) : // has to be before inf - XInfM ? {PSgn, FInput1M[62:0]} : - YInfM ? {PSgn, FInput2M[62:0]} : - ZInfM ? {ZSgn, FInput3M2[62:0]} : - Overflow ? (FmtM ? {WSgn, 11'h7ff, 52'b0} : {WSgn, 8'h7f8, 55'b0}) : - Underflow & ~ResultDenorm ? (FmtM ? {WSgn, 63'b0} - {63'b0, (Minus1&AddendStickyM)} + {63'b0, (Plus1&AddendStickyM)} : {{WSgn, 31'b0} - {31'b0, (Minus1&AddendStickyM)} + {31'b0, (Plus1&AddendStickyM)}, 32'b0}) : //***do you need minus1? - KillProdM ? (FmtM ? FInput3M2 - {63'b0, (Minus1&AddendStickyM)} + {63'b0, (Plus1&AddendStickyM)} : {FInput3M2[63:32] - {31'b0, (Minus1&AddendStickyM)} + {31'b0, (Plus1&AddendStickyM)}, 32'b0}) : // has to be after Underflow - FmtM ? {WSgn,WExp,WMan} : {WSgn,WExp[6:0],WMan,4'b0}; -logic [63:0] tmp; - assign tmp = {WSgn,WExp[6:0],WMan,4'b0}; - - // Set Invalid flag for following cases: - // 1) Inf - Inf - // 2) 0 * Inf - // 3) any input is a signaling NaN - logic [12:0] MaxExp; - assign MaxExp = FmtM ? 13'd2047 : 13'd255; - assign ProdOf = (ProdExpM >= MaxExp && ~ProdExpM[12]); - assign ProdInf = ProdOf && ~XNaNM && ~YNaNM; - assign SigNaN = FmtM ? (XNaNM&~FInput1M[51]) | (YNaNM&~FInput2M[51]) | (ZNaNM&~FInput3M2[51]) : (XNaNM&~FInput1M[54]) | (YNaNM&~FInput2M[54]) | (ZNaNM&~FInput3M2[54]); - assign Invalid = SigNaN | ((XInfM || YInfM || ProdInf) & ZInfM & (XSgn ^ YSgn ^ ZSgn)) | (XZeroM & YInfM) | (YZeroM & XInfM); - - // Set Overflow flag if the number is too big to be represented - assign Overflow = WExpTmp >= MaxExp & ~WExpTmp[12]; - - // Set Underflow flag if the number is too small to be represented in normal numbers - assign ProdUf = KillProdM & ZZeroM; - assign Underflow = SumExp[12] | ProdUf; - - // Set Inexact flag if the result is diffrent from what would be outputed given infinite precision - assign Inexact = (Sticky|Overflow| (Gaurd|Round))&~(XNaNM|YNaNM|ZNaNM|XInfM|YInfM|ZInfM); - - // Combine flags - // - FMA can't set the Divide by zero flag - // - Don't set the underflow flag if the result is exact - assign FmaFlagsM = {Invalid, 1'b0, Overflow, Underflow & Inexact, Inexact}; - -endmodule - diff --git a/wally-pipelined/src/fpu/FMA/lza.sv b/wally-pipelined/src/fpu/FMA/lza.sv deleted file mode 100644 index a3da4a32..00000000 --- a/wally-pipelined/src/fpu/FMA/lza.sv +++ /dev/null @@ -1,40 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// Block Name: lop.v -// Author: David Harris -// Date: 11/2/1995 -// -// Block Description: -// This block implements a Leading One Predictor used to determine -// the normalization shift count. -/////////////////////////////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////////////////////////// -module lza(sum, normcnt, sumzero); -///////////////////////////////////////////////////////////////////////////// - - input logic [163:0] sum; // sum - output logic [8:0] normcnt; // normalization shift count - output logic sumzero; // sum = 0 - - // Internal nodes - - reg [8:0] i; // loop index - - // A real LOP uses a fast carry chain to find only the first 0. - // It is an example of a parallel prefix algorithm. For the sake - // of simplicity, this model is behavioral instead. - // A real LOP would also operate on the sources of the adder, not - // the result! - - always_comb - begin - i = 0; - while (~sum[163-i] && i <= 163) i = i+1; // search for leading one - normcnt = i; // compute shift count - end - - // Also check if sum is zero - assign sumzero = ~(|sum); - -endmodule - diff --git a/wally-pipelined/src/fpu/FMA/multiply.sv b/wally-pipelined/src/fpu/FMA/multiply.sv deleted file mode 100644 index ecdfeca3..00000000 --- a/wally-pipelined/src/fpu/FMA/multiply.sv +++ /dev/null @@ -1,136 +0,0 @@ - -module multiply(xman, yman, xdenormE, ydenormE, xzeroE, yzeroE, rE, sE); -///////////////////////////////////////////////////////////////////////////// - - input logic [51:0] xman; // Fraction of multiplicand x - input logic [51:0] yman; // Fraction of multiplicand y - input logic xdenormE; // is x denormalized - input logic ydenormE; // is y denormalized - input logic xzeroE; // Z is denorm - input logic yzeroE; // Z is denorm - output logic [105:0] rE; // partial product 1 - output logic [105:0] sE; // partial product 2 - - wire [54:0] yExt; //y with appended 0 and assumed 1 - wire [53:0] xExt; //y with assumed 1 - wire [26:0][1:0] add1; - wire [26:0][54:0] pp; - wire [26:0] e; - logic [106:0] tmpsE; - logic [17:0][106:0] lv1add; - logic [11:0][106:0] lv2add; - logic [7:0][106:0] lv3add; - logic [3:0][106:0] lv4add; - logic [21:0][107:0] carryTmp; - wire [26:0][106:0] acc; - // wire [105:0] acc - genvar i; - - assign xExt = {1'b0,~(xdenormE|xzeroE),xman}; - assign yExt = {1'b0,~(ydenormE|yzeroE),yman, 1'b0}; - - generate - for(i=0; i<27; i=i+1) begin - booth booth(.xExt(xExt), .choose(yExt[(i*2)+2:i*2]), .add1(add1[i]), .e(e[i]), .pp(pp[i])); - end - endgenerate - - assign acc[0] = {49'b0,~e[0],e[0],e[0],pp[0]}; - assign acc[1] = {49'b01,~e[1],pp[1],add1[0]}; - assign acc[2] = {47'b01,~e[2],pp[2],add1[1], 2'b0}; - assign acc[3] = {45'b01,~e[3],pp[3],add1[2], 4'b0}; - assign acc[4] = {43'b01,~e[4],pp[4],add1[3], 6'b0}; - assign acc[5] = {41'b01,~e[5],pp[5],add1[4], 8'b0}; - assign acc[6] = {39'b01,~e[6],pp[6],add1[5], 10'b0}; - assign acc[7] = {37'b01,~e[7],pp[7],add1[6], 12'b0}; - assign acc[8] = {35'b01,~e[8],pp[8],add1[7], 14'b0}; - assign acc[9] = {33'b01,~e[9],pp[9],add1[8], 16'b0}; - assign acc[10] = {31'b01,~e[10],pp[10],add1[9], 18'b0}; - assign acc[11] = {29'b01,~e[11],pp[11],add1[10], 20'b0}; - assign acc[12] = {27'b01,~e[12],pp[12],add1[11], 22'b0}; - assign acc[13] = {25'b01,~e[13],pp[13],add1[12], 24'b0}; - assign acc[14] = {23'b01,~e[14],pp[14],add1[13], 26'b0}; - assign acc[15] = {21'b01,~e[15],pp[15],add1[14], 28'b0}; - assign acc[16] = {19'b01,~e[16],pp[16],add1[15], 30'b0}; - assign acc[17] = {17'b01,~e[17],pp[17],add1[16], 32'b0}; - assign acc[18] = {15'b01,~e[18],pp[18],add1[17], 34'b0}; - assign acc[19] = {13'b01,~e[19],pp[19],add1[18], 36'b0}; - assign acc[20] = {11'b01,~e[20],pp[20],add1[19], 38'b0}; - assign acc[21] = {9'b01,~e[21],pp[21],add1[20], 40'b0}; - assign acc[22] = {7'b01,~e[22],pp[22],add1[21], 42'b0}; - assign acc[23] = {5'b01,~e[23],pp[23],add1[22], 44'b0}; - assign acc[24] = {3'b01,~e[24],pp[24],add1[23], 46'b0}; - assign acc[25] = {1'b0, ~e[25],pp[25],add1[24], 48'b0}; - assign acc[26] = {pp[26],add1[25], 50'b0}; - - //*** resize adders - generate - for(i=0; i<9; i=i+1) begin - add3comp2 #(.BITS(107)) add1(.a(acc[i*3]), .b(acc[i*3+1]), .c(acc[i*3+2]), - .carry(carryTmp[i][106:0]), .sum(lv1add[i*2+1])); - assign lv1add[i*2] = {carryTmp[i][105:0], 1'b0}; - end - endgenerate - - generate - for(i=0; i<6; i=i+1) begin - add3comp2 #(.BITS(107)) add2(.a(lv1add[i*3]), .b(lv1add[i*3+1]), .c(lv1add[i*3+2]), - .carry(carryTmp[i+9][106:0]), .sum(lv2add[i*2+1])); - assign lv2add[i*2] = {carryTmp[i+9][105:0], 1'b0}; - end - endgenerate - - generate - for(i=0; i<4; i=i+1) begin - add3comp2 #(.BITS(107)) add3(.a(lv2add[i*3]), .b(lv2add[i*3+1]), .c(lv2add[i*3+2]), - .carry(carryTmp[i+15][106:0]), .sum(lv3add[i*2+1])); - assign lv3add[i*2] = {carryTmp[i+15][105:0], 1'b0}; - end - endgenerate - - - generate - for(i=0; i<2; i=i+1) begin - add4comp2 #(.BITS(107)) add4(.a(lv3add[i*4]), .b(lv3add[i*4+1]), .c(lv3add[i*4+2]), .d(lv3add[i*4+3]), - .carry(carryTmp[i+19]), .sum(lv4add[i*2+1])); - assign lv4add[i*2] = {carryTmp[i+19][105:0], 1'b0}; - end - endgenerate - - add4comp2 #(.BITS(107)) add5(.a(lv4add[0]), .b(lv4add[1]), .c(lv4add[2]), .d(lv4add[3]) , - .carry(carryTmp[21]), .sum(tmpsE)); - assign sE = tmpsE[105:0]; - assign rE = {carryTmp[21][104:0], 1'b0}; - // assign rE = 0; - // assign sE = acc[0] + - // acc[1] + - // acc[2] + - // acc[3] + - // acc[4] + - // acc[5] + - // acc[6] + - // acc[7] + - // acc[8] + - // acc[9] + - // acc[10] + - // acc[11] + - // acc[12] + - // acc[13] + - // acc[14] + - // acc[15] + - // acc[16] + - // acc[17] + - // acc[18] + - // acc[19] + - // acc[20] + - // acc[21] + - // acc[22] + - // acc[23] + - // acc[24] + - // acc[25] + - // acc[26]; - - // assign sE = {53'b0,~(xdenormE|xzeroE),xman} * {53'b0,~(ydenormE|yzeroE),yman}; - // assign rE = 0; -endmodule - diff --git a/wally-pipelined/src/fpu/FMA/normalize.sv b/wally-pipelined/src/fpu/FMA/normalize.sv deleted file mode 100644 index fe97ddea..00000000 --- a/wally-pipelined/src/fpu/FMA/normalize.sv +++ /dev/null @@ -1,147 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// Block Name: normalize.v -// Author: David Harris -// Date: 11/2/1995 -// -// Block Description: -// This block performs the normalization shift. It also -// generates the Rands bits for rounding. Finally, it -// handles the special case of a zero sum. -// -// v[53:2] is the fraction component of the prerounded result. -// It can be bypassed back to the X or Z inputs of the FMAC -// for back-to-back operations. -///////////////////////////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////////////////////////// -module normalize(sum, zexp, normcnt, aeM, aligncntM, sumshiftM, sumshiftzeroM, sumzero, - xzeroM, zzeroM, yzeroM, bsM, xdenormM, ydenormM, zdenormM, sticky, de0, resultdenorm, v); -///////////////////////////////////////////////////////////////////////////// - input logic [163:0] sum; // sum - input logic [62:52] zexp; // sum - input logic [8:0] normcnt; // normalization shift count - input logic [12:0] aeM; // normalization shift count - input logic [12:0] aligncntM; // normalization shift count - input logic [8:0] sumshiftM; // normalization shift count - input logic sumshiftzeroM; - input logic sumzero; // sum is zero - input logic bsM; // sticky bit for addend - input logic xdenormM; // Input Z is denormalized - input logic ydenormM; // Input Z is denormalized - input logic zdenormM; // Input Z is denormalized - input logic xzeroM; - input logic yzeroM; - input logic zzeroM; - output logic sticky; //sticky bit - output logic [12:0] de0; - output logic resultdenorm; // Input Z is denormalized - output logic [53:0] v; // normalized sum, R, S bits - - // Internal nodes - -logic [163:0] sumshifted; // shifted sum - logic [9:0] sumshifttmp; - logic [163:0] sumshiftedtmp; // shifted sum - logic isShiftLeft1; -logic tmp,tmp1,tmp2,tmp3,tmp4, tmp5; - - // When the sum is zero, normalization does not apply and only the - // sticky bit must be computed. Otherwise, the sum is right-shifted - // and the Rand S bits (v[1] and v[O], respectively) are assigned. - - // The R bit is also set on denormalized numbers where the exponent - // was computed to be exactly -1023 and the L bit was set. This - // is required for correct rounding up of multiplication results. - - // The sticky bit calculation is actually built into the shifter and - // does not require a true subtraction shown in the model. - - assign isShiftLeft1 = (aligncntM == 13'b1 ||aligncntM == 13'b0 || $signed(aligncntM) == $signed(-(13'b1)))&& zexp == 11'h2; - // assign tmp = ($signed(aeM-normcnt+2) >= $signed(-1022)); - always_comb - begin - // d = aligncntM - // l = normcnt - // p = 53 - // ea + eb = aeM - // set d<=2 to d<=0 - if ($signed(aligncntM)<=$signed(13'd2)) begin //d<=2 - // product anchored or cancellation - if ($signed(aeM-{{4{normcnt[8]}},normcnt}+13'd2) >= $signed(-(13'd1022))) begin //ea+eb-l+2 >= emin - //normal result - de0 = xzeroM|yzeroM ? {2'b0,zexp} : aeM-{{4{normcnt[8]}},normcnt}+{12'b0,xdenormM}+{12'b0,ydenormM}+13'd57; - resultdenorm = |sum & ~|de0 | de0[12]; - // if z is zero then there was a 56 bit shift of the product - sumshifted = resultdenorm ? sum << sumshiftM-{8'b0,zzeroM}+{8'b0,isShiftLeft1} : sum << normcnt; // p+2+l - v = sumshifted[162:109]; - sticky = (|sumshifted[108:0]) | bsM; - //de0 = aeM-normcnt+2-1023; - end else begin - sumshifted = sum << (13'd1080+aeM); - v = sumshifted[162:109]; - sticky = (|sumshifted[108:0]) | bsM; - resultdenorm = 1; - de0 = 0; - end - - end else begin // extract normalized bits - sumshifttmp = {1'b0,sumshiftM} - 2; - sumshifted = sumshifttmp[9] ? sum : sum << sumshifttmp; - tmp1 = (sumshifted[163] & ~sumshifttmp[9]); - tmp2 = ((sumshifttmp[9] & sumshiftM[0]) || sumshifted[162]); - tmp3 = (sumshifted[161] || (sumshifttmp[9] & sumshiftM[1])); - tmp4 = sumshifted[160]; - tmp5 = sumshifted[159]; - // for some reason use exp = zexp + {0,1,2} - // the book says exp = zexp + {-1,0,1} - if(sumshiftzeroM) begin - v = sum[162:109]; - sticky = (|sum[108:0]) | bsM; - de0 = {2'b0,zexp}; - end else if(sumshifted[163] & ~sumshifttmp[9])begin - v = sumshifted[162:109]; - sticky = (|sumshifted[108:0]) | bsM; - de0 = {2'b0,zexp} +13'd2; - end else if ((sumshifttmp[9] & sumshiftM[0]) || sumshifted[162]) begin - v = sumshifted[161:108]; - sticky = (|sumshifted[107:0]) | bsM; - de0 = {2'b0,zexp}+13'd1; - end else if (sumshifted[161] || (sumshifttmp[9] & sumshiftM[1])) begin - v = sumshifted[160:107]; - sticky = (|sumshifted[106:0]) | bsM; - //de0 = zexp-1; - de0 = {2'b0,zexp}+{12'b0,zdenormM}; - end else if(sumshifted[160]& ~zdenormM) begin - de0 = {2'b0,zexp}-13'b1; - v = ~|de0&~sumzero ? sumshifted[160:107] : sumshifted[159:106]; - sticky = (|sumshifted[105:0]) | bsM; - //de0 = zexp-1; - end else if(sumshifted[159]& ~zdenormM) begin - //v = sumshifted[158:105]; - de0 = {2'b0,zexp}-13'd2; - v = (~|de0 | de0[12])&~sumzero ? sumshifted[161:108] : sumshifted[158:105]; - sticky = (|sumshifted[104:0]) | bsM; - //de0 = zexp-1; - end else if(zdenormM) begin - v = sumshifted[160:107]; - sticky = (|sumshifted[106:0]) | bsM; - //de0 = zexp-1; - de0 = {{2{zexp[62]}},zexp}; - end else begin - de0 = 0; - sumshifted = sum << sumshiftM-1; // p+2+l - v = sumshifted[162:109]; - sticky = (|sumshifted[108:0]) | bsM; - end - - resultdenorm = (~|de0 | de0[12]); - end - end - - - // shift sum left by normcnt, filling the right with zeros - //assign sumshifted = sum << normcnt; - -endmodule - - diff --git a/wally-pipelined/src/fpu/FMA/round.sv b/wally-pipelined/src/fpu/FMA/round.sv deleted file mode 100644 index 34ecbb02..00000000 --- a/wally-pipelined/src/fpu/FMA/round.sv +++ /dev/null @@ -1,124 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Block Name: round.v -// Author: David Harris -// Date: 11/2/1995 -// -// Block Description: -// This block is responsible for rounding the normalized result of // the FMAC. Because prenormalized results may be bypassed back to // the FMAC X and z input logics, rounding does not appear in the critical // path of most floating point code. This is good because rounding // requires an entire 52 bit carry-propagate half-adder delay. -// -// The results from other FPU blocks (e.g. FCVT, FDIV, etc) are also -// muxed in to form the actual result for register file writeback. This -// saves a mux from the writeback path. -// -///////////////////////////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////////////////////////// -module round(v, sticky, FrmM, wsign, - FmaFlagsM, inf, nanM, xnanM, ynanM, znanM, - xman, yman, zman, - wman, infinity, specialsel,expplus1); -///////////////////////////////////////////////////////////////////////////// - - input logic [53:0] v; // normalized sum, R, S bits - input logic sticky; //sticky bit - input logic [2:0] FrmM; - input logic wsign; // Sign of result - input logic [4:0] FmaFlagsM; - input logic inf; // Some input logic is infinity - input logic nanM; // Some input logic is NaN - input logic xnanM; // X is NaN - input logic ynanM; // Y is NaN - input logic znanM; // Z is NaN - input logic [51:0] xman; // input logic X - input logic [51:0] yman; // input logic Y - input logic [51:0] zman; // input logic Z - output logic [51:0] wman; // rounded result of FMAC - output logic infinity; // Generate infinity on overflow - output logic specialsel; // Select special result - output logic expplus1; - - // Internal nodes - - logic plus1; // Round by adding one - wire [52:0] v1; // Result + 1 (for rounding) - wire [51:0] specialres; // Result of exceptional case - wire [51:0] infinityres; // Infinity or largest real number - wire [51:0] nanres; // Propagated or generated NaN - - // Compute if round should occur. This equation is derived from - // the rounding tables. - - // round to infinity - plus1 if positive - // round to -infinity - plus1 if negitive - // round to zero - do nothing - // round to nearest even - // {v[1], v[0], sticky} - // 0xx - do nothing - // 100 - tie - plus1 if v[2] = 1 - // 101/110/111 - plus1 - always_comb begin - case (FrmM) - 3'b000: plus1 = (v[1] & (v[0] | sticky | (~v[0]&~sticky&v[2])));//round to nearest even - 3'b001: plus1 = 0;//round to zero - 3'b010: plus1 = wsign;//round down - 3'b011: plus1 = ~wsign;//round up - 3'b100: plus1 = (v[1] & (v[0] | sticky | (~v[0]&~sticky&~wsign)));//round to nearest max magnitude - default: plus1 = 1'bx; - endcase - end - // assign plus1 = (rn & v[1] & (v[0] | sticky | (~v[0]&~sticky&v[2]))) | - // (rp & ~wsign) | - // (rm & wsign); - //assign plus1 = rn && ((v[1] && v[0]) || (v[2] && (v[1]))) || - // rp && ~wsign && (v[1] || v[0]) || - // rm && wsign && (v[1] || v[0]); - - // Compute rounded result - assign v1 = v[53:2] + 1; - // Determine if postnormalization is necessary - // Predicted by all bits =1 before round +1 - - //assign postnormalize = &(v[53:2]) && plus1; - - // Determine special result in event of of selection of a result from - // another FPU functional unit, infinity, NAN, or underflow - // The special result mux is a 4:1 mux that should not appear in the - // critical path of the machine. It is not priority encoded, despite - // the code below suggesting otherwise. Also, several of the identical data - // input logics to the wide muxes can be combined at the expense of more - // complicated non-critical control in the circuit implementation. - - assign specialsel = FmaFlagsM[2] || FmaFlagsM[1] || FmaFlagsM[4] || //overflow underflow invalid - nanM || inf; - assign specialres = FmaFlagsM[4] | nanM ? nanres : //invalid - FmaFlagsM[2] ? infinityres : //overflow - inf ? 52'b0 : - FmaFlagsM[1] ? 52'b0 : 52'bx; // underflow - - // Overflow is handled differently for different rounding modes - // Round is to either infinity or to maximum finite number - - assign infinity = |FrmM;//rn || (rp && ~wsign) || (rm && wsign);//***look into this - assign infinityres = infinity ? 52'b0 : {52{1'b1}}; - - // Invalid operations produce a quiet NaN. The result should - // propagate an input logic if the input logic is NaN. Since we assume all - // NaN input logics are already quiet, we don't have to force them quiet. - - // assign nanres = xnanM ? x: (ynanM ? y : (znanM ? z : {1'b1, 51'b0})); // original - - // IEEE 754-2008 section 6.2.3 states: - // "If two or more input logics are NaN, then the payload of the resulting NaN should be - // identical to the payload of one of the input logic NaNs if representable in the destination - // format. This standard does not specify which of the input logic NaNs will provide the payload." - assign nanres = xnanM ? {1'b1, xman[50:0]}: (ynanM ? {1'b1, yman[50:0]} : (znanM ? {1'b1, zman[50:0]} : {1'b1, 51'b0}));// KEP 210112 add the 1 to make NaNs quiet - - // Select result with 4:1 mux - // If the sum is zero and we round up, there is a special case in - // which we produce a massive loss of significance and trap to software. - // It is handled in the exception unit. - assign expplus1 = v1[52] & ~specialsel & plus1; - assign wman = specialsel ? specialres : (plus1 ? v1[51:0] : v[53:2]); - -endmodule - diff --git a/wally-pipelined/src/fpu/FMA/sign.sv b/wally-pipelined/src/fpu/FMA/sign.sv deleted file mode 100644 index 88da533b..00000000 --- a/wally-pipelined/src/fpu/FMA/sign.sv +++ /dev/null @@ -1,111 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// Block Name: sign.v -// Author: David Harris -// Date: 12/1/1995 -// -// Block Description: -// This block manages the signs of the numbers. -// 1 = negative -// -///////////////////////////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////////////////////////// -module sign(xsign, ysign, zsign, negsum0, negsum1, bsM, FrmM, FmaFlagsM, - sumzero, zinfM, inf, wsign, invz, negsum, selsum1, isAdd); -////////////////////////////////////////////////////////////////////////////I - - input logic xsign; // Sign of X - input logic ysign; // Sign of Y - input logic zsign; // Sign of Z - input logic isAdd; - input logic negsum0; // Sum in +O mode is negative - input logic negsum1; // Sum in +1 mode is negative - input logic bsM; // sticky bit from addend - input logic [2:0] FrmM; // Round toward minus infinity - input logic [4:0] FmaFlagsM; // Round toward minus infinity - input logic sumzero; // Sum = O - input logic zinfM; // Y = Inf - input logic inf; // Some input logic = Inf - output logic wsign; // Sign of W - output logic invz; // Invert addend into adder - output logic negsum; // Negate result of adder - output logic selsum1; // Select +1 mode from compound adder - - // Internal nodes - - wire zerosign; // sign if result= 0 - wire sumneg; // sign if result= 0 - wire infsign; // sign if result= Inf -logic tmp; - - // Compute sign of product - - assign psign = xsign ^ ysign; - - // Invert addend if sign of Z is different from sign of product assign invz = zsign ^ psign; - - //do you invert z - assign invz = (zsign ^ psign); - - assign selsum1 = invz; - //negate sum if its negitive - assign negsum = (selsum1&negsum1) | (~selsum1&negsum0); - // is the sum negitive - // if p - z is the sum negitive - // if -p + z is the sum positive - // if -p - z then the sum is negitive - assign sumneg = invz&zsign&negsum1 | invz&psign&~negsum1 | (zsign&psign); - //always @(invz or negsum0 or negsum1 or bsM or ps) - // begin - // if (~invz) begin // both input logics have same sign - // negsum = 0; - // selsum1 = 0; - // end else if (bsM) begin // sticky bit set on addend - // selsum1 = 0; - // negsum = negsum0; - // end else if (ps) begin // sticky bit set on product - // selsum1 = 1; - // negsum = negsum1; - // end else begin // both sticky bits clear - // //selsum1 = negsum1; // KEP 210113-10:44 Selsum1 was adding 1 to values that were multiplied by 0 - // selsum1 = ~negsum1; //original - // negsum = negsum1; - // end - //end - - // Compute sign of result - // This involves a special case when the sum is zero: - // x+x retains the same sign as x even when x = +/- 0. - // otherwise, x-x = +O unless in the RM mode when x-x = -0 - // There is also a special case for NaNs and invalid results; - // the sign of the NaN produced is forced to be 0. - // Sign calculation is not in the critical path so the cases - // can be tolerated. - // IEEE 754-2008 section 6.3 states - // "When ether an input logic or result is NaN, this standard does not interpret the sign of a NaN." - // also pertaining to negZero it states: - // "When the sum/difference of two operands with opposite signs is exactly zero, the sign of that sum/difference - // shall be +0 in all rounding attributes EXCEPT roundTowardNegative. Under that attribute, the sign of an exact zero - // sum/difference shall be -0. However, x+x = x-(-X) retains the same sign as x even when x is zero." - - //assign zerosign = (~invz && killprodM) ? zsign : rm;//***look into -// assign zerosign = (~invz && killprodM) ? zsign : 0; - // zero sign - // if product underflows then use psign - // otherwise - // addition - // if cancelation then 0 unless round to -inf - // otherwise psign - // subtraction - // if cancelation then 0 unless round to -inf - // otherwise psign - - assign zerosign = FmaFlagsM[1] ? psign : - (isAdd ? (psign^zsign ? FrmM == 3'b010 : psign) : - (psign^zsign ? psign : FrmM == 3'b010)); - assign infsign = zinfM ? zsign : psign; //KEP 210112 keep the correct sign when result is infinity - //assign infsign = xinfM ? (yinfM ? psign : xsign) : yinfM ? ysign : zsign;//original - assign tmp = FmaFlagsM[4] ? 0 : (inf ? infsign :(sumzero ? zerosign : psign ^ negsum)); - assign wsign = FmaFlagsM[4] ? 0 : (inf ? infsign :(sumzero ? zerosign : sumneg)); - -endmodule diff --git a/wally-pipelined/src/fpu/FMA/special.sv b/wally-pipelined/src/fpu/FMA/special.sv deleted file mode 100644 index 723b1e32..00000000 --- a/wally-pipelined/src/fpu/FMA/special.sv +++ /dev/null @@ -1,67 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// Block Name: special.v -// Author: David Harris -// Date: 12/2/1995 -// -// Block Description: -// This block implements special case handling for unusual operands (e.g. -// 0, NaN, denormalize, infinity). The block consists of zero/one detectors. -// -///////////////////////////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////////////////////////// -module special(ReadData1E, ReadData2E, ReadData3E, xzeroE, yzeroE, zzeroE, - xnanE, ynanE, znanE, xdenormE, ydenormE, zdenormE, xinfE, yinfE, zinfE); -///////////////////////////////////////////////////////////////////////////// - - input logic [63:0] ReadData1E; // Input ReadData1E - input logic [63:0] ReadData2E; // Input ReadData2E - input logic [63:0] ReadData3E; // Input ReadData3E - output logic xzeroE; // Input ReadData1E = 0 - output logic yzeroE; // Input ReadData2E = 0 - output logic zzeroE; // Input ReadData3E = 0 - output logic xnanE; // ReadData1E is NaN - output logic ynanE; // ReadData2E is NaN - output logic znanE; // ReadData3E is NaN - output logic xdenormE; // ReadData1E is denormalized - output logic ydenormE; // ReadData2E is denormalized - output logic zdenormE; // ReadData3E is denormalized - output logic xinfE; // ReadData1E is infinity - output logic yinfE; // ReadData2E is infinity - output logic zinfE; // ReadData3E is infinity - - // In the actual circuit design, the gates looking at bits - // 51:0 and at bits 62:52 should be shared among the various detectors. - - // Check if input is NaN - - assign xnanE = &ReadData1E[62:52] && |ReadData1E[51:0]; - assign ynanE = &ReadData2E[62:52] && |ReadData2E[51:0]; - assign znanE = &ReadData3E[62:52] && |ReadData3E[51:0]; - - // Check if input is denormalized - - assign xdenormE = ~(|ReadData1E[62:52]) && |ReadData1E[51:0]; - assign ydenormE = ~(|ReadData2E[62:52]) && |ReadData2E[51:0]; - assign zdenormE = ~(|ReadData3E[62:52]) && |ReadData3E[51:0]; - - // Check if input is infinity - - assign xinfE = &ReadData1E[62:52] && ~(|ReadData1E[51:0]); - assign yinfE = &ReadData2E[62:52] && ~(|ReadData2E[51:0]); - assign zinfE = &ReadData3E[62:52] && ~(|ReadData3E[51:0]); - - // Check if inputs are all zero - // Also forces denormalized inputs to zero. - // In the circuit implementation, this can be optimized - // to just check if the exponent is zero. - - // KATHERINE - commented following (21/01/11) - // assign xzeroE = ~(|ReadData1E[62:0]) || xdenormE; - // assign yzeroE = ~(|ReadData2E[62:0]) || ydenormE; - // assign zzeroE = ~(|ReadData3E[62:0]) || zdenormE; - // KATHERINE - removed denorm to prevent output logicing zero when computing with a denormalized number - assign xzeroE = ~(|ReadData1E[62:0]); - assign yzeroE = ~(|ReadData2E[62:0]); - assign zzeroE = ~(|ReadData3E[62:0]); - endmodule diff --git a/wally-pipelined/src/fpu/FMA/tbgen/StineVectors b/wally-pipelined/src/fpu/FMA/tbgen/StineVectors deleted file mode 100644 index 5014f01d..00000000 --- a/wally-pipelined/src/fpu/FMA/tbgen/StineVectors +++ /dev/null @@ -1,1997 +0,0 @@ -b68ffff8000000ff_3f9080000007ffff_b6307ffbe0080080_00001 -0000000000000000_a57f319ede38f755_0000000000000000_00000 -41e00003fffbffff_bfdfffffffefffff_c1d00003fff3fffc_00001 -80251295103185ae_0000000000000000_0000000000000000_00000 -c040000000001000_802fff7fffffffc0_007fff8000001fc0_00001 -0000000000000000_0000000000000000_0000000000000000_00000 -c1dfffffffe00080_3fa48edf3623f067_c1948edf360f61da_00001 -0000000000000000_47fffffffff9fffe_0000000000000000_00000 -43d36fa3cad3f59e_802ffdfffbfffffe_84136e6cce2953e4_00001 -c7f7fd5b86c89ff5_c340097b5e4f0be0_4b480b93035b0b70_00001 -c22000007fffffff_24700000ffffffef_a6a00001800007ed_00001 -0000000000000000_c3e000000ffdffff_0000000000000000_00000 -353437f613f7e662_37f1000000007fff_2d357b7575380687_00001 -ffe564443115fb16_3fbfffffeffbffff_ffb5644426612c74_00001 -3ceec111f7d2af02_39715bac743e2963_3670aeac5438df23_00001 -0000000000000000_41ec86d0aa48e2a2_0000000000000000_00000 -400effffffffefff_c7e10000000000ff_c80077fffffff876_00001 -bff007fffffffffb_be6ffffffff87fff_3e7007fffffc3e1b_00001 -c03000ffffffffe0_47effdfffdffffff_c82fffffddffdfbf_00001 -0000000000000000_ba2fffdffff7ffff_0000000000000000_00000 -bfc00000000011fe_3fdfffffffffff03_bfb000000000117f_00001 -43e0000020007ffe_0010000000000000_0400000020007ffe_00000 -c1cfdeed86c3bb69_400003ffffbffffe_c1dfe6e541a5f09d_00001 -0000000000000000_0010000000000000_0000000000000000_00000 -c25f117a8f103940_4004e72ff4f60ee2_c2744b6155a30e59_00001 -0000000000000000_c01f000000080000_0000000000000000_00000 -c513492fa35969e3_bfcffdffffffffef_44f347fb105f3443_00001 -403000000000fffe_0010000000000001_0050000000010000_00001 -f6d01003ffffffff_419ffffffdffefff_f8801003fefef7b6_00001 -0000000000000000_0010000000000001_0000000000000000_00000 -a83100000007fffe_41e0000effffffff_aa21000ff0080004_00001 -0000000000000000_c3fffffdfffffffd_0000000000000000_00000 -41d000fffffdffff_001fffffffffffff_020000fffffdffff_00001 -c3d08000001fffff_40200000000005ff_c40080000020062d_00001 -0000000000000000_001fffffffffffff_0000000000000000_00000 -1a6ffffffffdffee_c0dfdffffffff7ff_9b5fdffffffdf9ed_00001 -0000000000000000_4800040080000000_0000000000000000_00000 -3eb000000000003f_37ec0c2ea2e8a60d_36ac0c2ea2e8a67c_00001 -f17ffffffff7fff0_001ffffffffffffe_b1affffffff7ffee_00001 -c02ffffffe7fffff_bfb000000007ffbe_3feffffffe8fff7b_00001 -0000000000000000_001ffffffffffffe_0000000000000000_00000 -ffeffbfffffffefe_41e003ffffffffff_81e001ff7fffff7d_00001 -0000000000000000_434000080000003e_0000000000000000_00000 -bacc892b4c13f29c_41e00000081fffff_bcbc892b5a919a96_00001 -50e0100000001000_3ca0000000000000_4d90100000001000_00000 -c04000010000000e_3cc1ffffc0000000_bd120000dffffc0f_00001 -0000000000000000_3ca0000000000000_0000000000000000_00000 -3d40000001007fff_eca000001bffffff_e9f000001d007fff_00001 -0000000000000000_c010000000000000_0000000000000000_00000 -3f69ffffffffffff_404716ea43fac45c_3fc2c29e573bbf8b_00001 -400327ca64d70ec7_3ca0000000000001_3cb327ca64d70ec9_00001 -d8bfff000000007f_b956dbd0aee817c4_5226db19d062a0de_00001 -0000000000000000_3ca0000000000001_0000000000000000_00000 -c007b8561c35da43_7ffc000000000000_7ff8000000000000_00000 -0000000000000000_405f40f41f6021f8_0000000000000000_00000 -bfe00100001fffff_c24003ffffffffbf_42300500402007be_00001 -434fffffffffc003_3cafffffffffffff_400fffffffffc003_00001 -c03ffffffbfffffb_c02ffffffefffeff_407ffffffafffefb_00001 -0000000000000000_3cafffffffffffff_0000000000000000_00000 -40086202321a401c_47f86177898dd055_481293c5d18361f7_00001 -0000000000000000_43e207ffffffffff_0000000000000000_00000 -43effe000fffffff_a18c4acaee4cfd09_a58c49064fc37daf_00001 -74cffffffbff7fff_3caffffffffffffe_718ffffffbff7ffe_00001 -5be00000ffffffbf_421ffffffdffe000_5e100000feffefaf_00001 -0000000000000000_3caffffffffffffe_0000000000000000_00000 -bf47ffe000000000_c1ea1adf9696cf65_4143940d961184f5_00001 -0000000000000000_348ffffffdffffdf_0000000000000000_00000 -c0200003ffffffbf_40affffbfffffff7_c0e00001ffff7fba_00001 -3fdf7cc18997a120_3fd0000000000000_3fbf7cc18997a120_00000 -bf70200000000003_c3e0e4757c2948e7_4361063e67219b7c_00001 -0000000000000000_3fd0000000000000_0000000000000000_00000 -c3dfffff7ffffe00_7ffc000000000000_7ff8000000000000_00000 -0000000000000000_faeffffffffff010_0000000000000000_00000 -41dff52055724a9e_41f3fffe00000000_43e3f9323615694c_00001 -c3c567a7fb6402c6_3fd0000000000001_c3a567a7fb6402c7_00001 -41e0000000000004_388fffffffffff7e_3a7fffffffffff86_00001 -0000000000000000_3fd0000000000001_0000000000000000_00000 -41bfffffffffffff_ed6fffffffffffe8_ef3fffffffffffe7_00001 -381ffffbffffffee_3fdfffffffffffff_380ffffbffffffee_00001 -c1ffffffffeffc00_ce70000800000001_50800007fff7fdfd_00001 -0000000000000000_3fdfffffffffffff_0000000000000000_00000 -c1500007f0000000_80201fffff7ffffe_01802007ff5fffbf_00001 -0000000000000000_c1cecf3286229074_0000000000000000_00000 -43df400000000000_bfefffffc003ffff_c3df3fffc183e7ff_00001 -43dfffffffffff07_80200007f7ffffff_84100007f7ffff82_00001 -0000000000000000_3fdffffffffffffe_0000000000000000_00000 -c80e0000001ffffe_b7efffffffffffe6_400e0000001fffe6_00001 -0000000000000000_c1c0000000002003_0000000000000000_00000 -3f500000000000fa_3fe0000000000000_3f400000000000fa_00000 -7ffc000000000000_c7ffffffffefffdf_7ff8000000000000_00000 -0000000000000000_3fe0000000000000_0000000000000000_00000 -bfe0004000000080_401ffffffffff801_c010003ffffffc80_00001 -0000000000000000_b7f17fffffffffff_0000000000000000_00000 -c3fc3945feb77579_c01000100fffffff_441c39625436ba2e_00001 -40300020001fffff_3fe0000000000001_4020002000200001_00001 -cd100100000fffff_381fffffffffffff_c5400100000ffffe_00001 -0000000000000000_3fe0000000000001_0000000000000000_00000 -41ffefffffffffdf_bff8000001000000_c207f40000ff7fe7_00001 -0000000000000000_7ffc000000000000_7ff8000000000000_00000 -57f01fffffff7fff_3fd00001f7ffffff_57d02001fbef7ffe_00001 -c870200000010000_3fefffffffffffff_c87020000000ffff_00001 -3e2fffe000000fff_7ffc000000000000_7ff8000000000000_00000 -0000000000000000_3fefffffffffffff_0000000000000000_00000 -be36f03e8c9d3cd8_c7f9a4a35fede985_464261b53aedde07_00001 -0000000000000000_c180001ffffffffe_0000000000000000_00000 -c01fffffffef0000_401b5b155998eecc_c04b5b15598a6668_00001 -bfb0000400100000_3feffffffffffffe_bfb00004000ffffe_00001 -0000000000000000_3feffffffffffffe_0000000000000000_00000 -bfc8000000400000_c040000000005fff_4018000000408fff_00001 -0000000000000000_3fbe26137bc2717f_0000000000000000_00000 -c00aaa4fd557ef13_c3b8917384eb32d0_43d478efdc9216d8_00001 -33b002000007ffff_3ff0000000000000_33b002000007ffff_00000 -0000000000000000_3ff0000000000000_0000000000000000_00000 -3f50000000000000_c1cf9ffffffffffe_c12f9ffffffffffe_00000 -0000000000000000_b3f000000ffffe00_0000000000000000_00000 -3fffffffeffffff6_3fdfffffffff0020_3fefffffefff0017_00001 -bf6fffffffffff3f_3ff0000000000001_bf6fffffffffff40_00001 -47fffc0000000001_c03fffff7fffff7f_c84ffbff800fff80_00001 -0000000000000000_3ff0000000000001_0000000000000000_00000 -3caffe000000ffff_3fdffc7fffffffff_3c9ffa803800ffe3_00001 -0000000000000000_7ffc000000000000_7ff8000000000000_00000 -baa6a91cddacae08_510ff80000020000_cbc6a3729676ad6e_00001 -40300000083fffff_3fffffffffffffff_40400000083fffff_00001 -3cd00fffff7fffff_ffebc7d81171f5ef_fccbe39fe8a52922_00001 -0000000000000000_3fffffffffffffff_0000000000000000_00000 -a1407fff7fffffff_41cfffbffffffffe_a3207fde8000fffd_00001 -0000000000000000_c030080000ffffff_0000000000000000_00000 -4150040020000000_2eedc50618875049_304dcc7795977e4f_00001 -bfc676f7e5d9e346_3ffffffffffffffe_bfd676f7e5d9e344_00001 -0000000000000000_3ffffffffffffffe_0000000000000000_00000 -0000000000000000_c18aca47203438e2_0000000000000000_00000 -bd607ffffffffbfe_4024e704bfc3d6c1_bd958e3ce5c1f03a_00001 -40664093b187b4e5_4000000000000000_40764093b187b4e5_00000 -bffa5cf563cae7d4_bfeffbffffffffee_3ffa59a9c51e6e69_00001 -0000000000000000_4000000000000000_0000000000000000_00000 -3fcffffffffbffde_c02fbffdffffffff_c00fbffdfffc07dd_00001 -0000000000000000_7fedfffffdfffffe_0000000000000000_00000 -43e0ff7ffffffffe_c7effffffffff7ef_cbe0ff7ffffffbb5_00001 -8ad00000000041ff_4000000000000001_8ae0000000004200_00001 -5dfffffffff7fffc_bfffff8000010000_de0fff7ffff9001c_00001 -0000000000000000_4000000000000001_0000000000000000_00000 -ffefffffdfffffee_7ffc000000000000_7ff8000000000000_00000 -0000000000000000_3cd000000043fffe_0000000000000000_00000 -c01d9eadf45189b8_3f50000000ffffbf_bf7d9eadf62b741e_00001 -37effffeffffff00_400fffffffffffff_380ffffeffffff00_00001 -0000000000000000_400fffffffffffff_0000000000000000_00000 -0000000000000000_ffe58b7bfa0536fd_0000000000000000_00000 -c190000007fffeff_429455aca15996be_c43455acab846bc8_00001 -43f00000000fffc0_400ffffffffffffe_44100000000fffbf_00001 -0000000000000000_400ffffffffffffe_0000000000000000_00000 -47efff0008000000_b1dcb0523546117f_b9dcaf6cb9e07bdb_00001 -0000000000000000_b800003ffe000000_0000000000000000_00000 -bfe0000000000000_c1ffffffffff0008_41efffffffff0008_00000 -41edfffffffffffe_4010000000000000_420dfffffffffffe_00000 -bfc0000000000017_bfe2697f4b561495_3fb2697f4b5614b0_00001 -0000000000000000_4010000000000000_0000000000000000_00000 -3ff3fffffbffffff_bbefffeffffffdff_bbf3fff5fc0000be_00001 -0000000000000000_c1c0000007ffbffe_0000000000000000_00000 -3fcbd27c9d3cfce9_3fbf7ffffeffffff_3f9b6332a9e97510_00001 -404fffff000007fe_4010000000000001_406fffff00000800_00001 -43f000ffffff7fff_22300000001fffdf_26300100001f81de_00001 -0000000000000000_4010000000000001_0000000000000000_00000 -abc0000000000022_c23ff803ffffffff_2e0ff80400000043_00001 -0000000000000000_bca00001ff7ffffe_0000000000000000_00000 -bfbfffc001000000_40c00000000040ff_c08fffc0010081fc_00001 -c1c07ffffffff7fe_401fffffffffffff_c1f07ffffffff7fd_00001 -bf5bfffffffffffa_bfe6386ce8894329_3f53715f4b781ac0_00001 -0000000000000000_401fffffffffffff_0000000000000000_00000 -47ffffbfffefffff_381001fdffffffff_402001ddfbfbff00_00001 -0000000000000000_078fffffffff00fe_0000000000000000_00000 -402ff000001fffff_40759558e27de226_40b58a8e3622388e_00001 -3fb57e5a898766cf_401ffffffffffffe_3fe57e5a898766ce_00001 -b813d14cf9cc6a0f_7ffc000000000000_7ff8000000000000_00000 -0000000000000000_401ffffffffffffe_0000000000000000_00000 -0000000000000000_c01002003ffffffe_0000000000000000_00000 -ffe000010003ffff_eb50000000007f7e_2b40000100047f7e_00001 -f020400000000100_4340000000000000_f370400000000100_00000 -47f4000400000000_bf9fffbfc0000000_c7a3ffdbd7f7f800_00000 -0000000000000000_4340000000000000_0000000000000000_00000 -bfdf7ffffefffffe_3e2ffffffe007fff_be1f7ffffd087dfd_00001 -0000000000000000_40efdeffffffffff_0000000000000000_00000 -40bffffff0010000_c00fffbf7fffffff_c0dfffbf7001203c_00001 -b80ffffffffdfeff_4340000000000001_bb5ffffffffdff00_00001 -c7efe0000000001f_41cb6efdcaa9034a_c9cb538eccde5a61_00001 -0000000000000000_4340000000000001_0000000000000000_00000 -400ffffff00007ff_c1e40fffffffffff_c2040ffff5f80502_00001 -0000000000000000_bfdfffff8001ffff_0000000000000000_00000 -41c001ffffffff7f_43e061baf61ffb1f_45b063c72d7ebe9b_00001 -37e0080000003ffe_434fffffffffffff_3b40080000003ffe_00001 -c1f9046426f60438_bf7ffff7fffffffe_4189045de5dcfa79_00001 -0000000000000000_434fffffffffffff_0000000000000000_00000 -c03ffffffc00fffe_802002000007ffff_007001fffe08400e_00001 -0000000000000000_c5b00010000003fe_0000000000000000_00000 -3770000000000107_3fd48f00324582ef_37548f0032458441_00001 -b5affffffff7fffe_434ffffffffffffe_b90ffffffff7fffc_00001 -3fc0c468246a1620_bf9fc40000000000_bf70a4f7e125cf36_00001 -0000000000000000_434ffffffffffffe_0000000000000000_00000 -c0200000001fffff_bfc000ffffbffffe_3ff000ffffe001fd_00001 -0000000000000000_c1f6c9921fedfd35_0000000000000000_00000 -c02e0000ffffffff_3f8fc00000000100_bfcdc400fe0000ef_00001 -7ffc000000000000_7fe0000000000000_7ff8000000000000_00000 -c80f48a9d9dbc8c6_c1c007ffffeffffe_49df584e2ea96dfd_00001 -0000000000000000_7fe0000000000000_0000000000000000_00000 -0000000000000000_c02000003fff7fff_0000000000000000_00000 -7feffff800010000_37f21ffffffffffe_77f21ffb780090ff_00001 -c80c5e05644472e7_7fe0000000000001_87fc5e05644472e8_00001 -bfeffffffffffaff_bf800003fffffffe_3f800003fffffd7e_00001 -0000000000000000_7fe0000000000001_0000000000000000_00000 -3cbfffffffe00ffe_c1cc000001000000_be9c000000e40dfe_00001 -0000000000000000_b80fffffffc20000_0000000000000000_00000 -b35e061abc769f3a_c078000003fffffe_33e684941119bac2_00001 -c0ae000000000fff_7fefffffffffffff_80ae000000000ffe_00001 -643cfffffffffffe_3fc000000807ffff_640d00000e8e7ffd_00001 -0000000000000000_7fefffffffffffff_0000000000000000_00000 -c3efffdffffdfffe_7ffc000000000000_7ff8000000000000_00000 -0000000000000000_3ff000000fffff80_0000000000000000_00000 -c0114a0730d7f7a8_c3dffc0000fffffe_440147ddf07c2ce2_00001 -c071f1a35952c0a4_7feffffffffffffe_8071f1a35952c0a2_00001 -bf74200a147ea166_7ffc000000000000_7ff8000000000000_00000 -0000000000000000_7feffffffffffffe_0000000000000000_00000 -403a793cfb1e2471_bff0000100007fff_c03a793ea2b2c7eb_00001 -0000000000000000_3fd00003fffbfffe_0000000000000000_00000 -c09fffff7ffffff0_3cabffffffffffff_bd5bffff8ffffff1_00001 -3800008000000002_7ff0000000000000_7800008000000002_00000 -3dafffc3fffffffe_480ffff800000002_45cfffbc000f0000_00001 -0000000000000000_7ff0000000000000_7ff8000000000000_10000 -40cffffffffff880_39100003fff00000_39f00003ffeffc40_00001 -0000000000000000_4190200080000000_0000000000000000_00000 -41e56167e987d508_c3507641c18b2d15_c545ff6e26393368_00001 -3f43652672b8c04e_7ffc000000000000_7ff8000000000000_00000 -3d1ffffbfe000000_216898822a24af3f_1e98987f158ae1d8_00001 -0000000000000000_7ffc000000000000_7ff8000000000000_00000 -c1c8a60ffe18c7bf_c01bdaf03620c126_41f574c1d28158e8_00001 -0000000000000000_c741ffffffffffef_0000000000000000_00000 -3db000003ffffff7_43caaa16868406bc_418aaa16f12c60c8_00001 -a220000000000bff_7ffc000000000000_7ff8000000000000_00000 -39d0000007c00000_37efffffe07fffff_31cfffffeffffff0_00001 -0000000000000000_7ffc000000000000_7ff8000000000000_00000 -0000000000000000_c7f0000000000ffe_0000000000000000_00000 -bf8fffffffffdfef_7fd000000100ffff_ff7000000100eff6_00001 -bfb00000001bffff_7ffc000000000000_7ff8000000000000_00000 -0000000000000000_7ffc000000000000_7ff8000000000000_00000 -402fffffffffdfdf_c02fffffffffff6e_c06fffffffffdf4d_00001 -0000000000000000_1b6e0000000007ff_0000000000000000_00000 -4037ab310ba6cb64_7fefdffffdfffffe_00379385d9207187_00001 -c00195fa60036675_8000000000000000_0000000000000000_00000 -bfd000003fffbfff_c00fffe000000000_3fefffe07ffeffff_00001 -0000000000000000_8000000000000000_0000000000000000_00000 -c020000000800004_43d4a4d3867e8d13_c404a4d38723b3b4_00001 -0000000000000000_c1f8f41f2ee582b0_0000000000000000_00000 -37f0000000efffff_c3d00007fffffeff_bbd0000800efff75_00001 -64b00000000bffff_3b816cd156a62ab8_60416cd156b33c54_00001 -0000000000000000_4803ffffffffefff_0000000000000000_00000 -bfd7c2590b89786f_c000f4df3c754c0e_3fe92df857f975ae_00001 -3f0ffffffeffffc0_c003fffffff80000_bf23ffffff57ffd8_00001 -c3d2bbe6deae1f63_ffd0000000004010_03b2bbe6deae6a66_00001 -0000000000000000_403000000000003f_0000000000000000_00000 -41cffffffff7bfff_40600007fffffff8_42400007fffbdff6_00001 -c1dfff7ffffffff8_b7efffffffffffff_39dfff7ffffffff8_00001 -8020200007fffffe_c59000000000083f_05c020000800084e_00001 -0000000000000000_ffefff8000080000_0000000000000000_00000 -58b00000008003fe_3b6ff00001fffffe_542ff00002ff87f7_00001 -77f34f18a693527b_8010000000000000_b8134f18a693527b_00000 -42bfffffff80001e_408000004000000f_435000003fc0001e_00001 -0000000000000000_8010000000000000_0000000000000000_00000 -c7efffffc00007ff_c030000003fffffc_482fffffc80007e8_00001 -bec52f80f9199ec0_c3efff000007fffe_42c52ed77d1721d2_00001 -43f000000407ffff_8010000000000001_8410000004080000_00001 -401cc0bdc0613b09_bec09901b9b2a079_beedd3b3f0a24b73_00001 -0000000000000000_8010000000000001_0000000000000000_00000 -3fb00200000000ff_c0000000011fffff_bfc00200012024fd_00001 -0000000000000000_3fefffffffdff800_0000000000000000_00000 -9a5f095312a9cdc5_c1f1ffffdfffffff_1c61753e9b7630ac_00001 -c340000000000000_801fffffffffffff_036fffffffffffff_00000 -37e0000003fff7fe_37effffbbfffffff_2fdffffbc7ffeeec_00001 -0000000000000000_801fffffffffffff_0000000000000000_00000 -c1c0007dffffffff_bfb3fff7fffffffe_418400957fc0fffd_00001 -0000000000000000_3ef0000000000016_0000000000000000_00000 -3807fffffffffdff_4230000000002080_3a48000000002ebf_00001 -c1effffffffffc02_801ffffffffffffe_021ffffffffffc01_00001 -41c0000007ffffff_49103fffefffffff_4ae03ffff81ffff6_00001 -0000000000000000_801ffffffffffffe_0000000000000000_00000 -b81ffffffdfeffff_403dfffffff80000_b86dfffffe170fff_00001 -0000000000000000_32ee409a5f3b66fa_0000000000000000_00000 -3dcffffff0000000_c06fffffff800800_be4fffffef800800_00001 -2b50000200000020_bca0000000000000_a800000200000020_00000 -c1c39e834dacb36b_468f7fe000000000_c8634ff5a1f2b2f0_00001 -0000000000000000_bca0000000000000_0000000000000000_00000 -391f800001000000_46420003ffffffff_3f71b803f0900020_00001 -0000000000000000_3ff3d4f7273f6526_0000000000000000_00000 -407effbfffffffff_3e00000040001fff_3e8effc07bff3dfd_00001 -c00001000000007e_bca0000000000001_3cb0010000000080_00001 -0010000000003eff_419ffffff8200000_01bffffff8207dfe_00001 -0000000000000000_bca0000000000001_0000000000000000_00000 -c3f000000020003f_3fbf800000000006_c3bf8000003f0082_00001 -0000000000000000_41d1fdffffffffff_0000000000000000_00000 -47f9106b08704172_43f0000000bffffe_4bf9106b099d0674_00001 -3bddd6cd1eacf35d_bcafffffffffffff_b89dd6cd1eacf35c_00001 -3810003ffdffffff_c01f01d4d299b191_b83f0250d60cc15b_00001 -0000000000000000_bcafffffffffffff_0000000000000000_00000 -c1f00013fffffffe_7ffc000000000000_7ff8000000000000_00000 -0000000000000000_c3d52e10f5566786_0000000000000000_00000 -403001fffffffeff_402ffffdfffffffe_407001feffdffefe_00001 -3fb0ffff00000000_bcaffffffffffffe_bc70fffefffffffe_00001 -7ffc000000000000_c03ffffeff800000_7ff8000000000000_00000 -0000000000000000_bcaffffffffffffe_0000000000000000_00000 -405e1876cd43dfed_b7efffffffffc006_b85e1876cd43a3c1_00001 -0000000000000000_3fc01fffffff0000_0000000000000000_00000 -37f46ac0cb227799_41c5ef5245dd848c_39cbfd80a6baabfb_00001 -bcaa61d451370385_bfd0000000000000_3c8a61d451370385_00000 -c3f00004000001ff_c3d00bfffffffffe_47d00c04030001ff_00001 -0000000000000000_bfd0000000000000_0000000000000000_00000 -088fdffdfffffffe_bf3000007c000000_87cfdffef707f07d_00001 -0000000000000000_bfb0010007fffffe_0000000000000000_00000 -c38011ffffffffff_3a60000000220000_bdf012000022263e_00001 -402feffff7fffffe_bfd0000000000001_c00feffff7ffffff_00001 -c1ec36947a5606cc_bfd0fffeffffffff_41cdf9fbfe921f92_00001 -0000000000000000_bfd0000000000001_0000000000000000_00000 -41f0001fffffffbf_c3cffeffffffffdf_c5cfff3ffdffff5d_00001 -0000000000000000_c312de637a398fb0_0000000000000000_00000 -403b5ab30b28be12_bfdfffffffffffff_c02b5ab30b28be11_00001 -3fc040000000007f_3fd0f88932487143_3fa13c6b5711938f_00001 -0000000000000000_bfdfffffffffffff_0000000000000000_00000 -f8d6275431da5f5a_c3f01fffffff0000_7cd653a2da3cb1a4_00001 -0000000000000000_434fffffff820000_0000000000000000_00000 -3aa002007fffffff_c1fe80c92278a049_bcae849a2fa3386e_00001 -4c20400000007ffe_bfdffffffffffffe_cc10400000007ffc_00001 -41f778782e71a049_41f0000000040004_43f778782e777e6d_00001 -0000000000000000_bfdffffffffffffe_0000000000000000_00000 -47f00001ffffffbf_7ffc000000000000_7ff8000000000000_00000 -0000000000000000_c1cfffffff87ffff_0000000000000000_00000 -bfcbcb96cd6ce0e7_bdf0403fffffffff_3dcc3b3456fdca1d_00001 -3810004000007fff_bfe0000000000000_b800004000007fff_00000 -b816b0e6a400c9f7_41d04000000003ff_b9f70baa3e90d2c9_00001 -0000000000000000_bfe0000000000000_0000000000000000_00000 -c2b6b180a7b11fce_434ffffffffe7ffe_c616b180a7b00f7a_00001 -0000000000000000_3ca00fffffffefff_0000000000000000_00000 -bfcfffe00001fffe_3ffffffffffffff9_bfdfffe00001fff7_00001 -381ffffffff0007f_bfe0000000000001_b80ffffffff00080_00001 -3c508003ffffffff_c9840007ffffffff_c5e4a00d4001fffd_00001 -0000000000000000_bfe0000000000001_0000000000000000_00000 -c3f500b2abbc6d5a_c00000000200003f_440500b2ae5c8403_00001 -0000000000000000_c1fc003ffffffffe_0000000000000000_00000 -381f83ffffffffff_401020007fffffff_383fc308fc1ffffe_00001 -c2d1fffffffffff8_bfefffffffffffff_42d1fffffffffff8_00001 -41c000000003fffd_ee8000020000007f_f05000020004007c_00001 -0000000000000000_bfefffffffffffff_0000000000000000_00000 -44d1dac2a47ae323_bf0ad596dbf9ffc8_c3edf1d4e2cf5d16_00001 -0000000000000000_1dc0000200000400_0000000000000000_00000 -802b02a4a7567581_400ffbffffffff7f_804aff4452c18a45_00001 -801ffc000007ffff_bfeffffffffffffe_001ffc000007fffe_00001 -4061a0ee04ab4a49_395f87fffffffffe_39d15ed28819c7f2_00001 -0000000000000000_bfeffffffffffffe_0000000000000000_00000 -488e6af849a7c8cc_c3c00000801ffffe_cc5e6af93d3c6106_00001 -0000000000000000_f895b944b616e64d_0000000000000000_00000 -c08ffffff807ffff_381fdfffffffdfff_b8bfdffff80fd7fe_00001 -3e8ff000001fffff_bff0000000000000_be8ff000001fffff_00000 -2740d36bf6e95244_b8512e32d34343c0_9fa21137ff9a0629_00001 -0000000000000000_bff0000000000000_0000000000000000_00000 -bfd00040000003ff_bfe601e4fe42b76a_3fc6023d05d6b5f4_00001 -0000000000000000_ffe0000005fffffe_0000000000000000_00000 -34ed63d731a69782_37e15e6928604d26_2cdfe7805e636848_00001 -002ffcfffffffffe_bff0000000000001_802ffcffffffffff_00001 -41000000003e0000_baddffffffffff80_bbee000000743f7f_00001 -0000000000000000_bff0000000000001_0000000000000000_00000 -40a00000020001ff_c340000000800001_c3f0000002800200_00001 -0000000000000000_c02ffeffbfffffff_0000000000000000_00000 -bfe85c97c592f839_b7f253013ebdb741_37ebe68cf6e766e6_00001 -c3f00000083ffffe_bfffffffffffffff_44000000083ffffe_00001 -bfe7ffffbfffffff_c04f7fff00000000_40479fff01000200_00001 -0000000000000000_bfffffffffffffff_0000000000000000_00000 -c033a9b295fcb4d4_c34fffffc00fffff_4393a9b26eb32481_00001 -0000000000000000_bfa0040000000040_0000000000000000_00000 -c7ee1b070553cb86_43c02000000003ff_cbbe573d135e7aa1_00001 -bddfffffffffc03f_bffffffffffffffe_3defffffffffc03e_00001 -0000000000000000_bffffffffffffffe_0000000000000000_00000 -bfdffff800020000_40504000007fffff_c0403ffbf08103df_00001 -0000000000000000_802ffb0000000000_0000000000000000_00000 -bfcffffffffe07ff_3fd5d55d6d4b65c1_bfb5d55d6d4a0ddf_00001 -c6efc00000001fff_c000000000000000_46ffc00000001fff_00000 -0000000000000000_c000000000000000_0000000000000000_00000 -c341000000007fff_ffe80007ffffffff_033980088000bffe_00001 -0000000000000000_c3d45a83d3e64a25_0000000000000000_00000 -bcaffc0000001fff_37e000000003fffe_b49ffc0000081efb_00001 -ffe00000003fffef_c000000000000001_7fefffffffffffff_00101 -b7f0020000000fff_4470000010000007_bc70020010021006_00001 -0000000000000000_c000000000000001_0000000000000000_00000 -41d00000010003ff_40400000007effff_42200000017f03ff_00001 -0000000000000000_402200000001ffff_0000000000000000_00000 -b7efffffbfffeffe_b7efe00000001fff_2fefdfffc040100e_00001 -c3d09308769f3f51_c00fffffffffffff_43f09308769f3f51_00001 -5b18007fffffffff_421000000004007e_5d380080000600dd_00001 -0000000000000000_c00fffffffffffff_0000000000000000_00000 -0140008000fffffe_d2e0001ffffffffb_943000a0020001f8_00001 -0000000000000000_b6a4df75cc5a8ac6_0000000000000000_00000 -3fc0000000100002_bfdffffff0ffffff_bfaffffff1200002_00001 -9249d03728460383_c00ffffffffffffe_1269d03728460382_00001 -c80fffffeffffffe_40346972210201a4_c854697216cd4892_00001 -0000000000000000_c00ffffffffffffe_0000000000000000_00000 -ffef003fffffffff_c3e000000007fffc_03df0040000f8018_00001 -0000000000000000_402ffffdfefffffe_0000000000000000_00000 -ef3fffe000007fff_ffd8000000000004_2f27ffe800006004_00001 -b7404000000007fe_c010000000000000_37604000000007fe_00000 -c00fbffffc000000_37e1c5f1f14e88f4_b801a2660b332da3_00001 -0000000000000000_c010000000000000_0000000000000000_00000 -400fffffffffffff_c1effffc00001000_c20ffffc00000fff_00001 -0000000000000000_b81fbfffffffdffe_0000000000000000_00000 -c18000001fffeffe_cd4fffafffffffff_4edfffb03fff3ffc_00001 -be0c000001ffffff_c010000000000001_3e2c000002000001_00001 -4030080000400000_3feffffffffff7ef_40300800003ffbf6_00001 -0000000000000000_c010000000000001_0000000000000000_00000 -41f000000000004f_b0d8d4e5d2e17fbc_b2d8d4e5d2e18036_00001 -0000000000000000_c3e4bafe2be6e7ab_0000000000000000_00000 -43c2000000000000_1b9003ffdfffffff_1f62047fdbffffff_00001 -3f0ffffffe000000_c01fffffffffffff_bf3ffffffdffffff_00001 -38000fffffdfffff_3eb000000fffffdf_36c010000fefffde_00001 -0000000000000000_c01fffffffffffff_0000000000000000_00000 -3ff620e228517034_d7b0007ffff00000_d7b621932f4c91dd_00001 -0000000000000000_b2d000010001fffe_0000000000000000_00000 -434002ffffffffff_b80dffffff7ffffe_bb5e059fff7fe7fc_00001 -c01fffffffc00fff_c01ffffffffffffe_404fffffffc00ffe_00001 -0000000000000000_c01ffffffffffffe_0000000000000000_00000 -43402000003ffffe_3fefbfffffffdfff_433fff80007edfbc_00001 -0000000000000000_40400000000103fe_0000000000000000_00000 -c840000fffc00000_8020800000100000_087080107fce0010_00001 -dc6fffe800000000_c340000000000000_5fbfffe800000000_00000 -380ff7fffffffff7_37e07fff7fffffff_30007bdf801ffffb_00001 -0000000000000000_c340000000000000_0000000000000000_00000 -3fc001fff8000000_c7e000000fffffee_c7b002000801ffe5_00001 -0000000000000000_c01f672422632eb4_0000000000000000_00000 -c025e14360f49046_412fff0000000003_c165e09456d988a3_00001 -40efbffffffffff0_c340000000000001_c43fbffffffffff1_00001 -bffffffffff00006_2ff00001ffffefff_b0000001fff7f001_00001 -0000000000000000_c340000000000001_0000000000000000_00000 -db80000000008001_c8000000001fffdf_6390000000207fe1_00001 -0000000000000000_43c0010ffffffffe_0000000000000000_00000 -c01a463c652ab793_c05ffffffffeffff_408a463c6529e561_00001 -43f000ffbfffffff_bfb97cb2bcb99946_c3b97e4a21f299eb_00001 -0000000000000000_c34fffffffffffff_0000000000000000_00000 -c34b6bcc142a6f56_c7e4a843ca846cd5_4b41b38f9341a0c3_00001 -0000000000000000_43ee59a2f1155c8b_0000000000000000_00000 -9dd926fa6482fb5b_c34ffffffffffffe_213926fa6482fb5a_00001 -3fe000000000fbff_39cd3b5aa5703bc0_39bd3b5aa5720825_00001 -0000000000000000_c34ffffffffffffe_0000000000000000_00000 -3c49fe3f310fdc0a_bfd0000000000406_bc29fe3f310fe293_00001 -0000000000000000_40307ff000000000_0000000000000000_00000 -9daffffffdffffef_bf34c1a973f2b94f_1cf4c1a972a69ead_00001 -4cadffffffffffbf_ffe0000000000000_8c9dffffffffffbf_00000 -3fcffc0000003fff_c3e0000083ffffff_c3bffc0107df3ffd_00001 -0000000000000000_ffe0000000000000_0000000000000000_00000 -3fe0000000008fff_802ffffff7fffff6_801ffffff8011ff3_00001 -0000000000000000_3f0773142edfbe27_0000000000000000_00000 -29d000000403ffff_3f80003f00000000_2960003f04040fcf_00001 -38bfffefffdffffe_ffe0000000000001_f8afffefffdfffff_00001 -47effffc00000001_c7e953179168449a_cfe953146705526d_00001 -0000000000000000_ffe0000000000001_0000000000000000_00000 -c02fffc000007ffe_37ffffffdffffffa_b83fffbfe000bff7_00001 -0000000000000000_c1f000fffffffe00_0000000000000000_00000 -41c00fffffffbffe_ffefffffffffffff_81c00fffffffbffd_00001 -bfcebb873724572c_43fffffffff007fe_c3debb8737150115_00001 -0000000000000000_ffefffffffffffff_0000000000000000_00000 -3daffffc04000000_c1dffbfffbffffff_bf9ffbfc007f807e_00001 -0000000000000000_c7d001ffe0000000_0000000000000000_00000 -5ce0010001ffffff_559000000007fe00_728001000207fe7f_00001 -7ffc000000000000_ffeffffffffffffe_7ff8000000000000_00000 -4d0ffffffffefff8_434000000407ffff_5060000004077ffb_00001 -0000000000000000_ffeffffffffffffe_0000000000000000_00000 -3ffdb267f5c69234_3e3e492b0370990d_3e4c1b285e7fc086_00001 -0000000000000000_b7f00083fffffffe_0000000000000000_00000 -be8ffbfff7ffffff_b7efffffedffffff_368ffbffe6024003_00001 -40401007fffffffe_fff0000000000000_80401007fffffffe_00000 -43d4000000200000_3ca03fffffffff7f_4084500000207f5f_00001 -0000000000000000_fff0000000000000_7ff8000000000000_10000 -c1cff80000040000_c30007ffffffe000_44e003fe0001e108_00001 -0000000000000000_c6affffffffffffe_0000000000000000_00000 -66ef3a141ea96df4_a5fe000007ffffff_ccfd4672e48d5c1b_00001 -403efff800000000_7ffc000000000000_7ff8000000000000_00000 -c3efff5fffffffff_3e10aaf54bbf14f4_c210aaa1f4f49a38_00001 -0000000000000000_7ffc000000000000_7ff8000000000000_00000 -815fffbffffffbfe_3fc953950e8a2680_813953626760063f_00001 -0000000000000000_c0045abb4860cbf3_0000000000000000_00000 -b26ffffffffff3ff_31f0083fffffffff_a470083ffffff9fb_00001 -41fffffffffc000f_7ffc000000000000_7ff8000000000000_00000 -ffe000000807ffff_c7ffffffffffc00e_07f000000807e006_00001 -0000000000000000_7ffc000000000000_7ff8000000000000_00000 -c42fffffffff7eff_400af1800bf02233_c44af1800befb594_00001 -0000000000000000_bfc307b45d013179_0000000000000000_00000 -43e67239f3caa98b_4030100000007fff_442688ac2dbf27c5_00001 -c020003fefffffff_7ffc000000000000_7ff8000000000000_00000 -43df800000000000_c800000007fffffd_cbef80000fbffffa_00001 -0000000000000000_7ffc000000000000_7ff8000000000000_00000 -3fc00003ffffe000_3fc00020000ffffe_3f9000240017e002_00001 -de308000000fffff_bff03ffefffffffe_5e30c1fef8103ffc_00001 -33c9eac8840374c2_0000000000000000_0000000000000000_00000 -bfbf7fffffdfffff_b15fffffff810000_312f7fffff62fc00_00001 -402e0f0ff2ae974a_c010000007fbffff_c04e0f1001ae9b7d_00001 -0029ab134ab9225a_c1d2c16dd8a224a2_820e16c585c2b039_00001 -341ffc8000000000_b87001fffffffe00_aca0003fc7fffe00_00001 -402fbefffffffffe_bfe00001fff7ffff_c01fbf03f7d0207c_00001 -401395a7515be3d9_8010000000040007_803395a75160c94b_00001 -bffffffec0000000_c000000000003eff_400ffffec0007dfe_00001 -418f7ff7ffffffff_b7f00000000000bf_b98f7ff800000177_00001 -bf6ffffffe000400_402160aef0d05b5b_bfa160aeefba5298_00001 -1641ffffff7ffffe_47e800000000001f_1e3affffff400020_00001 -411ffffeffffffff_3e9ffc0000000020_3fcffbff00200020_00001 -c3fa0e39a0436d68_3d3c9035c5b2e908_c14741de3814e038_00001 -c01fffffdefffffe_0510000f7fffffff_8540000f6f7ff001_00001 -1fc3fffffffff800_c1f0000200020000_a1c40002800277ff_00001 -41cfffff81ffffff_402f0000000fffff_420effff85fffffe_00001 -4801ffffbfffffff_c3c99366bccc8a8e_cbdcc5d32e1880ea_00001 -48000000004001ff_41f331de979ac49e_4a0331de97e78e7e_00001 -47f0ffffffbfffff_4890001ff0000000_50910021eebfff80_00001 -c7e000008001fffe_001fffffffffffff_881000008001fffd_00001 -b8013a04700abd60_ffdfd80000000000_77f1247bea7eaff4_00001 -3eafeffff8000000_ca302000003fffff_c8f017effc37dffe_00001 -31fffc0000007ffe_41229ed1840a7ed0_33329c7da9da47fb_00001 -7ffc000000000000_c0da7f18d03da9b8_7ff8000000000000_00000 -7ffc000000000000_00203effffffffff_7ff8000000000000_00000 -401fffc00000003f_c11d4f929c6863da_c14d4f57fd432b42_00001 -400ffffffff8003e_3ca0000000000000_3cbffffffff8003e_00000 -3d0fffffbff7ffff_7ffc000000000000_7ff8000000000000_00000 -41d0003fffffffff_bc1ffffefdfffffe_be00003f7efdfbfd_00001 -c1effff800001fff_3ca0000000000001_be9ffff800002000_00001 -c7e944135d63f2dd_43ff7fffefffffff_cbf8df03034c5962_00001 -3ca0f7fffffffffe_b4bffffffff00000_b170f7fffff783fe_00001 -41f000000008001f_30700007fc000000_32700007fc080023_00001 -3ffd6b6052240005_3cafffffffffffff_3cbd6b6052240005_00001 -bfc02000000001ff_c00ffffeffffff7f_3fe01fff7f0001be_00001 -5580000000ffffee_3ff509df8fb64af0_558509df9106e8d2_00001 -7ffc000000000000_bcae035f6e1c25b3_7ff8000000000000_00000 -43d3ffffff000000_3caffffffffffffe_4093fffffeffffff_00001 -d533ffffffffffff_3cafffffffbffbff_d1f3ffffffd7fd7e_00001 -3ecab8eca9bb4c17_c0fd750edac542c0_bfd8995702b66277_00001 -befff8000000007f_40bfffffffffffff_bfcff8000000007e_00001 -b7f0008003ffffff_3fd0000000000000_b7d0008003ffffff_00000 -bfe156f8e2d95e99_434ffffff8000ffe_c34156f8de83a90a_00001 -c3c000000000001e_7fde00003fffffff_83ae000040000037_00001 -80261e35bfb76142_41cfffff0000fffe_82061e350ec66434_00001 -41effffdfffffff6_3fd0000000000001_41cffffdfffffff8_00001 -190294f45fbe164e_bf70000005fffffe_988294f466b5f1ef_00001 -7ffc000000000000_43dfff8004000000_7ff8000000000000_00000 -c1d1b3346b46a9eb_bfc003fffffffff0_41a1b7a138617b84_00001 -c1ed5aa8b5beebe6_3fdfffffffffffff_c1dd5aa8b5beebe5_00001 -434202ad5699be09_307fffffc0100000_33d202ad329d64b3_00001 -480007ffdffffffe_43eff08b0c1adb83_4c00004188dfe96b_00001 -2d70d3775ee02e3a_3fdffffffffffffe_2d60d3775ee02e39_00001 -bfeed9443f12e7c3_c03fffffe0000000_403ed9442039a384_00001 -43404007fffffffe_deff4f3947dd05b5_e24fcc85d4991db6_00001 -bf9fdfffffffffef_3fe3a38b61a3da9a_bf938fe7d64236b4_00001 -c3debfffffffffff_3fe0000000000000_c3cebfffffffffff_00000 -bcaffe0000000008_3fd00008000000ff_bc8ffe0fff000205_00001 -c05fffffefffefff_3fe8010ee8a17cd1_c058010edca0e95b_00001 -3e1f29626b9ddd18_30bfffdf80000000_2eef2942c595e7cc_00001 -3ffffeffffffeffe_3fe0000000000001_3feffefffffff000_00001 -66cefffffffffbff_bee1c34e00ecb06b_e5c1353390e548ae_00001 -7ffc000000000000_ba4dfffff8000000_7ff8000000000000_00000 -c1d427301514e081_3fd8800000000000_c1bedc01a047f7c5_00001 -d750100fffffffff_3fefffffffffffff_d750100ffffffffe_00001 -ffd00000000004fe_c7cffffffefffff0_07afffffff0009ec_00001 -bff0004000000001_3cbfffeffffffdff_bcc00037ffdfff00_00001 -404ffbfffffffffc_c34ffff8003fffff_c3affbf8013ff7fb_00001 -3fffffdfc0000000_3feffffffffffffe_3fffffdfbfffffff_00001 -43c000001dfffffe_3c00800001000000_3fd080001ff00000_00001 -3fefffffe2000000_478fdfff80000000_478fdfff621e0078_00000 -00200003fff00000_c8dffdfffffffff0_890ffe07ff6001ef_00001 -3d1dbffffffffffe_3ff0000000000000_3d1dbffffffffffe_00000 -401e89aca33806c9_381fc00007ffffff_384e4c99519401e4_00001 -403ffffffffffddf_31ce00001fffffff_321e00001ffffe01_00001 -c04ffc000000fffe_bfa3f7525558148b_4003f4d36b0e0942_00001 -434fffffffd00000_3ff0000000000001_434fffffffd00002_00001 -43e0000000000082_3db000003ffffeff_41a000003fffff82_00001 -bfcfffff00000040_fd561631baa43441_7d36163109f2a699_00001 -402fffff0000007f_3fffffffffffffff_403fffff0000007f_00001 -bfa0400010000000_c3f00010000003ff_43a040105000140f_00001 -c1600003fffffffd_43fbffffffffbffe_c56c0006ffffbff8_00001 -71deffffffbffffe_4060003e00000000_724f00781fbfff06_00001 -b0d000001fffffff_3ffffffffffffffe_b0e000001ffffffd_00001 -37effffffefffff0_4029001bf472f471_3829001bf3aaf385_00001 -3814000000000fff_37e0001fffeffffe_30040027ffec0ffd_00001 -41a0000010000000_f2a00020000007ff_f4500020100027ff_00001 -c1d004000ffffffe_4000000000000000_c1e004000ffffffe_00000 -be9dfffffffffffd_380afffffffffffe_b6b94ffffffffffb_00001 -bfb4717e76986740_47ffeffffdffffff_c7c46745b6160324_00001 -40e9f0ae10a42de6_c1df000000008000_c2d92128a01f7439_00001 -0010000002000001_4000000000000001_0020000002000003_00001 -320ff7fffffffc00_7fe0001000000006_71fff81ff7fffc0c_00001 -425fffffcfffffff_41dffffbf7fffffe_444ffffbc800060a_00001 -4ff0fffffffdfffe_d930000001000fff_e9310000010e10fc_00001 -be500000004001ff_400fffffffffffff_be700000004001fe_00001 -3fe0380000000000_41affffffdfffc00_41a037fffefc7df9_00000 -c00fffffc000007e_c02ffffdfffffbff_404ffffdc000007e_00001 -3fcfffffffffffff_bcaffffffefffbff_bc8ffffffefffbfe_00001 -e9500000003ff7ff_400ffffffffffffe_e9700000003ff7fd_00001 -37f74d312c9c12e6_c59138b471d0b5f9_bd99149935ac4c00_00001 -6b10000007ffffe0_b84ffffffffdffde_e370000007feffce_00001 -3f8fff00001fffff_bfd00000201fffff_bf6fff00405dfdfd_00001 -362fc7fffffffffe_4010000000000000_364fc7fffffffffe_00000 -550c000000000003_c03fffff7ffffeff_d55bffff8fffff22_00001 -c1dff8000000007f_7ffc000000000000_7ff8000000000000_00000 -bfe0001ffffffeff_bfe008000000ffff_3fd008201000ff00_00001 -409dfffbffffffff_4010000000000001_40bdfffc00000001_00001 -43ec69813b94d362_bcaffffffaffffff_c0ac69813724572f_00001 -475703a683fd6399_d6d0000000003000_de3703a683fda8a3_00001 -390ffffffffe0006_479800000000007e_40b7fffffffe8083_00001 -381303276ef23657_c4f0000000000efe_bd1303276ef24827_00001 -3fe00000000f0000_55ffdffffffffffc_55efe000001de1fc_00001 -367000100001fffe_4340000007ffffee_39c00010080207ed_00001 -c1fbfffffffdffff_401ffffffffffffe_c22bfffffffdfffd_00001 -407080fd3d82dc9d_c3c00000fdffffff_c44080fe438290cc_00001 -3ca3b763df2216f1_bd50000000003ffb_ba03b763df2265c8_00001 -c120000003ffffe0_c06000fffbffffff_4190010000003fde_00001 -001003fffffffffd_4340000000000000_036003fffffffffd_00000 -3b10000000807ffe_be1fffff8000000f_b93fffff81010006_00001 -3ffb9699df82c260_480ecff57c220532_481a907a18f76c15_00001 -b10a400da0daec23_c66ffbffbffffffe_378a3cc56aa6b583_00001 -77efff7fbfffffff_4340000000000001_7b3fff7fc0000001_00001 -fc4ffffffffe00ff_c80583e64223c02f_046583e64222689d_00001 -4035c0011a5256f5_403bb950bcc2c81f_4082d7f5d4e4d1ba_00001 -bfd000800000007f_463ffff7fffbffff_c620007bffde006e_00001 -4026684586bcc03f_434fffffffffffff_4386684586bcc03f_00001 -3fd1f7ffffffffff_c01000001dffffff_bff1f80021b0fffd_00001 -b06fffffffffdeff_bcafdfffff7fffff_2d2fdfffff7fdf20_00001 -bfd0040000000007_41f00000000009ff_c1d0040000000a08_00001 -c1d02cdfc07b7411_434ffffffffffffe_c5302cdfc07b740f_00001 -3fd3ffdffffffffe_c1f001fdffffffff_c1d4025d7c03fffc_00001 -ffefffffffe0000e_3c6db11b9ddefb5e_fc6db11b9dc14a4f_00001 -391bfffffffffff6_7ffc000000000000_7ff8000000000000_00000 -c010000fffffbffe_7fe0000000000000_8000000000000000_00011 -c0000ffffdffffff_41fdeffffffffffe_c20e0deffc41fffc_00001 -9ffa2f3964887701_7ffc000000000000_7ff8000000000000_00000 -2e0fefdfffffffff_4030000020000040_2e4fefe03fdfc07f_00001 -bf743e9d43f80c40_7fe0000000000001_ff643e9d43f80c41_00001 -c1e00007f0000000_21bffffffff01000_a3b00007eff807fc_00001 -ffd0000017fffffe_c1f000ffffffc000_01d0010018013ffe_00001 -c1e0000080010000_079fffffeeffffff_899000007780ffbb_00001 -1feffffffffc003e_7fefffffffffffff_5feffffffffc003e_00001 -c3efefffffffdfff_3f90100000000004_c39007f7ffffeff3_00001 -c3effffff7e00000_3d9ffffdfffff7ff_c19ffffdf7dff881_00001 -c1f00d875c7ed339_55400003fffffffc_d7400d8b5fe0aa54_00001 -401fffdff7ffffff_7feffffffffffffe_001fffdff7fffffe_00001 -43c0000803ffffff_3fcfffffffffffff_43a0000803ffffff_00001 -bee00000000007f0_4030453834d7a591_bf20453834d7ada3_00001 -bfc0001fffffff00_c170000380000000_414000238006ff00_00001 -bfe0077fffffffff_7ff0000000000000_ffe0077fffffffff_00000 -8a9fffffffffffff_7fe0000000001080_ca9000000000107f_00001 -be7aba21defbaa50_fc3fffffffffffff_7acaba21defbaa50_00001 -47f0000ffffdffff_3fbfff0000000006_47bfff1ffefc0025_00001 -bf5ffff7fe000000_7ffc000000000000_7ff8000000000000_00000 -38f0100000007ffe_41e0000001010000_3ae01000010280ff_00001 -3ffffffffffffff2_3faffff8000007ff_3fbffff8000007f2_00001 -c0afffffbffffdfe_3fc07ffdffffffff_c0807ffddf0002f5_00001 -093fff7f7ffffffe_7ffc000000000000_7ff8000000000000_00000 -3fb8ed736b185958_43f07dac22ee32d4_43b9b13eafd17761_00001 -4315932d1fc6bca5_bfe00000047ffffe_c305932d25d82153_00001 -bfdfffff1fffffff_c00aab60f8ca27b4_3ffaab603e1a80e6_00001 -3800003fdfffffff_7ffc000000000000_7ff8000000000000_00000 -47f9dcc0dc84790c_bfd001ffffffffc0_c7d9dffc74a00933_00001 -ae6fff800000007e_c08787cf0c729bb6_2f078770ed366a49_00001 -c01000001000000e_bdbfffffdfffdffe_3ddfffffffffdffa_00001 -001fffffefff0000_8000000000000000_0000000000000000_00000 -c0fffffffeffffee_55139bb9349e058c_d6239bb9340127b7_00001 -b7ef7fffffe00000_c3e1db16103a3e46_3be193a9b7e77a37_00001 -bca000000008007e_3810000000000880_b4c00000000808fe_00001 -406ff7fffff7ffff_c03000020001ffff_c0aff803fefbfefc_00001 -41fffffc0fffffff_bff125048d9f0538_c20125027190f5ca_00001 -40101ffbffffffff_4030000001fffbff_40501ffc0203fb76_00001 -3fc71922783e2606_5ebfffffffffb7ff_5e971922783df20d_00001 -4805e01bec624433_bebfffe003fffffe_c6d5e0060f025b4c_00001 -bfe000fffdffffff_b5ffffc007fffffe_35f000e0000043fe_00001 -5b70007f80000000_c3cfffffffeff7ff_df50007f7ff7fbbf_00001 -41ffdbaf18ce06bd_8010000000000000_821fdbaf18ce06bd_00000 -c0dfff77ffffffff_bcff8b0a27d3ea94_3def8a8418e8c14f_00001 -40785ec8540ee022_402fffffffffffff_40b85ec8540ee022_00001 -c03fffdfff7ffffe_3ffffffbfffffffe_c04fffdbff84000c_00001 -c3fbba85b3184d07_8010000000000001_041bba85b3184d09_00001 -4a3ccc699c427a3d_4000002003ffffff_4a4ccca33c48cd28_00001 -4c3002003fffffff_40dffffff0ffffff_4d200200387f0fe1_00001 -d5803ffffffffffc_400fffffffffdfff_d5a03fffffffefbb_00001 -7ffc000000000000_c80fffffffffffd6_7ff8000000000000_00000 -c346e93e17d2b781_415fffffffa00000_c4b6e93e178dfbc6_00001 -c0e1000000080000_801ffffffffffffe_011100000007ffff_00001 -b01fffff8003ffff_41e1107888e2300a_b211107844a26ff4_00001 -3fefffffffff000e_c034a2b24bab636b_c034a2b24baabe5e_00001 -39e003ffffffffbf_3e504000000001ff_38404410000001be_00001 -3fa1ffff7fffffff_bca0000000000000_bc51ffff7fffffff_00000 -c1cffffffe000003_bd1eb76580b25d59_3efeb7657ec6e704_00001 -bfc000200003fffe_bb70007fbffffffe_3b40009fc103801c_00001 -401f003fffffffff_bfe8d71166319ab9_c018108a8922da45_00001 -3d6fde0000000000_bca0000000000001_ba1fde0000000001_00001 -403c2c5a3b9bb39e_b7efffdffffff000_b83c2c3e0f4169ec_00001 -3fbffffff0000007_c807dfffffffffff_c7d7dffff4100004_00001 -c1f007ffffffffff_41efffffffbffff6_c3f007ffffdfeff9_00001 -40205fffffffffff_bcafffffffffffff_bce05ffffffffffe_00001 -41f0220000000000_c3afffffbf800000_c5b021ffdf7b7800_00000 -3fb000001fffffc0_41d0804000000000_4190804021007fbe_00001 -c1d00010007ffffe_0bd0200ffffffffe_8db020202091007b_00001 -47203fffffffff7e_bcaffffffffffffe_c3e03fffffffff7c_00001 -3fba29d8ba0da6e3_894fff7fc0000000_891a296fde570d38_00001 -37eee003376d4ca7_bd381ffffffffffe_b53746e26cc966c7_00001 -7ffc000000000000_3ca0000400000100_7ff8000000000000_00000 -c357b53537b96da5_bfd0000000000000_4337b53537b96da5_00000 -3bc00000fffff000_b81000001ffffff7_b3e000011ffff1f6_00001 -3fbfff3fffffffff_b7fc000000000006_b7cbff5800000005_00001 -3fd12a08d1862ac2_e6000000000003f6_e5e12a08d1862f01_00001 -3caffdfdffffffff_bfd0000000000001_bc8ffdfe00000000_00001 -c50c00000003ffff_480004003fffffff_cd1c0700700400fd_00001 -c1effffbffffbfff_39a0007000000000_bba0006dfff1dffe_00001 -c02ffffff807fffe_bff7fe641162987a_4037fe640b68ff0e_00001 -400fffff00400000_bfdfffffffffffff_bfffffff003fffff_00001 -3f3007ffc0000000_434fffffdffffffa_429007ffaff8003d_00001 -401fffffffffffff_ffebff8000000000_801bff7fffffffff_00001 -3feff000003fffff_4db0000ffffffffa_4daff01ff0400034_00001 -bff3fffffeffffff_bfdffffffffffffe_3fe3fffffefffffe_00001 -41d400000000000f_406ec0bcf0b3df6c_4253387616706bb2_00001 -0d5f7fefffffffff_47ec8d501c4f76b7_155c1b0c95362ab4_00001 -4440f00000000000_bd8c00ffffffffff_c1dda50efffffffe_00001 -37ebffffffdffffe_bfe0000000000000_b7dbffffffdffffe_00000 -37efe7ffffffffff_44040e69405ca472_3c03ff5e716c5ef7_00001 -43f25bca4820614e_b7e4000000000006_bbe6f2bcda2879a8_00001 -3fd0000000000004_318c8fccd5b02d23_316c8fccd5b02d2b_00001 -c7eff77bf2b59c3c_bfe0000000000001_47dff77bf2b59c3e_00001 -4000000210000000_43c00103ffffffff_43d00106102183ff_00001 -401100007fffffff_c3dffffc0000003f_c400fffe5ffff020_00001 -41ffffffff9fffff_c060000003ffffef_c270000003cfffee_00001 -7ffc000000000000_bfefffffffffffff_7ff8000000000000_00000 -c00d37e1e0c4506a_3f8ffffffff801ff_bfad37e1e0bd0444_00001 -3f240001ffffffff_c1cff8000003fffe_c103fb01ff827ffe_00001 -434000000ff7ffff_bfdffffbdfffffff_c32ffffbffeffbdf_00001 -002e000fffffffff_bfeffffffffffffe_802e000ffffffffd_00001 -bfc000000fefffff_3fb54faffd79cc78_bf854fb012b42cc4_00001 -380c3f72cc3dec98_c3fffffffbffffff_bc1c3f72c8b5fe3d_00001 -3caebfd21432f7f8_bff0000000000000_bcaebfd21432f7f8_00000 -802fffdffeffffff_4047cb0f60814953_8087caf794b39055_00001 -43e1001000000000_37f20000003fffff_3be320120044003f_00001 -b5bffffffc1fffff_bff0000000000001_35bffffffc200001_00001 -45cfdffffffbffff_37e00000007fbffe_3dbfe00000fa807c_00001 -c02fffffffffffe2_972f800000003fff_176f800000003fe2_00001 -4800003fffbffffe_41b000fffffffffb_49c0014003bffbf9_00001 -7fee4b562439ed33_bfffffffffffffff_ffefffffffffffff_00101 -480ffffffc000020_4094000000001ffe_48b3fffffd802012_00001 -b8e0000003fbffff_c503f4d44f4bf888_3df3f4d454443066_00001 -381ffffdfffdfffe_41e2c2cc4e128c3c_3a12c2cb21e49b2d_00001 -002d08b65157014a_bffffffffffffffe_803d08b651570148_00001 -7fd00fffffff7ffe_bfe2000100000000_ffc2120100ff6ffd_00001 -bf090b74581d0095_c340101fffffffff_425924b1e35dcdcf_00001 -c02fbffffff7ffff_41f35be73c03f148_c233352f6d87126b_00001 -3e78df1020787b47_c000000000000000_be88df1020787b47_00000 -3fcffffff8000ffe_db60037fffffffff_db40037ffbff27ff_00001 -c00fffeff7ffffff_366ffffffeffffbe_b68fffeff700003d_00001 -b9960804588bf278_c0dfffefffff0000_3a8607f9548915f2_00001 -3f3ffffc001fffff_c000000000000001_bf4ffffc00200000_00001 -182fffffffffffc0_3fe00000001fffff_18200000001fffdf_00001 -3f10000000000400_47fffffffdffffff_471ffffffe0007ff_00001 -c1c40000000003ff_bc10000000000ffe_3de40000000017fd_00001 -3f300ffff7fffffe_c00fffffffffffff_bf500ffff7fffffd_00001 -b800000200000400_2f9fffffffdffffd_a7b00001fff003fc_00001 -bf50000000100fff_c865677a07e9dbac_47c5677a07ff588d_00001 -b7f000000000013e_3ff0000000002010_b7f000000000214e_00001 -4800203fffffffff_c00ffffffffffffe_c820203ffffffffd_00001 -403bfffbffffffff_bfc00000ffffff00_c00bfffdbfffbe3f_00001 -c340002000004000_c0db3367e0423019_442b339e47125d6b_00001 -c037ff8000000000_c010000000000000_4057ff8000000000_00000 -42c0010000080000_3cd45a0cb459b7b5_3fa45b52552f2a57_00001 -ffdffc0080000000_3fefffffff7fe000_ffdffc007f7ff001_00001 -41d0000000000060_3e3a83b1571e2cf8_401a83b1571e2d98_00001 -ffe00000000002ff_c010000000000001_0000000000000000_00011 -b7e7e7cc88b1f290_c3f2ac81d4039f01_3bebe683ea2b7707_00001 -7ef1fffdffffffff_3f8ff7ffffffdfff_7e91fb7e007fedff_00001 -c06fefffffe00000_7ffc000000000000_7ff8000000000000_00000 -4801000000000fff_c01fffffffffffff_c831000000000ffe_00001 -4f60000801ffffff_41c07fe000000000_51307fe841fffbff_00001 -40faeed5df2a2899_400000ffffefffff_410af084cc6d2c64_00001 -47f90f3fcc527003_c7e01fffbfffffff_cfe9415de7ae15b0_00001 -403fffe000000006_c01ffffffffffffe_c06fffe000000004_00001 -bfe0000020003ffe_bc1ffddfffffffff_3c0ffde03ffc3ff3_00001 -380ff7ffffffefff_d00fff00000000fe_c82ff7003ffff0fd_00001 -380ffffffffc007e_c340000000000000_bb5ffffffffc007e_00000 -2310800003ffffff_661000ffffefffff_4930810803efbffe_00001 -4340004000020000_44c00000008001ff_4810004000820400_00001 -3f3fffe00001ffff_c02008000000ffff_bf7007eff802007d_00001 -c1ffffffbfefffff_c340000000000001_454fffffbff00001_00001 -41d000400000003f_c1dfbfffe0000000_c3bfc07edfff807d_00001 -bfc000020000001f_bfa00800000007fe_3f7008020100081e_00001 -cd5fffffffffe1ff_4dbd2735bcda9589_db2d2735bcda7a33_00001 -c3effffff7ffefff_c34fffffffffffff_474ffffff7ffefff_00001 -3f98000000007fff_41d3af2126b9069b_417d86b1ba162761_00001 -3fc0000fffdfffff_c017d02e9840c356_bfe7d046683fbb38_00001 -c55048c1a2236a7e_bfbffe0001ffffff_452047bd170dd461_00001 -c7ffc0000000003f_c34ffffffffffffe_4b5fc0000000003e_00001 -c002d09cd8fe7e49_c27ff7fbffffffff_4292cbe657b4a38a_00001 -404fff7fffffff7f_48ab7e2aad4ec686_490b7dbcb4a410dd_00001 -3cdbf00000000000_43dffffddffffffe_40cbeffe250fffff_00001 -c35bffffffefffff_ffe0000000000000_034bffffffefffff_00000 -c3fffff5fffffffe_37e910297c4564f4_bbf91021a7386e1c_00001 -995000801fffffff_bfc600a072f928fd_19260150a3fe01ab_00001 -c7fc95c1023be015_38000001fffff7ff_c00c95c494f3f20f_00001 -1250000fbffffffe_ffe0000000000001_d240000fbfffffff_00001 -3f80000003ffffef_40cffffffffdfffe_4060000003feffee_00001 -4806199091f39a3e_3a54f1e8abc46a10_426cee1727f7af20_00001 -401fe00000000000_c3cab4ec3fa6d4eb_c3fa9a3753672e16_00001 -7ffc000000000000_ffefffffffffffff_7ff8000000000000_00000 -38a314b3956389c2_41e4554078c1c962_3a983f8b5796bf4d_00001 -402f800000001ffe_449000ffffe00000_44cf81f7ffc12000_00001 -c1cffffe001ffffe_ffeffffffffffffe_01cffffe001ffffd_00001 -3c00400000000fff_41dfffffbff7ffff_3df03fffdf7bffff_00001 -cbc0001ff7fffffe_d1c2000000001fff_5d920023f7001ffd_00001 -bfcffc1fffffffff_fff0000000000000_7fcffc1fffffffff_00000 -3fafffffffffff0f_c3dffe0400000000_c39ffe03ffffff0f_00001 -c02fffffffffffdd_41ffffffffe7ffff_c23fffffffe7ffdc_00001 -c1c0000003ffffc0_c00fbfffbffffffe_41dfbfffc7efff70_00001 -41e189ea1a6fff97_7ffc000000000000_7ff8000000000000_00000 -bf00000000017fff_402000000017ffff_bf30000000197ffe_00001 -c1cffffffffffffe_c7f03fffff7ffffe_49d03fffff7ffffd_00001 -43d4000000000020_cb9000007ffeffff_cf7400009ffec01e_00001 -3fd4000000000040_7ffc000000000000_7ff8000000000000_00000 -41deeffffffffffe_408096dfffe807a5_427009dd8fe8d363_00001 -d40fffffffefefff_4020000000001ffb_d43ffffffff02ff4_00001 -285fffffb0000000_bcc07ffffbffffff_a5307fffd2c00009_00001 -41dba3c9edc2d856_7ffc000000000000_7ff8000000000000_00000 -c0231e85f8945a25_bf9ffffffff04000_3fd31e85f88af120_00001 -3ff0ee9046c9330f_8479e1e79766e02b_847b63d14ff91acb_00001 -3800000000008002_c34fff800ffffffe_bb5fff801000fffe_00001 -bff00010001ffffe_0000000000000000_0000000000000000_00000 -324824baaf05e670_c02f1d6d391cd812_b28779c88aef6872_00001 -c3ce25f5756217be_beb8de9767c61bc6_42976e2e13caff56_00001 -bec0fffffffffffd_bff000fffbfffffe_3ec1010ffbbffffb_00001 -509ffff800000040_bf800002007fffff_d02ffffc00fefffe_00001 -408fffffffffffff_5f8fbcc496d14669_602fbcc496d14669_00001 -4010002000000006_5e9ffc001fffffff_5ebffc401800400b_00001 -3987fed51dcf1c87_bfb5383498e99ecc_b94fd2c2829010f7_00001 -d2f805130a8c11df_43effffdfdfffffe_d6f8051188ba9004_00001 -a66000000008ffff_b5f63e97ef44abfa_1c663e97ef512f2f_00001 -ffd08000fffffffe_c2e50f943cb3415f_02c5b8122f921f33_00001 -3ca03ffbffffffff_cd52199e0ff31aad_ca02620001cb6319_00001 -402ffffffe07ffff_0010000000000000_004ffffffe07ffff_00000 -361ffffffffffdfb_40451c57126e71b1_36751c57126e705c_00001 -be2fefffffffffff_b81ffffffffffffe_365feffffffffffe_00001 -c80fffffffbfff7f_4b2fffff800001ff_d34fffff7fc0017f_00001 -ba7dffffffffdfff_40138c01af69c4ee_baa2534194731512_00001 -3a90000001020000_c1cffffffffc000f_bc70000001000007_00001 -4f1fffbfffe00000_bcd02000000007ff_cc001fdfbfefe7fe_00001 -bfe0007ffffffeff_001fffffffffffff_8010007ffffffefe_00001 -4047ec41418542a9_bca07e0000000000_bcf8a8a5c3693c15_00001 -3ca0200000000100_c1c00000000ffffd_be702000001020fc_00001 -422007ffffffffff_43dfffff00000003_461007ff7fc00001_00001 -40dfe000003fffff_001ffffffffffffe_010fe000003ffffe_00001 -c02d53f3e871e98f_402000000003f7fe_c05d53f3e8792fde_00001 -41f0000000007bfe_43c07fff80000000_45c07fff80007fde_00001 -abfff80000ffffff_3ca0000000000000_a8aff80000ffffff_00000 -802fffffffffffbf_400ffff7ffffff7f_804ffff7ffffff3e_00001 -be70000077ffffff_c1efffffffffffff_4070000077ffffff_00001 -c1900000000ffff6_c0100000207fffff_41b00000208ffff6_00001 -3ff00000007ffffc_3ca0000000000001_3ca00000007ffffe_00001 -d3ad0f91e5202b24_948ff7fffffffdfe_284d084e00a6e147_00001 -434dfe591d17f337_3801fffffffefffe_3b60df12205c88db_00001 -41e3fffffbfffffe_c3e20000000007ff_c5d67ffffb8009fc_00001 -3549284c3d5f3c48_3cafffffffffffff_3209284c3d5f3c48_00001 -bc1fffdbfffffffe_ffe8492804aa9910_7c18490cb25d93cf_00001 -378fff7fffbfffff_c1f0000000200007_b98fff7fffffff0c_00001 -3fcffffffeffffe0_41300023fffffffe_41100023ff7ffece_00001 -41e1ffffbffffffe_3caffffffffffffe_3ea1ffffbffffffd_00001 -c1ede88c6af5824c_3fdfffff82000000_c1dde88bf531d966_00001 -b81fc00000003ffe_9b07b63efeb2a5b1_133786d280b56fd1_00001 -03909fc2a7ba5daf_3fd0000000000000_03709fc2a7ba5daf_00000 -41cfffbfffffff00_bfc454db14a7766b_c1a454b26af14c79_00001 -2bd2309c71f3442c_43d0000000000009_2fb2309c71f34437_00001 -b81fffffff080000_e6a07fffffff7fff_5ed07fffff7fa000_00001 -c05622dd78e30c7a_3fd0000000000001_c03622dd78e30c7b_00001 -19ba5c173102efbd_c56000000047fffe_9f2a5c1731798e22_00001 -c1e007fffffdffff_36ffffff80008000_b8f007ffbfde401f_00001 -3bbd976272fb1d2a_c06ffff80007fffe_bc3d975b0d29e641_00001 -bfdffffffff00000_3fdfffffffffffff_bfcfffffffefffff_00001 -47ef7ffffffeffff_3f60001fffffffef_475f803efffeffdc_00001 -262fefbfffffffff_7ffc000000000000_7ff8000000000000_00000 -bcafffc007fffffe_bfdffffefffffffe_3c9fffbf0801ffbd_00001 -c3a0000000007ff0_3fdffffffffffffe_c390000000007fee_00001 -bfd00001fffffc00_c1620001fffffffe_4142000440003b7e_00001 -c01100003fffffff_c80ffffefffffbff_4830ffffb7fffbdf_00001 -3ff00000000077fe_b90000000f000000_b90000000f0077fe_00001 -bcac3a797cd8e4f5_3fe0000000000000_bc9c3a797cd8e4f5_00000 -434fff01ffffffff_403dfeffffffffff_439dfe11e7efffff_00001 -c00fffffffc003ff_c03fffffc03ffffe_405fffffc00003fe_00001 -a2d32b1c7c92b19f_3fe0000000000001_a2c32b1c7c92b1a0_00001 -a640000043ffffff_41f00000000fff80_a8400000440fff7f_00001 -3fead93e15f6bba8_41c5006a9bd9854b_41c19eea30ca59a5_00001 -37efffffffff801e_aebffffffffe7fff_a6bffffffffe001d_00001 -3ff0000000107fff_3fefffffffffffff_3ff0000000107fff_00001 -84bffffff0ffffff_3c100040003ffffe_80e0003ff8bfe1fd_00001 -c7f0000007ffffee_bf97fffffbfffffe_4798000007ffffe2_00001 -7dc216346ad00be1_bfb5d37af4d918a8_fd88ac349d895e09_00001 -be6fff7fffffffff_3feffffffffffffe_be6fff7ffffffffd_00001 -bff00000000002ff_3e4b497c09187baf_be4b497c091880cb_00001 -c00ffbffffffbfff_40e000000201ffff_c0fffc0004033f7d_00001 -21f3fe0000000000_bfa7bdef23c7089e_a1adaa732ed451e4_00001 -c0ecb0cf56c6bd69_3ff0000000000000_c0ecb0cf56c6bd69_00000 -c02565653da65c70_402fff7fffeffffe_c065650fa806b322_00001 -43c0004000000003_4eb48be91251fe77_52848c3b41f647c3_00001 -c003310bd2998fff_41e00ff800000000_c1f3443345e64042_00001 -c1dfffdfdfffffff_3ff0000000000001_c1dfffdfe0000000_00001 -c0007a0c6d7de4fd_4e1000400000003e_ce207a4e55af9b34_00001 -41d007ff80000000_41f0fffffffc0000_43d1087f77fbfe01_00001 -c3d0040040000000_3fffffffffffffff_c3e004003fffffff_00001 -3f403ff7ffffffff_3fb911d8e2d1a307_3f097613bd707829_00001 -274fffdffdffffff_c1cff8000000007f_a92ff7e00600807d_00001 -31f2102fde21571e_bf67ffffffff7ffe_b16b1847cd317229_00001 -bff50c7f8469cefb_3ffffffffffffffe_c0050c7f8469cef9_00001 -43dbffffdfffffff_7fefff07fffffffe_03dbff26e000f7fe_00001 -7fdd0802349a67aa_7730000000017fff_371d0802349d2069_00001 -46e0000001fff000_b8007ffdfffffffe_bef07ffe020fef3e_00001 -c56fffffffff7fbf_4000000000000000_c57fffffffff7fbf_00000 -ffeef7a206029708_bdcfa4109a3a5b22_7dce9eaa2542875b_00001 -3fbffffdffffff00_3e2f419626e39c29_3dff419432ca38c1_00001 -43f7dcd3b83b1a38_7fded222c26e4b3d_03e6fbb995be62f0_00001 -a40fc000001ffffe_4000000000000001_a41fc000001fffff_00001 -c0a000000000023f_001bf55a98315677_80cbf55a98315a63_00001 -c802c57786e11b88_402007ffffeffffe_c832ceda4291c69b_00001 -4740000fe0000000_bf5fffffffffdfbf_c6b0000fdfffefdf_00001 -3b50004000040000_400fffffffffffff_3b70004000040000_00001 -fa5fffffffe01ffe_08e4b85713fba238_c354b85713e6fe97_00001 -c3f00800007fffff_3fa6e616c4e16784_c3a6f189d0fb08ec_00001 -3b6ffffffeffffc0_3c7ffffe003ffffe_37fffffdff3fffce_00001 -c0200001fffffbff_400ffffffffffffe_c0400001fffffbfd_00001 -b7e000801ffffffe_376fffffffbfffde_af6000801fdffeec_00001 -bc7c1babdee0743a_7ffc000000000000_7ff8000000000000_00000 -c03fc00000100000_43efdfffffffdffe_c43fa040000fd03e_00001 -434ff7ffffffefff_4010000000000000_436ff7ffffffefff_00000 -2b8a7a8d3c728052_bfa86acb62809317_ab4434482c1fc770_00001 -37e00002000007fe_ffd0008000002000_f7c00082001027fe_00001 -b7ed16be78e120f8_b97fffffffffff9e_317d16be78e1209f_00001 -bfffefffffffff7f_4010000000000001_c01fefffffffff80_00001 -c1d1ffffffbfffff_bfcffffefffff800_41b1ffff6fbffb82_00001 -40a0ffffbfffffff_c80fffffbffffdff_c8c0ffff9dffff6e_00001 -c019377796930508_cf2fffe00007fffe_4f59375e5f21bc52_00001 -3ff006ffffffffff_401fffffffffffff_402006ffffffffff_00001 -43effffdffffdfff_00201fffffffbfff_04201ffefdffafdf_00001 -40107fffffff0000_480ffffffff80003_48307ffffffae002_00001 -43ffc03fffffffff_bffc89ceeec323b9_c40c50f464837af6_00001 -c03847d851769ff3_401ffffffffffffe_c06847d851769ff1_00001 -c7e4cc95b36f21a4_4340000000000000_cb34cc95b36f21a4_00000 -d79f98b4522b366f_3ff0000001010000_d79f98b45426bb3f_00001 -2030000000000090_c05e2e90015c47a1_a09e2e90015c48b0_00001 -380ffff800000000_3fd001fffffff800_37f001fbff7ff801_00001 -bfbfff9fffffffff_4340000000000001_c30fffa000000000_00001 -44dc65e5d161d8f2_7fda6d3e1bb162b2_04c773bceef1605c_00001 -c7f0000007fffeff_43ed0d6b02dfccdb_cbed0d6b11668089_00001 -c7f0000000000a00_434fffffffffffff_cb500000000009ff_00001 -406d4a7b7029484b_c1cfffdfffe00000_c24d4a5e25908da6_00001 -401ffdffffffffde_407ffffffffdffef_40affdfffffdffee_00001 -47efdd469e302de0_b80000000080001e_bfffdd469f2f1850_00001 -c1dfffbffc000000_434ffffffffffffe_c53fffbffbfffffe_00001 -bbf000000007efff_001fe0000007fffe_fc1fe0000017d01c_00001 -43fffffc00100000_c0171459ccff2c1a_c4271456ea7f7ca7_00001 -7ffc000000000000_404ffeffffffdfff_7ff8000000000000_00000 -1d34898549e35148_7fe0000000000000_5d24898549e35148_00000 -c079c96edc9a6761_c1c010007ffffffe_4249e33919c278aa_00001 -3fe04390701a9d8d_32980a64e11ad16b_32886fe96d861b6f_00001 -c7ec000008000000_4020200001ffffff_c81c38000b8fffff_00001 -43cf77ffffffffff_7fe0000000000001_03bf780000000001_00001 -c1dfffffb7fffffe_bf35a1c5c5463803_4125a1c5949a3b06_00001 -4340607d2db01f47_c7effffc00007ffe_cb40607b21a0bb11_00001 -41cae866712069f4_c02fffffffffffff_c20ae866712069f3_00001 -ac6bfffffeffffff_7fefffffffffffff_ec6bfffffefffffe_00001 -c050000000000006_41e0000001000000_c240000001000006_00001 -412fd11c7ab3b025_c3fffbfffbfffffe_c53fcd22532a361d_00001 -7fd83ef8d8c91fd9_20a65e11c2d9c573_6090f291851e0d23_00001 -3fe2ad625e1082e2_7feffffffffffffe_7fe2ad625e1082e1_00001 -4083fffffffffeff_381d4e791b603cf5_38b2510bb11c252e_00001 -402000020000003f_43ffefffc0000000_442ff003bdfff87e_00001 -c02fffc7fffffffe_43d0008000000800_c4100063ff2007fe_00001 -b80000001001ffff_7ff0000000000000_f80000001001ffff_00000 -bfce1e32ccf56348_3ca1f66d4c8eeef3_bc80e7fa025544da_00001 -e6ffffffbfffffff_41d000000005ffff_e8dfffffc00bfffc_00001 -b7fffeffbfffffff_2e8ffffc0003ffff_a69ffefbc02407dd_00001 -3fb000007ffffc00_7ffc000000000000_7ff8000000000000_00000 -bcaffffbffffff7f_bf5000ffffffdffe_3c1000fdffdfdfbe_00001 -c3400008000001ff_4020000fff7ffffe_c3700017ff8801bd_00001 -442ff0000000000f_38100000001ffffc_3c4ff000003fe008_00001 -3fc0001ffffff000_7ffc000000000000_7ff8000000000000_00000 -bffbaf4aab76937a_400004003ffffffe_c00bb636ecde9bc9_00001 -47e099d3c7690936_b17ffdffffffffff_b97098ca2a2c92a4_00001 -ffedfffff0000000_ffeffff000000800_3fedfff0f0000f80_00001 -3fdffffffffbfffd_7ffc000000000000_7ff8000000000000_00000 -d74ffdfffffffffe_41e020001ffffffe_d9401efe1ffdfffc_00001 -bd4512fd478e497e_bc0886e981ed2f8d_39602717421b4cf4_00001 -bf1000000007fff0_381400000000ffff_b7340000000affeb_00001 -c3d0bc37284221aa_8000000000000000_0000000000000000_00000 -bfbf0000000001ff_403f8f9584adf87e_c00e9318d8888ab2_00001 -41e0400000000001_bca0000000010ffe_be9040000001143e_00001 -c008164611e5d5a7_802fffdfffffdfff_0048162dfb9fabab_00001 -95c40000000000ff_c07103ffffffffff_164545000000010e_00001 -37effffc3ffffffe_bca0fffffffffffd_b4a0fffe01fffffb_00001 -a2900000009fffff_b8c85070bbd9c196_1b685070bccce5fc_00001 -c1ee1fffffffffff_4110000003dfffff_c30e2000074bbffd_00001 -3ffffffffc200000_6b9fffffffdfffe0_6baffffffbffffe1_00001 -bfe3e01e845582e7_b6c009ffffffffff_36b3ec8a97683858_00001 -40568df4bf71d4de_41dffeffffffff7f_42468d404fcbd8f5_00001 -b7e0004000001fff_ecb0008000000007_64a000c002002008_00001 -c0386508df251ee3_8010000000000000_00586508df251ee3_00000 -7fd003ffffffffff_41c007fffffbffff_01a00c01fffbfefe_00001 -403fffdfffffff00_db02020000000000_db5201edfdffff6f_00001 -bc950a021bf9dee1_3db0001fffdffffe_ba550a2c2fd402cd_00001 -41c0400000000007_8010000000000001_81e0400000000008_00001 -3e90007ffffffdff_4263a6b86ea9d367_4103a755a46d4640_00001 -c000000001008000_3fafff8000200000_bfbfff800220f7fc_00001 -c01ffffffefffdff_384ffff800100000_b87ffff7ff0ffe3f_00001 -c7eb8b600079a271_801fffffffffffff_081b8b600079a271_00001 -4001ffffffffffff_c6d00003fffffbff_c6e200047ffffb7d_00001 -c01fd3d6f52fa881_2c3fffeff7ffffff_ac6fd3c7034f382a_00001 -2e3403fffffffffe_c7fffffeffffffbf_b64403ff5fdfffd5_00001 -47efffffffffefc0_18b03fffffffffff_20b03ffffffff7bf_00001 -fd4fffffdfffffef_41cffffdffffffef_ff2ffffde00001de_00001 -4a0ff80000800000_c3403f829e8acc09_cd603b72be242760_00001 -c7e0010000003fff_bca0000000000000_4490010000003fff_00000 -3f7e00003fffffff_403ffffffdfbffff_3fce00003e1c3ffb_00001 -40100010007fffff_b7e00001ffffffff_b80000120082000d_00001 -7c8ffffffbffffbf_bfe1ff8000000000_fc81ff7ffdc00fdb_00001 -418ffffe0fffffff_bca0000000000001_be3ffffe10000000_00001 -43cb7d45e24373f9_bf559488d625deb3_c33289cecc120933_00001 -3fe0000100ffffff_c03ffffffffef7ff_c030000100ff7bfe_00001 -bcafffffffffff82_c1e001000000003f_3ea0010000000000_00001 -bfc00000004007ff_bcafffffffffffff_3c800000004007ff_00001 -7ffc000000000000_7ffc000000000000_7ff8000000000000_00000 -37ee08352ef09dd4_2604d5494204c82f_1e038d4ca00591eb_00001 -b80f00ffffffffff_401ffffffff800ff_b83f00fffff840b6_00001 -32bfffffffff0002_bcaffffffffffffe_af7fffffffff0000_00001 -434fffffffbffeff_c34fffffdffffff0_c6afffffdfbffeef_00001 -7fdffffdfdffffff_403ff3fffffffffe_002ff3fdfec0bffe_00001 -47eda330abe8cbed_43dd1adeb484ff45_4bdaf4c6f6a96df0_00001 -bf4526d7f8d80bd7_bfd0000000000000_3f2526d7f8d80bd7_00000 -3190000020000007_ffef800010000000_f18f80004f00002d_00001 -c009130b80fe8274_b811571307061a38_382b2cb1993b60f3_00001 -c3413ffffffffffe_bdf7ab1d79033080_4149847bc6777048_00001 -b8000020000ffffe_bfd0000000000001_37e0002000100000_00001 -3fb0020000020000_4640040000000007_4600060080020088_00001 -e17d0c35c0de73a1_63185843aaa354bd_84a6194750eee6f6_00001 -80200000000000fe_bfdfffffffffffff_00100000000000fe_00001 -aefffffffc000003_3fc186e2c19646d9_aed186e2bf656a82_00001 -c01fff5fffffffff_bfafff7fffffbfff_3fdffee0027fc000_00001 -b818000000000001_b7f1d3f763b137ef_301abdf31589d3e8_00001 -001ffff7ffffff7f_c7e000010000003e_880ffff9ffff7ffa_00001 -c0600000ffffffdf_7feda1b8c591f9c6_805da1ba9fad85e2_00001 -c1320001ffffffff_3ff4000000000004_c136800280000003_00001 -41e001ffffffffff_bfe0000000000000_c1d001ffffffffff_00000 -802ffc0000000008_7ffc000000000000_7ff8000000000000_00000 -343ffffff007fffe_c3d000007ffffdff_b82000007803fdbe_00001 -3fc0003fffffffbf_bfe0000000000001_bfb0003fffffffc0_00001 -b81003effffffffe_ad7c04f924d58101_259c0bde5e259189_00001 -43507fffdfffffff_41c00003f7fffffe_45208003f7bff80d_00001 -bffffffffffffff0_5d4ffd0000000000_dd5ffcfffffffff0_00001 -48bffffbffffffff_bfefffffffffffff_c8bffffbfffffffe_00001 -c1e4af3f8d45e031_3ca0020002000000_be94b1d577cd70de_00001 -802fffffff7fdfff_cfaffff7ffff8000_0feffff7ff7f6020_00001 -37f0000003fffffd_a91000100001ffff_a1100010040203fc_00001 -7ffc000000000000_bfeffffffffffffe_7ff8000000000000_00000 -8f5fffffffffffff_311ffffbbfffffff_808ffffbbffffffe_00001 -402fffffffffdfdf_802ffffffe0007ff_806ffffffdffe7de_00001 -4020000080000040_4010a7a91ae0c98e_4040a7a9a01e12a8_00001 -3feffffffe000002_bff0000000000000_bfeffffffe000002_00000 -c02e000000008000_c57001ffffffff7e_45ae03c000007f1d_00001 -3fcfa39599be7563_638f800000001ffe_636f250743579b30_00001 -3800008100000000_b810000020000080_b020008120010280_00001 -3caffff000000007_bff0000000000001_bcaffff000000008_00001 -0a0eb920723db732_41a17037c319dc53_0bc0be16b7c15790_00001 -bfdffffffe000006_ac64ffffffffffff_2c54fffffeb00003_00001 -cbc000000008007e_bfffffffffffffff_4bd000000008007e_00001 -bfce00000007ffff_bf19713ef8574e3d_3ef7da2b08d835a9_00001 -f27fffffffffcffe_c67ff7fffffdffff_790ff7fffffdd00a_00001 -001effffffffe000_a780000200000000_e7af0003dfffdfff_00001 -4809b2aa55e663c2_bffffffffffffffe_c819b2aa55e663c0_00001 -c02fffffbfffffde_c1d000000001fbff_420fffffc003f7dc_00001 -372ff00000003fff_7fe000fdfffffffe_771ff1fb02003fff_00001 -c7ebfffffbffffff_560000000003fff8_ddfbfffffc06fff0_00001 -40000000000001ff_c000000000000000_c0100000000001ff_00000 -085fffff80007ffe_402a11bb3168c296_089a11bac9223e16_00001 -c1e62ef8919f035d_b2a0001000000002_34962f0ec09794ff_00001 -c3c0010000fffffe_683dfffffffffbff_ec0e01e001dffbfa_00001 -c3900fffffffe000_c000000000000001_43a00fffffffe002_00001 -c1e1fff7ffffffff_2250000003fffff7_a441fff8047ffdf4_00001 -bee007fffffffffa_435001001ffffffe_c2400900a00ffff7_00001 -3ca000000000000e_41df7ffffffbffff_3e8f7ffffffc001b_00001 -47d00021fffffffe_c00fffffffffffff_c7f00021fffffffd_00001 -c80978bafcce324c_3fcffffffffbffdf_c7e978bafccb031a_00001 -3fdc7fffffffffff_c7ffffffffff6ffe_c7ec7fffffff7fbd_00001 -b7e625be6b6b5de6_c0103fff00000000_38067e5402bd24a7_00001 -401e4ea4f33af325_c00ffffffffffffe_c03e4ea4f33af323_00001 -bca0000011000000_43dfffdffffffe00_c08fffe021ffdbff_00001 -bca47e03cc211f1d_c3c0040000000ffe_407483234d143be1_00001 -cd00001fffffffbf_7ffc000000000000_7ff8000000000000_00000 -3ee889b636e67325_c010000000000000_bf0889b636e67325_00000 -c3fa207d4382d6f3_4000007ffffdfffe_c40a214e4769aef6_00001 -bfbc9ea0c2b4884b_43f4a552574073d5_c3c277000b21a4e7_00001 -bf0c000080000000_c64ffffffffffc1f_456c00007ffffc9c_00001 -c2a0000000000101_c010000000000001_42c0000000000103_00001 -8341000001fffffe_c3407ffffffffffd_06918800020ffffb_00001 -7ffc000000000000_4720000780000000_7ff8000000000000_00000 -c1a0001000001000_c803d295a14dc259_49b3d2a973e3777a_00001 -b3d757f4aa26587e_c01fffffffffffff_340757f4aa26587e_00001 -37fffffffffff5ff_a190000080001ffe_99a0000080001afd_00001 -c0095ffaae004771_bff0040100000000_4009665442ab7263_00001 -4030000003ffffdf_c33fffffffff1fff_c380000003ff8fde_00001 -bf1fe0000000ffff_c01ffffffffffffe_3f4fe0000000fffe_00001 -3e3f7fffffbffffe_c324000000800000_c173b0000055fffe_00001 -3ca5ec40d9224e50_c3100003ffff0000_bfc5ec46543125d4_00001 -b7ef8000000ffffe_b7e000000000007b_2fdf8000001000f1_00001 -c03c99226bab2fdf_c340000000000000_438c99226bab2fdf_00000 -c0d0000000800040_b813260f6e05d589_38f3260f6e9f0652_00001 -bf10000004000003_be5efffffffdffff_3d7f000007be0005_00001 -41f0000080000007_c01bfffffbffffff_c21c0000dbffffeb_00001 -9239ba76a05ecbd7_c340000000000001_1589ba76a05ecbd9_00001 -47bb47c5d4f98afd_bfd00000004001fe_c79b47c5d566ad79_00001 -41ffffffff7ffffb_0027ffffffffeffe_0237ffffff9feffb_00001 -dd2003fff7ffffff_46ffffffeffffeff_e43003ffeffdff82_00001 -3faffffb7ffffffe_c34fffffffffffff_c30ffffb7ffffffd_00001 -c02f080000000000_7fe0000020100000_801f08003e2f0800_00000 -4020080ffffffffe_b8107b8a10fe7835_b84083d85191086d_00001 -3810008000000fff_bffd243f1bcee286_b81d25283dc7de1f_00001 -c8060448957c7df4_c34ffffffffffffe_4b660448957c7df3_00001 -48000000fffdffff_bfeffffff7efffff_c8000000fbf5ffbe_00001 -46700000003ffff7_c1f403b660b099b6_c87403b66100a884_00001 -3e3fffffeffffffa_b80e1fffffffffff_b65e1ffff0effff9_00001 -c7e040000fffffff_ffe0000000000000_07d040000fffffff_00000 -c00fffffffefffdf_41e0000000000000_c1ffffffffefffdf_00000 -c0107fffffffffdf_3ff8ba6f4e5ae4ee_c0198042c8cdbbe2_00001 -c1df80007fffffff_3c7ffff7ffff7ffe_be6f7ff89fff61fd_00001 -c34ffff7feffffff_ffe0000000000001_033ffff7ff000001_00001 -2d594c653e03ade2_c3e000003fffc000_b1494c65a334dda8_00001 -b800001ffe000000_bfde924b4ffe25d9_37ee928870c27c6c_00001 -c049124f686bf9b3_b7f000fffffff000_384913e08d626761_00001 -ffdffffffffdffff_ffefffffffffffff_3fdffffffffdffff_00001 -ffd00400000000ff_c0ada76631d3f698_008daed00b606d6f_00001 -7ffc000000000000_3fe0000ffffff7ff_7ff8000000000000_00000 -4020c540619836fa_c7f000ffefffffff_c820c64ca4d9101a_00001 -4364893437d666c6_ffeffffffffffffe_8364893437d666c4_00001 -c1cfe0000000ffff_c1d0000080400000_43afe000ff808000_00001 -bd70000fff7ffffe_291fffffe0000010_a6a0000fef7ff006_00001 -c1f20000000001ff_4012001fffffffff_c21440240000023d_00001 -b80fffffffbfdfff_fff0000000000000_780fffffffbfdfff_00000 -ffe000200000ffff_7ffc000000000000_7ff8000000000000_00000 -401650b0af16768d_be1001fe00000000_be365377fb164379_00001 -3f9000008000ffff_bfdffffffe000100_bf8000007f010076_00001 -c1effc1fffffffff_7ffc000000000000_7ff8000000000000_00000 -05d7728ced9039cb_c1eeffffff7fffff_87d6b6f885c5edc8_00001 -39a5106aa3a32bb8_bf1000fffffff7fe_b8c511bbaa4d5b5f_00001 -4070001ffffbfffe_c7e00000080ffffe_c8600020080c101b_00001 -c01fffffffff0080_7ffc000000000000_7ff8000000000000_00000 -c97ffffffff00ffe_c3c002000000000f_4d5001fffff8070f_00001 -3fe6ef3744bfe08c_4000000050000000_3ff6ef37b76bf4e4_00001 -c79feffffffeffff_42b040000000ffff_ca6037e000007d7e_00001 -47f03ffffffdffff_7ffc000000000000_7ff8000000000000_00000 -3fbff0000fffffff_bfd007fffffeffff_bf9ffff8100600fc_00001 -c0d000000001ffbf_c03ba46e644e4e9c_411ba46e6451c2ba_00001 -48000000401fffff_c3efffffbfff7fff_cc000000201fbf7e_00001 -380ffffffeffffff_b7efff00007fffff_b00ffeffff8007fd_00001 -3fefffff0000007f_41c0080fffffffff_41c0080f7fbf803f_00001 -8010e080b96f5390_c1c0000fffffefff_01e0e09199effc1e_00001 -47ffffffffffffdd_bfa080000000000f_c7b07ffffffffffc_00001 -480dfffffff7ffff_bfbffffffc0003ff_c7ddfffffc3803be_00001 -3fc0000000007efe_c3eea93f38dfa88a_c3bea93f38e09be5_00001 -4683fff7ffffffff_bfbfffdfffffffe0_c653ffe40007ffeb_00001 -3fefffffffe003fe_381b9635176eb14a_381b963517531e86_00001 -c4500000005fffff_c03a20ab4de47fc9_449a20ab4e8143cc_00001 -38101ffffefffffe_bfc3fffff0000000_b7e427ffee9ffffe_00001 -bfeffffffffdffde_7ffc000000000000_7ff8000000000000_00000 -4710003bfffffffe_0010000000000000_0730003bfffffffe_00000 -448c88eae42cd15d_c7e00000001dffff_cc7c88eae4625213_00001 -b810bffffffffffe_bfdfffff8000ffff_3800bfffbd0085fe_00001 -c030588b5c2ae8f5_bef5ba5fd85a7448_3f36329e27cafa0d_00001 -2a8ffff000007ffe_3e0ffff800004000_28afffe80004bffe_00001 -456f400000000000_924ffffffbffdfff_97cf3ffffc17e0bf_00001 -47f000001fffffdf_480fffff7fefffff_500fffffbfeffebd_00001 -400e00000000007e_001fffffffffffff_003e00000000007e_00001 -c1e1a9bf123eaa3f_ffefffff7ffff7ff_01e1a9becb97a98c_00001 -7b70000081fffffe_bf904000000003fe_fb104000840803fb_00001 -b810100200000000_37effffcffffffff_b01010007e7fcfff_00001 -c3bfffffff780000_001ffffffffffffe_83efffffff77fffe_00001 -be7ffc2000000000_c100000000060000_3f8ffc20000bfe8c_00000 -8020000000000ffb_47f000000080003f_882000000080103a_00001 -381300ec5ae729a0_c0c3975208fc137b_b8e744d2d1f394c2_00001 -40cffffffff80ffe_3ca0000000000000_3d7ffffffff80ffe_00000 -47effffebffffffe_bf936fbdb3967862_c7936fbcf1390f5c_00001 -45a01fffff7fffff_c3c0020200000000_c9702206037fefee_00001 -38cffff800003fff_3f80011fffffffff_3860011bffb82001_00001 -bfcfffffffffc01f_3ca0000000000001_bc7fffffffffc020_00001 -4020000010040000_c03000000207fffe_c0600000120c0000_00001 -bc9fffbfff7fffff_c1d0000003ffff80_3e7fffc0077feeff_00001 -43fffffe0001fffe_b16080003ffffffe_b5707fff380103fc_00001 -3fdfddbc012dea56_3cafffffffffffff_3c9fddbc012dea56_00001 -434352c905da85ec_7fd0000020000001_032352c92c8017f9_00001 -b2cfffffffbfff80_c0afffff7fffffff_338fffff7fbfff81_00001 -c06ffffffdfffff0_443f000000001000_c4befffffe100ff0_00001 -3e8ff800000000ff_3caffffffffffffe_3b4ff800000000fe_00001 -bffffffffffff007_400c899bdf7fd714_c01c899bdf7fc8d5_00001 -c5c1368ba271b92a_b811ffcdc1bd41c6_3de35d27095069f1_00001 -6480000100080000_c3cca35dae1517d8_e85ca35f78594468_00001 -c1d00000000083ff_3fd0000000000000_c1b00000000083ff_00000 -403bd37b5f01600f_40110003fffffffe_405d90ba09d04dcd_00001 -409000003fff0000_c020fffffffffffc_c0c1000043feeffb_00001 -fe6000100007fffe_bd6feffffffc0000_7bdff01ff00bf7f9_00001 -7fe00000007c0000_3fd0000000000001_7fc00000007c0002_00001 -401ffffffffff800_c020000000000300_c04ffffffffffdff_00001 -be004000000007fe_3fdffff7ff7fffff_bdf03ffbefbf07fd_00001 -43d00000003efffe_c02fffffafffffff_c40fffffb07dfff9_00001 -203000000001fbff_3fdfffffffffffff_202000000001fbff_00001 -30feffffffffefff_5137a780ee1f0e89_4246ea44e6ae0a41_00001 -c3cc00000000001f_3ffffff8003fffff_c3dbfff90038001e_00001 -401fe0000003fffe_3fa47c191d152036_3fd4679d03fa9a98_00001 -b1c0001fff7fffff_3fdffffffffffffe_b1b0001fff7ffffd_00001 -c0035f74d9e4a66e_c1c000800000003f_41d3600fd58b75e0_00001 -402fe04a50d62ff8_bfc0018000000000_bfffe34757cdc40c_00001 -47f08000007ffffe_ee9effffffffffff_f69ff80000f7fffb_00001 -b11000007ffffe00_3fe0000000000000_b10000007ffffe00_00000 -c00000401ffffffe_3fdfffffbfdfffff_bff0003fffef7f7d_00001 -7fdfebffffffffff_4fafffffffffff7d_0f9febffffffff7d_00001 -00300000bfffffff_c025ac1ab7310df3_8065ac1bbb424e87_00001 -bfe400001fffffff_3fe0000000000001_bfd4000020000000_00001 -ffe0001000000000_b4c3fffffffbffff_74b40013fffbfffb_00001 -41800000007ffbff_41ccce2758e7ac2f_435cce2759ce1635_00001 -c3ce000000000002_43c88b83def64702_c7a702cba106e293_00001 -0020003ffffff800_3fefffffffffffff_0020003ffffff800_00001 -402ff87ffffffffe_ab9f7ffffdffffff_abdf789dfe0077fd_00001 -b80cef50bd17db40_c05fffc00000000e_387cef16de76611d_00001 -41d0080000fffffe_381000ffffffff7f_39f0090081000f7d_00001 -47effffffdfffbff_3feffffffffffffe_47effffffdfffbfe_00001 -c7e46b2ebd63014a_bec00003feffffff_46b46b33d6e7fdb6_00001 -bf80040000000002_3ccffff5ffffffff_bc6003fafec00001_00001 -3ecfff8008000000_3ff0000000000000_3ecfff8008000000_00000 -3810410000000000_3ef621b8ce00723b_37167ba1ccc5540c_00001 -c3d6e92ed3061ec0_bfb3ffffffffffff_439ca37a87c7a66f_00001 -3fb0080000100000_bfbff00000003fff_bf7ffff80020301e_00001 -a5a7fffffffffffe_3ff0000000000001_a5a7ffffffffffff_00001 -3d4000ffffffffff_3d47f68d8eb6b9a4_3a97f80cf78fa50f_00001 -c16ff80001fffffe_c1dffffffffffdfc_435ff80001fffdfb_00001 -b81f000000003fff_4000000000001000_b82f000000005eff_00001 -3fdb6c04a6feb9f6_3fffffffffffffff_3feb6c04a6feb9f6_00001 -3fed24f6ded74376_cc7ffffffdffffef_cc7d24f6dd04f3f8_00001 -c01000000002003e_c02f044788fbab9f_404f044788ff8ca1_00001 -c02d8271a41fe6f3_47ffffffff600000_c83d8271a38c5aba_00001 -c7eed2778ed7be16_3ffffffffffffffe_c7fed2778ed7be14_00001 -c1fb827b7979160a_3fcbb9627f4399d0_c1d7d57735568a19_00001 -404ffffff0200000_c1cde621665f3871_c22de621578a0ddf_00001 -ffe3fffffffffffb_c03dc3321aaa5380_003299ff50aa742c_00001 -bfb0000ffffffe00_4000000000000000_bfc0000ffffffe00_00000 -43d00000000efffe_402ffeffffffffff_440fff00001dff0c_00001 -bfb000003fbffffe_79110003ffffffff_f8d1000443bc0fec_00001 -bf800000ffffefff_c7f000000107ffff_478000010107f00f_00001 -c04000000000801f_4000000000000001_c050000000008020_00001 -b8000000001fffff_3fcefffffbffffff_b7defffffc3dfffd_00001 -bfcffffdffffbfff_c16907618a99b2b2_4149075ffa2367f9_00001 -c7efffffdffffffc_400fffffffffffff_c80fffffdffffffb_00001 -40440a2b86699a62_bdfffa0000000000_be5406699e406695_00001 -3ca3fffffffffeff_bf02ffafb4e9241d_bbb7bf9ba2236bf3_00001 -862000000000807f_402007ffffffff80_865008000000803f_00001 -b8c0000037ffffff_400ffffffffffffe_b8e0000037fffffd_00001 -3f70002000000fff_be501ffdfffffffe_bdd0201e3ffc101c_00001 -433fffffffefff80_41dffffdfbffffff_452ffffdfbefff81_00001 -401feffdffffffff_7fd0000000000103_7fefffffffffffff_00101 -3fe003fffffdffff_4010000000000000_400003fffffdffff_00000 -c3e6c4abfbae3348_c3dffbfffdfffffe_47d6c1d364c272c1_00001 -41defffffefffffe_c01fffffffffe004_c20efffffeffe101_00001 -cf7fffffff87ffff_4010000000000001_cf9fffffff880000_00001 -53598c812c3c39dd_3f20000100fffffe_52898c82c69d14b1_00001 -c02f00000003ffff_c00814fbd82d4e31_40475453f96ee65f_00001 -3fbabd40046f3063_959ffc00000fffff_956ab9e85c7c011c_00001 -801010007ffffffe_401fffffffffffff_804010007ffffffd_00001 -359ddddaad68456b_b8000000fdfffffe_adaddddc878a34e8_00001 -c3c90596ea75d9c9_40c730520dce2fe8_c4a221cd04029cdd_00001 -3ff0000000000000_bffbffffffffdfff_bffbffffffffdfff_00000 -3ca4001000000000_401ffffffffffffe_3cd4000fffffffff_00001 -c1cfe7ffffffffff_c0c7dd56f5c5966e_42a7cb70f48d423d_00001 -bfcc298ec1c2e8e2_4010201000000000_bfec61fe08d53076_00001 -c3dffffff8000001_3fe0020000003ffe_c3d001fffbffbffe_00001 -b81a1948cf487bc6_4340000000000000_bb6a1948cf487bc6_00000 -7fe20fffffffffff_3d90000000000007_7d82100000000007_00001 -316ffffffffc0003_47f001fefffffffe_397001fefffdffc0_00001 -40b49d4b49693e4c_3f9fe0000001ffff_406488adfe211ee2_00001 -3f5fffff7ffdffff_4340000000000001_42afffff7ffe0001_00001 -c03ffffffd000000_bb8df851d942ba18_3bddf851d673726c_00001 -bfca6a374638a9a7_3694000003fffffe_b67082628f30b0ef_00001 -402ffffbffffff7f_4800080fffffffff_4840080dfefdffbf_00001 -c0c000000001fffd_434fffffffffffff_c42000000001fffc_00001 -7ba00800003fffff_3ff9a9a129c791b3_7ba9b675fac31bff_00001 -4517d68d04fb3028_f67973648aee082d_fba2f5941ca565da_00001 -5bbfffffbfff7fff_3f9fffff7ffffffc_5b6fffff3fff80fc_00001 -41f9b338f2e03e52_434ffffffffffffe_4559b338f2e03e51_00001 -b7e0880000000000_c8500400001ffffe_40408c2200210ffe_00001 -401f7fffffffe000_4110000003f7ffff_413f800007d01fff_00001 -41d001000000ffff_bfe000fbfffffffe_c1c001fc0fc1000c_00001 -38000000008001ff_305ffffdfffffffb_286ffffe010003e9_00001 -38143510168bb69f_bc6ffeffffefffff_b494346e6e00e7b8_00001 -c06400000000000e_bd00000ffffffdff_3d740013fffffd8d_00001 -c3d0000fffffffef_7fe0000000000001_83c0000ffffffff0_00001 -3f607efffffffffe_c3effeffbfffffff_c3607e7be701fffd_00001 -bfff00000000007f_b57f6f93eb9411db_358e74174c3771c9_00001 -3fc000400007ffff_bfb0000000fdffff_bf800040010603f6_00001 -c020007fdfffffff_7fefffffffffffff_8020007fdffffffe_00001 -bf958caed0772f21_3fdffffff0000fff_bf858caec5b0e27e_00001 -413fffffffffffbe_c009e266b690362d_c159e266b69035f7_00001 -bfedfffffffffffc_7feffffffffffffe_ffedfffffffffffa_00001 -57cfffffdfffffdf_a1b0007fffefffff_b990007fefef7fee_00001 -402fffff5fffffff_c2f007bfffffffff_c33007bfafd93ffe_00001 -c34f80001fffffff_b7fffffe0007ffff_3b5f7ffe2807ddff_00001 -41d04000007fffff_7ff0000000000000_01d04000007fffff_00000 -bfa03ffff7ffffff_c3dfbffffffffeff_43901f7ff80fff7d_00001 -a000000000000fff_c7e07f0000000000_27f07f000000107e_00001 -bfe00020000003ff_3fbffffff7fffdfe_bfb0001ffbfffafd_00001 -c030000001ffff7f_7ffc000000000000_7ff8000000000000_00000 -c3fb7e9782f90cc2_bca0800000004000_40ac5a8c3f114323_00001 -c1df2a4105eef916_c34fffffffffffe3_453f2a4105eef8fa_00001 -7df000400000007e_bfdfffdffffdfffe_fde0002fffbf0078_00001 -40c794dd327440fd_7ffc000000000000_7ff8000000000000_00000 -0010000000001ff8_4800020000010000_0820020000011ffc_00001 -c3c00007fffffefe_3fcffbfffffffffe_c39ffc0ffdfffdfa_00001 -2510000000000700_bff00004000007fe_a510000400000efe_00001 -43d3fffffffc0000_7ffc000000000000_7ff8000000000000_00000 -4d8ffbdfffffffff_bca03ffffffffff6_ca403de7bffffff5_00001 -97ead859955088eb_4a6d12c61bd00359_a26863d113b451ef_00001 -bfd1fffdfffffffe_8640000007fdffff_0621fffe08fdbefe_00001 -07cfffff0000ffff_8000000000000000_0000000000000000_00000 -434000003fffbfff_d29ffffffc7ffffe_d5f000003e3fbff7_00001 -c346f4237b7cbfe9_471000000000006f_ca66f4237b7cc088_00001 -2c4c0000003fffff_230ffffc00400000_0f6bfffc8077fff8_00001 -3fc4400000000000_43cc71fdbb55b450_43a20022908c3c1b_00001 -bdeffbfffff7fffe_403000000000dfff_be2ffbfffff9bfc4_00001 -c020001001000000_c34ec9a95e5b23e2_437ec9c829f11cd4_00001 -c3d7fffffffdffff_c01ff7feffffffff_4407f9ff3ffe007f_00001 -b245df5ba33a7f85_40100000004003ff_b265df5ba392026a_00001 -c06000007fffff7f_43eff90000000000_c45ff900ffc7fefe_00001 -c18ffc00000fffff_7ffc000000000000_7ff8000000000000_00000 -c0f1fffffffff000_429effffdfffffff_c3a16fffedfff07f_00001 -3c8000000bffffff_c52fff0000400000_c1bfff00183f3ffe_00001 -381fffffffbff7fe_8010000000000000_f83fffffffbff7fe_00000 -002ffffff0003fff_3ff000008000003f_0030000078001fff_00001 -b7fca13a9dbf49e7_bfe80000000001ff_37f578ebf64f7937_00001 -47e000000800003e_bfc080003ffffffe_c7b080004840005d_00001 -8b3ffc2000000000_7ffc000000000000_7ff8000000000000_00000 -4120001fff800000_7ffc000000000000_7ff8000000000000_00000 -517000001fff7ffe_c1cf000000003ffe_d34f00003dff47fa_00001 -380e000000000010_801fffffffffffff_f83e00000000000f_00001 -41168636954ae162_bfec00000001fffe_c113b56fc2a2ed97_00001 -330e000100000000_43ee0000000001ff_370c2000f00001e0_00001 -802d3018ea8c241d_c007fdffffffffff_0045e23fae5a7253_00001 -bffc505cc8a6e8ea_801ffffffffffffe_002c505cc8a6e8e9_00001 -bfbff8000001ffff_3acffffffff00000_ba9ff7fffff203fe_00001 -c80000001ffffbfe_3e40880000000000_c6508800210ffbdb_00001 -43d0080000000004_bca0000000000000_c080080000000004_00000 -41367c708f592990_c00a5078d45675b0_c1527da775ba1512_00001 -c3474f322c53fb6a_4c386ada422df8a5_cf91c93af32c74b4_00001 -41dffffff00003fe_bca0000000000001_be8ffffff00003ff_00001 -41f0000001fdffff_5ff53ac9cf7cf6c8_61f53ac9d221a8a8_00001 -3fb000001fffff7e_3ffbad41f232c7b1_3fbbad42298d4ab5_00001 -43e047fffffffffe_4000003ffdfffffe_43f048411df6fffc_00001 -bf9e000002000000_bcafffffffffffff_3c5e000002000000_00001 -c53fffffff77ffff_c05ffe000000003e_45affdffff7808be_00001 -c1cffffffffffe1f_717000005fffffff_f35000005fffff0e_00001 -402000003ffffbff_403000001f800000_406000005f7ffc7d_00001 -c039d0b1184126b6_06ad12e793d72c70_86f77460b35b5a57_00001 -c048000000000000_434000000800003e_c39800000c00005d_00000 -c06fc00001ffffff_0ec040faf47bd51e_8f402078ff96ed22_00001 -bf87ffffff7fffff_bfd0000000000000_3f67ffffff7fffff_00000 -bc70000200001fff_bf29fffffffffffe_3baa0003400033fd_00001 -c000005fffffffff_403ffffffff00002_c050005ffff7ffd0_00001 -45f00017fffffffe_47f2f5abbf28ad12_4df2f5c82faa4bcd_00001 -0dd00000000fffff_bfd0000000000001_8db0000000100000_00001 -bf0d45dab53a65b8_380fff7ffffffffe_b72d45659dcf90cc_00001 -7ffc000000000000_bfdeba273f5031a6_7ff8000000000000_00000 -7fdffffffffffdfc_3cd000008000001e_7cc000007fffff1c_00001 -a0bffffdfefffffe_bfdfffffffffffff_20affffdfefffffe_00001 -3feffff80000001e_c3dffff802000000_c3dffff00201ff9d_00001 -401bb79c251f0d03_bbfdf1012672bca6_bc29ef2550a601bc_00001 -ffdfffffc000000f_22efffffff0001ff_e2dfffffbf00020f_00001 -3fc8b60e46a80f6d_bfdffffffffffffe_bfb8b60e46a80f6b_00001 -4141058dae2059c1_bf9fffff0003ffff_c0f1058d25f60d01_00001 -ca3326c13bfeba24_bfe0000000000000_4a2326c13bfeba24_00000 -b53bffffffffc000_43cfffffffffefdf_b91bffffffffb1e3_00001 -b4f0000020ffffff_40095713ee956d23_b509571422d9063d_00001 -c0200001e0000000_bfe0000000000001_40100001e0000002_00001 -41c00080000000ff_40c000000000083f_429000800000093f_00001 -7d501ff7ffffffff_bff0000004000400_fd501ff804080206_00001 -c0cfeffffffffffe_4010ffffffffffde_c0f0f77fffffffdd_00001 -bfc06d169113d091_bfefffffffffffff_3fc06d169113d091_00001 -bd5fdffdffffffff_5644b72ace1bbb6b_d3b4a27257daf2cd_00001 -381ffff7ffffeffe_bf80003fffffe000_b7b0003bffefd7fe_00001 -3dc000000ffbffff_41c68f9b37c7034c_3f968f9b4e50fa9c_00001 -c7ffffffdf800000_bfeffffffffffffe_47ffffffdf7fffff_00001 -bfe0000000001000_bf3ffe00000001ff_3f2ffe00000021fe_00001 -380a8e204e2cb7dd_7fdfffcfffffffff_77fa8df878fc429a_00001 -bf8f000000000100_c29ffffffff04000_423efffffff0bf00_00001 -330fc7fffffffffe_bff0000000000000_b30fc7fffffffffe_00000 -41f0000000003ffe_c1d800000000000e_c3d800000000600b_00001 -c1e676ed17a50125_be900000000fefff_408676ed17bb619a_00001 -b80010001fffffff_40e01ffffff7fffe_b8f030202037f7fc_00001 -c020000000000000_bff0000000000001_4020000000000001_00000 -486007fffffffdff_3ca000003fc00000_451008003fdfddff_00001 -b81ffffffffff0fe_ba0dfffffbfffffe_323dfffffbfff1ed_00001 -205043ffffffffff_7ffc000000000000_7ff8000000000000_00000 -3ffffffdfffffff8_bfffffffffffffff_c00ffffdfffffff7_00001 -3fefffffffff7dff_3a6000040ffffffe_3a6000040fffbefe_00001 -401bffffeffffffe_b7fc497e1cedf965_b828c04e4b2b7b28_00001 -c34fff0000007fff_bffffffffffffffe_435fff0000007ffe_00001 -3fbfc000fffffffe_bff0000040007ffe_bfbfc0017f0101fa_00001 -407000003ffbfffe_38042862fe8e3368_388428634f2ab547_00001 -40f000000ff00000_c1effffff0003fff_c2f0000007f01ff7_00001 -c3dffffffff77ffe_c000000000000000_43effffffff77ffe_00000 -b811814b7ef464dc_fa807ffffbfffffe_72a20d55d68bb521_00001 -37efffffffe3fffe_3fe000000000001b_37dfffffffe40034_00001 -c010000001000004_c0000020001ffffe_4020002001200203_00001 -ca200000400007ff_c000000000000001_4a30000040000801_00001 -3f8fff7ffffefffe_3fb000000087ffff_3f4fff80010efbbc_00001 -3fd0008000007fff_c1c7099afc03c81c_c1a70a5348dc6085_00001 -c3f000000fdfffff_3ffd2e23653e84e9_c3fd2e2382324c05_00001 -bf8ffbfff7ffffff_c00fffffffffffff_3faffbfff7ffffff_00001 -3dcff00fffffffff_b7effff7ffffffff_b5cff00803fbfffe_00001 -353957789e95fd88_381d5abc75937d08_2d673f2091f73528_00001 -3f80080000080000_c00ffffffffffffe_bfa008000007fffe_00001 -b650004000ffffff_b7e00fffffffefff_2e4010404100effe_00001 -4390e6210af918da_46cfffc400000000_4a70e6015b7b2447_00001 -3fefffffffffdfef_40dffffefbfffffe_40dffffefbffdfee_00001 -401549a16416e287_c010000000000000_c03549a16416e287_00000 -41fffffc00001fff_c1fa652249c59e1f_c40a651efd216f4a_00001 -cfeffff6ffffffff_41ffff9fffffffff_d1ffff97001afffe_00001 -bcafc000003fffff_c010000000000001_3ccfc00000400001_00001 -b7f0000000810000_c3e2c0625a54229a_3be2c0625aeb51b3_00001 -a957fffffffbfffe_43cfff0000000400_ad37ff3ffffc031e_00001 -a464b1e64cae594f_c01fffffffffffff_2494b1e64cae594f_00001 -cedc00003ffffffe_41c000000000ffff_d0ac00004001bffc_00001 -c01fbeffffffffff_21600000003fffbf_a18fbf00007efb7e_00001 -c3de59209bb8a564_bfd0000007fdffff_43be5920aae16a8c_00001 -c7ffffffe3ffffff_c01ffffffffffffe_482fffffe3fffffe_00001 -b8a00000000002ff_43dfdfffffff7ffe_bc8fdfffffff85f6_00001 -c01e7d66f623cb4c_787feff7fffffffe_f8ae6e20a34efbdb_00001 -47eddf042473ef08_b7e00000fe000000_bfdddf05fea850ca_00001 -bf80100003ffffff_c340000000000000_42d0100003ffffff_00000 -43e0000000008006_7fdfffffc7fffffe_03cfffffc801000a_00001 -c01ffff03fffffff_3fddffffffffff7f_c00dfff13bffff7e_00001 -c7e0000000007ffe_3cae59ba3a79c7b6_c49e59ba3a7aba80_00001 -3caffff80001ffff_c340000000000001_bffffff800020000_00001 -bfbfdffffdfffffe_1a8fe1ffffffffff_9a5fc21dfe01dffd_00001 -3811c6a45a8e5bfc_b7e48cc87315baad_b006d4b6422c9dfb_00001 -36a0000000013ffe_c170004000000200_b820004000014202_00001 -7fefffffffffff07_c34fffffffffffff_834fffffffffff06_00001 -3fbfffff7fffffef_c340ffffffffffbf_c310ffffbbffffb5_00001 -3fc003ffffff0000_c800000037ffffff_c7d00400380cfffe_00001 -802fffe008000000_c3f00001fffffc00_042fffe407fbf901_00001 -c3c6c403d1bd7bc9_c34ffffffffffffe_4726c403d1bd7bc8_00001 -c80ffe0000001ffe_bcae9296e1ac0804_44ce90adb83e0bd5_00001 -b7ffffffffe00003_aa4ffffdffdfffff_225ffffdffc00005_00001 -674e000000010000_ffe0000000000000_a73e000000010000_00000 -3f5008000000007f_ffe0d019cec3a5a4_ff40d881dbab07fc_00001 -c3effc0100000000_417fffffff700000_c57ffc00ff7011fb_00000 -b811ffff7fffffff_c0cffff0003fffff_38f1fff680243ffe_00001 -c02f8000000007ff_ffe0000000000001_001f800000000801_00001 -c040000800000006_b550003fffffff7e_35a00048001fff84_00001 -ffdffffef0000000_37f400003fffffff_f7e3ffff95fffddf_00001 -3fb000040000001e_426ffefffe000000_422fff07fdbfffbc_00001 -b81fffffc00fffff_ffefffffffffffff_781fffffc00fffff_00001 -3e72cba2f8f989b2_c2b007fffffffff7_c132d508ca76066c_00001 -508ffeffbffffffe_3f00ffffffffbfff_4fa0ff77ddffc000_00001 -48000000027fffff_4063ffff7fffffff_4873ffff831fffea_00001 -4020017ffffffffe_ffeffffffffffffe_8020017ffffffffc_00001 -beb00000000fbfff_3fefff7ffffffffb_beafff80001f7f7b_00001 -002f37ebf6c8eaec_c08be464f4c81c69_80cb36000706e168_00001 -42dfffff80000100_c4befffdfffffffe_c7aefffd840008f5_00001 -c03ffffc00000100_fff0000000000000_003ffffc00000100_00000 -41c007fffffbfffe_43bfff77fffffffe_459007bbddfc000e_00001 -37ea265023bdd968_7ffc000000000000_7ff8000000000000_00000 -3fdfffffffbffffb_3fefffe000000000_3fdfffdfffc0003c_00001 -c1e001fffffefffe_7ffc000000000000_7ff8000000000000_00000 -41500000803fffff_bfadc816e2fbf1f7_c10dc817d1b3c968_00001 -bfeffdfffffffffc_7ffc000000000000_7ff8000000000000_00000 -c1e000007fe00000_bf1fffffffffffe8_411000007fdffff4_00001 -c00e800000000000_7ffc000000000000_7ff8000000000000_00000 -bfb5665a54ce0c12_beb0000008007ffe_3e75665a5f81e46d_00001 -c0300007ffffffef_3fb9cc340fc29b6a_bff9cc40f5dca32f_00001 -c1800000ffffffff_c0bfc00000003fff_424fc001fc003ffe_00001 -c80ffffffffffbfd_7ffc000000000000_7ff8000000000000_00000 -c0073e8cf3e13711_802807fffffffffe_004174b95a25e19a_00001 -37efffffffffaffe_3d7ffffffffe001f_357ffffffffdb01e_00001 -c7e457789619128b_40bff3fffffffffe_c8b44fd7c8e0c922_00001 -b8004379ab207ab5_0000000000000000_0000000000000000_00000 -27cd6fcc24e7623d_401000000003efff_27ed6fcc24eea0bf_00001 -0010000000000000_0000000000000000_0000000000000000_00000 -bca000400003ffff_c3fcb63607d6b0bc_40acb6a8e0b5fda3_00001 -0010000000000000_fb48000040000000_bb68000040000000_00000 -c010200100000000_7ffc000000000000_7ff8000000000000_00000 -bfff863c13828ae4_3fef8000000003ff_bfff0823233484a8_00001 -c0409fffffffffff_bfdfff0003ffffff_40309f7b0213ffff_00001 -b69ffff000001000_43dfc00003fffffe_ba8fbff024000dde_00001 -40d00000000403ff_43f0000027ffffff_44d00000280403ff_00001 -3e40552ef3ea764f_3c200ffffffffffc_3a70658422de60c2_00001 -0010000000000000_c0bfffe00000001e_80dfffe00000001e_00000 -bfffc00000000003_391001ffffffffff_b91fc3f800000001_00001 -bfc0007ffffff000_381ffffffffe1ffe_b7f0007ffffefff7_00001 -c010000ffffdfffe_bf5fffffff800fff_3f80000fffbe07be_00001 -3a0de408a1808afd_ffd00000000001fb_f9ede408a1808eb0_00001 -bca5e76e4f34d231_0010000000000000_fcc5e76e4f34d231_00000 -bfbffdffffffff00_404000000003fffb_c00ffe000007fe76_00001 -2f40000000000027_c35f7fffffffffc0_b2af80000000000c_00001 -434ffffff7ff7fff_3fcfff7ffffffeff_432fff7ff7ff9f01_00001 -c1000023fffffffe_0010000000000001_81200023ffffffff_00001 -a38000000800ffff_402ff7faa54f7d56_a3bff7fab54d7a26_00001 -c1db54446247aa52_bfcc001fffffffff_41b7e9d72a43174f_00001 -0010000000000000_b80000000000807e_f82000000000807e_00000 -c1dffbfefffffffe_c0c0000100000100_42affc00ffbff1fe_00001 -c3d00000000003be_001fffffffffffff_84000000000003bd_00001 -380154191efc4e28_381000001ff7ffff_30215419419bd659_00001 -3fb6ec4483f565b4_7fe657f1311c1385_7fb0016e3b91608a_00001 -0010000000000000_b28fffffffffe007_f2afffffffffe007_00000 -b7ffffffffefffbf_69a003ffffffefff_e1b003fffff7edde_00001 -c038e6a7fa682c54_4032e353cb91aeb8_c07d6547d23e6845_00001 -403000001fffffdf_43e2d8971b04eb4e_4422d89740b6195e_00001 -0010000000000000_c0392c59c8e48f37_80592c59c8e48f37_00000 -3c63320494ceb76c_4028000020000000_3c9ccb07059a1c4c_00001 -7ffc000000000000_3ca0000000000000_7ff8000000000000_00000 -c0201000000007ff_4288c3935a34e57b_c2b8dc56ed8f26c0_00001 -c1c00000007fff00_c01fffffffffef00_41f00000007ff680_00001 -0010000000000000_bcafffffffe01ffe_fccfffffffe01ffe_00000 -c01f000001ffffff_c7effffffffe0003_481f000001fe1002_00001 -4789b47aa1149764_3ca0000000000001_4439b47aa1149766_00001 -c60fdfffffffffff_a1c03fffffefffff_27e02fbffff00fff_00001 -c3ce000200000000_001bfffffffbffff_83fa4001bffc3ffe_00001 -0010000000000000_c0000800000001ff_80200800000001ff_00000 -3ff00000001ffefe_3feffff7fff7fffe_3feffff80037fdeb_00001 -bf300000000006ff_3cafffffffffffff_bbf00000000006fe_00001 -41ff000000000002_bfcffffffbfdfffe_c1defffffc1e1000_00001 -43c3e4c2b39d80cb_38080000001fffff_3bddd7240d940ab5_00001 -0010000000000000_41cfe00001ffffff_01efe00001ffffff_00000 -bfe1ff7fffffffff_7ffc000000000000_7ff8000000000000_00000 -c3e0000000006ffe_3caffffffffffffe_c0a0000000006ffc_00001 -47f6ea4106b65a11_3ec001ffffffffef_46c6ed1e4ed730c4_00001 -480fffffffffdf00_4010000000000400_482fffffffffe700_00001 -0010000000000000_c1d0000004000fff_81f0000004000fff_00000 -69ffffa000000000_c00ffffefbffffff_ea1fff9efc030bff_00001 -401000000006ffff_3fd0000000000000_3ff000000006ffff_00000 -c1e000ffffffffff_3812000000003ffe_ba02012000004000_00001 -0010000000000000_3fd0000000000000_7fefffffffffffff_00101 -0029ddf3657c97ac_bb62000400000000_fb9d19b849a90400_00001 -0010000000000000_5c10000001001fff_1c30000001001fff_00000 -c7f02007fffffffe_402000000100000f_c82020080102008d_00001 -947ffe00000ffffe_3fd0000000000001_945ffe00000fffff_00001 -c04000000047ffff_3feffffffffc0007_c040000000460002_00001 -4030040000200000_0017055f48beeff5_00570b20a0bf2a70_00001 -41c0000000fdffff_b81fffffffffffed_b9f0000000fdfff5_00001 -c3436f8f2b2e7e21_3fdfffffffffffff_c3336f8f2b2e7e20_00001 -c3cfffffffff7f7f_40bab08b43d48199_c49ab08b43d4166b_00001 -0010000000000000_3fdfffffffffffff_7fefffffffffffff_00101 -c1ffffffdff80000_402fffffc00000ff_c23fffff9ff8013f_00001 -0010000000000000_c05ffddfffffffff_807ffddfffffffff_00000 -47e00008000ffffe_3fdffffffffffffe_47d00008000ffffd_00001 -e8618845e92f15df_bfce0fd99d7c11ae_68407870a5c4189a_00001 -0010000000000000_3fdffffffffffffe_7fefffffffffffff_00101 -bc7000000000ffee_c1e0001100000000_3e6000110000fff0_00001 -c0cfffffdfc00000_c1c0200000000040_42a01fffefbfc040_00001 -7ffc000000000000_3fe0000000000000_7ff8000000000000_00000 -911f7ffffffffff0_3f90ca8f09d1be5d_90c08764cdaa775b_00001 -0010000000000000_3fe0000000000000_0000000000000000_00011 -c02200003ffffffe_c1d1ffffbffffffe_42043ffffffffefc_00001 -0010000000000000_ffe7ffffffffffee_c007ffffffffffee_00000 -bfe0000023ffffff_c06ffc000000000e_405ffc0047f7000d_00001 -bfb2001fffffffff_3fe0000000000001_bfa2002000000000_00001 -4269afb6393490b7_ba62478d7e1c3e1c_bcdd588bdfe3e666_00001 -c040000000007fff_c3b2a6c91c557f56_4402a6c91c56148c_00001 -c06007f7fffffffe_ddcfff9ffffffffe_5e4007c7e817fffd_00001 -c57ea73c304d054d_3fefffffffffffff_c57ea73c304d054c_00001 -43c086a10b8210ae_bf01ffffbfffffff_c2d29774ead7ce94_00001 -0010000000000000_3fefffffffffffff_0000000000000000_00011 -4343a987a0dad4a5_40caa5c07b2b6187_44205f969ae3434d_00001 -0010000000000000_40b007ffffffff7e_00d007ffffffff7e_00000 -c7e0100000000040_bff0002000000001_47e0102020000042_00001 -4403bb97ce60574a_3feffffffffffffe_4403bb97ce605749_00001 -3a0c0007fffffffe_381f800000fffffe_323b9007e0e0003d_00001 -41ffffffff003fff_c3b0000007ffffee_c5c0000007801fed_00001 -40232b23c9417cd7_ba5000000000087e_ba832b23c9418703_00001 -c05fbffbffffffff_3ff0000000000000_c05fbffbffffffff_00000 -bfc0000080000800_b80ffffffffffffe_37e00000800007ff_00001 -0010000000000000_3ff0000000000000_0010000000000000_00000 -c3e4003fffffffff_ffd0007ffffffffe_03c400e001fffffd_00001 -c0fbffffffffffef_c3cf100000000000_44db2dfffffffff0_00001 -4339ff8b8ee34977_3ff0000000000001_4339ff8b8ee34979_00001 -3fefffffffffffff_37f9fc8b9cbef88a_37f9fc8b9cbef88a_00001 -0010000000000000_3ff0000000000001_0010000000000001_00000 -21900001dfffffff_bf20000017fffffe_a0c00001f80002cc_00001 -0010000000000000_41e000003fffffff_020000003fffffff_00000 -7ffc000000000000_bf5369d33862aaac_7ff8000000000000_00000 -c0300001fffffffa_3fffffffffffffff_c0400001fffffff9_00001 -c06000400000007f_c1d00000fff7ffff_42400040fffc005f_00001 -0010000000000000_3fffffffffffffff_001fffffffffffff_00000 -bfdffffffff000fe_43dffdfffdffffff_c3cffdfffdf001fc_00001 -0010000000000000_41dffbffffffffff_01fffbffffffffff_00000 -c0a6000000000000_43fefffffffff7ff_c4b54ffffffffa7f_00001 -bff60484a5536536_3ffffffffffffffe_c0060484a5536534_00001 -0029954d0f0df5b3_41e00000000003ff_0219954d0f0dfc17_00001 -0010000000000000_3ffffffffffffffe_001ffffffffffffe_00000 -c01000081fffffff_308ffdffbfffffff_b0affe0ffefbdf7d_00001 -0010000000000000_c03fbffffffffffe_805fbffffffffffe_00000 -2fb00ffffffdffff_bd50000001fffff6_ad10100001fffff4_00001 -b7effffffffffc1f_4000000000000000_b7fffffffffffc1f_00000 -bfb83dc63477cd3d_4070007ffff80000_c0383e88229d5218_00001 -0010000000000000_4000000000000000_0020000000000000_00000 -bfcffffff8000100_bfc000000003e000_3f9ffffff807c100_00001 -0010000000000000_435f000003ffffff_037f000003ffffff_00000 -b810000020000001_47ffdfffffffff80_c01fe0003fbfff81_00001 -802fffefefffffff_4000000000000001_803fffeff0000000_00001 -3fd0000ffbfffffe_3fbbfffffdffffff_3f9c001bf6fffdfc_00001 -0010000000000000_4000000000000001_0020000000000001_00000 -43ec064c6152fc63_cd3fbffffff7fffe_d13bce3fc88954d5_00001 -3c3e54c4d8a3cf09_415ffffffffdffe0_3dae54c4d8a1e99f_00001 -4030fffffffeffff_400fffffffffffff_4050fffffffeffff_00001 -402efffffffffff7_bcafffc00001ffff_bceeffc20001eff6_00001 -0010000000000000_400fffffffffffff_002fffffffffffff_00000 -c1a000000001fdff_c7e29e108929df66_49929e10892c30d4_00001 -0010000000000000_ffeffff800007fff_c00ffff800007fff_00000 -dff0007f7fffffff_37fffffffffff77f_d800007f7ffffbbe_00001 -bfb0000000007f7f_400ffffffffffffe_bfd0000000007f7d_00001 -c3e44faf4fcc6d94_b80fec0000000000_3c0442fd823a8dd0_00001 -0010000000000000_400ffffffffffffe_002ffffffffffffe_00000 -47e0004008000000_bfb85853044ed3e1_c7a858b471c70e9e_00001 -0010000000000000_b06003ffffffffde_f08003ffffffffde_00000 -37e7518d337cc25b_7ffc000000000000_7ff8000000000000_00000 -d12000ffffefffff_4010000000000000_d14000ffffefffff_00000 -4490000003fffefe_4136bf27884c5b05_45d6bf278dfc2379_00001 -0010000000000000_4010000000000000_0030000000000000_00000 -c0221db466eedfb9_c3c0e83093586003_43f3249a1eb595ba_00001 -0010000000000000_4020000000004400_0040000000004400_00000 -4022ac23df608ace_3a2cddcec5bdb7f6_3a60d80ce2bc8b14_00001 -3fbffffffff60000_4010000000000001_3fdffffffff60002_00001 -3fefffff80000400_434615f1f239d053_434615f199e20b4d_00001 -0010000000000000_4010000000000001_0030000000000001_00000 -37ffe5d085a3877b_c000800000003fff_b810727f84e891a6_00001 -0010000000000000_c80ffffe00000006_882ffffe00000006_00000 -bc10001fffffefff_3ccd2ded70b56965_b8ed2e27cc902da0_00001 -bf700000000100ff_401fffffffffffff_bfa00000000100fe_00001 -c1f00207fffffffe_c1e03effffffffff_43e0410fff7ffffd_00001 -0010000000000000_401fffffffffffff_003fffffffffffff_00000 -403fffffff780000_b400023fffffffff_b450023fffbbf66f_00001 -47ffffe000020000_3fe5d02ba77755f7_47f5d015d74d0b83_00001 -43ef0000000000ff_401ffffffffffffe_441f0000000000fe_00001 -3ca0384aaa23be04_b940005fffffffff_b5f038abfbe3bad9_00001 -0010000000000000_401ffffffffffffe_003ffffffffffffe_00000 -40327ad957b1f5df_c000006000000000_c0427b4838ca040a_00001 -0010000000000000_b806f9c81cbb15f4_f826f9c81cbb15f4_00000 -37feffffffffffff_47ef8000000fffff_3ffe8400000f7fff_00001 -404ffefffffff000_4340000000000000_439ffefffffff000_00000 -3fc0001000200000_b100003ffffffff8_b0d0005000600077_00001 -0010000000000000_4340000000000000_0360000000000000_00000 -ffdb3470a5e3dd1b_480f7fffffffdfff_87fac79ee34c3271_00001 -0010000000000000_bca0000080003fff_fcc0000080003fff_00000 -3cce0ccf7d8e4a61_7ffc000000000000_7ff8000000000000_00000 -c1d00800ffffffff_4340000000000001_c520080100000000_00001 -41f000fffffdfffe_404effffffdfffff_424f01efffdc1dfc_00001 -0010000000000000_4340000000000001_0360000000000001_00000 -b80f800001fffffe_44e00000ffff7fff_bcff8001f9ff041c_00001 -401ffffbdfffffff_43d0000000000300_43fffffbe00005ff_00001 -c3c0000017fffffe_434fffffffffffff_c720000017fffffd_00001 -c1feffffff7ffffe_1af693ab1ab44f36_9d05df0dc1845e0e_00001 -0010000000000000_434fffffffffffff_036fffffffffffff_00000 -b20643cc9d9a536b_41e49085b10e049f_b3fc9ddc0081bc98_00001 -0010000000000000_4009ad651462b44a_0029ad651462b44a_00000 -41dff0000000003e_43effff7ffffffe0_45dfeff80400001f_00001 -c09ffff000004000_434ffffffffffffe_c3fffff000003ffe_00001 -3fd0200000000800_dc0ffe0002000000_dbf01efe010207ff_00001 -0010000000000000_434ffffffffffffe_036ffffffffffffe_00000 -be400000080001fe_14f0010000000ffe_93400100080091fc_00001 -0010000000000000_436eff7fffffffff_038eff7fffffffff_00000 -bfd883177e5f1999_43e4000000000003_c3cea3dd5df6e003_00001 -c3e0000000800003_7fe0000000000000_83d0000000800003_00000 -405ffffffffffb80_8015e1d67420ea5d_8085e1d67420e749_00001 -0010000000000000_7fe0000000000000_4000000000000000_00000 -3fd1000fffffffff_5d310000000000ff_5d1210110000010e_00001 -0010000000000000_c1efffdffbffffff_820fffdffbffffff_00000 -b8a008000000007f_c01ffffffc00001e_38d007fffdff008f_00001 -41ffffdfffff8000_7fe0000000000001_01efffdfffff8002_00001 -0010000000000000_7fe0000000000001_4000000000000001_00000 -c340708fc64cbb8d_802fc64018f098e6_038052e4afa4e3ab_00001 -bfffffbffff7ffff_bd400000200000ff_3d4fffc03ff781fd_00001 -c02008d3baee2879_7fefffffffffffff_802008d3baee2878_00001 -0010000000000000_7fefffffffffffff_400fffffffffffff_00000 -400ffe00003fffff_c1e507e54ddba03c_c2050694cfb0d24b_00001 -0010000000000000_4edffffffefffeff_0efffffffefffeff_00000 -c15000400ffffffe_c0500007fffdffff_41b00048101e07f5_00001 -c6bb60a15b9ca674_7feffffffffffffe_86bb60a15b9ca672_00001 -b80a16ad02c87cd3_380fffffffffe7fe_b02a16ad02c86940_00001 -0010000000000000_7feffffffffffffe_400ffffffffffffe_00000 -c00f7ffffffeffff_f7efefffffffffbe_780f703fffff003f_00001 -0010000000000000_40dffffffffff806_00fffffffffff806_00000 -32a89b054aa778be_38ee00000000000e_2ba71154f5fd013d_00001 -aa6f0618039cfa82_7ff0000000000000_ea6f0618039cfa82_00000 -40f007ff80000000_47fffff07fffffff_490007f7bc203e00_00001 -0010000000000000_7ff0000000000000_4010000000000000_00000 -4020000000020006_bb62b1da7ab47675_bb92b1da7ab6ccb7_00001 -3fc482ada40e5d82_bec10c5904e0bbb5_be95daac9db0f037_00001 -47f0fffffffffffb_7ffc000000000000_7ff8000000000000_00000 -c023b435d252ab57_c0efffffffbffffe_4123b435d22b42eb_00001 -0010000000000000_7ffc000000000000_7ff8000000000000_00000 -37ed147aa1f43557_bed00000003fffc0_b6cd147aa26886cd_00001 -0010000000000000_84fffbffffff0000_c51ffbffffff0000_00000 -42a0010000000000_c8000000001001ff_cab00100001002ff_00001 -37f00000003ffbfe_7ffc000000000000_7ff8000000000000_00000 -c67fefff7ffffffe_3eac1d26eec725e8_c53c0f17eadb2698_00001 -0010000000000000_7ffc000000000000_7ff8000000000000_00000 -7fdff7fffffdfffe_be603755dfca2a65_fe5033480a513464_00001 -0010000000000000_41ffffffffbfff7f_021fffffffbfff7f_00000 -47fc27499562c193_bfd7fffffffff7ff_c7e51d77300a0a23_00001 -bffffe000000fffe_7ffc000000000000_7ff8000000000000_00000 -401ffc0000000002_43cfff800000003e_43fffb8010000040_00001 -0010000000000000_7ffc000000000000_7ff8000000000000_00000 -43f7ffffffffdfff_ffed3e9e1f93387c_83f5eef697ae4d1d_00001 -0010000000000000_403fff8001000000_005fff8001000000_00000 -3fd004000000000f_37f6cfd4cb442f48_37d6d588c077006a_00001 -bf80001002000000_8000000000000000_0000000000000000_00000 -37e00000004007fe_c0036ff67812a280_b7f36ff678606c0f_00001 -0010000000000000_8000000000000000_0000000000000000_00000 -48070394b74ce3a4_480efc79a696d4b9_502648ef1c54f542_00001 -0010000000000000_8020000037fffffe_c040000037fffffe_00000 -bc3f7fffffffffbf_bca03ff7ffffffff_38effdf03fffffbd_00001 -b677ffffffffeffe_415ffffffdf7fffe_b7e7fffffe79effc_00001 -0010000000000000_c0fffffffdfffff6_811ffffffdfffff6_00000 -c02fffffdffffbff_3fd00000000003ff_c00fffffe00003fc_00001 -c0300000ffeffffe_3fffff8000001ffe_c03fff81ffd8207a_00001 -f98fff8007ffffff_3fe040003fffffff_f9803fbf440f000e_00001 -c7e80001ffffffff_bff0000000007ffe_47e800020000bffd_00001 -c3d00001000001ff_b7f60cb3edb38762_3bd60cb54e7ec8fe_00001 -546000000004003f_400663ca353eb4a4_547663ca35444def_00001 -bfeffffffffdffff_c3c800003ffffffe_43c800003ffe7ffe_00001 -c3c000000100000f_8010000000000000_03e000000100000f_00000 -43c86b97bdb4310f_2a1104f9c0a750d2_2de9f9e94ff2d4b0_00001 -0010000000000000_8010000000000000_c030000000000000_00000 -bfff000000000100_bff27243af555c1b_4001deb191dab1ce_00001 -0010000000000000_cf10008040000000_8f30008040000000_00000 -bfcf800000000000_bfc000000ffffffd_3f9f80001f7ffffb_00001 -bff0000000020fff_becc54fdffa82e36_3ecc54fdffabd529_00001 -0010000000000000_8010000000000001_c030000000000001_00000 -1590000080200000_e290003ff7ffffff_b83000407822003e_00001 -0010000000000000_48000000040007ff_08200000040007ff_00000 -434fffffffff7dfe_7fe0000000000043_033fffffffff7e84_00001 -407ffffffff7fff7_801fffffffffffff_80affffffff7fff6_00001 -47fe3fffffffffff_3fe12dc9c92e02e4_47f03d48c02d7ebb_00001 -0010000000000000_801fffffffffffff_c03fffffffffffff_00000 -b810000000003fe0_9f90000100000008_17b0000100003fe9_00001 -0010000000000000_46abd96de2786819_06cbd96de2786819_00000 -60d92d2aa25c2d87_bfbffe001fffffff_e0a92b97e8df3265_00001 -43c0007fffdfffff_801ffffffffffffe_83f0007fffdffffd_00001 -bfd00000407ffffe_d001000000800000_4fe1000045080000_00001 -0010000000000000_801ffffffffffffe_c03ffffffffffffe_00000 -4382a3880af103a1_801fffffffc08000_83b2a3880acc071f_00001 -0010000000000000_4017ffffefffffff_0037ffffefffffff_00000 -efd000800000fffe_37e34d3325f0bc2f_e7c34dcd8f8b2085_00001 -0010000000000000_bca0000000000000_fcc0000000000000_00000 -413effffffffffff_3ffffffdfffffffc_414efffe0ffffffc_00001 -0010000000000000_c04fff0000007ffe_806fff0000007ffe_00000 -3fbf800000000002_bfb892c300fae7f4_bf883077f4f6fc55_00001 -c7efffffdffffbff_bca0000000000001_449fffffdffffc01_00001 -41effffffff00002_c013ffffe0000000_c213ffffdff60001_00001 -0010000000000000_bca0000000000001_fcc0000000000001_00000 -c0272f86e7296ddc_c00fffffe1fffffe_40472f86d16cdf62_00001 -0010000000000000_480ffff000000080_082ffff000000080_00000 -c440000800000003_402ffffffdfffffd_c4800007feffff81_00001 -41f000000ffffffe_bcafffffffffffff_beb000000ffffffd_00001 -c21d2b9577b04a48_3caffffeff7fffff_bedd2b948ddef033_00001 -0010000000000000_bcafffffffffffff_fccfffffffffffff_00000 -46600000003ffffb_c7f03ffdfffffffe_ce603ffe0040fff0_00001 -0010000000000000_c11ff00000000003_813ff00000000003_00000 -404ffffffe001fff_3f183477e56b4fdb_3f783477e3e82091_00001 -7fe53580e079043e_bcaffffffffffffe_fca53580e079043c_00001 -3fcf000000400000_7ffc000000000000_7ff8000000000000_00000 -0010000000000000_bcaffffffffffffe_fccffffffffffffe_00000 -bfbffffffffff7fb_3f67c662a30b77d9_bf37c662a30b71e3_00001 -0010000000000000_bfff9793a2cfab94_801f9793a2cfab94_00000 -c2a602769741e0f4_41df7ffffffff800_c495aa6cbce4d3ef_00001 -47f28f0812269bb5_bfd0000000000000_c7d28f0812269bb5_00000 -4171ffffefffffff_bff0c7c76598ebc1_c172e0c0418441d2_00001 -0010000000000000_bfd0000000000000_ffefffffffffffff_00101 -7ffc000000000000_bcaffffbfffffff7_7ff8000000000000_00000 -0010000000000000_c340000000400020_8360000000400020_00000 -b81ffffffdffffbf_4168000000000007_b997fffffe7fffd6_00001 -43d2000000000002_bfd0000000000001_c3b2000000000003_00001 -40800041ffffffff_c3ced81c55396ab6_c45ed89b90ae4a40_00001 -0010000000000000_bfd0000000000001_ffefffffffffffff_00101 -4003069a0d38953d_40a077ffffffffff_40b3954b909bbd9c_00001 -0010000000000000_43f20ac9374433ed_04120ac9374433ed_00000 -4010618f5a6ec8f0_c3ddaa7859723ef0_c3fe5f5b9e50707d_00001 -c0ffffffffeffffe_bfdfffffffffffff_40efffffffeffffe_00001 -40100000020fffff_3530003bffffffff_3550003c021007ba_00001 -3ffffefeffffffff_47f0000040000fff_47fffeff7ffc1bfc_00001 -0010000000000000_c3e0000100004000_8400000100004000_00000 -bee07fffffbffffe_c008000000000ffe_3ef8bfffffa0107b_00001 -ffeffffffc002000_bfdffffffffffffe_7fdffffffc001fff_00001 -441ed7f6a4c867c6_c00fbffffffbfffe_c43e9a46b77afbf5_00001 -3fc0000000007fef_1980000002000007_1950000002007ff7_00001 -4007810b8f74ac1d_bfc856fb871d13a1_bfe1e0ac3a197c02_00001 -5677fffffffeffff_bfe0000000000000_d667fffffffeffff_00000 -6f7000000001fdff_1510010000000fff_4490010000020e1e_00001 -0010000000000000_bfe0000000000000_8000000000000000_00011 -c0000003ffffe000_bfd1684c1780a28e_3fe168507193859e_00001 -0010000000000000_47fff3c7f4f5dd0a_081ff3c7f4f5dd0a_00000 -80204000000ffffe_381fffffff81fffe_f8503fffffd003fc_00001 -95d00007ffffffff_bfe0000000000001_15c0000800000001_00001 -37f0800000008000_41c00000007ff800_39c08000008477c1_00001 -0010000000000000_bfe0000000000001_8000000000000000_00011 -413ffdffffdffffe_3fbc6dc2b14b6dd5_410c6bfbd503eb5a_00001 -0010000000000000_de70000600000000_9e90000600000000_00000 -37f002000000000f_b1effcfffffffffe_a9f0007fd000000d_00001 -be4bd57690ea5405_bfefffffffffffff_3e4bd57690ea5405_00001 -bfcffdffff000000_b7e44dc0093df58b_37c44c7b2c9af3ac_00001 -40100000083fffff_3c0dcff9f723ff06_3c2dcffa06833be8_00001 -0010000000000000_403ffff800000003_005ffff800000003_00000 -c3dffc0000000006_002ffffeffffffff_841ffbff00200005_00001 -3ca01ffffffffffc_bf8ffbffe0000000_bc401dfbefdffffc_00001 -43ebffefffffffff_401fffff80003fff_441bffef900077ff_00001 -0010000000000000_47f000021fffffff_081000021fffffff_00000 -4040000040200000_c030003ffffff7ff_c08000404020f87e_00001 -cc3050bc013d7cd7_bff0000000000000_4c3050bc013d7cd7_00000 -bca371e443fc6409_c3f0000004000003_40a371e448d8dd1e_00001 -0010000000000000_bff0000000000000_8010000000000000_00000 -3cd49ee0d5dc5dad_5dd2718355e26898_5ab7c50847fefa19_00001 -0010000000000000_46603fffe0000000_06803fffe0000000_00000 -c3dffffffffffffe_802fffffc8000000_041fffffc7ffffff_00001 -401fff7dffffffff_bff0000000000001_c01fff7e00000000_00001 -c3e00000400003ff_c041cb2ba6fa7627_4431cb2bee272935_00001 -0010000000000000_bff0000000000001_8010000000000001_00000 -c1d0003ff8000000_f9f000000010003f_7bd0003ff810007f_00001 -0010000000000000_87fff0000000fffe_c81ff0000000fffe_00000 -308fffffffffffe7_bc4fffffffefffbf_acefffffffefffa6_00001 -43c0003ffffffffc_bfffffffffffffff_c3d0003ffffffffb_00001 -c030007ffffefffe_37f1c5927efed20d_b831c620ab91ada8_00001 -0010000000000000_bfffffffffffffff_801fffffffffffff_00000 -7ffc000000000000_3111ffffffffbfff_7ff8000000000000_00000 -0010000000000000_43c8000000ffffff_03e8000000ffffff_00000 -ffe84f73fb8db6fe_bc1fffffc0000000_7c184f73caeecf07_00001 -47e0000000010080_bffffffffffffffe_c7f000000001007e_00001 -c04fffffbffffffb_3c7f7ffffffffdfe_bcdf7fffc0fffdf9_00001 -0010000000000000_bffffffffffffffe_801ffffffffffffe_00000 -37f000003fffffde_c3400000000ffe00_bb400000400ffdde_00001 -0010000000000000_c3fb5c5330475c41_841b5c5330475c41_00000 -472dfffffeffffff_c3448df0813db0ec_ca83451178856658_00001 -3ca36b7814b2d456_c000000000000000_bcb36b7814b2d456_00000 -a4ffffefdfffffff_c3e0020000000fff_28f001f7eefe0fff_00001 -0010000000000000_c000000000000000_8020000000000000_00000 -3feffffffffffbdf_bff0077965f9c355_bff0077965f9c143_00001 -c11ffff7fff7ffff_c1adeb3cfb8c4374_42ddeb3580b589c1_00001 -7feefffe00000000_c000000000000001_ffefffffffffffff_00101 -43effbfffffff7ff_7fefffffff801ffe_03effbffff8027fa_00001 -0010000000000000_c000000000000001_8020000000000001_00000 -32100007efffffff_c78ffffff0000007_b9b00007e7fffc0a_00001 -0010000000000000_b7efffffbffff7fe_f80fffffbffff7fe_00000 -bce98537abc2f82a_41e00003ffdffffe_bed9853e0cddd8a8_00001 -ffefffeffffdffff_c00fffffffffffff_0000000000000000_00011 -3f8007ffffffffff_c3f000401fffffff_c3800840400ffffd_00001 -0010000000000000_c00fffffffffffff_802fffffffffffff_00000 -c3d4f4adbfb6a5ea_3e700000000000c0_c254f4adbfb6a6e5_00001 -0010000000000000_408000000010ffff_00a000000010ffff_00000 -c015834380f2b995_3f9fff0000000400_bfc5829766d6b4af_00001 -3faffeffffffc000_c00ffffffffffffe_bfcffeffffffbffe_00001 -c3effffffffffef7_bf40445cd52bc22b_4340445cd52bc1a5_00001 -0010000000000000_c00ffffffffffffe_802ffffffffffffe_00000 -c340004000007fff_4070004000000400_c3c0008001008401_00001 -e0d20000000003ff_c34000002ffffffe_64220000360003fd_00001 -38185f449f6bf14d_c010000000000000_b8385f449f6bf14d_00000 -c341fffffffffffc_bec000003ffbffff_4212000047fb7ffb_00001 -0010000000000000_c010000000000000_8030000000000000_00000 -c23fff7ffffffbff_c8710000000000ff_4ac0ffbbfffffedf_00001 -0010000000000000_41dfffffc0001000_01ffffffc0001000_00000 -c8000003fffffff6_7fdffffffff7dffe_87f00003fffbeff3_00001 -32d3e44c3072f211_c010000000000001_b2f3e44c3072f212_00001 -c3efffdffeffffff_c22fffffffffefbf_462fffdffeffefbf_00001 -0010000000000000_c010000000000001_8030000000000001_00000 -40700200000001fe_bdffffffe0000040_be8001ffeffe021e_00001 -0010000000000000_802ffbffc0000000_c04ffbffc0000000_00000 -3c6fbfffffdfffff_40300000009fffff_3cafc000011d7ffe_00001 -001000003fffffff_c01fffffffffffff_804000003ffffffe_00001 -b80002000000007f_c7e000000007fbfe_3ff002000007fd7d_00001 -0010000000000000_c01fffffffffffff_803fffffffffffff_00000 -c0204000000fffff_406ffffffefffdfe_c0a03fffff8dfef9_00001 -4809f4b95e8684c3_b5a0000000000380_bdb9f4b95e868a70_00001 -c1f0020000001000_c01ffffffffffffe_4220020000000fff_00001 -c58fff8000010000_3ff000080000007f_c58fff8fffc100fe_00001 -0010000000000000_c01ffffffffffffe_803ffffffffffffe_00000 -bfefdfbffffffffe_3fb0101fffffffff_bfafffdf7f7ffffc_00001 -0010000000000000_7fdffffbfbfffffe_3ffffffbfbfffffe_00000 -3caffffffc00000e_ffefffffffe0007f_fcaffffffbe0008d_00001 -c34e3db1b794999c_c340000000000000_469e3db1b794999c_00000 -41e010000000001f_c5b04000000fffff_c7a050400010101e_00001 -0010000000000000_c340000000000000_8360000000000000_00000 -7fd00000001fffff_c1c0010000000000_81a00100002001fe_00001 -0010000000000000_7ffc000000000000_7ff8000000000000_00000 -41e43c7afaf93429_c3dffff8000ffffe_c5d43c75ebe493a6_00001 -1d60000000000000_c340000000000001_a0b0000000000001_00000 -bfe0000007fffffb_b7e000000000200e_37d000000800200a_00001 -0010000000000000_c340000000000001_8360000000000001_00000 -4c6000000ffffe00_b4cfbffff7fffffe_c13fc00017bffbfe_00001 -0010000000000000_7ffc000000000000_7ff8000000000000_00000 -3b40018000000000_3ea0400000000100_39f0418600000101_00001 -41cf871987a4786c_c34fffffffffffff_c52f871987a4786b_00001 -4261d11be1f2a3c5_3caf800000000080_3f2189d7726ad97e_00001 -0010000000000000_c34fffffffffffff_836fffffffffffff_00000 -a6d00ffffc000000_c1e0002080000000_28c010209c7ff7e0_00000 -c770000000001c00_450fffebfffffffe_cc8fffec000037fd_00001 -c000000100002000_c34ffffffffffffe_4360000100001fff_00001 -43dfffff40000000_3c700000003fffff_405fffff407ffffc_00001 -0010000000000000_c34ffffffffffffe_836ffffffffffffe_00000 -c504000080000000_c030000200400000_4544000300501002_00000 -0010000000000000_4cdffeffff7fffff_0cfffeffff7fffff_00000 -c3dff8000000007e_3fd0008000000002_c3bff8ffc0000082_00001 -c80e00000000001f_ffe0000000000000_07fe00000000001f_00000 -4038c1f6b59a2712_c1effe0000000ffe_c238c06a962ed9ce_00001 -0010000000000000_ffe0000000000000_c000000000000000_00000 -3f0fffffdfffffdf_c2a0000000000402_c1bfffffe00007e2_00001 -7fd007fbffffffff_400bfffffffefffe_7fec0df8fffeff7d_00001 -402fc000000007ff_ffe0000000000001_801fc00000000800_00001 -400c000003fffffe_43c0000000020002_43dc000004038002_00001 -0010000000000000_ffe0000000000001_c000000000000001_00000 -16dff0001ffffffe_3fb500ae0796659d_16a4f62dc5934871_00001 -0010000000000000_7fdfffffdf800000_3fffffffdf800000_00000 -40111e45b8b5ab55_ffefffffffffffff_80111e45b8b5ab54_00001 -ba0007fffffeffff_3ca0000008000200_b6b00800080301ff_00001 -0010000000000000_ffefffffffffffff_c00fffffffffffff_00000 -c1dfc7ffffffffff_c3cff00000000fff_45bfb81c00000fe3_00001 -47ffffffffffdff0_3f9fdffffffffbff_47afdfffffffdc10_00001 -c1fffffe000001ff_ffeffffffffffffe_01fffffe000001fe_00001 -ba6fffffbf7fffff_c00fffffbdffffff_3a8fffff7d800084_00001 -0010000000000000_ffeffffffffffffe_c00ffffffffffffe_00000 -b7e003ffffffff7f_deafffffeffffffd_56a003fff7fdff7e_00001 -03efffffffffff04_3dafff7ffffffffa_01afff7ffffffeff_00001 -381ff000000000ff_fff0000000000000_f81ff000000000ff_00000 -43fe000000004000_3fdfffc000000400_43edffc4000043c0_00001 -0010000000000000_fff0000000000000_c010000000000000_00000 -378b1c4beaf19830_c1d00000000081ff_b96b1c4beaf27474_00001 -bf8e00000000000e_342fffffffc01fff_b3cdffffffc41e0d_00001 -7febdc9a99e7a82d_7ffc000000000000_7ff8000000000000_00000 -c3d003fffffffffb_47effffff0000001_cbd003fff7fdfffb_00001 -0010000000000000_7ffc000000000000_7ff8000000000000_00000 -406000001fffbfff_3f20020000080000_3f900200200bbff8_00001 -0010000000000000_c0f01fff00000000_81101fff00000000_00000 -001fffefffffefff_40ac0001fffffffe_00dbfff3fffef1fe_00001 -b7ffffffff80000f_7ffc000000000000_7ff8000000000000_00000 -40fffe000001fffe_c28ffffeffffff7f_c39ffdff0011ff7c_00001 -0010000000000000_7ffc000000000000_7ff8000000000000_00000 -c1f010e938b5ded1_400dfffffffffffe_c20e1fb54a5501c5_00001 -415ffffffffffe1f_d96f7f7fffffffff_dadf7f7ffffffe25_00001 -ef00000ffffc0000_7ffc000000000000_7ff8000000000000_00000 -7ffc000000000000_bab0002007ffffff_7ff8000000000000_00000 -0010000000000000_7ffc000000000000_7ff8000000000000_00000 -3eefffffffffffed_43efe8e5002721cc_42efe8e5002721ba_00001 -51f00008003ffffe_c470040000000001_d670040802400ffe_00001 -3ca0020000000000_0000000000000000_0000000000000000_00000 -41d0040040000000_be4ffffffffbffef_c03004003ffdff77_00001 -0010000000000001_0000000000000000_0000000000000000_00000 -c1ca0de3d0d15dd1_3fffffffe03ffffe_c1da0de3b6f795c6_00001 -0010000000000001_b8d09a33206c9699_f8f09a33206c969a_00001 -4340800000000020_3f5fec0000000000_42b075b000000020_00001 -bfdffff800100000_10dfffffffffffff_90cffff8000fffff_00001 -439fbffffffbffff_bf8454fd38ef0ba0_c3342c533e7aa2e8_00001 -bfdf7fffffffffbe_c3f8cd30846286fc_43e869fbc250fcad_00001 -c010102396a7802c_c0200000000007bf_4040102396a787f3_00001 -c0258dbcf58dfc04_3da000000001007f_bdd58dbcf58f558a_00001 -0010000000000001_43400000000001f8_03600000000001fa_00001 -43e000000009ffff_407059db2c4f6829_446059db2c59a051_00001 -bca5daf2cc8924e1_c03000007ffffefe_3ce5daf37b60b9e5_00001 -bfc000000000043f_c2c084efd4d351ba_429084efd4d3561d_00001 -dc1fffffffffffaf_c34ffffffdffc000_5f7ffffffdffbfb0_00001 -418effffffffff7f_0010000000000000_01aeffffffffff7f_00000 -c1c000000200007e_bf000001ffffffbf_40d000020200007e_00001 -ae31fbffffffffff_1801c2793142b19f_8643f657b91eb725_00001 -0010000000000001_403fffffffffc1ff_005fffffffffc201_00001 -ffd0000fffdfffff_bb5fffffff81ffff_7b40000fffa0ffc0_00001 -2c8000080000ffff_f0000000010001ff_dc9000080101027e_00001 -37e7ff7fffffffff_43ff8acf4be4e380_3bf7a79d4dae7b0c_00001 -c3cfffffffefe000_37efff0001fffffe_bbcfff0001efe07e_00001 -ffd7ad4237371282_001fffffffffffff_c007ad4237371281_00001 -001e6a23746179de_4b3fffffbfffffe0_0b6e6a23378d32d7_00001 -c1a0000080fffffe_c00feffbfffffffe_41bfeffd017edfbb_00001 -480000000008fffe_001637e790e69de2_082637e790f31d52_00001 -c3400ffffffefffe_001ffffffffffffe_83700ffffffefffc_00001 -c050000003ffdfff_3fc000009ffffffe_c0200000a3ffe024_00001 -c02fffffffffffff_4030000000080000_c07000000007ffff_00001 -b7effef800000000_47efff7ffffeffff_bfeffe78041f0007_00001 -400fffffc3ffffff_3ca0000000000000_3cbfffffc3ffffff_00000 -bfefb80000000000_bfd9c346f3f0115d_3fd9894f944b3536_00001 -bfb007fffffffbfe_3fffff0000000007_bfc0077fbffffc01_00001 -0010000000000001_7fe8764cdc1ba128_4008764cdc1ba12a_00001 -419ffffffdfdffff_c01fffffffff0000_c1cffffffdfcffff_00001 -bffffffc000003fe_3ca0000000000001_bcaffffc000003ff_00001 -3ffffffbffe00000_402ffffbfefffffe_403ffff7fee08023_00001 -d1bfffffffffffff_4373dd6bcb6fc58e_d543dd6bcb6fc58d_00001 -b8cfffffffbefffe_3cafffffffffffff_b58fffffffbefffd_00001 -c0a684d24f5ca22b_c34ffffeffffffff_440684d19b360fb0_00001 -37e2e713ec3308f4_4010000000001fdf_3802e713ec332e9c_00001 -3fffff80000001ff_bffffc0000000040_c00ffb801000023e_00001 -43cffdff7fffffff_3caffffffffffffe_408ffdff7ffffffe_00001 -4014daa7249b383d_c804080000000000_c82a1bbe415453e8_00001 -43cffc00000000fe_43c1ffffffffffff_47a1fdc00000008e_00001 -6b4848a9a8c0dcd5_480ffffffffbdfff_736848a9a8bdbb77_00001 -3fc9e8c6d2ecf933_3fd0000000000000_3fa9e8c6d2ecf933_00000 -4037ab91bff33a68_3dbfdffffffffff7_3e0793e62e334727_00001 -ffeffffffffbfefe_3c503ffffeffffff_fc503ffffefdf77b_00001 -0010000000000001_400fffffffff7bff_002fffffffff7c01_00001 -c92bffffffffff7e_3cc00007fffe0000_c5fc000dfffc7f7d_00001 -c3d00000201fffff_3fd0000000000001_c3b0000020200000_00001 diff --git a/wally-pipelined/src/fpu/FMA/tbgen/testMini b/wally-pipelined/src/fpu/FMA/tbgen/testMini deleted file mode 100644 index c2cf277c..00000000 --- a/wally-pipelined/src/fpu/FMA/tbgen/testMini +++ /dev/null @@ -1,1000 +0,0 @@ -400FEFFFFFFDFFFF_4500001EFFFFFFFF_451FF03DE0FDFFF9 -7FF8CDB067A39BAF_0000000000000000_7FF8CDB067A39BAF -0000000000000000_BFDFFFFDFFFFFEFF_0000000000000000 -0000000000000000_0000000000000000_0000000000000000 -BFD000000001FFFF_DCBFFFFFF0000008_5C9FFFFFF0040006 -BFCFFFFEF7FFFFFF_0000000000000001_8000000000000000 -0000000000000000_C3EDC5379E609531_0000000000000000 -0000000000000000_0000000000000001_0000000000000000 -3FC0080000100000_405FEFFFFFFFFFFF_402FFFF8001FEFFF -C04E0000003FFFFE_000FFFFFFFFFFFFF_806E0000003FFFFC -0000000000000000_EA4FFFFFFE00001E_0000000000000000 -0000000000000000_000FFFFFFFFFFFFF_0000000000000000 -C1E7999EFA5CB8B7_B7E6CD6B7AF10020_39E0D11CB2EAA14B -AC8FFFFDFFFFFFE0_000FFFFFFFFFFFFE_8000000000000000 -0000000000000000_403FFFFFFFFF7F80_0000000000000000 -0000000000000000_000FFFFFFFFFFFFE_0000000000000000 -46700000040003FF_FFD01FFFFFFFEFFF_FFF0000000000000 -41EFFFFFBFF00000_0010000000000000_020FFFFFBFF00000 -0000000000000000_C800080000004000_0000000000000000 -0000000000000000_0010000000000000_0000000000000000 -4020000002000007_3FEFFFFFFF7FBFFE_4020000001BFE006 -B807FFFFFFFFF7FE_0010000000000001_8000000000000000 -0000000000000000_41F8010000000000_0000000000000000 -0000000000000000_0010000000000001_0000000000000000 -3FB0FFFC00000000_FFD0004FFFFFFFFF_FF910050FFEBFFFF -40211829E4678335_001FFFFFFFFFFFFF_00511829E4678334 -0000000000000000_42D8A445AAA71568_0000000000000000 -0000000000000000_001FFFFFFFFFFFFF_0000000000000000 -0000010000000002_B817CDB89FDC55F4_8000000000000000 -BF101FFFFFFFFFC0_001FFFFFFFFFFFFE_8000008100000000 -0000000000000000_47E46906EEBEE918_0000000000000000 -0000000000000000_001FFFFFFFFFFFFE_0000000000000000 -E89FFFFFFFFFEF7E_04D2ED0B521C0CD4_AD82ED0B521C0311 -C02FFFFFFFFFEFDF_3CA0000000000000_BCDFFFFFFFFFEFDF -0000000000000000_CB53CEB78D3DA2DC_0000000000000000 -0000000000000000_3CA0000000000000_0000000000000000 -41F10FFFFFFFFFFF_381FF00000000040_3A21077800000021 -558B5B190F940823_3CA0000000000001_523B5B190F940825 -0000000000000000_C7B4FED9659CF8AE_0000000000000000 -0000000000000000_3CA0000000000001_0000000000000000 -47FFFFFFFFF80000_402D61B8AA025254_483D61B8A9FAF9E6 -4020017FFFFFFFFF_3CAFFFFFFFFFFFFF_3CE0017FFFFFFFFE -0000000000000000_41AFFFFFFFFC3FFE_0000000000000000 -0000000000000000_3CAFFFFFFFFFFFFF_0000000000000000 -3FB0000000001FDF_C1EFFDFFFFFFFE00_C1AFFE0000003DBA -3FE20007FFFFFFFF_3CAFFFFFFFFFFFFE_3CA20007FFFFFFFE -0000000000000000_2B3FFFFFFFBFC000_0000000000000000 -0000000000000000_3CAFFFFFFFFFFFFE_0000000000000000 -BE7CEA94F3B14E4F_BF1FFFFFFFF7FBFF_3DACEA94F3AA100C -C03FFEF000000000_3FD0000000000000_C01FFEF000000000 -0000000000000000_4000000000003DFF_0000000000000000 -0000000000000000_3FD0000000000000_0000000000000000 -380EA140715A3CD4_BFFFFFFEFFFFC000_B81EA13F7C4FFC07 -43FEFFFFFFFF7FFF_3FD0000000000001_43DEFFFFFFFF8001 -0000000000000000_43D000DFFFFFFFFF_0000000000000000 -0000000000000000_3FD0000000000001_0000000000000000 -44B01FFFF7FFFFFF_C45FFBFFFFFFFF7F_C9201DFBF800FFBE -00200000047FFFFF_3FDFFFFFFFFFFFFF_00100000047FFFFE -0000000000000000_3FD5C8FB38E9A49E_0000000000000000 -0000000000000000_3FDFFFFFFFFFFFFF_0000000000000000 -BFF8E60E5D344579_41D5816CF5D8B0D6_C1E0BBAD9ECC7B52 -C00FFFE000080000_3FDFFFFFFFFFFFFE_BFFFFFE00007FFFE -0000000000000000_43C0010000080000_0000000000000000 -0000000000000000_3FDFFFFFFFFFFFFE_0000000000000000 -47FE7FFFFFFFFFFE_40200002000FFFFE_482E8003D01E7FFA -C5A000FFFFFFFF7F_3FE0000000000000_C59000FFFFFFFF7F -0000000000000000_B7F148B5FB128399_0000000000000000 -0000000000000000_3FE0000000000000_0000000000000000 -40100000000000BE_0021C60C25274782_0041C60C25274855 -CDDFFFF00000003F_3FE0000000000001_CDCFFFF000000041 -0000000000000000_41DDFFFFFFF7FFFF_0000000000000000 -0000000000000000_3FE0000000000001_0000000000000000 -41CFFFFEF7FFFFFF_40B0000003FBFFFF_428FFFFEFFF7FFBB -C34E7FFFFFFFFFFF_3FEFFFFFFFFFFFFF_C34E7FFFFFFFFFFE -0000000000000000_FFEFF7FFFFFFEFFE_0000000000000000 -0000000000000000_3FEFFFFFFFFFFFFF_0000000000000000 -C3FFFFFFFFFEBFFF_EFEBFFFF00000000_73FBFFFEFFFEE7FF -7FD00007FFFFFFF8_3FEFFFFFFFFFFFFE_7FD00007FFFFFFF7 -0000000000000000_B073F65978980B32_0000000000000000 -0000000000000000_3FEFFFFFFFFFFFFE_0000000000000000 -41F000FFFFC00000_3FFFFFFFFFFFFDDF_420000FFFFBFFEEF -C1FE739481F2BE3F_3FF0000000000000_C1FE739481F2BE3F -0000000000000000_C0322919B9F21861_0000000000000000 -0000000000000000_3FF0000000000000_0000000000000000 -802688A188936073_40300000FFDFFFFF_806688A2F0F067B8 -B80BFFFC00000000_3FF0000000000001_B80BFFFC00000002 -0000000000000000_7FD8C936DE7F5A7F_0000000000000000 -0000000000000000_3FF0000000000001_0000000000000000 -BCA0002000000008_AB4FFFFFF00003FF_2800001FF7FFF208 -001FFFFE04000000_3FFFFFFFFFFFFFFF_002FFFFE03FFFFFF -0000000000000000_B7FFFFDFEFFFFFFF_0000000000000000 -0000000000000000_3FFFFFFFFFFFFFFF_0000000000000000 -C04F890B53A3EDB7_C0B0003FFFFFFFFC_410F898977D13C3F -20EFE0000003FFFF_3FFFFFFFFFFFFFFE_20FFE0000003FFFD -0000000000000000_4060207FFFFFFFFF_0000000000000000 -0000000000000000_3FFFFFFFFFFFFFFE_0000000000000000 -C03FFFF7FFFFFFFF_C3FC6F28895A14B1_444C6F216D8FF25A -C1CF000FFFFFFFFF_4000000000000000_C1DF000FFFFFFFFF -0000000000000000_406FFFBFFFFFF800_0000000000000000 -0000000000000000_4000000000000000_0000000000000000 -0020000400080000_CED3FFFFFFEFFFFE_8F040004FFF9FFFA -41DFFFFFFFF7EFFF_4000000000000001_41EFFFFFFFF7F001 -0000000000000000_BFF001FFFFFFFFFE_0000000000000000 -0000000000000000_4000000000000001_0000000000000000 -3FB67CD2866D8FA6_A3180E039B8F1FFB_A2E0E77709F1E847 -5BAE42362B008EE1_400FFFFFFFFFFFFF_5BCE42362B008EE0 -0000000000000000_405FFFFFFFFFC004_0000000000000000 -0000000000000000_400FFFFFFFFFFFFF_0000000000000000 -C3DFE08000000000_C69FFFFFFDFFFFFC_4A8FE07FFE01F7FC -000FFC000000007F_400FFFFFFFFFFFFE_002FF800000000FC -0000000000000000_C00800000FFFFFFF_0000000000000000 -0000000000000000_400FFFFFFFFFFFFE_0000000000000000 -3FFA684CBBED6A5A_48000003FFFFBFFE_480A685356002FB1 -3810402000000000_4010000000000000_3830402000000000 -0000000000000000_C44036F9705DCF7B_0000000000000000 -0000000000000000_4010000000000000_0000000000000000 -801FFFC000040000_C0100083FFFFFFFF_00400063FEFA0010 -43DFC04000000000_4010000000000001_43FFC04000000002 -0000000000000000_BFA6105CCA37DEC3_0000000000000000 -0000000000000000_4010000000000001_0000000000000000 -3FB0000007FF0000_3FDFFFFFFF7FF800_3FA0000007BEFC00 -EC400002000000FF_401FFFFFFFFFFFFF_EC700002000000FE -0000000000000000_C27FFFFFFFFF0FFF_0000000000000000 -0000000000000000_401FFFFFFFFFFFFF_0000000000000000 -7FD000000040001F_43D3FFFFFFFFFFFB_7FF0000000000000 -C02FFFFFFFFFFFF2_401FFFFFFFFFFFFE_C05FFFFFFFFFFFF0 -0000000000000000_FFDFFF7FFFFFFFFA_0000000000000000 -0000000000000000_401FFFFFFFFFFFFE_0000000000000000 -BFCFFFFE00FFFFFF_CF3FFFFBFFF7FFFE_4F1FFFFA00F83FDD -8028020CED088751_4340000000000000_8378020CED088751 -0000000000000000_C0A00001FFFFFEFF_0000000000000000 -0000000000000000_4340000000000000_0000000000000000 -466FFFFFF8007FFF_B7E302B4758E9CF0_BE6302B470CE3BDD -3460040000000007_4340000000000001_37B0040000000008 -0000000000000000_B80FFFFEF7FFFFFE_0000000000000000 -0000000000000000_4340000000000001_0000000000000000 -3F2A3423E9A84517_4B6B870AF5372E45_4AA68A933DBF53AA -001000007FFFFFFF_434FFFFFFFFFFFFF_037000007FFFFFFE -0000000000000000_7FE200000001FFFF_0000000000000000 -0000000000000000_434FFFFFFFFFFFFF_0000000000000000 -0020000F80000000_C06FFFFFC003FFFF_80A0000F6001E101 -400FC00000007FFF_434FFFFFFFFFFFFE_436FC00000007FFD -0000000000000000_C030010000002000_0000000000000000 -0000000000000000_434FFFFFFFFFFFFE_0000000000000000 -4004C8EA10E7ADCB_9E900000FFFBFFFF_9EA4C8EB5D711C9E -3DFFFFFFFFFFFF80_7FE0000000000000_7DEFFFFFFFFFFF80 -0000000000000000_C0200003FFFFFBFF_0000000000000000 -0000000000000000_7FE0000000000000_0000000000000000 -FFD0200000040000_7D3349A08E2390FB_FFF0000000000000 -D9FFFFEFFFFFC000_7FE0000000000001_FFF0000000000000 -0000000000000000_3FC001001FFFFFFF_0000000000000000 -0000000000000000_7FE0000000000001_0000000000000000 -C050000000101FFF_B7E000001000000F_384000001010200E -47FFFFFFFC001000_7FEFFFFFFFFFFFFF_7FF0000000000000 -0000000000000000_B93FFFFFFFFD7FFE_0000000000000000 -0000000000000000_7FEFFFFFFFFFFFFF_0000000000000000 -37F0210000000000_C02FFFFFFFEFFFFE_B83020FFFFF7EF7F -BFF5114D6D96342B_7FEFFFFFFFFFFFFE_FFF0000000000000 -0000000000000000_C02FE20000000000_0000000000000000 -0000000000000000_7FEFFFFFFFFFFFFE_0000000000000000 -BFC0000400000003_3A60801FFFFFFFFF_BA30802420080002 -41DFFFFFFFFFFFEE_7FF0000000000000_7FF0000000000000 -0000000000000000_BE10000000201FFE_0000000000000000 -0000000000000000_7FF0000000000000_FFF8000000000000 -43E371D1036B72C3_BF859A7E3A0C2F23_C37A412337175011 -B87FFFFFFFFEFFBF_7FF0000000000001_7FF8000000000001 -0000000000000000_C8D000000C000000_0000000000000000 -0000000000000000_7FF0000000000001_7FF8000000000001 -430FE005B89E3887_C05D8479D4B8952C_C37D66FAA1E29499 -BFCFFFFF00001FFE_7FFFFFFFFFFFFFFF_7FFFFFFFFFFFFFFF -0000000000000000_43C000021FFFFFFF_0000000000000000 -0000000000000000_7FFFFFFFFFFFFFFF_7FFFFFFFFFFFFFFF -41CFFFFFEFFC0000_BFC8001000000000_C1A8000FF3FCF7FE -C01F7FFFFFFFFFC0_7FFFFFFFFFFFFFFE_7FFFFFFFFFFFFFFE -0000000000000000_6A50FFFFFFDFFFFE_0000000000000000 -0000000000000000_7FFFFFFFFFFFFFFE_7FFFFFFFFFFFFFFE -C1E64F6BACB49699_BFBFFFFFF800007F_41B64F6BA720BC06 -C0300400001FFFFE_8000000000000000_0000000000000000 -0000000000000000_42900000200003FF_0000000000000000 -0000000000000000_8000000000000000_0000000000000000 -C100000001FFFFFA_BFDFDFFFFFFFEFFE_40EFE00003FBEFF2 -7FE00000FFFFDFFF_8000000000000001_BCC00000FFFFDFFF -0000000000000000_C3E0001FFFF7FFFF_0000000000000000 -0000000000000000_8000000000000001_0000000000000000 -409FFFFFFFF80004_FFDEA6822647B589_FFF0000000000000 -4CC003FFFFFFFFFB_800FFFFFFFFFFFFF_8CE003FFFFFFFFFA -0000000000000000_7FD080FFFFFFFFFE_0000000000000000 -0000000000000000_800FFFFFFFFFFFFF_0000000000000000 -7FE000000080003F_002000000400001E_401000000480005D -000450CD890B4179_800FFFFFFFFFFFFE_8000000000000000 -0000000000000000_4001FDFFFFFFFFFE_0000000000000000 -0000000000000000_800FFFFFFFFFFFFE_0000000000000000 -3FD000000004000F_C03E25F912FE70C4_C01E25F91305FA5F -FFE000FFFF7FFFFE_8010000000000000_400000FFFF7FFFFE -0000000000000000_403EAC2BA5BC629D_0000000000000000 -0000000000000000_8010000000000000_0000000000000000 -BF7FFFFFFF83FFFE_43C0000000008010_C34FFFFFFF85001E -4808F7FD87D24388_40D0FFFFFFFF0000_48EA877D604DD841 -2E8FBFFFFBFFFFFE_8010000000000001_8000000000000000 -0000000000000000_3FEB5FE3084DCBD4_0000000000000000 -0000000000000000_8010000000000001_0000000000000000 -B806622CB76C829F_43FFFFFFFBFBFFFE_BC16622CB49D70C1 -400000000013FFFE_801FFFFFFFFFFFFF_803000000013FFFD -0000000000000000_400FFFFFFFFBF800_0000000000000000 -0000000000000000_801FFFFFFFFFFFFF_0000000000000000 -BF9FFFFFFC00007F_C0E00000001003FF_408FFFFFFC20087D -C3412F70E854A3CD_801FFFFFFFFFFFFE_03712F70E854A3CC -0000000000000000_BF80000001000FFF_0000000000000000 -0000000000000000_801FFFFFFFFFFFFE_0000000000000000 -400A0E106668F71F_C7EFB60691768C51_C809D1D5398F7803 -5D40000020000001_BCA0000000000000_D9F0000020000001 -0000000000000000_4011EFFFFFFFFFFF_0000000000000000 -0000000000000000_BCA0000000000000_0000000000000000 -41F615F447443D4D_47FB520048B4C7C8_4A02DB1E90465D97 -C331FFFFFFFDFFFF_BCA0000000000001_3FE1FFFFFFFE0000 -0000000000000000_43CFB00000000000_0000000000000000 -0000000000000000_BCA0000000000001_0000000000000000 -43D000003FFFFFDF_332FFFDFFFFFBFFE_370FFFE07FFF3FBC -C0B00FFDFFFFFFFF_BCAFFFFFFFFFFFFF_3D700FFDFFFFFFFE -0000000000000000_801FFFFFDFFDFFFF_0000000000000000 -0000000000000000_BCAFFFFFFFFFFFFF_0000000000000000 -BA8020000007FFFE_CC630E69BC6B5947_46F334868FEDB72C -D2CDB3F1E461B363_BCAFFFFFFFFFFFFE_4F8DB3F1E461B361 -0000000000000000_BF1A4AE1112F1B36_0000000000000000 -0000000000000000_BCAFFFFFFFFFFFFE_0000000000000000 -D21FFFF7FFFFFBFF_C5600001FFFFFFF7_578FFFFBFFFEFBED -DD9DB170DCBBF900_BFD0000000000000_5D7DB170DCBBF900 -0000000000000000_001FFFFFFFFFF1FE_0000000000000000 -0000000000000000_BFD0000000000000_0000000000000000 -C3400000010FFFFF_C1D03F7FFFFFFFFF_45203F800114377E -41447D93CBEFEF97_BFD0000000000001_C1247D93CBEFEF98 -0000000000000000_C9CF7FFFEFFFFFFF_0000000000000000 -0000000000000000_BFD0000000000001_0000000000000000 -C0345B0019635AC8_400FFFFFFDFEFFFF_C0545B00181D07EE -FFE000000000807F_BFDFFFFFFFFFFFFF_7FD000000000807E -0000000000000000_43F0FDFFFFFFFFFE_0000000000000000 -0000000000000000_BFDFFFFFFFFFFFFF_0000000000000000 -47FFFFFFFFFC00FF_C0BA425E976EE2B8_C8CA425E976B9B3D -400FFFFFDBFFFFFF_BFDFFFFFFFFFFFFE_BFFFFFFFDBFFFFFD -0000000000000000_4D5FFFFFFBFFFFBF_0000000000000000 -0000000000000000_BFDFFFFFFFFFFFFE_0000000000000000 -59FBFFFE00000000_C027EFFFFFFFFFFF_DA34F1FE80FFFFFF -43D00000000000BF_BFE0000000000000_C3C00000000000BF -0000000000000000_402FFFFFE00003FF_0000000000000000 -0000000000000000_BFE0000000000000_0000000000000000 -B800003FFFFF8000_80007FF7FFFFFFFF_0000000000000000 -4020000000001FFF_BFE0000000000001_C010000000002000 -0000000000000000_3D9CA18D99CF24D6_0000000000000000 -0000000000000000_BFE0000000000001_0000000000000000 -37FFFF0000400000_47EFD7FFFFFFFFFE_3FFFD701403FAFFE -C3FFFFFF007FFFFE_BFEFFFFFFFFFFFFF_43FFFFFF007FFFFD -0000000000000000_BFE0003FBFFFFFFF_0000000000000000 -0000000000000000_BFEFFFFFFFFFFFFF_0000000000000000 -2AEFFFFFF7FFFFDF_800EE8D7022000B1_8000000000000000 -3FF00000000401FF_BFEFFFFFFFFFFFFE_BFF00000000401FE -0000000000000000_C3C00007FFDFFFFE_0000000000000000 -0000000000000000_BFEFFFFFFFFFFFFE_0000000000000000 -C00FFFF840000000_B7EFFFFFFF400000_380FFFF83F40002E -285FF7FFEFFFFFFE_BFF0000000000000_A85FF7FFEFFFFFFE -0000000000000000_403FFFBFFFF7FFFF_0000000000000000 -0000000000000000_BFF0000000000000_0000000000000000 -BED72C0F094A1B3F_7600000040007FFE_F4E72C0F65FB10C2 -4140000002FFFFFF_BFF0000000000001_C140000003000000 -0000000000000000_41DD7D0FA218C928_0000000000000000 -0000000000000000_BFF0000000000001_0000000000000000 -A96000403FFFFFFF_43F000000021FFFF_AD60004040220087 -3F5E0000000000FE_BFFFFFFFFFFFFFFF_BF6E0000000000FD -0000000000000000_7FF0000000024000_7FF8000000024000 -0000000000000000_BFFFFFFFFFFFFFFF_0000000000000000 -3A20000000803FFE_41DE5DAED7B5B96D_3C0E5DAED8A92057 -7FD0007FFFFFFFFC_BFFFFFFFFFFFFFFE_FFE0007FFFFFFFFB -0000000000000000_C03FFFFFDFFF8000_0000000000000000 -0000000000000000_BFFFFFFFFFFFFFFE_0000000000000000 -C1203FFFFFFFBFFE_BFF4001FFFFFFFFE_412450207FFFAFFB -C01F5E2568A7C286_C000000000000000_402F5E2568A7C286 -0000000000000000_FFD001000FFFFFFF_0000000000000000 -0000000000000000_C000000000000000_0000000000000000 -C3BFFF00000FFFFF_C02FFFF800000003_43FFFEF8004FFFFE -C1100001001FFFFF_C000000000000001_4120000100200000 -0000000000000000_C80EFFFF7FFFFFFF_0000000000000000 -0000000000000000_C000000000000001_0000000000000000 -3FBB7FFFFFFFFFFF_07FE52090A77DFF6_07CA0E7FC4FF0476 -B94FFDFFFFDFFFFF_C00FFFFFFFFFFFFF_396FFDFFFFDFFFFE -0000000000000000_BD86175278991CFB_0000000000000000 -0000000000000000_C00FFFFFFFFFFFFF_0000000000000000 -404633CAD2D9FF4D_B81FFFDFFEFFFFFF_B87633B49E5D8E1C -B80FFFFFFFFDFEFF_C00FFFFFFFFFFFFE_382FFFFFFFFDFEFD -0000000000000000_80080003FFFFFFFF_0000000000000000 -0000000000000000_C00FFFFFFFFFFFFE_0000000000000000 -C00FF000000007FE_C36FFFFF80000003_438FEFFF80400801 -C00FFFBFFFFF8000_C010000000000000_402FFFBFFFFF8000 -0000000000000000_3E37CA3A440B93F2_0000000000000000 -0000000000000000_C010000000000000_0000000000000000 -BFE848F15117B8F5_D5DFFFFFEFFFFDFF_55D848F144F33EC7 -3B50000004200000_C010000000000001_BB70000004200001 -0000000000000000_3FD2B1D6314EA651_0000000000000000 -0000000000000000_C010000000000001_0000000000000000 -C02FFFFFFF07FFFF_8BF00000003FBFFF_0C2FFFFFFF877FFD -BFF07FFEFFFFFFFF_C01FFFFFFFFFFFFF_40207FFEFFFFFFFE -0000000000000000_43E0000BFFFFFFFF_0000000000000000 -0000000000000000_C01FFFFFFFFFFFFF_0000000000000000 -8000000000002400_379FFFFF7FEFFFFF_8000000000000000 -C03FFDFFFFDFFFFF_C01FFFFFFFFFFFFE_406FFDFFFFDFFFFD -0000000000000000_401FFFFBFFFBFFFE_0000000000000000 -0000000000000000_C01FFFFFFFFFFFFE_0000000000000000 -CDAFFFFFF7FF8000_677FFE0000000003_F53FFDFFF800000B -43F00003FFFFFFBE_C340000000000000_C7400003FFFFFFBE -0000000000000000_47E0003FFFFFFFF7_0000000000000000 -0000000000000000_C340000000000000_0000000000000000 -C1D0004000000001_45C1EFFFFFFFFFFF_C7A1F047C0000000 -B840000005000000_C340000000000001_3B90000005000001 -0000000000000000_41DBFFFFFEFFFFFE_0000000000000000 -0000000000000000_C340000000000001_0000000000000000 -3FFFFFFFFF400000_3FE0000100001FFF_3FF00000FFA01FF9 -C7EFFFFFFFEFFFBE_C34FFFFFFFFFFFFF_4B4FFFFFFFEFFFBD -0000000000000000_C7EFFF87FFFFFFFE_0000000000000000 -0000000000000000_C34FFFFFFFFFFFFF_0000000000000000 -C98FFBFF7FFFFFFF_C024436216C48467_49C440D95974237B -3FE000002000FFFF_C34FFFFFFFFFFFFE_C34000002000FFFE -0000000000000000_401D27E8DCD864B4_0000000000000000 -0000000000000000_C34FFFFFFFFFFFFE_0000000000000000 -CCF56A812031F454_480D2D9053C8F4DB_D5138703621A58FE -C1E0000000000000_FFE0000000000000_7FF0000000000000 -0000000000000000_C1DFDFFFFFFBFFFE_0000000000000000 -0000000000000000_FFE0000000000000_0000000000000000 -561FFFFFFFDFFF00_BF859F5CCDF17B14_D5B59F5CCDDBDB0A -C1C0008000001000_FFE0000000000001_7FF0000000000000 -0000000000000000_37E0000000020FFE_0000000000000000 -0000000000000000_FFE0000000000001_0000000000000000 -002020000000001F_795C00000000001F_398C380000000055 -C034771CEE8F19C1_FFEFFFFFFFFFFFFF_7FF0000000000000 -0000000000000000_37FDC9CB87C9560C_0000000000000000 -0000000000000000_FFEFFFFFFFFFFFFF_0000000000000000 -C3CFFFFFFFFBFF7E_C0300000EFFFFFFF_44100000EFFDFFBE -67DE000080000000_FFEFFFFFFFFFFFFE_FFF0000000000000 -0000000000000000_3FFFC0000001FFFF_0000000000000000 -0000000000000000_FFEFFFFFFFFFFFFE_0000000000000000 -BFBFBFFFBFFFFFFF_40DFFFFFFE3FFFFE_C0AFBFFFBE438001 -46AFFFE00007FFFE_FFF0000000000000_FFF0000000000000 -0000000000000000_4622B04F697716EC_0000000000000000 -0000000000000000_FFF0000000000000_FFF8000000000000 -47F007FDFFFFFFFF_8010000002007FFF_881007FE02017FFE -402BFFFFFFFFFFDE_FFF0000000000001_FFF8000000000001 -0000000000000000_BFD000000000001C_0000000000000000 -0000000000000000_FFF0000000000001_FFF8000000000001 -3F6FFE0007FFFFFE_C02F800000000000_BFAF7E0807DFFFFE -B8EFFFFF0000000F_FFFFFFFFFFFFFFFF_FFFFFFFFFFFFFFFF -0000000000000000_C302E9A0E2FB7F01_0000000000000000 -0000000000000000_FFFFFFFFFFFFFFFF_FFFFFFFFFFFFFFFF -7670000000BFFFFE_001B46C40B2B81F0_369B46C40C72D31D -C1D0200100000000_FFFFFFFFFFFFFFFE_FFFFFFFFFFFFFFFE -0000000000000000_41F0008003FFFFFF_0000000000000000 -0000000000000000_FFFFFFFFFFFFFFFE_FFFFFFFFFFFFFFFE -37F8A185A32AD418_427FFFFC0007FFFF_3A88A1828F004813 -C1C0041FFFFFFFFF_0000000000000000_0000000000000000 -0000000000000001_3DDFFFFFFC0000FF_0000000000000000 -0000000000000001_0000000000000000_0000000000000000 -C00E0774599CC624_BFDFFF7EFFFFFFFF_3FFE06FB4B8FBCE3 -4EF74A66CE2FEE3C_0000000000000001_0BD74A66CE2FEE3C -0000000000000001_37FFFFFFBFFF7FFF_0000000000000000 -0000000000000001_0000000000000001_0000000000000000 -DEE00000FFBFFFFF_BCAFFFFFFFFFEBFE_5BA00000FFBFF5FE -802000000020007F_000FFFFFFFFFFFFF_8000000000000000 -0000000000000001_C04C0007FFFFFFFE_8000000000000038 -0000000000000001_000FFFFFFFFFFFFF_0000000000000000 -BEF000000A000000_47EFFFFFFFFFFF88_C6F0000009FFFFC4 -3AEFFFB7FFFFFFFF_000FFFFFFFFFFFFE_0000000000000000 -0000000000000001_C024F91426E8BB9F_800000000000000A -0000000000000001_000FFFFFFFFFFFFE_0000000000000000 -00156FEE8D11D18C_434FEFFF7FFFFFFF_03756536400B8E6E -D9800000080001FF_0010000000000000_99A00000080001FF -0000000000000001_43C56DDD9EE7B1D0_00A56DDD9EE7B1D0 -0000000000000001_0010000000000000_0000000000000000 -47FFFFBFFFFFFBFF_097080000FFFFFFF_11807FDF0FFFDDEE -C0AFFFFFFBFFFDFE_0010000000000001_80CFFFFFFBFFFE00 -0000000000000001_13CEFFFFFFFEFFFE_0000000000000000 -0000000000000001_0010000000000001_0000000000000000 -EB3972F509C9EC31_41EFEDFFFFFFFFFE_ED3964A45FF46A9B -C3F0000000008006_001FFFFFFFFFFFFF_8420000000008005 -0000000000000001_43EF0BB46298AEF4_00CF0BB46298AEF4 -0000000000000001_001FFFFFFFFFFFFF_0000000000000000 -BFCFFFFFFFFBF7FF_BB8003FFFFFFBFFF_3B6003FFFFFDBB7D -C01FDBFFFFFFFFFF_001FFFFFFFFFFFFE_804FDBFFFFFFFFFD -0000000000000001_4340AB6D8CE611D7_0020AB6D8CE611D7 -0000000000000001_001FFFFFFFFFFFFE_0000000000000000 -000FFFFFDFEFFFFF_3FE0000880000000_000800042FF7F77B -CEDFEBFFFFFFFFFF_3CA0000000000000_CB8FEBFFFFFFFFFF -0000000000000001_C80A1C4093F21AAC_84EA1C4093F21AAC -0000000000000001_3CA0000000000000_0000000000000000 -403FFFFFFFFFFFFF_438017FFFFFFFFFF_43D017FFFFFFFFFE -3FF2BE5D4AF2557B_3CA0000000000001_3CA2BE5D4AF2557C -0000000000000001_BFDFFFC00000000F_8000000000000000 -0000000000000001_3CA0000000000001_0000000000000000 -B7F400001FFFFFFE_D2600000000083FF_4A6400002000A4FD -BCAFBFFFFFFFFFFA_3CAFFFFFFFFFFFFF_B96FBFFFFFFFFFF9 -0000000000000001_BCA008007FFFFFFE_8000000000000000 -0000000000000001_3CAFFFFFFFFFFFFF_0000000000000000 -42EFFFFFBFF7FFFF_B95F0D53B2F5E431_BC5F0D5374D37975 -37FFFFFF8000003F_3CAFFFFFFFFFFFFE_34BFFFFF8000003D -0000000000000001_41FC0000007FFFFE_00000001C0000008 -0000000000000001_3CAFFFFFFFFFFFFE_0000000000000000 -B7EBFFFFEFFFFFFF_C80FFFFFE1FFFFFF_400BFFFFD5C0000D -C03301B70F92F179_3FD0000000000000_C01301B70F92F179 -0000000000000001_C670008002000000_8350008002000000 -0000000000000001_3FD0000000000000_0000000000000000 -2410000400000000_37E83FFFFFFFFFFF_1C0840060FFFFFFF -C03000203FFFFFFE_3FD0000000000001_C01000203FFFFFFF -0000000000000001_4010401FFFFFFFFF_0000000000000004 -0000000000000001_3FD0000000000001_0000000000000000 -3813A877851DA9FD_B590000003FFFFFF_ADB3A8778A07C7DD -B8C4E06540E8A4BD_3FDFFFFFFFFFFFFF_B8B4E06540E8A4BC -0000000000000001_B8CFFFFFE0000000_8000000000000000 -0000000000000001_3FDFFFFFFFFFFFFF_0000000000000000 -C06892F842C11DA8_8B3FDFFF7FFFFFFF_0BB87A64E8327B7F -43D0408000000000_3FDFFFFFFFFFFFFE_43C0407FFFFFFFFF -0000000000000001_401F0000FFFFFFFE_0000000000000008 -0000000000000001_3FDFFFFFFFFFFFFE_0000000000000000 -47EFFFE020000000_C1DF7FFFFFFFFFBF_C9DF7FE09F7FFFBF -4770000000101FFF_3FE0000000000000_4760000000101FFF -0000000000000001_7FFFFFFF80400000_7FFFFFFF80400000 -0000000000000001_3FE0000000000000_0000000000000000 -DD0FFF7FDFFFFFFE_BFC001FFF0000000_5CE001BFD7FE400F -412FFFFFFF7FFF7E_3FE0000000000001_411FFFFFFF7FFF80 -0000000000000001_BFB083FFFFFFFFFF_8000000000000000 -0000000000000001_3FE0000000000001_0000000000000001 -451FFFFFFFFBFDFF_BD70FFFFFDFFFFFF_C2A0FFFFFDFDDEEE -50C800B6B5B2FD27_3FEFFFFFFFFFFFFF_50C800B6B5B2FD26 -0000000000000001_4BEFFFFFFFBFFFC0_08CFFFFFFFBFFFC0 -0000000000000001_3FEFFFFFFFFFFFFF_0000000000000001 -C34BFFFFDFFFFFFE_399602EDE20FF4EE_BCF342900FCB086D -7FD0020080000000_3FEFFFFFFFFFFFFE_7FD002007FFFFFFF -0000000000000001_4198000008000000_0000000006000002 -0000000000000001_3FEFFFFFFFFFFFFE_0000000000000001 -38000FFEFFFFFFFF_C1FFFFFFFFE0FFFF_BA100FFEFFF0707F -C1FFFFFFFFFFFFBE_3FF0000000000000_C1FFFFFFFFFFFFBE -0000000000000001_C800000000010001_84E0000000010001 -0000000000000001_3FF0000000000000_0000000000000001 -C020800000000FFF_BFDFFFFFEFFFF000_40107FFFF7C007BF -EADFFFFFFFFFF080_3FF0000000000001_EADFFFFFFFFFF082 -0000000000000001_C01FFFF0000007FF_8000000000000008 -0000000000000001_3FF0000000000001_0000000000000001 -218FFFFFFFB00000_C06C000004000000_A20C000003BA0000 -381ABCCBF83E3414_3FFFFFFFFFFFFFFF_382ABCCBF83E3413 -0000000000000001_43C8000000000008_00A8000000000008 -0000000000000001_3FFFFFFFFFFFFFFF_0000000000000002 -C341E0811C296B57_401FFFFBFFFFFFFD_C371E07EE01947D0 -4D314B2DC2F83F9D_3FFFFFFFFFFFFFFE_4D414B2DC2F83F9C -0000000000000001_C18FEFFFF7FFFFFE_8000000003FDFFFF -0000000000000001_3FFFFFFFFFFFFFFE_0000000000000002 -FFD2000000001FFF_3F11FFBFFFFFFFFF_FEF43FB8000023FD -3FE401FFFFFFFFFF_4000000000000000_3FF401FFFFFFFFFF -0000000000000001_3F50000000400000_0000000000000000 -0000000000000001_4000000000000000_0000000000000002 -443FFFFFFC00007F_C3FEFFFFFFEFFFFF_C84EFFFFFC10007A -C34FFFFF80020000_4000000000000001_C35FFFFF80020002 -0000000000000001_FFDF7FFFFF000000_BCBF7FFFFF000000 -0000000000000001_4000000000000001_0000000000000002 -00200001EFFFFFFF_8006659B6BED88DA_8000000000000000 -B810000200010000_400FFFFFFFFFFFFF_B83000020000FFFF -0000000000000001_A6D0000800008000_8000000000000000 -0000000000000001_400FFFFFFFFFFFFF_0000000000000004 -FB20000002001FFF_43DFFFFFFBFFFFFF_FF10000000001FFE -47FFFF007FFFFFFE_400FFFFFFFFFFFFE_481FFF007FFFFFFC -0000000000000001_BF8E7FFFFFFFFFFE_8000000000000000 -0000000000000001_400FFFFFFFFFFFFE_0000000000000004 -E3BFBFFFFFFFFEFF_E9E15A004FCE6807_7FF0000000000000 -4340FFFFFFE00000_4010000000000000_4360FFFFFFE00000 -0000000000000001_BFC0BFDE31293D98_8000000000000000 -0000000000000001_4010000000000000_0000000000000004 -C030000000008FFE_0015D88E53B0A1CD_8055D88E53B16667 -7FD000000007FDFE_4010000000000001_7FF0000000000000 -0000000000000001_D6E000000080001E_93C000000080001E -0000000000000001_4010000000000001_0000000000000004 -4021E12E183CCA0F_B8D8F4801AD34750_B90BE2FE4AB7942E -A707357A4F8568A8_401FFFFFFFFFFFFF_A737357A4F8568A7 -0000000000000001_3FE178762201A644_0000000000000001 -0000000000000001_401FFFFFFFFFFFFF_0000000000000008 -7FDFFFC0FFFFFFFF_583FFEFFFFFF8000_7FF0000000000000 -BFB74259F79B4BB9_401FFFFFFFFFFFFE_BFE74259F79B4BB8 -0000000000000001_B81FEBD3A50FE362_8000000000000000 -0000000000000001_401FFFFFFFFFFFFE_0000000000000008 -D03FFFFFFD7FFFFF_C7F0001FFFFFFFFB_5840001FFEBFFD7A -41E9A4A230094AE9_4340000000000000_4539A4A230094AE9 -0000000000000001_48001CAA6570456B_04E01CAA6570456B -0000000000000001_4340000000000000_0020000000000000 -5FEE26480FB99D8D_4010000000DFFFFF_600E2648115FB57C -C3DFFFFEFFFFFF7F_4340000000000001_C72FFFFEFFFFFF81 -0000000000000001_3FFFFC0000000200_0000000000000002 -0000000000000001_4340000000000001_0020000000000001 -380FFFBFFFFFFFBF_4ECFFFDFFFFFFBFF_46EFFFA0003FFBBE -B9B000003EFFFFFF_434FFFFFFFFFFFFF_BD1000003EFFFFFE -0000000000000001_D71BFFFFFFFFFBFF_93FBFFFFFFFFFBFF -0000000000000001_434FFFFFFFFFFFFF_002FFFFFFFFFFFFF -BFB5FFFFFFFFFFFF_117681193B4BFFEA_913EF182B1887FE0 -40FFDFFFFFFFFEFF_434FFFFFFFFFFFFE_445FDFFFFFFFFEFD -0000000000000001_3BC4526231892215_0000000000000000 -0000000000000001_434FFFFFFFFFFFFE_002FFFFFFFFFFFFE -3DEFFFFFFFFBFFFC_C037FFFFFFFFFFEF_BE37FFFFFFFCFFEC -C010ECC1AEA52328_7FE0000000000000_FFF0000000000000 -0000000000000001_3CEA7FBFD31CA673_0000000000000000 -0000000000000001_7FE0000000000000_3CC0000000000000 -BE3FFFFFFFFFBF7E_41E000000003FFBF_C03000000003DF7E -C0B0000003E00000_7FE0000000000001_FFF0000000000000 -0000000000000001_40E80000003FFFFE_000000000000C000 -0000000000000001_7FE0000000000001_3CC0000000000001 -DA8F7FF800000000_7FFFFFEFFFFFE000_7FFFFFEFFFFFE000 -3D2FC00000008000_7FEFFFFFFFFFFFFF_7D2FC00000007FFF -0000000000000001_C000000000007FFC_8000000000000002 -0000000000000001_7FEFFFFFFFFFFFFF_3CCFFFFFFFFFFFFF -47DBD36CC06BACFB_C25905617E47F685_CA45C1DAC602E6E9 -37EFFFFFE0007FFF_7FEFFFFFFFFFFFFE_77EFFFFFE0007FFD -0000000000000001_41EFFFFFFF7EFFFF_00000000FFFFFFFC -0000000000000001_7FEFFFFFFFFFFFFE_3CCFFFFFFFFFFFFE -47FFFF8FFFFFFFFE_002FFFFFFFE0007F_083FFF8FFFE000ED -C3EBCD6E9C101F0A_7FF0000000000000_FFF0000000000000 -0000000000000001_3FEFFFFFFFFFFFE7_0000000000000001 -0000000000000001_7FF0000000000000_7FF0000000000000 -C003FFFFFFFFFFDF_C3DDFFFFBFFFFFFF_43F2BFFFD7FFFFE0 -3B3A26F7C907674C_7FF0000000000001_7FF8000000000001 -0000000000000001_C3CFBF7FFFFFFFFF_80AFBF7FFFFFFFFF -0000000000000001_7FF0000000000001_7FF8000000000001 -FFD571ED141357CC_48D13238F7A90FEF_FFF0000000000000 -FFEF00000000FFFE_7FFFFFFFFFFFFFFF_7FFFFFFFFFFFFFFF -0000000000000001_3FC000800000007E_0000000000000000 -0000000000000001_7FFFFFFFFFFFFFFF_7FFFFFFFFFFFFFFF -41FFFFFFFFFFFFFC_D26000001FF7FFFF_D47000001FF7FFFD -403FFFFFFFFFC07F_7FFFFFFFFFFFFFFE_7FFFFFFFFFFFFFFE -0000000000000001_A7D0000000000FF6_8000000000000000 -0000000000000001_7FFFFFFFFFFFFFFE_7FFFFFFFFFFFFFFE -47F001FFFF7FFFFF_C04FFDFFFFFEFFFF_C85000FFDF7F87EF -41FFFFFFFFFFF3FF_8000000000000000_0000000000000000 -0000000000000001_CF5FFFFE00001FFF_8C3FFFFE00001FFF -0000000000000001_8000000000000000_0000000000000000 -41DB1657445CD846_8E1040007FFFFFFF_8FFB82B17A2105C8 -C4F000000000006F_8000000000000001_01D000000000006F -0000000000000001_401FFFC001FFFFFF_0000000000000008 -0000000000000001_8000000000000001_8000000000000000 -BFA0000400000001_3FC000020001FFFF_BF70000600028000 -C3DFF0000000FFFF_800FFFFFFFFFFFFF_03FFF0000000FFFD -0000000000000001_C1DD324AC6EB4159_8000000074C92B1C -0000000000000001_800FFFFFFFFFFFFF_8000000000000000 -3F90000000000016_3FE000010000003F_3F80000100000055 -43D1117D9853FBE0_800FFFFFFFFFFFFE_83F1117D9853FBDE -0000000000000001_B7F0000FFFF80000_8000000000000000 -0000000000000001_800FFFFFFFFFFFFE_8000000000000000 -434EFFFFF7FFFFFE_4A77FFFEFFFFFFFE_4DD73FFF0200003D -BFC03FFFFFFFEFFF_8010000000000000_000207FFFFFFFE00 -0000000000000001_B7F0000FFFDFFFFF_8000000000000000 -0000000000000001_8010000000000000_8000000000000000 -B7FFFFFFF77FFFFF_0002BCC98A90728F_8000000000000000 -40100013FFFFFFFF_8010000000000001_8030001400000000 -0000000000000001_C7F0FFFDFFFFFFFE_84D0FFFDFFFFFFFE -0000000000000001_8010000000000001_8000000000000000 -FFDFFFFFFFFFBFFD_BF2C00000000FFFF_7F1C00000000C7FC -28CFEFFFFFFFFFFE_801FFFFFFFFFFFFF_8000000000000000 -0000000000000001_DD1FFFFFFFFFFFFE_99FFFFFFFFFFFFFE -0000000000000001_801FFFFFFFFFFFFF_8000000000000000 -DC8F000004000000_39BFFFFFFFC001FE_D65F000003C201EE -2FFFFFFFFFFFE01F_801FFFFFFFFFFFFE_8000000000000000 -0000000000000001_1BCFFFFFFDDFFFFE_0000000000000000 -0000000000000001_801FFFFFFFFFFFFE_8000000000000000 -480FFFFFFFFFFFFF_3E2C9A5A9EC07FDC_464C9A5A9EC07FDB -C1EFFFFFFFFFFDBF_BCA0000000000000_3E9FFFFFFFFFFDBF -0000000000000001_C34DDB49773FD16B_802DDB49773FD16B -0000000000000001_BCA0000000000000_8000000000000000 -40100000103FFFFE_3E1F7FFFEFFFFFFF_3E3F80000FFDFFEB -FFD7C6AFA1BB614D_BCA0000000000001_7C87C6AFA1BB614E -0000000000000001_C5FFFFFF3FFFFFFE_82DFFFFF3FFFFFFE -0000000000000001_BCA0000000000001_8000000000000000 -3F1FE00002000000_470FFE0001FFFFFF_463FDE0203FDDFFF -BFFFFFF80000003F_BCAFFFFFFFFFFFFF_3CBFFFF80000003E -0000000000000001_401FFFF000000003_0000000000000008 -0000000000000001_BCAFFFFFFFFFFFFF_8000000000000000 -3FF45B95085B60D5_C34FF8007FFFFFFF_C354567E74879E1E -380DD203735C6934_BCAFFFFFFFFFFFFE_B4CDD203735C6932 -0000000000000001_462C78F00C35C750_030C78F00C35C750 -0000000000000001_BCAFFFFFFFFFFFFE_8000000000000000 -C02313A786810A2A_407000000000403F_C0A313A7868156C4 -713C0C08CC84FDB5_BFD0000000000000_F11C0C08CC84FDB5 -0000000000000001_BFC000001000007E_8000000000000000 -0000000000000001_BFD0000000000000_8000000000000000 -BEBFFFFFFFB80000_434000003FFBFFFE_C21000003FD7FFFD -362200000007FFFE_BFD0000000000001_B60200000007FFFF -0000000000000001_3F42FFE933B9BB10_0000000000000000 -0000000000000001_BFD0000000000001_8000000000000000 -CFD000008003FFFE_C7FFFFFFF00FFFFF_57E00000780BFFBE -C03FFFC001FFFFFE_BFDFFFFFFFFFFFFF_402FFFC001FFFFFD -0000000000000001_BA4FFF7FFFFFFFFC_8000000000000000 -0000000000000001_BFDFFFFFFFFFFFFF_8000000000000000 -C04FFFBFFFFFF7FF_8010F80000000000_0070F7DE0FFFFBC1 -4D0EE00000000000_BFDFFFFFFFFFFFFE_CCFEDFFFFFFFFFFE -0000000000000001_3FA04000000FFFFF_0000000000000000 -0000000000000001_BFDFFFFFFFFFFFFE_8000000000000000 -BFC0000FFFFFDFFE_43FF7FFFFFFFFFBF_C3CF801F7FFFC0BB -3FB9AB239159DED5_BFE0000000000000_BFA9AB239159DED5 -0000000000000001_F2A003FFFFFFFBFE_AF8003FFFFFFFBFE -0000000000000001_BFE0000000000000_8000000000000000 -C02001000000007E_1B8E200000000000_9BBE21E2000000ED -403FFFFDFFF7FFFE_BFE0000000000001_C02FFFFDFFF80000 -0000000000000001_BFE000FF7FFFFFFE_8000000000000001 -0000000000000001_BFE0000000000001_8000000000000001 -7FD501AD5D9E2189_3F4FFFFFFE03FFFE_7F3501AD5C50A6E8 -B7FC0AAEDB09EA30_BFEFFFFFFFFFFFFF_37FC0AAEDB09EA2F -0000000000000001_BEB0200000000008_8000000000000000 -0000000000000001_BFEFFFFFFFFFFFFF_8000000000000001 -171008000000000E_BE7BFFFFFFFFFFBF_959C0DFFFFFFFFD7 -C0700011FFFFFFFF_BFEFFFFFFFFFFFFE_40700011FFFFFFFE -0000000000000001_C1DFFF000000001F_800000007FFC0000 -0000000000000001_BFEFFFFFFFFFFFFE_8000000000000001 -405000FFBFFFFFFF_5EBFFFDFFEFFFFFF_5F2000EFBE803800 -BFF0000000024000_BFF0000000000000_3FF0000000024000 -0000000000000001_C090040003FFFFFE_8000000000000401 -0000000000000001_BFF0000000000000_8000000000000001 -C3FFFFFFE0007FFF_44DFFFFE0003FFFF_C8EFFFFDE00481FE -C02FFFFFF8000040_BFF0000000000001_402FFFFFF8000042 -0000000000000001_D2AFFFF7FFFFBFFF_8F8FFFF7FFFFBFFF -0000000000000001_BFF0000000000001_8000000000000001 -7FF3C1D73DDD9076_402FFFF800000001_7FFBC1D73DDD9076 -FA9EC591D7B01CD9_BFFFFFFFFFFFFFFF_7AAEC591D7B01CD8 -0000000000000001_38048102083FC9E3_0000000000000000 -0000000000000001_BFFFFFFFFFFFFFFF_8000000000000002 -B88F880000000000_3FD56ECE521B8745_B8751E6ECC67A00A -403B952B8AE225F4_BFFFFFFFFFFFFFFE_C04B952B8AE225F2 -0000000000000001_3FC137B5E8A03D99_0000000000000000 -0000000000000001_BFFFFFFFFFFFFFFE_8000000000000002 -C0A00000001DFFFE_B3000001000001FE_33B00001001E01FE -B81CAFBB0B6DC6EC_C000000000000000_382CAFBB0B6DC6EC -0000000000000001_B80B07B5A33665F4_8000000000000000 -0000000000000001_C000000000000000_8000000000000002 -4FD003FFFFDFFFFF_47F7D101D738B33C_57D7D6F6177EDF64 -001B3F6963661396_C000000000000001_802B3F6963661398 -0000000000000001_3F2FFFF0001FFFFF_0000000000000000 -0000000000000001_C000000000000001_8000000000000002 -0034943A60F4EFB5_43E000080000001E_04249444AB122056 -3F7000001FFFFDFE_C00FFFFFFFFFFFFF_BF9000001FFFFDFD -0000000000000001_404FFFFFF001FFFE_0000000000000040 -0000000000000001_C00FFFFFFFFFFFFF_8000000000000004 -C91FFFFFFFFFE00E_BEE7FBFFFFFFFFFE_4817FBFFFFFFE80C -4A5FFFFDFFFFFDFF_C00FFFFFFFFFFFFE_CA7FFFFDFFFFFDFD -0000000000000001_BFDFFFF9FFFFFFFF_8000000000000000 -0000000000000001_C00FFFFFFFFFFFFE_8000000000000004 -3817A935C36334BA_C70FFFEFF7FFFFFE_BF37A929E8DE0596 -C3CBF80565D79A7A_C010000000000000_43EBF80565D79A7A -0000000000000001_C0186B90D3F5B30C_8000000000000006 -0000000000000001_C010000000000000_8000000000000004 -001FF80001FFFFFF_D5F00000002003FF_961FF800023FF7FB -8130000001FE0000_C010000000000001_0150000001FE0001 -0000000000000001_C40FFFFFFFFFF07E_80EFFFFFFFFFF07E -0000000000000001_C010000000000001_8000000000000004 -3FBB8FFE7BE7C539_415370AA7A2ED49E_4120BE89EA788AE4 -C0B0000000100001_C01FFFFFFFFFFFFF_40E0000000100000 -0000000000000001_37FF00007FFFFFFF_0000000000000000 -0000000000000001_C01FFFFFFFFFFFFF_8000000000000008 -C3CFFEFFFFDFFFFF_C80000010000000E_4BDFFF01FFD00019 -403FFDFFFF800000_C01FFFFFFFFFFFFE_C06FFDFFFF7FFFFE -0000000000000001_C73F2E150CDAC121_841F2E150CDAC121 -0000000000000001_C01FFFFFFFFFFFFE_8000000000000008 -BFDFFFFFF7FFFE00_0000008000007FFF_8000004000002FFF -C1DFFFFFFFFF8001_C340000000000000_452FFFFFFFFF8001 -0000000000000001_48DFFFFC00000FFF_05BFFFFC00000FFF -0000000000000001_C340000000000000_8020000000000000 -C3CFFFFFFFFBDFFF_800FFFBFFFFFFFFC_03EFFF7FFFFBE008 -B4BFF7FFFFFFBFFF_C340000000000001_380FF7FFFFFFC001 -0000000000000001_BFDFFFDFFFFFF7FF_8000000000000000 -0000000000000001_C340000000000001_8020000000000001 -FFEFFFFFFFBFFFFF_3C0002003FFFFFFF_FC0002003FDFFBFE -D50FC00000000002_C34FFFFFFFFFFFFF_586FC00000000001 -0000000000000001_C4B0FFFFFFFFF000_8190FFFFFFFFF000 -0000000000000001_C34FFFFFFFFFFFFF_802FFFFFFFFFFFFF -CE4F000000003FFE_C1F4001FFFFFFFFF_5053601F000027FE -C1DFFFFFFFE80000_C34FFFFFFFFFFFFE_453FFFFFFFE7FFFE -0000000000000001_381A2A6AB7776A91_0000000000000000 -0000000000000001_C34FFFFFFFFFFFFE_802FFFFFFFFFFFFE -B4CFFFFDFFFEFFFF_3F260584BD080937_B40605835CAF0D3A -C0400000000001FC_FFE0000000000000_7FF0000000000000 -0000000000000001_BDE969C24D971893_8000000000000000 -0000000000000001_FFE0000000000000_BCC0000000000000 -4025CF94566B4B58_8010100000200000_8045E563EAED55CC -B811EFFFFFFFFFFF_FFE0000000000001_7801F00000000000 -0000000000000001_C01003FFFFFFFFBF_8000000000000004 -0000000000000001_FFE0000000000001_BCC0000000000001 -404FF8000000007E_001FF7DFFFFFFFFF_007FEFE20800007D -C00003FEFFFFFFFF_FFEFFFFFFFFFFFFF_7FF0000000000000 -0000000000000001_B7F1000000000020_8000000000000000 -0000000000000001_FFEFFFFFFFFFFFFF_BCCFFFFFFFFFFFFF -6F800000000021FE_8000000FFFFFFFBE_AE9FFFFFFF7C43FC -4070FFFFFFFFFFFF_FFEFFFFFFFFFFFFE_FFF0000000000000 -0000000000000001_FFFFFF7FDFFFFFFF_FFFFFF7FDFFFFFFF -0000000000000001_FFEFFFFFFFFFFFFE_BCCFFFFFFFFFFFFE -0000000100000200_BCAFFFFFA0000000_8000000000000000 -00100003FFC00000_FFF0000000000000_FFF0000000000000 -0000000000000001_47FF000000000000_04DF000000000000 -0000000000000001_FFF0000000000000_FFF0000000000000 -3CA38A82442296EC_BF1FFFFFFF00000F_BBD38A82438642E3 -C03FFFF0001FFFFE_FFF0000000000001_FFF8000000000001 -0000000000000001_7FD008000000FFFF_3CB008000000FFFF -0000000000000001_FFF0000000000001_FFF8000000000001 -BA990A47FF91A237_3F15A1528236BE67_B9C0ECFB8A3280E7 -691007FFFFFDFFFF_FFFFFFFFFFFFFFFF_FFFFFFFFFFFFFFFF -0000000000000001_38FFFFF80000007E_0000000000000000 -0000000000000001_FFFFFFFFFFFFFFFF_FFFFFFFFFFFFFFFF -BFB782598EE1963D_C7FFFFFFFFFFFAFF_47C782598EE19290 -C2AFCC0D05774D24_FFFFFFFFFFFFFFFE_FFFFFFFFFFFFFFFE -0000000000000001_BFC3FC0000000000_8000000000000000 -0000000000000001_FFFFFFFFFFFFFFFE_FFFFFFFFFFFFFFFE -BFEFFFFFFFF7F7FF_002F07A6EB573EF6_802F07A6EB4F7549 -47E001FFFFFFFC00_0000000000000000_0000000000000000 -000FFFFFFFFFFFFF_3FE6CC569E37BA1B_000B662B4F1BDD0D -000FFFFFFFFFFFFF_0000000000000000_0000000000000000 -000FFFFFFFFFFFFF_0000000000000000_0000000000000000 -37F1C984DA2FA15D_8C60000000803FFF_8461C984DABE34A9 -C34FFFC001000000_0000000000000001_802FFFC001000000 -000FFFFFFFFFFFFF_C0280EEFA9D9947D_80480EEFA9D9947B -000FFFFFFFFFFFFF_0000000000000001_0000000000000000 -498FFFFFFFFFC100_8020000037FFFFFE_89C0000037FFE07E -41C5A5D87BCD5D1E_000FFFFFFFFFFFFF_01E5A5D87BCD5D1D -000FFFFFFFFFFFFF_47EFFFEFFF7FFFFF_080FFFEFFF7FFFFD -000FFFFFFFFFFFFF_000FFFFFFFFFFFFF_0000000000000000 -B7E0077FFFFFFFFE_BFC0000003FFFFFB_37B007800401DFF9 -450003FFFFFFF000_000FFFFFFFFFFFFE_052003FFFFFFEFFE -000FFFFFFFFFFFFF_41F0000000010002_0210000000010001 -000FFFFFFFFFFFFF_000FFFFFFFFFFFFE_0000000000000000 -3819F0E21E79F2CF_802BABDAA5FC7E3F_8000000000000000 -4AD57AD1D82F200A_0010000000000000_0AF57AD1D82F200A -000FFFFFFFFFFFFF_0000001000003FFF_0000000000000000 -000FFFFFFFFFFFFF_0010000000000000_0000000000000000 -40131FB8C050100E_7FEFFF00000001FE_7FF0000000000000 -3E6FFFF80007FFFF_0010000000000001_000000000FFFFC00 -000FFFFFFFFFFFFF_C7F000000001FDFF_881000000001FDFE -000FFFFFFFFFFFFF_0010000000000001_0000000000000000 -3FBFFFBFFFFF0000_CB8FFFDFFFF80000_CB5FFFA000370011 -8A784DA30375EC04_001FFFFFFFFFFFFF_8000000000000000 -000FFFFFFFFFFFFF_43EFFFFFEFFFFFFF_040FFFFFEFFFFFFD -000FFFFFFFFFFFFF_001FFFFFFFFFFFFF_0000000000000000 -3FF40000000003FF_BFDFE04000000000_BFE3EC28000003FB -401FFC0001000000_001FFFFFFFFFFFFE_004FFC0000FFFFFE -000FFFFFFFFFFFFF_380FF4BDB82DA02D_0000000000000000 -000FFFFFFFFFFFFF_001FFFFFFFFFFFFE_0000000000000000 -BFE0000001FFFFFC_FFDFFFFFFFF0007E_7FD0000001F8003B -C3F000400007FFFF_3CA0000000000000_C0A000400007FFFF -000FFFFFFFFFFFFF_41C2CF6CAD438055_01E2CF6CAD438054 -000FFFFFFFFFFFFF_3CA0000000000000_0000000000000000 -370000000004001F_C020007BFFFFFFFE_B730007C0004003C -8020000024000000_3CA0000000000001_8000000000000001 -000FFFFFFFFFFFFF_8010040000001FFF_8000000000000000 -000FFFFFFFFFFFFF_3CA0000000000001_0000000000000000 -C3D0030C167F60D9_37FFFFBEFFFFFFFE_BBE002EB904ED325 -3FE08007FFFFFFFF_3CAFFFFFFFFFFFFF_3CA08007FFFFFFFE -000FFFFFFFFFFFFF_B81FBDFBE9395EB3_8000000000000000 -000FFFFFFFFFFFFF_3CAFFFFFFFFFFFFF_0000000000000001 -A06CB433FB0FB66E_44FFFFFFFFFE0200_A57CB433FB0DECF6 -41AFFFFFFFFBEFFE_3CAFFFFFFFFFFFFE_3E6FFFFFFFFBEFFC -000FFFFFFFFFFFFF_C0108007FFFFFFFE_80308007FFFFFFFD -000FFFFFFFFFFFFF_3CAFFFFFFFFFFFFE_0000000000000001 -BFD0000000000000_C1ECEA38018E3B97_41CCEA38018E3B97 -D5F0000008000FFF_3FD0000000000000_D5D0000008000FFF -000FFFFFFFFFFFFF_40D00003FFFEFFFF_00F00003FFFEFFFE -000FFFFFFFFFFFFF_3FD0000000000000_0004000000000000 -3FF258CD32E658F4_47EFFFFF40000000_47F258CCC4D189C3 -C030000040000010_3FD0000000000001_C010000040000011 -000FFFFFFFFFFFFF_C7FFFF7FFFDFFFFE_881FFF7FFFDFFFFC -000FFFFFFFFFFFFF_3FD0000000000001_0004000000000000 -BE7FF7FFBFFFFFFE_4016E78241C01AF1_BEA6E1C83360A665 -411000000007FE00_3FDFFFFFFFFFFFFF_410000000007FDFF -000FFFFFFFFFFFFF_C530A81F6ACD67E9_8550A81F6ACD67E8 -000FFFFFFFFFFFFF_3FDFFFFFFFFFFFFF_0007FFFFFFFFFFFF -C99FFEFFFFEFFFFF_3ECFFFFFFFDFFFFA_C87FFEFFFFD000F9 -802000000000FEFF_3FDFFFFFFFFFFFFE_801000000000FEFE -000FFFFFFFFFFFFF_BFB96269E917CC32_800196269E917CC3 -000FFFFFFFFFFFFF_3FDFFFFFFFFFFFFE_0007FFFFFFFFFFFF -3C0FFDFFFFFFF7FE_3E1FFFFFE000001E_3A3FFDFFE001F81C -41EFFFFFFBFFFFBF_3FE0000000000000_41DFFFFFFBFFFFBF -000FFFFFFFFFFFFF_1E5F9B45EC578B94_0000000000000000 -000FFFFFFFFFFFFF_3FE0000000000000_0008000000000000 -441466E50DDBA08C_C33FFFDFFFFFFFF7_C76466D0A6F692AB -7FFFFFFFFC003FFF_3FE0000000000001_7FFFFFFFFC003FFF -000FFFFFFFFFFFFF_B81FFFFFFFFFFE00_8000000000000000 -000FFFFFFFFFFFFF_3FE0000000000001_0008000000000000 -4340000000000F00_001FFFC010000000_036FFFC010001E00 -43C00000013FFFFE_3FEFFFFFFFFFFFFF_43C00000013FFFFD -000FFFFFFFFFFFFF_3FD003FFDFFFFFFE_000400FFF7FFFFFF -000FFFFFFFFFFFFF_3FEFFFFFFFFFFFFF_000FFFFFFFFFFFFF -FFEFFFDFFFFFFFFE_4150200000000002_FFF0000000000000 -3FFFFFFFFFFF77FE_3FEFFFFFFFFFFFFE_3FFFFFFFFFFF77FC -000FFFFFFFFFFFFF_D7D3C6DCCC150718_97F3C6DCCC150717 -000FFFFFFFFFFFFF_3FEFFFFFFFFFFFFE_000FFFFFFFFFFFFE -C3CFFFDF00000000_C0C0000000003FFC_449FFFDF00007FF7 -3BBFFFC000000000_3FF0000000000000_3BBFFFC000000000 -000FFFFFFFFFFFFF_C3FFFE000007FFFF_841FFE000007FFFD -000FFFFFFFFFFFFF_3FF0000000000000_000FFFFFFFFFFFFF -400FFFFFFEFFFC00_40214C497A0B6C45_40414C49798107D0 -C7FC20BC60276748_3FF0000000000001_C7FC20BC6027674A -000FFFFFFFFFFFFF_3E9FFFFFF7FFFFFE_000000007FFFFFE0 -000FFFFFFFFFFFFF_3FF0000000000001_0010000000000000 -B7FC7621ED01FEBC_1BD3FFFFFFFFFBFF_93E1C9D534213BA6 -3F1FFFFFFFF00000_3FFFFFFFFFFFFFFF_3F2FFFFFFFEFFFFF -000FFFFFFFFFFFFF_C0D0003FFFFFFEFF_80F0003FFFFFFEFE -000FFFFFFFFFFFFF_3FFFFFFFFFFFFFFF_001FFFFFFFFFFFFD -434FFFFC04000000_C1C00000000000EF_C51FFFFC040001DE -BFA00000027FFFFF_3FFFFFFFFFFFFFFE_BFB00000027FFFFE -000FFFFFFFFFFFFF_4001FFFFFFFFFFFF_0021FFFFFFFFFFFE -000FFFFFFFFFFFFF_3FFFFFFFFFFFFFFE_001FFFFFFFFFFFFC -3109F8D54E236259_C6004007FFFFFFFF_B71A60C59FC696F2 -480F01FFFFFFFFFE_4000000000000000_481F01FFFFFFFFFE -000FFFFFFFFFFFFF_C179EDA020E53E29_8199EDA020E53E27 -000FFFFFFFFFFFFF_4000000000000000_001FFFFFFFFFFFFE -8ACE23742D722F8B_277FFBFFBFFFFFFF_8000000000000000 -3F6FFFFF00000001_4000000000000001_3F7FFFFF00000003 -000FFFFFFFFFFFFF_1F7FFFFFC001FFFF_0000000000000000 -000FFFFFFFFFFFFF_4000000000000001_0020000000000000 -BFDB5F82EC7B36F4_4170000002001FFE_C15B5F82EFE75E0D -C1E07FFFFFFFF7FF_400FFFFFFFFFFFFF_C2007FFFFFFFF7FE -000FFFFFFFFFFFFF_400FFFFDF7FFFFFF_002FFFFDF7FFFFFD -000FFFFFFFFFFFFF_400FFFFFFFFFFFFF_002FFFFFFFFFFFFD -3FAFFE00000000FE_F1B077FFFFFFFFFE_F17076F880000081 -B68F800000003FFF_400FFFFFFFFFFFFE_B6AF800000003FFD -000FFFFFFFFFFFFF_37E03F0000000000_0000000000000000 -000FFFFFFFFFFFFF_400FFFFFFFFFFFFE_002FFFFFFFFFFFFC -C000000400100000_4ADF442B8D81DFF3_CAEF44335EAC077F -C7E000001FDFFFFF_4010000000000000_C80000001FDFFFFF -000FFFFFFFFFFFFF_BFCFFFFFFFE03FFF_8003FFFFFFFC0800 -000FFFFFFFFFFFFF_4010000000000000_002FFFFFFFFFFFFE -801FF00000000FFE_41C00001C0000000_81EFF0037E400FFE -BFB7FF7FFFFFFFFE_4010000000000001_BFD7FF7FFFFFFFFF -000FFFFFFFFFFFFF_FFEF7FFFFFFFFFFA_C00F7FFFFFFFFFF8 -000FFFFFFFFFFFFF_4010000000000001_0030000000000000 -EFFFFFFFFFFF3FFF_43EFFFFFFFFFFFFF_F3FFFFFFFFFF3FFE -BFC0800000004000_401FFFFFFFFFFFFF_BFF0800000003FFF -000FFFFFFFFFFFFF_47FFFFFFFF7FFFBF_081FFFFFFF7FFFBD -000FFFFFFFFFFFFF_401FFFFFFFFFFFFF_003FFFFFFFFFFFFD -44DFFF1FFFFFFFFF_3F1000000007FE00_43FFFF20000FFB8F -BFE0001FFFFFEFFE_401FFFFFFFFFFFFE_C010001FFFFFEFFD -000FFFFFFFFFFFFF_7FFA52594B6AAC96_7FFA52594B6AAC96 -000FFFFFFFFFFFFF_401FFFFFFFFFFFFE_003FFFFFFFFFFFFC -8020000000000017_8013FEFFFFFFFFFF_0000000000000000 -C11FFFDFFBFFFFFE_4340000000000000_C46FFFDFFBFFFFFE -000FFFFFFFFFFFFF_81BD3C5BA33E326B_8000000000000000 -000FFFFFFFFFFFFF_4340000000000000_035FFFFFFFFFFFFE -C02FFFFFFE000800_E93FFFFFFFFFFFFF_697FFFFFFE0007FF -3FEFFFFFFF80001E_4340000000000001_433FFFFFFF800020 -000FFFFFFFFFFFFF_434002000000000E_036002000000000D -000FFFFFFFFFFFFF_4340000000000001_0360000000000000 -00225101173CD34F_3FFFFFFC0000007F_003250FECD1CB0B0 -001100003FFFFFFE_434FFFFFFFFFFFFF_037100003FFFFFFD -000FFFFFFFFFFFFF_400FFFFC00000001_002FFFFBFFFFFFFF -000FFFFFFFFFFFFF_434FFFFFFFFFFFFF_036FFFFFFFFFFFFD -43CFFFFFFFDF0000_C03F7FFFFE000000_C41F7FFFFDDF8400 -B066FD1CF779FFEB_434FFFFFFFFFFFFE_B3C6FD1CF779FFEA -000FFFFFFFFFFFFF_C7FF7FFFBFFFFFFE_881F7FFFBFFFFFFC -000FFFFFFFFFFFFF_434FFFFFFFFFFFFE_036FFFFFFFFFFFFC -23A0080000000002_BFE0000004007FFF_A390080004028041 -BF800000005FFFFF_7FE0000000000000_FF700000005FFFFF -000FFFFFFFFFFFFF_BE5E000002000000_8000000007800000 -000FFFFFFFFFFFFF_7FE0000000000000_3FFFFFFFFFFFFFFE -C0081124E7C2C6A2_43FBFFFFFBFFFFFF_C4150F0047C84930 -40E01F7FFFFFFFFF_7FE0000000000001_7FF0000000000000 -000FFFFFFFFFFFFF_3CB0FFBFFFFFFFFE_0000000000000001 -000FFFFFFFFFFFFF_7FE0000000000001_4000000000000000 -3F01C31E6C016497_BECFFFFFFFFE0000_BDE1C31E6C004865 -43EB42DBFC66A178_7FEFFFFFFFFFFFFF_7FF0000000000000 -000FFFFFFFFFFFFF_B51FFFFFC001FFFF_8000000000000000 -000FFFFFFFFFFFFF_7FEFFFFFFFFFFFFF_400FFFFFFFFFFFFD -3B5DFFFFFF7FFFFF_B8034E069BE3222B_B372192631D7B7ED -411D96BD48E7E8A5_7FEFFFFFFFFFFFFE_7FF0000000000000 -000FFFFFFFFFFFFF_BF1000000003FFDF_8000004000000010 -000FFFFFFFFFFFFF_7FEFFFFFFFFFFFFE_400FFFFFFFFFFFFC -42CFFFFFFE0007FF_3D9F87FFFFFFFFFF_407F87FFFE0787E0 -407FFBEFFFFFFFFE_7FF0000000000000_7FF0000000000000 -000FFFFFFFFFFFFF_4066D5C15EBD53EA_0086D5C15EBD53E9 -000FFFFFFFFFFFFF_7FF0000000000000_7FF0000000000000 -5290FFFFC0000000_C3DFFFFFF7800000_D680FFFFBB7C0011 -002000010000003F_7FF0000000000001_7FF8000000000001 -000FFFFFFFFFFFFF_BFC7FFFFFFF7FFFE_8002FFFFFFFF0000 -000FFFFFFFFFFFFF_7FF0000000000001_7FF8000000000001 -BFEFFFFC7FFFFFFF_C0607FFFFFFFFDFE_40607FFE31FFFDFD -DF0FFC1FFFFFFFFE_7FFFFFFFFFFFFFFF_7FFFFFFFFFFFFFFF -000FFFFFFFFFFFFF_FFF000000040003E_FFF800000040003E -000FFFFFFFFFFFFF_7FFFFFFFFFFFFFFF_7FFFFFFFFFFFFFFF -C3EFFFFFDE000000_001000400FFFFFFF_8410003FFEFFBBEE -B83FFBFFFFFFFFF7_7FFFFFFFFFFFFFFE_7FFFFFFFFFFFFFFE -000FFFFFFFFFFFFF_48067CE76AF6218D_08267CE76AF6218C -000FFFFFFFFFFFFF_7FFFFFFFFFFFFFFE_7FFFFFFFFFFFFFFE -BFC000000400003F_3F9AC3B6F25DF7F1_BF6AC3B6F90EE617 -BE4D01D37764FF1D_8000000000000000_0000000000000000 -000FFFFFFFFFFFFF_C3D0404000000000_83F0403FFFFFFFFF -000FFFFFFFFFFFFF_8000000000000000_0000000000000000 -8027FFBFFFFFFFFF_C62FFFFFFF000FFE_0667FFBFFF400DFD -7FD0003F80000000_8000000000000001_BCB0003F80000000 -000FFFFFFFFFFFFF_C1EFFFFFFFFFF7F7_820FFFFFFFFFF7F5 -000FFFFFFFFFFFFF_8000000000000001_8000000000000000 -C0100040007FFFFF_FFFFFEFFFF7FFFFF_FFFFFEFFFF7FFFFF -C01F7FFFFFFFFFDF_800FFFFFFFFFFFFF_003F7FFFFFFFFFDD -000FFFFFFFFFFFFF_C0B51C5B18B23A95_80D51C5B18B23A94 -000FFFFFFFFFFFFF_800FFFFFFFFFFFFF_8000000000000000 -E32FF0007FFFFFFF_43F09BE8A5FF905D_E730939AF41C332C -47D0000000800003_800FFFFFFFFFFFFE_87F0000000800001 -000FFFFFFFFFFFFF_3EDF807FFFFFFFFF_00000007E0200000 -000FFFFFFFFFFFFF_800FFFFFFFFFFFFE_8000000000000000 -47FFFFFFFFFCFFFF_C56FFFDF7FFFFFFE_CD7FFFDF7FFD0000 -4046BF34980845A3_8010000000000000_8066BF34980845A3 -000FFFFFFFFFFFFF_43E000000000081E_040000000000081D -000FFFFFFFFFFFFF_8010000000000000_8000000000000000 -6F5FFEFFFFC00000_4170000101FFFFFF_70DFFF0203AFDFFA -43C020000003FFFE_8010000000000001_83E020000003FFFF -000FFFFFFFFFFFFF_BC300020000001FF_8000000000000000 -000FFFFFFFFFFFFF_8010000000000001_8000000000000000 -C3EFFFFFFFFFF7F7_BCA0000013FFFFFE_40A0000013FFFBF9 -41FFEFFFFFFFFDFE_801FFFFFFFFFFFFF_822FEFFFFFFFFDFD -000FFFFFFFFFFFFF_43DFFFFFBE000000_03FFFFFFBDFFFFFE -000FFFFFFFFFFFFF_801FFFFFFFFFFFFF_8000000000000000 -7FF00000000047FF_B93FDFFFFFFEFFFE_7FF80000000047FF -32B000000007FE00_801FFFFFFFFFFFFE_8000000000000000 -000FFFFFFFFFFFFF_BD6FFFF000400000_8000000000001000 -000FFFFFFFFFFFFF_801FFFFFFFFFFFFE_8000000000000000 -B7EFFFFBFFFEFFFE_C1C7FAC55E957FA4_39C7FAC25F3C13FA -401F1C8FAE67A13D_BCA0000000000000_BCCF1C8FAE67A13D -000FFFFFFFFFFFFF_3FFFFFFF807FFFFF_001FFFFF807FFFFD -000FFFFFFFFFFFFF_BCA0000000000000_8000000000000000 -BEDB552C12514299_3C54B12B3B74A137_BB41AC8F9473FB6A -41900003FFF80000_BCA0000000000001_BE400003FFF80001 -000FFFFFFFFFFFFF_7FDFFFF800FFFFFF_3FFFFFF800FFFFFD -000FFFFFFFFFFFFF_BCA0000000000001_8000000000000000 -001B7306E4E785ED_BCAFFFFFFFFFFC07_8000000000000002 -BFBF7FFFFFFFFF7F_BCAFFFFFFFFFFFFF_3C7F7FFFFFFFFF7E -000FFFFFFFFFFFFF_B80000200000FFFF_8000000000000000 -000FFFFFFFFFFFFF_BCAFFFFFFFFFFFFF_8000000000000001 -C03CB6FEC9D40E15_40CFBFFF7FFFFFFE_C11C7D9059646AD0 -56500000001FEFFF_BCAFFFFFFFFFFFFE_D3100000001FEFFE -000FFFFFFFFFFFFF_402FFFFFC0000FFE_004FFFFFC0000FFC -000FFFFFFFFFFFFF_BCAFFFFFFFFFFFFE_8000000000000001 -801FFE000000001F_400FEE825F091FF6_803FEC8376E32F83 -801FFC00000FFFFF_BFD0000000000000_0007FF0000040000 -000FFFFFFFFFFFFF_41C0007FFFFFFFFE_01E0007FFFFFFFFD -000FFFFFFFFFFFFF_BFD0000000000000_8004000000000000 -43CFFFFFFFFE0002_1F6FFFFFFFFFEFFC_234FFFFFFFFDEFFE -BD1A3D3698F0F279_BFD0000000000001_3CFA3D3698F0F27B -000FFFFFFFFFFFFF_BFEFEFFFEFFFFFFF_800FF7FFF7FFFFFF -000FFFFFFFFFFFFF_BFD0000000000001_8004000000000000 -C53DAA2326A10327_C00FFFCFFFFFFFFF_455DA9F6A76C4935 -40041A66DDC91329_BFDFFFFFFFFFFFFF_BFF41A66DDC91328 -000FFFFFFFFFFFFF_BDBCAB0FD11DC435_800000000001CAB1 -000FFFFFFFFFFFFF_BFDFFFFFFFFFFFFF_8007FFFFFFFFFFFF -C34FFF80000007FE_D9B0FFFFFFFFFFDF_5D10FFBC0000041E -C03C3915287E2637_BFDFFFFFFFFFFFFE_402C3915287E2635 -000FFFFFFFFFFFFF_4620000000201FFF_0640000000201FFE -000FFFFFFFFFFFFF_BFDFFFFFFFFFFFFE_8007FFFFFFFFFFFF -C1F0000004001FFF_403FFFFDEFFFFFFF_C23FFFFDF8003F79 -0E08000000000800_BFE0000000000000_8DF8000000000800 -000FFFFFFFFFFFFF_400FFFFFDFFFC000_002FFFFFDFFFBFFE -000FFFFFFFFFFFFF_BFE0000000000000_8008000000000000 -37E0000000004000_B7CDFFFFFFF7FFFE_AFBDFFFFFFF877FE -406FFFFFFE0001FF_BFE0000000000001_C05FFFFFFE000201 -000FFFFFFFFFFFFF_4012E22B0796D97A_0032E22B0796D979 -000FFFFFFFFFFFFF_BFE0000000000001_8008000000000000 -480F800000007FFF_B99000007FFFFFFF_C1AF8000FC007FFD -FAC0003FFFFFFC00_BFEFFFFFFFFFFFFF_7AC0003FFFFFFBFF -000FFFFFFFFFFFFF_43460FDD484EBBF2_03660FDD484EBBF1 -000FFFFFFFFFFFFF_BFEFFFFFFFFFFFFF_800FFFFFFFFFFFFF -00250255336A1FD8_37EDFFFFFFFFF7FF_0000000000000000 -40DFFFFF80000FFE_BFEFFFFFFFFFFFFE_C0DFFFFF80000FFC -000FFFFFFFFFFFFF_BC6DE83267D8F306_8000000000000000 -000FFFFFFFFFFFFF_BFEFFFFFFFFFFFFE_800FFFFFFFFFFFFE -43DFE00400000000_47FFFFFEF7FFFFFF_4BEFE002F907DEFF -00100000200FFFFF_BFF0000000000000_80100000200FFFFF -000FFFFFFFFFFFFF_FFD0003FFEFFFFFE_BFF0003FFEFFFFFD -000FFFFFFFFFFFFF_BFF0000000000000_800FFFFFFFFFFFFF -3F8C000007FFFFFE_8B5FFFFFF0000004_8AFBFFFFF9FFFFFE -3F04E8DBDE385ED5_BFF0000000000001_BF04E8DBDE385ED6 -000FFFFFFFFFFFFF_C80AE23008288F2B_882AE23008288F29 -000FFFFFFFFFFFFF_BFF0000000000001_8010000000000000 -4B2FFBFF00000000_3CA000000007FFE0_47DFFBFF000FFDC0 -BFF0080001FFFFFF_BFFFFFFFFFFFFFFF_4000080001FFFFFE -000FFFFFFFFFFFFF_C010000000002400_80300000000023FF -000FFFFFFFFFFFFF_BFFFFFFFFFFFFFFF_801FFFFFFFFFFFFD -BFF164D0CE0F4D7C_41E7D7D5DDD93C63_C1E9EB8F5D4F5143 -C1D8000000000000_BFFFFFFFFFFFFFFE_41E7FFFFFFFFFFFE -000FFFFFFFFFFFFF_3F2FFEFFFFFFFFFF_000000FFF8000000 -000FFFFFFFFFFFFF_BFFFFFFFFFFFFFFE_801FFFFFFFFFFFFC -C1D6D2C0D910DCD3_3CAFFFFFFFD7FFFF_BE96D2C0D8F45561 -FFFFFFFBFFFFF7FE_C000000000000000_FFFFFFFBFFFFF7FE -000FFFFFFFFFFFFF_FFFABF7501A0A4D4_FFFABF7501A0A4D4 -000FFFFFFFFFFFFF_C000000000000000_801FFFFFFFFFFFFE -4370007FFFFFFFFF_3FE000000FBFFFFF_436000800FC07DFE -402008000FFFFFFE_C000000000000001_C03008000FFFFFFF -000FFFFFFFFFFFFF_C1FD5FA1A934528E_821D5FA1A934528C -000FFFFFFFFFFFFF_C000000000000001_8020000000000000 -C03FFFFFF801FFFF_BFE0000000100001_402FFFFFF8220001 -001FFFDFFEFFFFFE_C00FFFFFFFFFFFFF_803FFFDFFEFFFFFD -000FFFFFFFFFFFFF_871000000003FBFF_8000000000000000 -000FFFFFFFFFFFFF_C00FFFFFFFFFFFFF_802FFFFFFFFFFFFD -CF66989323B8CA6C_7FF0001FFFFFFFFF_7FF8001FFFFFFFFF -BF4000001FFFFFFE_C00FFFFFFFFFFFFE_3F6000001FFFFFFD -000FFFFFFFFFFFFF_4030000020000003_0050000020000002 -000FFFFFFFFFFFFF_C00FFFFFFFFFFFFE_802FFFFFFFFFFFFC -43CFFFFFC0000007_CCF3EAA6A1B6FA2E_D0D3EAA679E1ACEF -BF27000000000000_C010000000000000_3F47000000000000 -000FFFFFFFFFFFFF_C010000000001FFE_8030000000001FFD -000FFFFFFFFFFFFF_C010000000000000_802FFFFFFFFFFFFE -C27D3655B9D22134_3FB0200000002000_C23D70C26545FFE3 -3FE01FFFFFFFFFFE_C010000000000001_C0001FFFFFFFFFFF diff --git a/wally-pipelined/src/fpu/faddcvt.sv b/wally-pipelined/src/fpu/faddcvt.sv new file mode 100755 index 00000000..c4122e21 --- /dev/null +++ b/wally-pipelined/src/fpu/faddcvt.sv @@ -0,0 +1,417 @@ +// +// File name : fpadd +// Title : Floating-Point Adder/Subtractor +// project : FPU +// Library : fpadd +// Author(s) : James E. Stine, Jr., Brett Mathis +// Purpose : definition of main unit to floating-point add/sub +// notes : +// +// Copyright Oklahoma State University +// Copyright AFRL +// +// Basic and Denormalized Operations +// +// Step 1: Load operands, set flags, and convert SP to DP +// Step 2: Check for special inputs ( +/- Infinity, NaN) +// Step 3: Compare exponents. Swap the operands of exp1 < exp2 +// or of (exp1 = exp2 AND mnt1 < mnt2) +// Step 4: Shift the mantissa corresponding to the smaller exponent, +// and extend precision by three bits to the right. +// Step 5: Add or subtract the mantissas. +// Step 6: Normalize the result.// +// Shift left until normalized. Normalized when the value to the +// left of the binrary point is 1. +// Step 7: Round the result.// +// Step 8: Put sum onto output. +// + +module faddcvt( + input logic clk, + input logic reset, + input logic FlushM, + input logic StallM, + input logic [63:0] SrcXE, // 1st input operand (A) + input logic [63:0] SrcYE, // 2nd input operand (B) + input logic [3:0] FOpCtrlE, FOpCtrlM, // Function opcode + input logic FmtE, FmtM, // Result Precision (0 for double, 1 for single) + input logic [2:0] FrmM, // Rounding mode - specify values + output logic [63:0] FAddResM, // Result of operation + output logic [4:0] FAddFlgM); // IEEE exception flags + + logic [63:0] AddSumE, AddSumM; + logic [63:0] AddSumTcE, AddSumTcM; + logic [3:0] AddSelInvE, AddSelInvM; + logic [10:0] AddExpPostSumE,AddExpPostSumM; + logic AddCorrSignE, AddCorrSignM; + logic AddOp1NormE, AddOp1NormM; + logic AddOp2NormE, AddOp2NormM; + logic AddOpANormE, AddOpANormM; + logic AddOpBNormE, AddOpBNormM; + logic AddInvalidE, AddInvalidM; + logic AddDenormInE, AddDenormInM; + logic AddSwapE, AddSwapM; + logic AddNormOvflowE, AddNormOvflowM; //***this isn't used in addcvt2 + logic AddSignAE, AddSignAM; + logic AddConvertE, AddConvertM; + logic [63:0] AddFloat1E, AddFloat2E, AddFloat1M, AddFloat2M; + logic [11:0] AddExp1DenormE, AddExp2DenormE, AddExp1DenormM, AddExp2DenormM; + logic [10:0] AddExponentE, AddExponentM; + + + fpuaddcvt1 fpadd1 (.SrcXE, .SrcYE, .FOpCtrlE, .FmtE, .AddFloat1E, .AddFloat2E, .AddExponentE, + .AddExpPostSumE, .AddExp1DenormE, .AddExp2DenormE, .AddSumE, .AddSumTcE, .AddSelInvE, + .AddCorrSignE, .AddSignAE, .AddOp1NormE, .AddOp2NormE, .AddOpANormE, .AddOpBNormE, .AddInvalidE, + .AddDenormInE, .AddConvertE, .AddSwapE, .AddNormOvflowE); + + flopenrc #(64) EMRegAdd1(clk, reset, FlushM, ~StallM, AddSumE, AddSumM); + flopenrc #(64) EMRegAdd2(clk, reset, FlushM, ~StallM, AddSumTcE, AddSumTcM); + flopenrc #(11) EMRegAdd3(clk, reset, FlushM, ~StallM, AddExpPostSumE, AddExpPostSumM); + flopenrc #(64) EMRegAdd4(clk, reset, FlushM, ~StallM, AddFloat1E, AddFloat1M); + flopenrc #(64) EMRegAdd5(clk, reset, FlushM, ~StallM, AddFloat2E, AddFloat2M); + flopenrc #(12) EMRegAdd6(clk, reset, FlushM, ~StallM, AddExp1DenormE, AddExp1DenormM); + flopenrc #(12) EMRegAdd7(clk, reset, FlushM, ~StallM, AddExp2DenormE, AddExp2DenormM); + flopenrc #(11) EMRegAdd8(clk, reset, FlushM, ~StallM, AddExponentE, AddExponentM); + flopenrc #(15) EMRegAdd9(clk, reset, FlushM, ~StallM, + {AddSelInvE, AddCorrSignE, AddOp1NormE, AddOp2NormE, AddOpANormE, AddOpBNormE, AddInvalidE, AddDenormInE, AddConvertE, AddSwapE, AddNormOvflowE, AddSignAE}, + {AddSelInvM, AddCorrSignM, AddOp1NormM, AddOp2NormM, AddOpANormM, AddOpBNormM, AddInvalidM, AddDenormInM, AddConvertM, AddSwapM, AddNormOvflowM, AddSignAM}); + + + fpuaddcvt2 fpadd2 (.FrmM, .FOpCtrlM, .FmtM, .AddSumM, .AddSumTcM, .AddFloat1M, .AddFloat2M, + .AddExp1DenormM, .AddExp2DenormM, .AddExponentM, .AddExpPostSumM, .AddSelInvM, + .AddOp1NormM, .AddOp2NormM, .AddOpANormM, .AddOpBNormM, .AddInvalidM, .AddDenormInM, + .AddSignAM, .AddCorrSignM, .AddConvertM, .AddSwapM, .FAddResM, .FAddFlgM); +endmodule + +module fpuaddcvt1 (AddSumE, AddSumTcE, AddSelInvE, AddExpPostSumE, AddCorrSignE, AddOp1NormE, AddOp2NormE, AddOpANormE, AddOpBNormE, AddInvalidE, AddDenormInE, AddConvertE, AddSwapE, AddNormOvflowE, AddSignAE, AddFloat1E, AddFloat2E, AddExp1DenormE, AddExp2DenormE, AddExponentE, SrcXE, SrcYE, FOpCtrlE, FmtE); + + input logic [63:0] SrcXE; // 1st input operand (A) + input logic [63:0] SrcYE; // 2nd input operand (B) + input logic [3:0] FOpCtrlE; // Function opcode + input logic FmtE; // Result Precision (1 for double, 0 for single) + + wire P; + assign P = ~FmtE; + + wire [63:0] IntValue; + wire [11:0] exp1, exp2; + wire [11:0] exp_diff1, exp_diff2; + wire [11:0] exp_shift; + wire [51:0] mantissaA; + wire [56:0] mantissaA1; + wire [63:0] mantissaA3; + wire [51:0] mantissaB; + wire [56:0] mantissaB1, mantissaB2; + wire [63:0] mantissaB3; + wire exp_gt63; + wire Sticky_out; + wire sub; + wire zeroB; + wire [5:0] align_shift; + + output logic [63:0] AddFloat1E; + output logic [63:0] AddFloat2E; + output logic [10:0] AddExponentE; + output logic [10:0] AddExpPostSumE; + output logic [11:0] AddExp1DenormE, AddExp2DenormE;//KEP used to be [10:0] + output logic [63:0] AddSumE, AddSumTcE; + output logic [3:0] AddSelInvE; + output logic AddCorrSignE; + output logic AddSignAE; + output logic AddOp1NormE, AddOp2NormE; + output logic AddOpANormE, AddOpBNormE; + output logic AddInvalidE; + output logic AddDenormInE; +// output logic exp_valid; + output logic AddConvertE; + output logic AddSwapE; + output logic AddNormOvflowE; + wire [5:0] ZP_mantissaA; + wire [5:0] ZP_mantissaB; + wire ZV_mantissaA; + wire ZV_mantissaB; + + // Convert the input operands to their appropriate forms based on + // the orignal operands, the FOpCtrlE , and their precision P. + // Single precision inputs are converted to double precision + // and the sign of the first operand is set appropratiately based on + // if the operation is absolute value or negation. + + convert_inputs conv1 (AddFloat1E, AddFloat2E, SrcXE, SrcYE, FOpCtrlE, P); + + // Test for exceptions and return the "Invalid Operation" and + // "Denormalized" Input Flags. The "AddSelInvE" is used in + // the third pipeline stage to select the result. Also, AddOp1NormE + // and AddOp2NormE are one if SrcXE and SrcYE are not zero or denormalized. + // sub is one if the effective operation is subtaction. + + exception exc1 (AddSelInvE, AddInvalidE, AddDenormInE, AddOp1NormE, AddOp2NormE, sub, + AddFloat1E, AddFloat2E, FOpCtrlE); + + // Perform Exponent Subtraction (used for alignment). For performance + // both exponent subtractions are performed in parallel. This was + // changed to a behavior level to allow the tools to try to optimize + // the two parallel additions. The input values are zero-extended to 12 + // bits prior to performing the addition. + + assign exp1 = {1'b0, AddFloat1E[62:52]}; + assign exp2 = {1'b0, AddFloat2E[62:52]}; + assign exp_diff1 = exp1 - exp2; + assign exp_diff2 = AddDenormInE ? ({AddFloat2E[63], exp2[10:0]} - {AddFloat1E[63], exp1[10:0]}): exp2 - exp1; + + // The second operand (B) should be set to zero, if FOpCtrlE does not + // specify addition or subtraction + assign zeroB = FOpCtrlE[2] | FOpCtrlE[1]; + + // Swapped operands if zeroB is not one and exp1 < exp2. + // Swapping causes exp2 to be used for the result exponent. + // Only the exponent of the larger operand is used to determine + // the final result. + assign AddSwapE = exp_diff1[11] & ~zeroB; + assign AddExponentE = AddSwapE ? exp2[10:0] : exp1[10:0]; + assign AddExpPostSumE = AddSwapE ? exp2[10:0] : exp1[10:0]; + assign mantissaA = AddSwapE ? AddFloat2E[51:0] : AddFloat1E[51:0]; + assign mantissaB = AddSwapE ? AddFloat1E[51:0] : AddFloat2E[51:0]; + assign AddSignAE = AddSwapE ? AddFloat2E[63] : AddFloat1E[63]; + + // Leading-Zero Detector. Determine the size of the shift needed for + // normalization. If sum_corrected is all zeros, the exp_valid is + // zero; otherwise, it is one. + // modified to 52 bits to detect leading zeroes on denormalized mantissas + lz52 lz_norm_1 (ZP_mantissaA, ZV_mantissaA, mantissaA); + lz52 lz_norm_2 (ZP_mantissaB, ZV_mantissaB, mantissaB); + + // Denormalized exponents created by subtracting the leading zeroes from the original exponents + assign AddExp1DenormE = AddSwapE ? (exp1 - {6'b0, ZP_mantissaB}) : (exp1 - {6'b0, ZP_mantissaA}); //KEP extended ZP_mantissa + assign AddExp2DenormE = AddSwapE ? (exp2 - {6'b0, ZP_mantissaA}) : (exp2 - {6'b0, ZP_mantissaB}); + + // Determine the alignment shift and limit it to 63. If any bit from + // exp_shift[6] to exp_shift[11] is one, then shift is set to all ones. + assign exp_shift = AddSwapE ? exp_diff2 : exp_diff1; + assign exp_gt63 = exp_shift[11] | exp_shift[10] | exp_shift[9] + | exp_shift[8] | exp_shift[7] | exp_shift[6]; + assign align_shift = exp_shift[5:0] | {6{exp_gt63}}; //KEP used to be all of exp_shift + + // Unpack the 52-bit mantissas to 57-bit numbers of the form. + // 001.M[51]M[50] ... M[1]M[0]00 + // Unless the number has an exponent of zero, in which case it + // is unpacked as + // 000.00 ... 00 + // This effectively flushes denormalized values to zero. + // The three bits of to the left of the binary point prevent overflow + // and loss of sign information. The two bits to the right of the + // original mantissa form the "guard" and "round" bits that are used + // to round the result. + assign AddOpANormE = AddSwapE ? AddOp2NormE : AddOp1NormE; + assign AddOpBNormE = AddSwapE ? AddOp1NormE : AddOp2NormE; + assign mantissaA1 = {2'h0, AddOpANormE, mantissaA[51:0]&{52{AddOpANormE}}, 2'h0}; + assign mantissaB1 = {2'h0, AddOpBNormE, mantissaB[51:0]&{52{AddOpBNormE}}, 2'h0}; + + // Perform mantissa alignment using a 57-bit barrel shifter + // If any of the bits shifted out are one, Sticky_out is set. + // The size of the barrel shifter could be reduced by two bits + // by not adding the leading two zeros until after the shift. + barrel_shifter_r57 bs1 (mantissaB2, Sticky_out, mantissaB1, align_shift); + + // Place either the sign-extened 32-bit value or the original 64-bit value + // into IntValue (to be used for integer to floating point conversion) + assign IntValue [31:0] = SrcXE[31:0]; + assign IntValue [63:32] = FOpCtrlE[0] ? {32{SrcXE[31]}} : SrcXE[63:32]; + + // If doing an integer to floating point conversion, mantissaA3 is set to + // IntVal and the prenomalized exponent is set to 1084. Otherwise, + // mantissaA3 is simply extended to 64-bits by setting the 7 LSBs to zero, + // and the exponent value is left unchanged. + // Under denormalized cases, the exponent before the rounder is set to 1 + // if the normal shift value is 11. + assign AddConvertE = ~FOpCtrlE[2] & FOpCtrlE[1]; + assign mantissaA3 = (FOpCtrlE[3]) ? (FOpCtrlE[0] ? AddFloat1E : ~AddFloat1E) : (AddDenormInE ? ({12'h0, mantissaA}) : (AddConvertE ? IntValue : {mantissaA1, 7'h0})); + + // Put zero in for mantissaB3, if zeroB is one. Otherwise, B is extended to + // 64-bits by setting the 7 LSBs to the Sticky_out bit followed by six + // zeros. + assign mantissaB3[63:7] = (FOpCtrlE[3]) ? (57'h0) : (AddDenormInE ? {12'h0, mantissaB[51:7]} : mantissaB2 & {57{~zeroB}}); + assign mantissaB3[6] = (FOpCtrlE[3]) ? (1'b0) : (AddDenormInE ? mantissaB[6] : Sticky_out & ~zeroB); + assign mantissaB3[5:0] = (FOpCtrlE[3]) ? (6'h01) : (AddDenormInE ? mantissaB[5:0] : 6'h0); + + // The sign of the result needs to be corrected if the true + // operation is subtraction and the input operands were swapped. + assign AddCorrSignE = ~FOpCtrlE[2]&~FOpCtrlE[1]&FOpCtrlE[0]&AddSwapE; + + // 64-bit Mantissa Adder/Subtractor + cla64 add1 (AddSumE, mantissaA3, mantissaB3, sub); //***adder + + // 64-bit Mantissa Subtractor - to get the two's complement of the + // result when the sign from the adder/subtractor is negative. + cla_sub64 sub1 (AddSumTcE, mantissaB3, mantissaA3); //***adder + + // Finds normal underflow result to determine whether to round final exponent down + //***KEP used to be (AddSumE == 16'h0) I am unsure what it's supposed to be + assign AddNormOvflowE = (AddDenormInE & (AddSumE == 64'h0) & (AddOpANormE | AddOpBNormE) & ~FOpCtrlE[0]) ? 1'b1 : (AddSumE[63] ? AddSumTcE[52] : AddSumE[52]); + +endmodule // fpadd + + +// +// File name : fpadd +// Title : Floating-Point Adder/Subtractor +// project : FPU +// Library : fpadd +// Author(s) : James E. Stine, Jr., Brett Mathis +// Purpose : definition of main unit to floating-point add/sub +// notes : +// +// Copyright Oklahoma State University +// Copyright AFRL +// +// Basic and Denormalized Operations +// +// Step 1: Load operands, set flags, and AddConvertM SP to DP +// Step 2: Check for special inputs ( +/- Infinity, NaN) +// Step 3: Compare exponents. Swap the operands of exp1 < exp2 +// or of (exp1 = exp2 AND mnt1 < mnt2) +// Step 4: Shift the mantissa corresponding to the smaller AddExponentM, +// and extend precision by three bits to the right. +// Step 5: Add or subtract the mantissas. +// Step 6: Normalize the result.// +// Shift left until normalized. Normalized when the value to the +// left of the binrary point is 1. +// Step 7: Round the result.// +// Step 8: Put AddSumM onto output. +// + + +module fpuaddcvt2 (FAddResM, FAddFlgM, AddSumM, AddSumTcM, AddSelInvM, AddExpPostSumM, AddCorrSignM, AddOp1NormM, AddOp2NormM, AddOpANormM, AddOpBNormM, AddInvalidM, AddDenormInM, AddConvertM, AddSwapM, AddSignAM, AddFloat1M, AddFloat2M, AddExp1DenormM, AddExp2DenormM, AddExponentM, FrmM, FOpCtrlM, FmtM); + + input [2:0] FrmM; // Rounding mode - specify values + input [3:0] FOpCtrlM; // Function opcode + input FmtM; // Result Precision (0 for double, 1 for single) + // input AddOvEnM; // Overflow trap enabled + // input AddUnEnM; // Underflow trap enabled + input [63:0] AddSumM, AddSumTcM; + input [63:0] AddFloat1M; + input [63:0] AddFloat2M; + input [11:0] AddExp1DenormM, AddExp2DenormM; + input [10:0] AddExponentM, AddExpPostSumM; //exp_pre; + //input exp_valid; + input [3:0] AddSelInvM; + input AddOp1NormM, AddOp2NormM; + input AddOpANormM, AddOpBNormM; + input AddInvalidM; + input AddDenormInM; + input AddSignAM; + input AddCorrSignM; + input AddConvertM; + input AddSwapM; + // input AddNormOvflowM; + + output [63:0] FAddResM; // Result of operation + output [4:0] FAddFlgM; // IEEE exception flags + wire AddDenormM; // AddDenormM on input or output + + wire P; + assign P = ~FmtM; + + wire [10:0] exp_pre; + wire [63:0] Result; + wire [63:0] sum_norm, sum_norm_w_bypass; + wire [5:0] norm_shift, norm_shift_denorm; + wire exp_valid; + wire DenormIO; + wire [4:0] FlagsIn; + wire Sticky_out; + wire sign_corr; + wire zeroB; + wire [10:0] AddExpPostSumM; + wire mantissa_comp; + wire mantissa_comp_sum; + wire mantissa_comp_sum_tc; + wire Float1_sum_comp; + wire Float2_sum_comp; + wire Float1_sum_tc_comp; + wire Float2_sum_tc_comp; + wire normal_underflow; + wire [63:0] sum_corr; + logic AddNormOvflowM; + + + logic AddOvEnM; // Overflow trap enabled + logic AddUnEnM; // Underflow trap enabled + + assign AddOvEnM = 1'b1; + assign AddUnEnM = 1'b1; + //AddExponentM value pre-rounding with considerations for denormalized + //cases/conversion cases + assign exp_pre = AddDenormInM ? + ((norm_shift == 6'b001011) ? 11'b00000000001 : (AddSwapM ? AddExp2DenormM[10:0] : AddExp1DenormM[10:0])) + : (AddConvertM ? 11'b10000111100 : AddExponentM); + + + // Finds normal underflow result to determine whether to round final AddExponentM down + // Comparison between each float and the resulting AddSumM of the primary cla adder/subtractor and cla subtractor + assign Float1_sum_comp = (AddFloat1M[51:0] > AddSumM[51:0]) ? 1'b0 : 1'b1; + assign Float2_sum_comp = (AddFloat2M[51:0] > AddSumM[51:0]) ? 1'b0 : 1'b1; + assign Float1_sum_tc_comp = (AddFloat1M[51:0] > AddSumTcM[51:0]) ? 1'b0 : 1'b1; + assign Float2_sum_tc_comp = (AddFloat2M[51:0] > AddSumTcM[51:0]) ? 1'b0 : 1'b1; + + // Determines the correct Float value to compare based on AddSwapM result + assign mantissa_comp_sum = AddSwapM ? Float2_sum_comp : Float1_sum_comp; + assign mantissa_comp_sum_tc = AddSwapM ? Float2_sum_tc_comp : Float1_sum_tc_comp; + + // Determines the correct comparison result based on operation and sign of resulting AddSumM + assign mantissa_comp = (FOpCtrlM[0] ^ AddSumM[63]) ? mantissa_comp_sum_tc : mantissa_comp_sum; + + // If the signs are different and both operands aren't denormalized + // the normal underflow bit is needed and therefore updated. + assign normal_underflow = ((AddFloat1M[63] ~^ AddFloat2M[63]) & (AddOpANormM | AddOpBNormM)) ? mantissa_comp : 1'b0; + + // Determine the correct sign of the result + assign sign_corr = ((AddCorrSignM ^ AddSignAM) & ~AddConvertM) ^ AddSumM[63]; + + // If the AddSumM is negative, use its two complement instead. + // This value has to be 64-bits to correctly handle the + // case 10...00 + assign sum_corr = (AddDenormInM & (AddOpANormM | AddOpBNormM) & ( ( (AddFloat1M[63] ~^ AddFloat2M[63]) & FOpCtrlM[0] ) | ((AddFloat1M[63] ^ AddFloat2M[63]) & ~FOpCtrlM[0]) )) + ? (AddSumM[63] ? AddSumM : AddSumTcM) : ( (FOpCtrlM[3]) ? AddSumM : (AddSumM[63] ? AddSumTcM : AddSumM)); + + // Finds normal underflow result to determine whether to round final AddExponentM down + //KEP used to be (AddSumM == 16'h0) not sure what it is supposed to be + assign AddNormOvflowM = (AddDenormInM & (AddSumM == 64'h0) & (AddOpANormM | AddOpBNormM) & ~FOpCtrlM[0]) ? 1'b1 : (AddSumM[63] ? AddSumTcM[52] : AddSumM[52]); + + // Leading-Zero Detector. Determine the size of the shift needed for + // normalization. If sum_corrected is all zeros, the exp_valid is + // zero; otherwise, it is one. + lz64 lzd1 (norm_shift, exp_valid, sum_corr); + + assign norm_shift_denorm = (AddDenormInM & ( (~AddOpANormM & ~AddOpBNormM) | normal_underflow)) ? (6'h00) : (norm_shift); + + // Barell shifter used for normalization. It takes as inputs the + // the corrected AddSumM and the amount by which the AddSumM should + // be right shifted. It outputs the normalized AddSumM. + barrel_shifter_l64 bs2 (sum_norm, sum_corr, norm_shift_denorm); + + assign sum_norm_w_bypass = (FOpCtrlM[3]) ? (FOpCtrlM[0] ? ~sum_corr : sum_corr) : (sum_norm); + + // Round the mantissa to a 52-bit value, with the leading one + // removed. If the result is a single precision number, the actual + // mantissa is in the upper 23 bits and the lower 29 bits are zero. + // At this point, normalization has already been performed, so we know + // exactly where the rounding point is. The rounding units also + // handles special cases and set the exception flags. + + // Changed DenormIO -> AddDenormM and FlagsIn -> FAddFlgM in order to + // help in processor reservation station detection of load/stores. In + // other words, the processor would like to know ahead of time that + // if the result is an exception then don't load or store. + rounder round1 (Result, DenormIO, FlagsIn, FrmM, P, AddOvEnM, AddUnEnM, exp_valid, + AddSelInvM, AddInvalidM, AddDenormInM, AddConvertM, sign_corr, exp_pre, norm_shift, sum_norm_w_bypass, + AddExpPostSumM, AddOp1NormM, AddOp2NormM, AddFloat1M[63:52], AddFloat2M[63:52], + AddNormOvflowM, normal_underflow, AddSwapM, FOpCtrlM, AddSumM); + + // Store the final result and the exception flags in registers. + assign FAddResM = Result; + assign {AddDenormM, FAddFlgM} = {DenormIO, FlagsIn}; + +endmodule // fpadd + + diff --git a/wally-pipelined/src/fpu/fctrl.sv b/wally-pipelined/src/fpu/fctrl.sv index 45f2e7ef..7805e8a3 100755 --- a/wally-pipelined/src/fpu/fctrl.sv +++ b/wally-pipelined/src/fpu/fctrl.sv @@ -64,38 +64,38 @@ module fctrl ( else if (Funct3D[1:0] == 2'b00) ControlsD = `FCTRLW'b0_1_100_0100_00_01_0_0; // fmv.x.w else if (Funct3D[1:0] == 2'b01) ControlsD = `FCTRLW'b0_1_100_0101_00_01_0_0; // fmv.x.d else ControlsD = `FCTRLW'b0_0_000_0000_00_00_0_1; // non-implemented instruction - 7'b1100000: case(Rs2D[1:0]) - 2'b00: ControlsD = `FCTRLW'b0_1_100_0001_00_00_0_0; // fcvt.s.w - 2'b01: ControlsD = `FCTRLW'b0_1_100_0101_00_00_0_0; // fcvt.s.wu - 2'b10: ControlsD = `FCTRLW'b0_1_100_1001_00_00_0_0; // fcvt.s.l - 2'b11: ControlsD = `FCTRLW'b0_1_100_1101_00_00_0_0; // fcvt.s.lu + 7'b1101000: case(Rs2D[1:0]) + 2'b00: ControlsD = `FCTRLW'b1_0_100_0001_11_00_0_0; // fcvt.s.w + 2'b01: ControlsD = `FCTRLW'b1_0_100_0101_11_00_0_0; // fcvt.s.wu + 2'b10: ControlsD = `FCTRLW'b1_0_100_1001_11_00_0_0; // fcvt.s.l + 2'b11: ControlsD = `FCTRLW'b1_0_100_1101_11_00_0_0; // fcvt.s.lu default: ControlsD = `FCTRLW'b0_0_000_0000_00_00_0_1; // non-implemented instruction endcase - 7'b1101000: case(Rs2D[1:0]) - 2'b00: ControlsD = `FCTRLW'b1_1_100_0010_00_00_0_0; // fcvt.w.s - 2'b01: ControlsD = `FCTRLW'b1_1_100_0110_00_00_0_0; // fcvt.wu.s - 2'b10: ControlsD = `FCTRLW'b1_1_100_1010_00_00_0_0; // fcvt.l.s - 2'b11: ControlsD = `FCTRLW'b1_1_100_1110_00_00_0_0; // fcvt.lu.s + 7'b1100000: case(Rs2D[1:0]) + 2'b00: ControlsD = `FCTRLW'b0_1_100_0010_11_11_0_0; // fcvt.w.s + 2'b01: ControlsD = `FCTRLW'b0_1_100_0110_11_11_0_0; // fcvt.wu.s + 2'b10: ControlsD = `FCTRLW'b0_1_100_1010_11_11_0_0; // fcvt.l.s + 2'b11: ControlsD = `FCTRLW'b0_1_100_1110_11_11_0_0; // fcvt.lu.s default: ControlsD = `FCTRLW'b0_0_000_0000_00_00_0_1; // non-implemented instruction endcase 7'b1111000: ControlsD = `FCTRLW'b1_0_100_0000_00_00_0_0; // fmv.w.x - 7'b0100000: ControlsD = `FCTRLW'b1_0_010_0000_00_00_0_0; // fcvt.s.d - 7'b1100001: case(Rs2D[1:0]) - 2'b00: ControlsD = `FCTRLW'b0_1_100_0001_00_00_0_0; // fcvt.d.w - 2'b01: ControlsD = `FCTRLW'b0_1_100_0101_00_00_0_0; // fcvt.d.wu - 2'b10: ControlsD = `FCTRLW'b0_1_100_1001_00_00_0_0; // fcvt.d.l - 2'b11: ControlsD = `FCTRLW'b0_1_100_1101_00_00_0_0; // fcvt.d.lu + 7'b0100000: ControlsD = `FCTRLW'b1_0_010_0111_00_00_0_0; // fcvt.s.d + 7'b1101001: case(Rs2D[1:0]) + 2'b00: ControlsD = `FCTRLW'b1_0_100_0001_11_00_0_0; // fcvt.d.w + 2'b01: ControlsD = `FCTRLW'b1_0_100_0101_11_00_0_0; // fcvt.d.wu + 2'b10: ControlsD = `FCTRLW'b1_0_100_1001_11_00_0_0; // fcvt.d.l + 2'b11: ControlsD = `FCTRLW'b1_0_100_1101_11_00_0_0; // fcvt.d.lu default: ControlsD = `FCTRLW'b0_0_000_0000_00_00_0_1; // non-implemented instruction endcase - 7'b1101001: case(Rs2D[1:0]) - 2'b00: ControlsD = `FCTRLW'b1_0_100_0010_00_00_0_0; // fcvt.w.d - 2'b01: ControlsD = `FCTRLW'b1_0_100_0110_00_00_0_0; // fcvt.wu.d - 2'b10: ControlsD = `FCTRLW'b1_0_100_1010_00_00_0_0; // fcvt.l.d - 2'b11: ControlsD = `FCTRLW'b1_0_100_1110_00_00_0_0; // fcvt.lu.d + 7'b1100001: case(Rs2D[1:0]) + 2'b00: ControlsD = `FCTRLW'b0_1_100_0010_11_11_0_0; // fcvt.w.d + 2'b01: ControlsD = `FCTRLW'b0_1_100_0110_11_11_0_0; // fcvt.wu.d + 2'b10: ControlsD = `FCTRLW'b0_1_100_1010_11_11_0_0; // fcvt.l.d + 2'b11: ControlsD = `FCTRLW'b0_1_100_1110_11_11_0_0; // fcvt.lu.d default: ControlsD = `FCTRLW'b0_0_000_0000_00_00_0_1; // non-implemented instruction endcase 7'b1111001: ControlsD = `FCTRLW'b1_0_100_0001_00_00_0_0; // fmv.d.x - 7'b0100001: ControlsD = `FCTRLW'b1_0_100_0000_00_00_0_0; // fcvt.d.s + 7'b0100001: ControlsD = `FCTRLW'b1_0_010_0111_00_00_0_0; // fcvt.d.s default: ControlsD = `FCTRLW'b0_0_000_0000_00_00_0_1; // non-implemented instruction endcase default: ControlsD = `FCTRLW'b0_0_000_0000_00_00_0_1; // non-implemented instruction @@ -109,7 +109,7 @@ module fctrl ( // Precision // 0-single // 1-double - assign FmtD = FResultSelD == 3'b000 ? Funct3D[0] : Funct7D[0]; + assign FmtD = FResultSelD == 3'b000 ? Funct3D[0] : OpD[6:1] == 6'b010000 ? ~Funct7D[0] : Funct7D[0]; // div/sqrt // fdiv = ???0 // fsqrt = ???1 diff --git a/wally-pipelined/src/fpu/fcvt.sv b/wally-pipelined/src/fpu/fcvt.sv new file mode 100644 index 00000000..e893fc81 --- /dev/null +++ b/wally-pipelined/src/fpu/fcvt.sv @@ -0,0 +1,163 @@ + +// `include "wally-config.vh" +module fcvt ( + input logic [63:0] X, + input logic [64-1:0] SrcAE, + input logic [3:0] FOpCtrlE, + input logic [2:0] FrmE, + input logic FmtE, + output logic [63:0] CvtResE, + output logic [4:0] CvtFlgE); + + logic [10:0] XExp; + logic [51:0] XFrac; + logic XSgn; + logic [10:0] ResExp,TmpExp; + logic [51:0] ResFrac; + logic ResSgn; + logic [10:0] NormCnt; + logic [11:0] Bias; // 1023 for double, 127 for single + logic [7:0] Bits, SubBits; + logic [64+51:0] ShiftedManTmp; + logic [64+51:0] ShiftVal; + logic [64+1:0] ShiftedMan; + logic [64:0] RoundedTmp; + logic [63:0] Rounded; + logic [12:0] ExpVal, ShiftCnt; + logic [64-1:0] PosInt; + + logic [64-1:0] CvtIntRes; + logic [63:0] CvtRes; + logic XFracZero, Of,Uf; + logic XExpMax; + logic XNaN, XDenorm, XInf, XZero; + logic Plus1,CalcPlus1, Guard, Round, LSB, Sticky; + logic SgnRes, In64; + logic Res64; + logic RoundMSB; + logic RoundSgn; + logic XExpZero; + + // fcvt.w.s = 0010 - + // fcvt.wu.s = 0110 - + // fcvt.s.w = 0001 + // fcvt.s.wu = 0101 + // fcvt.l.s = 1010 - + // fcvt.lu.s = 1110 - + // fcvt.s.l = 1001 + // fcvt.s.lu = 1101 + // fcvt.w.d = 0010 - + // fcvt.wu.d = 0110 - + // fcvt.d.w = 0001 + // fcvt.d.wu = 0101 + // fcvt.l.d = 1010 - + // fcvt.lu.d = 1110 - + // fcvt.d.l = 1001 -- + // fcvt.d.lu = 1101 -- + // {long, unsigned, to int, from int} Fmt controls the output for fp -> fp + assign XSgn = X[63]; + assign XExp = FmtE ? X[62:52] : {3'b0, X[62:55]}; + assign XFrac = FmtE ? X[51:0] : {X[54:32], 29'b0}; + assign XExpZero = ~|XExp; + + assign XFracZero = ~|XFrac; + assign XExpMax = FmtE ? &XExp[10:0] : &XExp[7:0]; + assign XNaN = XExpMax & ~XFracZero; + assign XDenorm = XExpZero & ~XFracZero; + assign XInf = XExpMax & XFracZero; + assign XZero = XExpZero & XFracZero; + + + assign Bias = FmtE ? 12'h3ff : 12'h7f; + assign Res64 = ((FOpCtrlE==4'b1010 || FOpCtrlE==4'b1110) | (FmtE&(FOpCtrlE==4'b0001 | FOpCtrlE==4'b0101 | FOpCtrlE==4'b0000 | FOpCtrlE==4'b1001 | FOpCtrlE==4'b1101))); + assign In64 = ((FOpCtrlE==4'b1001 || FOpCtrlE==4'b1101) | (FmtE&(FOpCtrlE==4'b0010 | FOpCtrlE==4'b0110 | FOpCtrlE==4'b1010 | FOpCtrlE==4'b1110) | (FOpCtrlE==4'b1101 & ~FmtE))); + assign SubBits = In64 ? 8'd64 : 8'd32; + assign Bits = Res64 ? 8'd64 : 8'd32; + assign ExpVal = XExp - Bias + XDenorm; + +//////////////////////////////////////////////////////// + + logic [64-1:0] IntIn; + assign IntIn = FOpCtrlE[3] ? SrcAE : {SrcAE[31:0], 32'b0}; + assign PosInt = IntIn[64-1]&~FOpCtrlE[2] ? -IntIn : IntIn; + assign ResSgn = ~FOpCtrlE[2] ? IntIn[64-1] : 1'b0; + + // Leading one detector + logic [8:0] i; + always_comb begin + i = 0; + while (~PosInt[64-1-i] && i <= 64) i = i+1; // search for leading one + NormCnt = i+1; // compute shift count + end + assign TmpExp = i==64 ? 0 : Bias + SubBits - NormCnt; + + + + +//////////////////////////////////////////// + + + + assign ShiftCnt = FOpCtrlE[1] ? ExpVal : NormCnt; + assign ShiftVal = FOpCtrlE[1] ? {{64-2{1'b0}}, ~(XDenorm|XZero), XFrac} : {PosInt, 52'b0}; + //if shift = -1 then shift one bit right for round to nearest (shift over 2 never rounds) + // if the shift is negitive add bit for sticky bit + // otherwise shift left + assign ShiftedManTmp = &ShiftCnt ? {{64-1{1'b0}}, ~(XDenorm|XZero), XFrac[51:1]} : ShiftCnt[12] ? {115'b0, ~XZero} : ShiftVal << ShiftCnt; + + assign ShiftedMan = ShiftedManTmp[64+51:50]; + assign Sticky = |ShiftedManTmp[49:0] | &ShiftCnt&XFrac[0] | (FOpCtrlE[0]&|ShiftedManTmp[62:50]) | (FOpCtrlE[0]&~FmtE&|ShiftedManTmp[91:63]); + + + // determine guard, round, and least significant bit of the result + assign Guard = FOpCtrlE[1] ? ShiftedMan[1] : FmtE ? ShiftedMan[13] : ShiftedMan[42]; + assign Round = FOpCtrlE[1] ? ShiftedMan[0] : FmtE ? ShiftedMan[12] : ShiftedMan[41]; + assign LSB = FOpCtrlE[1] ? ShiftedMan[2] : FmtE ? ShiftedMan[14] : ShiftedMan[43]; + + always_comb begin + // Determine if you add 1 + case (FrmE) + 3'b000: CalcPlus1 = Guard & (Round | Sticky | (~Round&~Sticky&LSB));//round to nearest even + 3'b001: CalcPlus1 = 0;//round to zero + 3'b010: CalcPlus1 = (XSgn&FOpCtrlE[1]) | (ResSgn&FOpCtrlE[0]);//round down + 3'b011: CalcPlus1 = (~XSgn&FOpCtrlE[1]) | (~ResSgn&FOpCtrlE[0]);//round up + 3'b100: CalcPlus1 = Guard & (Round | Sticky | (~Round&~Sticky));//round to nearest max magnitude + default: CalcPlus1 = 1'bx; + endcase + end + + assign Plus1 = CalcPlus1 & (Guard|Round|Sticky)&~(XZero&FOpCtrlE[1]); + + assign RoundedTmp = ShiftedMan[64+1:2] + Plus1; + assign {ResExp, ResFrac} = FmtE ? {TmpExp, ShiftedMan[64+1:14]} + Plus1 : {{TmpExp, ShiftedMan[64+1:43]} + Plus1, 29'b0} ; + + assign Rounded = Res64 ? XSgn&FOpCtrlE[1] ? -RoundedTmp[63:0] : RoundedTmp[63:0] : + XSgn ? {{32{1'b1}}, -RoundedTmp[31:0]} : {32'b0, RoundedTmp[31:0]}; + assign RoundMSB = Res64 ? RoundedTmp[64] : RoundedTmp[32]; + assign RoundSgn = Res64 ? Rounded[63] : Rounded[31]; + + + + // Choose result + // double to unsigned long + // >2^64-1 or +inf or NaN - all 1's + // <0 or -inf - zero + // otherwise rounded result + //assign Of = (~XSgn&($signed(ShiftCnt) >= $signed(Bits))) | (RoundMSB&(ShiftCnt==(Bits-1))) | (~XSgn&XInf) | XNaN; + assign Of = (~XSgn&($signed(ShiftCnt) >= $signed(Bits))) | (~XSgn&RoundSgn&~FOpCtrlE[2]) | (RoundMSB&(ShiftCnt==(Bits-1))) | (~XSgn&XInf) | XNaN; + assign Uf = FOpCtrlE[2] ? XSgn&~XZero | (XSgn&XInf) | (XSgn&~XZero&(~ShiftCnt[12]|CalcPlus1)) | (ShiftCnt[12]&Plus1) : (XSgn&XInf) | (XSgn&($signed(ShiftCnt) >= $signed(Bits))) | (XSgn&~RoundSgn&~ShiftCnt[12]); // assign CvtIntRes = (XSgn | ShiftCnt[12]) ? {64{1'b0}} : (ShiftCnt >= 64) ? {64{1'b1}} : Rounded; + assign SgnRes = ~FOpCtrlE[3] & FOpCtrlE[1]; + assign CvtIntRes = Of ? FOpCtrlE[2] ? SgnRes ? {32'b0, {32{1'b1}}}: {64{1'b1}} : SgnRes ? {33'b0, {31{1'b1}}}: {1'b0, {63{1'b1}}} : + Uf ? FOpCtrlE[2] ? 64'b0 : SgnRes ? {32'b0, 1'b1, 31'b0} : {1'b1, 63'b0} : + Rounded[64-1:0]; + + assign CvtRes = FmtE ? {ResSgn, ResExp, ResFrac} : {ResSgn, ResExp[7:0], ResFrac, 3'b0}; + assign CvtResE = FOpCtrlE[0] ? CvtRes : CvtIntRes; + assign CvtFlgE = {(Of | Uf)&FOpCtrlE[1], 3'b0, (Guard|Round|Sticky)&FOpCtrlE[0]}; + + + + +endmodule // fpadd + + diff --git a/wally-pipelined/src/fpu/fma2.sv b/wally-pipelined/src/fpu/fma.sv similarity index 63% rename from wally-pipelined/src/fpu/fma2.sv rename to wally-pipelined/src/fpu/fma.sv index 518b7a76..f9c6b1bd 100644 --- a/wally-pipelined/src/fpu/fma2.sv +++ b/wally-pipelined/src/fpu/fma.sv @@ -1,3 +1,231 @@ +module fma( + input logic clk, + input logic reset, + input logic FlushM, + input logic StallM, + input logic [63:0] SrcXE, SrcXM, // X + input logic [63:0] SrcYE, SrcYM, // Y + input logic [63:0] SrcZE, SrcZM, // Z + input logic FmtE, FmtM, // precision 1 = double 0 = single + input logic [2:0] FOpCtrlM, FOpCtrlE, // 000 = fmadd (X*Y)+Z, 001 = fmsub (X*Y)-Z, 010 = fnmsub -(X*Y)+Z, 011 = fnmadd -(X*Y)-Z, 100 = fmul (X*Y) + input logic [2:0] FrmM, // rounding mode 000 = rount to nearest, ties to even 001 = round twords zero 010 = round down 011 = round up 100 = round to nearest, ties to max magnitude + output logic [63:0] FMAResM, + output logic [4:0] FMAFlgM); + + + logic [105:0] ProdManE, ProdManM; + logic [161:0] AlignedAddendE, AlignedAddendM; + logic [12:0] ProdExpE, ProdExpM; + logic AddendStickyE, AddendStickyM; + logic KillProdE, KillProdM; + logic XZeroE, YZeroE, ZZeroE, XZeroM, YZeroM, ZZeroM; + logic XInfE, YInfE, ZInfE, XInfM, YInfM, ZInfM; + logic XNaNE, YNaNE, ZNaNE, XNaNM, YNaNM, ZNaNM; + + fma1 fma1 (.X(SrcXE), .Y(SrcYE), .Z(SrcZE), .FOpCtrlE, .FmtE, .ProdManE, .AlignedAddendE, + .ProdExpE, .AddendStickyE, .KillProdE, .XZeroE, .YZeroE, .ZZeroE, .XInfE, .YInfE, .ZInfE, + .XNaNE, .YNaNE, .ZNaNE ); + + flopenrc #(106) EMRegFma1(clk, reset, FlushM, ~StallM, ProdManE, ProdManM); + flopenrc #(162) EMRegFma2(clk, reset, FlushM, ~StallM, AlignedAddendE, AlignedAddendM); + flopenrc #(13) EMRegFma3(clk, reset, FlushM, ~StallM, ProdExpE, ProdExpM); + flopenrc #(11) EMRegFma4(clk, reset, FlushM, ~StallM, + {AddendStickyE, KillProdE, XZeroE, YZeroE, ZZeroE, XInfE, YInfE, ZInfE, XNaNE, YNaNE, ZNaNE}, + {AddendStickyM, KillProdM, XZeroM, YZeroM, ZZeroM, XInfM, YInfM, ZInfM, XNaNM, YNaNM, ZNaNM}); + + fma2 fma2(.X(SrcXM), .Y(SrcYM), .Z(SrcZM), .FOpCtrlM, .FrmM, .FmtM, + .ProdManM, .AlignedAddendM, .ProdExpM, .AddendStickyM, .KillProdM, + .XZeroM, .YZeroM, .ZZeroM, .XInfM, .YInfM, .ZInfM, .XNaNM, .YNaNM, .ZNaNM, + .FMAResM, .FMAFlgM); + +endmodule + + + +module fma1( + + input logic [63:0] X, // X + input logic [63:0] Y, // Y + input logic [63:0] Z, // Z + input logic [2:0] FOpCtrlE, // 000 = fmadd (X*Y)+Z, 001 = fmsub (X*Y)-Z, 010 = fnmsub -(X*Y)+Z, 011 = fnmadd -(X*Y)-Z, 100 = fmul (X*Y) + input logic FmtE, // precision 1 = double 0 = single + output logic [105:0] ProdManE, // 1.X frac * 1.Y frac + output logic [161:0] AlignedAddendE, // Z aligned for addition + output logic [12:0] ProdExpE, // X exponent + Y exponent - bias + output logic AddendStickyE, // sticky bit that is calculated during alignment + output logic KillProdE, // set the product to zero before addition if the product is too small to matter + output logic XZeroE, YZeroE, ZZeroE, // inputs are zero + output logic XInfE, YInfE, ZInfE, // inputs are infinity + output logic XNaNE, YNaNE, ZNaNE); // inputs are NaN + + logic [51:0] XFrac,YFrac,ZFrac; // input fraction + logic [52:0] XMan,YMan,ZMan; // input mantissa (with leading one) + logic [12:0] XExp,YExp,ZExp; // input exponents + logic XSgn,YSgn,ZSgn; // input signs + logic [12:0] AlignCnt; // how far to shift the addend to align with the product + logic [213:0] ZManShifted; // output of the alignment shifter including sticky bit + logic [213:0] ZManPreShifted; // input to the alignment shifter + logic XDenorm, YDenorm, ZDenorm; // inputs are denormal + logic [63:0] Addend; // value to add (Z or zero) + logic [12:0] Bias; // 1023 for double, 127 for single + logic XExpZero, YExpZero, ZExpZero; // input exponent zero + logic XFracZero, YFracZero, ZFracZero; // input fraction zero + logic XExpMax, YExpMax, ZExpMax; // input exponent all 1s + + /////////////////////////////////////////////////////////////////////////////// + // split inputs into the sign bit, fraction, and exponent to handle single or double precision + // - single precision is in the top half of the inputs + /////////////////////////////////////////////////////////////////////////////// + + // Set addend to zero if FMUL instruction + assign Addend = FOpCtrlE[2] ? 64'b0 : Z; + + assign XSgn = X[63]; + assign YSgn = Y[63]; + assign ZSgn = Addend[63]; + + assign XExp = FmtE ? {2'b0, X[62:52]} : {5'b0, X[62:55]}; + assign YExp = FmtE ? {2'b0, Y[62:52]} : {5'b0, Y[62:55]}; + assign ZExp = FmtE ? {2'b0, Addend[62:52]} : {5'b0, Addend[62:55]}; + + assign XFrac = FmtE ? X[51:0] : {X[54:32], 29'b0}; + assign YFrac = FmtE ? Y[51:0] : {Y[54:32], 29'b0}; + assign ZFrac = FmtE ? Addend[51:0] : {Addend[54:32], 29'b0}; + + assign XMan = {~XExpZero, XFrac}; + assign YMan = {~YExpZero, YFrac}; + assign ZMan = {~ZExpZero, ZFrac}; + + assign Bias = FmtE ? 13'h3ff : 13'h7f; + + + + /////////////////////////////////////////////////////////////////////////////// + // determine if an input is a special value + /////////////////////////////////////////////////////////////////////////////// + + assign XExpZero = ~|XExp; + assign YExpZero = ~|YExp; + assign ZExpZero = ~|ZExp; + + assign XFracZero = ~|XFrac; + assign YFracZero = ~|YFrac; + assign ZFracZero = ~|ZFrac; + + assign XExpMax = FmtE ? &XExp[10:0] : &XExp[7:0]; + assign YExpMax = FmtE ? &YExp[10:0] : &YExp[7:0]; + assign ZExpMax = FmtE ? &ZExp[10:0] : &ZExp[7:0]; + + assign XNaNE = XExpMax & ~XFracZero; + assign YNaNE = YExpMax & ~YFracZero; + assign ZNaNE = ZExpMax & ~ZFracZero; + + assign XDenorm = XExpZero & ~XFracZero; + assign YDenorm = YExpZero & ~YFracZero; + assign ZDenorm = ZExpZero & ~ZFracZero; + + assign XInfE = XExpMax & XFracZero; + assign YInfE = YExpMax & YFracZero; + assign ZInfE = ZExpMax & ZFracZero; + + assign XZeroE = XExpZero & XFracZero; + assign YZeroE = YExpZero & YFracZero; + assign ZZeroE = ZExpZero & ZFracZero; + + + + + /////////////////////////////////////////////////////////////////////////////// + // Calculate the product + // - When multipliying two fp numbers, add the exponents + // - Subtract the bias (XExp + YExp has two biases, one from each exponent) + // - Denormal numbers have an an exponent value of 1, however they are + // represented with an exponent of 0. add one if there is a denormal number + /////////////////////////////////////////////////////////////////////////////// + + // verilator lint_off WIDTH + assign ProdExpE = (XZeroE|YZeroE) ? 13'b0 : + XExp + YExp - Bias + XDenorm + YDenorm; + + // Calculate the product's mantissa + // - Add the assumed one. If the number is denormalized or zero, it does not have an assumed one. + assign ProdManE = XMan * YMan; + + + + + + + + + + /////////////////////////////////////////////////////////////////////////////// + // Alignment shifter + /////////////////////////////////////////////////////////////////////////////// + + // determine the shift count for alignment + // - negitive means Z is larger, so shift Z left + // - positive means the product is larger, so shift Z right + // - Denormal numbers have an an exponent value of 1, however they are + // represented with an exponent of 0. add one to the exponent if it is a denormal number + assign AlignCnt = ProdExpE - ZExp - ZDenorm; + // verilator lint_on WIDTH + + + // Defualt Addition without shifting + // | 55'b0 | 106'b(product) | 2'b0 | + // |1'b0| addnend | + + // the 1'b0 before the added is because the product's mantissa has two bits before the binary point (xx.xxxxxxxxxx...) + assign ZManPreShifted = {55'b0, ZMan, 106'b0}; + always_comb + begin + + // If the product is too small to effect the sum, kill the product + + // | 54'b0 | 106'b(product) | 2'b0 | + // | addnend | + if ($signed(AlignCnt) <= $signed(-13'd56)) begin + KillProdE = 1; + ZManShifted = ZManPreShifted;//{107'b0, ZMan, 54'b0}; + AddendStickyE = ~(XZeroE|YZeroE); + + // If the Addend is shifted left (negitive AlignCnt) + + // | 54'b0 | 106'b(product) | 2'b0 | + // | addnend | + end else if($signed(AlignCnt) <= $signed(13'd0)) begin + KillProdE = 0; + ZManShifted = ZManPreShifted << -AlignCnt; + AddendStickyE = |(ZManShifted[51:0]); + + // If the Addend is shifted right (positive AlignCnt) + + // | 54'b0 | 106'b(product) | 2'b0 | + // | addnend | + end else if ($signed(AlignCnt)<=$signed(13'd106)) begin + KillProdE = 0; + ZManShifted = ZManPreShifted >> AlignCnt; + AddendStickyE = |(ZManShifted[51:0]); + + // If the addend is too small to effect the addition + // - The addend has to shift two past the end of the addend to be considered too small + // - The 2 extra bits are needed for rounding + + // | 54'b0 | 106'b(product) | 2'b0 | + // | addnend | + end else begin + KillProdE = 0; + ZManShifted = 0; + AddendStickyE = ~ZZeroE; + + end + end + + + assign AlignedAddendE = ZManShifted[213:52]; + +endmodule module fma2( diff --git a/wally-pipelined/src/fpu/fma1.sv b/wally-pipelined/src/fpu/fma1.sv deleted file mode 100644 index 76f7316b..00000000 --- a/wally-pipelined/src/fpu/fma1.sv +++ /dev/null @@ -1,184 +0,0 @@ -module fma1( - - input logic [63:0] X, // X - input logic [63:0] Y, // Y - input logic [63:0] Z, // Z - input logic [2:0] FOpCtrlE, // 000 = fmadd (X*Y)+Z, 001 = fmsub (X*Y)-Z, 010 = fnmsub -(X*Y)+Z, 011 = fnmadd -(X*Y)-Z, 100 = fmul (X*Y) - input logic FmtE, // precision 1 = double 0 = single - output logic [105:0] ProdManE, // 1.X frac * 1.Y frac - output logic [161:0] AlignedAddendE, // Z aligned for addition - output logic [12:0] ProdExpE, // X exponent + Y exponent - bias - output logic AddendStickyE, // sticky bit that is calculated during alignment - output logic KillProdE, // set the product to zero before addition if the product is too small to matter - output logic XZeroE, YZeroE, ZZeroE, // inputs are zero - output logic XInfE, YInfE, ZInfE, // inputs are infinity - output logic XNaNE, YNaNE, ZNaNE); // inputs are NaN - - logic [51:0] XFrac,YFrac,ZFrac; // input fraction - logic [52:0] XMan,YMan,ZMan; // input mantissa (with leading one) - logic [12:0] XExp,YExp,ZExp; // input exponents - logic XSgn,YSgn,ZSgn; // input signs - logic [12:0] AlignCnt; // how far to shift the addend to align with the product - logic [213:0] ZManShifted; // output of the alignment shifter including sticky bit - logic [213:0] ZManPreShifted; // input to the alignment shifter - logic XDenorm, YDenorm, ZDenorm; // inputs are denormal - logic [63:0] Addend; // value to add (Z or zero) - logic [12:0] Bias; // 1023 for double, 127 for single - logic XExpZero, YExpZero, ZExpZero; // input exponent zero - logic XFracZero, YFracZero, ZFracZero; // input fraction zero - logic XExpMax, YExpMax, ZExpMax; // input exponent all 1s - - /////////////////////////////////////////////////////////////////////////////// - // split inputs into the sign bit, fraction, and exponent to handle single or double precision - // - single precision is in the top half of the inputs - /////////////////////////////////////////////////////////////////////////////// - - // Set addend to zero if FMUL instruction - assign Addend = FOpCtrlE[2] ? 64'b0 : Z; - - assign XSgn = X[63]; - assign YSgn = Y[63]; - assign ZSgn = Addend[63]; - - assign XExp = FmtE ? {2'b0, X[62:52]} : {5'b0, X[62:55]}; - assign YExp = FmtE ? {2'b0, Y[62:52]} : {5'b0, Y[62:55]}; - assign ZExp = FmtE ? {2'b0, Addend[62:52]} : {5'b0, Addend[62:55]}; - - assign XFrac = FmtE ? X[51:0] : {X[54:32], 29'b0}; - assign YFrac = FmtE ? Y[51:0] : {Y[54:32], 29'b0}; - assign ZFrac = FmtE ? Addend[51:0] : {Addend[54:32], 29'b0}; - - assign XMan = {~XExpZero, XFrac}; - assign YMan = {~YExpZero, YFrac}; - assign ZMan = {~ZExpZero, ZFrac}; - - assign Bias = FmtE ? 13'h3ff : 13'h7f; - - - - /////////////////////////////////////////////////////////////////////////////// - // determine if an input is a special value - /////////////////////////////////////////////////////////////////////////////// - - assign XExpZero = ~|XExp; - assign YExpZero = ~|YExp; - assign ZExpZero = ~|ZExp; - - assign XFracZero = ~|XFrac; - assign YFracZero = ~|YFrac; - assign ZFracZero = ~|ZFrac; - - assign XExpMax = FmtE ? &XExp[10:0] : &XExp[7:0]; - assign YExpMax = FmtE ? &YExp[10:0] : &YExp[7:0]; - assign ZExpMax = FmtE ? &ZExp[10:0] : &ZExp[7:0]; - - assign XNaNE = XExpMax & ~XFracZero; - assign YNaNE = YExpMax & ~YFracZero; - assign ZNaNE = ZExpMax & ~ZFracZero; - - assign XDenorm = XExpZero & ~XFracZero; - assign YDenorm = YExpZero & ~YFracZero; - assign ZDenorm = ZExpZero & ~ZFracZero; - - assign XInfE = XExpMax & XFracZero; - assign YInfE = YExpMax & YFracZero; - assign ZInfE = ZExpMax & ZFracZero; - - assign XZeroE = XExpZero & XFracZero; - assign YZeroE = YExpZero & YFracZero; - assign ZZeroE = ZExpZero & ZFracZero; - - - - - /////////////////////////////////////////////////////////////////////////////// - // Calculate the product - // - When multipliying two fp numbers, add the exponents - // - Subtract the bias (XExp + YExp has two biases, one from each exponent) - // - Denormal numbers have an an exponent value of 1, however they are - // represented with an exponent of 0. add one if there is a denormal number - /////////////////////////////////////////////////////////////////////////////// - - // verilator lint_off WIDTH - assign ProdExpE = (XZeroE|YZeroE) ? 13'b0 : - XExp + YExp - Bias + XDenorm + YDenorm; - - // Calculate the product's mantissa - // - Add the assumed one. If the number is denormalized or zero, it does not have an assumed one. - assign ProdManE = XMan * YMan; - - - - - - - - - - /////////////////////////////////////////////////////////////////////////////// - // Alignment shifter - /////////////////////////////////////////////////////////////////////////////// - - // determine the shift count for alignment - // - negitive means Z is larger, so shift Z left - // - positive means the product is larger, so shift Z right - // - Denormal numbers have an an exponent value of 1, however they are - // represented with an exponent of 0. add one to the exponent if it is a denormal number - assign AlignCnt = ProdExpE - ZExp - ZDenorm; - // verilator lint_on WIDTH - - - // Defualt Addition without shifting - // | 55'b0 | 106'b(product) | 2'b0 | - // |1'b0| addnend | - - // the 1'b0 before the added is because the product's mantissa has two bits before the binary point (xx.xxxxxxxxxx...) - assign ZManPreShifted = {55'b0, ZMan, 106'b0}; - always_comb - begin - - // If the product is too small to effect the sum, kill the product - - // | 54'b0 | 106'b(product) | 2'b0 | - // | addnend | - if ($signed(AlignCnt) <= $signed(-13'd56)) begin - KillProdE = 1; - ZManShifted = ZManPreShifted;//{107'b0, ZMan, 54'b0}; - AddendStickyE = ~(XZeroE|YZeroE); - - // If the Addend is shifted left (negitive AlignCnt) - - // | 54'b0 | 106'b(product) | 2'b0 | - // | addnend | - end else if($signed(AlignCnt) <= $signed(13'd0)) begin - KillProdE = 0; - ZManShifted = ZManPreShifted << -AlignCnt; - AddendStickyE = |(ZManShifted[51:0]); - - // If the Addend is shifted right (positive AlignCnt) - - // | 54'b0 | 106'b(product) | 2'b0 | - // | addnend | - end else if ($signed(AlignCnt)<=$signed(13'd106)) begin - KillProdE = 0; - ZManShifted = ZManPreShifted >> AlignCnt; - AddendStickyE = |(ZManShifted[51:0]); - - // If the addend is too small to effect the addition - // - The addend has to shift two past the end of the addend to be considered too small - // - The 2 extra bits are needed for rounding - - // | 54'b0 | 106'b(product) | 2'b0 | - // | addnend | - end else begin - KillProdE = 0; - ZManShifted = 0; - AddendStickyE = ~ZZeroE; - - end - end - - - assign AlignedAddendE = ZManShifted[213:52]; - -endmodule \ No newline at end of file diff --git a/wally-pipelined/src/fpu/fpu.sv b/wally-pipelined/src/fpu/fpu.sv index 59f5e439..ab351bd7 100755 --- a/wally-pipelined/src/fpu/fpu.sv +++ b/wally-pipelined/src/fpu/fpu.sv @@ -45,7 +45,7 @@ module fpu ( // *** change FMA to do 16 - 32 - 64 - 128 FEXPBITS generate - if (`F_SUPPORTED) begin + if (`F_SUPPORTED | `D_SUPPORTED) begin // control logic signal instantiation logic FWriteEnD, FWriteEnE, FWriteEnM, FWriteEnW; // FP register write enable logic [2:0] FrmD, FrmE, FrmM; // FP rounding mode @@ -75,39 +75,15 @@ module fpu ( logic [63:0] DivInput1E, DivInput2E; logic HoldInputs; // keep forwarded inputs arround durring division - // FMA signals - logic [105:0] ProdManE, ProdManM; ///*** put pipline stages in units - logic [161:0] AlignedAddendE, AlignedAddendM; - logic [12:0] ProdExpE, ProdExpM; - logic AddendStickyE, AddendStickyM; - logic KillProdE, KillProdM; - logic XZeroE, YZeroE, ZZeroE, XZeroM, YZeroM, ZZeroM; - logic XInfE, YInfE, ZInfE, XInfM, YInfM, ZInfM; - logic XNaNE, YNaNE, ZNaNE, XNaNM, YNaNM, ZNaNM; + //fpu signals logic [63:0] FMAResM, FMAResW; logic [4:0] FMAFlgM, FMAFlgW; // add/cvt signals - logic [63:0] AddSumE, AddSumM; - logic [63:0] AddSumTcE, AddSumTcM; - logic [3:0] AddSelInvE, AddSelInvM; - logic [10:0] AddExpPostSumE,AddExpPostSumM; - logic AddCorrSignE, AddCorrSignM; - logic AddOp1NormE, AddOp1NormM; - logic AddOp2NormE, AddOp2NormM; - logic AddOpANormE, AddOpANormM; - logic AddOpBNormE, AddOpBNormM; - logic AddInvalidE, AddInvalidM; - logic AddDenormInE, AddDenormInM; - logic AddSwapE, AddSwapM; - logic AddNormOvflowE, AddNormOvflowM; //***this isn't used in addcvt2 - logic AddSignAE, AddSignAM; - logic AddConvertE, AddConvertM; - logic [63:0] AddFloat1E, AddFloat2E, AddFloat1M, AddFloat2M; - logic [11:0] AddExp1DenormE, AddExp2DenormE, AddExp1DenormM, AddExp2DenormM; - logic [10:0] AddExponentE, AddExponentM; logic [63:0] FAddResM, FAddResW; logic [4:0] FAddFlgM, FAddFlgW; + logic [63:0] CvtResE, CvtResM; + logic [4:0] CvtFlgE, CvtFlgM; // cmp signals logic CmpNVE, CmpNVM, CmpNVW; @@ -117,7 +93,7 @@ module fpu ( logic [63:0] SgnResE, SgnResM; logic SgnNVE, SgnNVM, SgnNVW; logic [63:0] FResM, FResW; - logic FFlgM, FFlgW; + logic [4:0] FFlgM, FFlgW; // instantiation of W stage regfile signals logic [63:0] AlignedSrcAM; @@ -198,9 +174,10 @@ module fpu ( // first of two-stage instance of floating-point fused multiply-add unit - fma1 fma1 (.X(SrcXE), .Y(SrcYE), .Z(SrcZE), .FOpCtrlE(FOpCtrlE[2:0]), .FmtE, .ProdManE, .AlignedAddendE, - .ProdExpE, .AddendStickyE, .KillProdE, .XZeroE, .YZeroE, .ZZeroE, .XInfE, .YInfE, .ZInfE, - .XNaNE, .YNaNE, .ZNaNE ); + fma fma (.clk, .reset, .FlushM, .StallM, + .SrcXE, .SrcYE, .SrcZE, .SrcXM, .SrcYM, .SrcZM, + .FOpCtrlE(FOpCtrlE[2:0]), .FOpCtrlM(FOpCtrlM[2:0]), + .FmtE, .FmtM, .FrmM, .FMAFlgM, .FMAResM); // first and only instance of floating-point divider logic fpdivClk; @@ -225,10 +202,8 @@ module fpu ( // first of two-stage instance of floating-point add/cvt unit - fpuaddcvt1 fpadd1 (.SrcXE, .SrcYE, .FOpCtrlE, .FmtE, .AddFloat1E, .AddFloat2E, .AddExponentE, - .AddExpPostSumE, .AddExp1DenormE, .AddExp2DenormE, .AddSumE, .AddSumTcE, .AddSelInvE, - .AddCorrSignE, .AddSignAE, .AddOp1NormE, .AddOp2NormE, .AddOpANormE, .AddOpBNormE, .AddInvalidE, - .AddDenormInE, .AddConvertE, .AddSwapE, .AddNormOvflowE); + faddcvt faddcvt (.clk, .reset, .FlushM, .StallM, .FrmM, .FOpCtrlM, .FmtE, .FmtM, + .SrcXE, .SrcYE, .FOpCtrlE, .FAddResM, .FAddFlgM); // first and only instance of floating-point comparator fcmp fcmp (SrcXE, SrcYE, FOpCtrlE[2:0], FmtE, CmpNVE, CmpResE); @@ -239,6 +214,9 @@ module fpu ( // first and only instance of floating-point classify unit fclassify fclassify (.SrcXE, .FmtE, .ClassResE); + + fcvt fcvt (.X(SrcXE), .SrcAE, .FOpCtrlE, .FmtE, .FrmE, .CvtResE, .CvtFlgE); + // output for store instructions assign FWriteDataE = FmtE ? SrcYE[63:64-`XLEN] : {{`XLEN-32{1'b0}}, SrcYE[63:32]}; //***swap to mux @@ -259,31 +237,16 @@ module fpu ( flopenrc #(64) EMFpReg2(clk, reset, FlushM, ~StallM, SrcYE, SrcYM); flopenrc #(64) EMFpReg3(clk, reset, FlushM, ~StallM, SrcZE, SrcZM); - flopenrc #(106) EMRegFma1(clk, reset, FlushM, ~StallM, ProdManE, ProdManM); - flopenrc #(162) EMRegFma2(clk, reset, FlushM, ~StallM, AlignedAddendE, AlignedAddendM); - flopenrc #(13) EMRegFma3(clk, reset, FlushM, ~StallM, ProdExpE, ProdExpM); - flopenrc #(11) EMRegFma4(clk, reset, FlushM, ~StallM, - {AddendStickyE, KillProdE, XZeroE, YZeroE, ZZeroE, XInfE, YInfE, ZInfE, XNaNE, YNaNE, ZNaNE}, - {AddendStickyM, KillProdM, XZeroM, YZeroM, ZZeroM, XInfM, YInfM, ZInfM, XNaNM, YNaNM, ZNaNM}); - - flopenrc #(64) EMRegAdd1(clk, reset, FlushM, ~StallM, AddSumE, AddSumM); - flopenrc #(64) EMRegAdd2(clk, reset, FlushM, ~StallM, AddSumTcE, AddSumTcM); - flopenrc #(11) EMRegAdd3(clk, reset, FlushM, ~StallM, AddExpPostSumE, AddExpPostSumM); - flopenrc #(64) EMRegAdd4(clk, reset, FlushM, ~StallM, AddFloat1E, AddFloat1M); - flopenrc #(64) EMRegAdd5(clk, reset, FlushM, ~StallM, AddFloat2E, AddFloat2M); - flopenrc #(12) EMRegAdd6(clk, reset, FlushM, ~StallM, AddExp1DenormE, AddExp1DenormM); - flopenrc #(12) EMRegAdd7(clk, reset, FlushM, ~StallM, AddExp2DenormE, AddExp2DenormM); - flopenrc #(11) EMRegAdd8(clk, reset, FlushM, ~StallM, AddExponentE, AddExponentM); - flopenrc #(15) EMRegAdd9(clk, reset, FlushM, ~StallM, - {AddSelInvE, AddCorrSignE, AddOp1NormE, AddOp2NormE, AddOpANormE, AddOpBNormE, AddInvalidE, AddDenormInE, AddConvertE, AddSwapE, AddNormOvflowE, AddSignAE}, - {AddSelInvM, AddCorrSignM, AddOp1NormM, AddOp2NormM, AddOpANormM, AddOpBNormM, AddInvalidM, AddDenormInM, AddConvertM, AddSwapM, AddNormOvflowM, AddSignAM}); - + flopenrc #(1) EMRegCmp1(clk, reset, FlushM, ~StallM, CmpNVE, CmpNVM); flopenrc #(64) EMRegCmp2(clk, reset, FlushM, ~StallM, CmpResE, CmpResM); flopenrc #(64) EMRegSgn1(clk, reset, FlushM, ~StallM, SgnResE, SgnResM); flopenrc #(1) EMRegSgn2(clk, reset, FlushM, ~StallM, SgnNVE, SgnNVM); + flopenrc #(64) EMRegCvt1(clk, reset, FlushM, ~StallM, CvtResE, CvtResM); + flopenrc #(5) EMRegCvt2(clk, reset, FlushM, ~StallM, CvtFlgE, CvtFlgM); + flopenrc #(22) EMCtrlReg(clk, reset, FlushM, ~StallM, {FWriteEnE, FResultSelE, FResSelE, FIntResSelE, FrmE, FmtE, RdE, FOpCtrlE, FWriteIntE}, {FWriteEnM, FResultSelM, FResSelM, FIntResSelM, FrmM, FmtM, RdM, FOpCtrlM, FWriteIntM}); @@ -299,29 +262,27 @@ module fpu ( //BEGIN MEMORY STAGE - mux3 #(64) FResMux(AlignedSrcAM, SgnResM, CmpResM, FResSelM, FResM); - mux3 #(1) FFlgMux(1'b0, SgnNVM, CmpNVM, FResSelM, FFlgM); + mux4 #(64) FResMux(AlignedSrcAM, SgnResM, CmpResM, CvtResM, FResSelM, FResM); + mux4 #(5) FFlgMux(5'b0, {4'b0, SgnNVM}, {4'b0, CmpNVM}, CvtFlgM, FResSelM, FFlgM); //***change to mux assign SrcXMAligned = FmtM ? SrcXM[63:64-`XLEN] : {{`XLEN-32{1'b0}}, SrcXM[63:32]}; - mux3 #(`XLEN) IntResMux(CmpResM[`XLEN-1:0], SrcXMAligned, ClassResM[`XLEN-1:0], FIntResSelM, FIntResM); + mux4 #(`XLEN) IntResMux(CmpResM[`XLEN-1:0], SrcXMAligned, ClassResM[`XLEN-1:0], CvtResM[`XLEN-1:0], FIntResSelM, FIntResM); - // second instance of two-stage FMA unit - fma2 fma2(.X(SrcXM), .Y(SrcYM), .Z(SrcZM), .FOpCtrlM(FOpCtrlM[2:0]), .FrmM, .FmtM, - .ProdManM, .AlignedAddendM, .ProdExpM, .AddendStickyM, .KillProdM, - .XZeroM, .YZeroM, .ZZeroM, .XInfM, .YInfM, .ZInfM, .XNaNM, .YNaNM, .ZNaNM, - .FMAResM, .FMAFlgM); - - // second instance of two-stage floating-point add/cvt unit - fpuaddcvt2 fpadd2 (.FrmM, .FOpCtrlM, .FmtM, .AddSumM, .AddSumTcM, .AddFloat1M, .AddFloat2M, - .AddExp1DenormM, .AddExp2DenormM, .AddExponentM, .AddExpPostSumM, .AddSelInvM, - .AddOp1NormM, .AddOp2NormM, .AddOpANormM, .AddOpBNormM, .AddInvalidM, .AddDenormInM, - .AddSignAM, .AddCorrSignM, .AddConvertM, .AddSwapM, .FAddResM, .FAddFlgM); // Align SrcA to MSB when single precicion mux2 #(64) SrcAMux({SrcAM[31:0], 32'b0}, {{64-`XLEN{1'b0}}, SrcAM}, FmtM, AlignedSrcAM); - + always_comb begin + case (FResultSelM) + 3'b000 : SetFflagsM = 5'b0; + 3'b001 : SetFflagsM = FMAFlgM; + 3'b010 : SetFflagsM = FAddFlgM; + 3'b011 : SetFflagsM = FDivSqrtFlgM; + 3'b100 : SetFflagsM = FFlgM; + default : SetFflagsM = 5'bxxxxx; + endcase + end @@ -334,19 +295,14 @@ module fpu ( // M/W pipe registers //***************** flopenrc #(64) MWRegFma1(clk, reset, FlushW, ~StallW, FMAResM, FMAResW); - flopenrc #(5) MWRegFma2(clk, reset, FlushW, ~StallW, FMAFlgM, FMAFlgW); flopenrc #(64) MWRegDiv1(clk, reset, FlushW, ~StallW, FDivResultM, FDivResultW); - flopenrc #(5) MWRegDiv2(clk, reset, FlushW, ~StallW, FDivSqrtFlgM, FDivSqrtFlgW); flopenrc #(64) MWRegAdd1(clk, reset, FlushW, ~StallW, FAddResM, FAddResW); - flopenrc #(5) MWRegAdd2(clk, reset, FlushW, ~StallW, FAddFlgM, FAddFlgW); - flopenrc #(1) MWRegCmp1(clk, reset, FlushW, ~StallW, CmpNVM, CmpNVW); flopenrc #(64) MWRegCmp3(clk, reset, FlushW, ~StallW, CmpResM, CmpResW); flopenrc #(64) MWRegClass2(clk, reset, FlushW, ~StallW, FResM, FResW); - flopenrc #(1) MWRegClass1(clk, reset, FlushW, ~StallW, FFlgM, FFlgW); flopenrc #(11) MWCtrlReg(clk, reset, FlushW, ~StallW, {FWriteEnM, FResultSelM, RdM, FmtM, FWriteIntM}, @@ -363,20 +319,6 @@ module fpu ( - - - //***turn into muxs - always_comb begin - case (FResultSelW) - 3'b000 : FPUFlagsW = 5'b0; - 3'b001 : FPUFlagsW = FMAFlgW; - 3'b010 : FPUFlagsW = FAddFlgW; - 3'b011 : FPUFlagsW = FDivSqrtFlgW; - 3'b100 : FPUFlagsW = {4'b0,FFlgW}; - default : FPUFlagsW = 5'bxxxxx; - endcase - end - always_comb begin case (FResultSelW) 3'b000 : FPUResult64W = FmtW ? {ReadDataW, {64-`XLEN{1'b0}}} : {ReadDataW[31:0], 32'b0}; @@ -393,13 +335,11 @@ module fpu ( // floating-point results // // define offsets for LSB zero extension or truncation - always_comb begin - // zero extension - //***turn into mux - FPUResultW = FmtW ? FPUResult64W[63:64-`XLEN] : {{`XLEN-32{1'b0}}, FPUResult64W[63:32]}; - //*** put into mem stage - SetFflagsM = FPUFlagsW; - end + always_comb begin + // zero extension +//***turn into mux + FPUResultW = FmtW ? FPUResult64W[63:64-`XLEN] : {{`XLEN-32{1'b0}}, FPUResult64W[63:32]}; + end end else begin // no F_SUPPORTED; tie outputs low assign FStallD = 0; assign FWriteIntE = 0; diff --git a/wally-pipelined/src/fpu/fpuaddcvt1.sv b/wally-pipelined/src/fpu/fpuaddcvt1.sv deleted file mode 100755 index 1b86b198..00000000 --- a/wally-pipelined/src/fpu/fpuaddcvt1.sv +++ /dev/null @@ -1,198 +0,0 @@ -// -// File name : fpadd -// Title : Floating-Point Adder/Subtractor -// project : FPU -// Library : fpadd -// Author(s) : James E. Stine, Jr., Brett Mathis -// Purpose : definition of main unit to floating-point add/sub -// notes : -// -// Copyright Oklahoma State University -// Copyright AFRL -// -// Basic and Denormalized Operations -// -// Step 1: Load operands, set flags, and convert SP to DP -// Step 2: Check for special inputs ( +/- Infinity, NaN) -// Step 3: Compare exponents. Swap the operands of exp1 < exp2 -// or of (exp1 = exp2 AND mnt1 < mnt2) -// Step 4: Shift the mantissa corresponding to the smaller exponent, -// and extend precision by three bits to the right. -// Step 5: Add or subtract the mantissas. -// Step 6: Normalize the result.// -// Shift left until normalized. Normalized when the value to the -// left of the binrary point is 1. -// Step 7: Round the result.// -// Step 8: Put sum onto output. -// - - -module fpuaddcvt1 (AddSumE, AddSumTcE, AddSelInvE, AddExpPostSumE, AddCorrSignE, AddOp1NormE, AddOp2NormE, AddOpANormE, AddOpBNormE, AddInvalidE, AddDenormInE, AddConvertE, AddSwapE, AddNormOvflowE, AddSignAE, AddFloat1E, AddFloat2E, AddExp1DenormE, AddExp2DenormE, AddExponentE, SrcXE, SrcYE, FOpCtrlE, FmtE); - - input logic [63:0] SrcXE; // 1st input operand (A) - input logic [63:0] SrcYE; // 2nd input operand (B) - input logic [3:0] FOpCtrlE; // Function opcode - input logic FmtE; // Result Precision (1 for double, 0 for single) - - wire P; - assign P = ~FmtE | FOpCtrlE[2]; - - wire [63:0] IntValue; - wire [11:0] exp1, exp2; - wire [11:0] exp_diff1, exp_diff2; - wire [11:0] exp_shift; - wire [51:0] mantissaA; - wire [56:0] mantissaA1; - wire [63:0] mantissaA3; - wire [51:0] mantissaB; - wire [56:0] mantissaB1, mantissaB2; - wire [63:0] mantissaB3; - wire exp_gt63; - wire Sticky_out; - wire sub; - wire zeroB; - wire [5:0] align_shift; - - output logic [63:0] AddFloat1E; - output logic [63:0] AddFloat2E; - output logic [10:0] AddExponentE; - output logic [10:0] AddExpPostSumE; - output logic [11:0] AddExp1DenormE, AddExp2DenormE;//KEP used to be [10:0] - output logic [63:0] AddSumE, AddSumTcE; - output logic [3:0] AddSelInvE; - output logic AddCorrSignE; - output logic AddSignAE; - output logic AddOp1NormE, AddOp2NormE; - output logic AddOpANormE, AddOpBNormE; - output logic AddInvalidE; - output logic AddDenormInE; -// output logic exp_valid; - output logic AddConvertE; - output logic AddSwapE; - output logic AddNormOvflowE; - wire [5:0] ZP_mantissaA; - wire [5:0] ZP_mantissaB; - wire ZV_mantissaA; - wire ZV_mantissaB; - - // Convert the input operands to their appropriate forms based on - // the orignal operands, the FOpCtrlE , and their precision P. - // Single precision inputs are converted to double precision - // and the sign of the first operand is set appropratiately based on - // if the operation is absolute value or negation. - - convert_inputs conv1 (AddFloat1E, AddFloat2E, SrcXE, SrcYE, FOpCtrlE, P); - - // Test for exceptions and return the "Invalid Operation" and - // "Denormalized" Input Flags. The "AddSelInvE" is used in - // the third pipeline stage to select the result. Also, AddOp1NormE - // and AddOp2NormE are one if SrcXE and SrcYE are not zero or denormalized. - // sub is one if the effective operation is subtaction. - - exception exc1 (AddSelInvE, AddInvalidE, AddDenormInE, AddOp1NormE, AddOp2NormE, sub, - AddFloat1E, AddFloat2E, FOpCtrlE); - - // Perform Exponent Subtraction (used for alignment). For performance - // both exponent subtractions are performed in parallel. This was - // changed to a behavior level to allow the tools to try to optimize - // the two parallel additions. The input values are zero-extended to 12 - // bits prior to performing the addition. - - assign exp1 = {1'b0, AddFloat1E[62:52]}; - assign exp2 = {1'b0, AddFloat2E[62:52]}; - assign exp_diff1 = exp1 - exp2; - assign exp_diff2 = AddDenormInE ? ({AddFloat2E[63], exp2[10:0]} - {AddFloat1E[63], exp1[10:0]}): exp2 - exp1; - - // The second operand (B) should be set to zero, if FOpCtrlE does not - // specify addition or subtraction - assign zeroB = FOpCtrlE[2] | FOpCtrlE[1]; - - // Swapped operands if zeroB is not one and exp1 < exp2. - // Swapping causes exp2 to be used for the result exponent. - // Only the exponent of the larger operand is used to determine - // the final result. - assign AddSwapE = exp_diff1[11] & ~zeroB; - assign AddExponentE = AddSwapE ? exp2[10:0] : exp1[10:0]; - assign AddExpPostSumE = AddSwapE ? exp2[10:0] : exp1[10:0]; - assign mantissaA = AddSwapE ? AddFloat2E[51:0] : AddFloat1E[51:0]; - assign mantissaB = AddSwapE ? AddFloat1E[51:0] : AddFloat2E[51:0]; - assign AddSignAE = AddSwapE ? AddFloat2E[63] : AddFloat1E[63]; - - // Leading-Zero Detector. Determine the size of the shift needed for - // normalization. If sum_corrected is all zeros, the exp_valid is - // zero; otherwise, it is one. - // modified to 52 bits to detect leading zeroes on denormalized mantissas - lz52 lz_norm_1 (ZP_mantissaA, ZV_mantissaA, mantissaA); - lz52 lz_norm_2 (ZP_mantissaB, ZV_mantissaB, mantissaB); - - // Denormalized exponents created by subtracting the leading zeroes from the original exponents - assign AddExp1DenormE = AddSwapE ? (exp1 - {6'b0, ZP_mantissaB}) : (exp1 - {6'b0, ZP_mantissaA}); //KEP extended ZP_mantissa - assign AddExp2DenormE = AddSwapE ? (exp2 - {6'b0, ZP_mantissaA}) : (exp2 - {6'b0, ZP_mantissaB}); - - // Determine the alignment shift and limit it to 63. If any bit from - // exp_shift[6] to exp_shift[11] is one, then shift is set to all ones. - assign exp_shift = AddSwapE ? exp_diff2 : exp_diff1; - assign exp_gt63 = exp_shift[11] | exp_shift[10] | exp_shift[9] - | exp_shift[8] | exp_shift[7] | exp_shift[6]; - assign align_shift = exp_shift[5:0] | {6{exp_gt63}}; //KEP used to be all of exp_shift - - // Unpack the 52-bit mantissas to 57-bit numbers of the form. - // 001.M[51]M[50] ... M[1]M[0]00 - // Unless the number has an exponent of zero, in which case it - // is unpacked as - // 000.00 ... 00 - // This effectively flushes denormalized values to zero. - // The three bits of to the left of the binary point prevent overflow - // and loss of sign information. The two bits to the right of the - // original mantissa form the "guard" and "round" bits that are used - // to round the result. - assign AddOpANormE = AddSwapE ? AddOp2NormE : AddOp1NormE; - assign AddOpBNormE = AddSwapE ? AddOp1NormE : AddOp2NormE; - assign mantissaA1 = {2'h0, AddOpANormE, mantissaA[51:0]&{52{AddOpANormE}}, 2'h0}; - assign mantissaB1 = {2'h0, AddOpBNormE, mantissaB[51:0]&{52{AddOpBNormE}}, 2'h0}; - - // Perform mantissa alignment using a 57-bit barrel shifter - // If any of the bits shifted out are one, Sticky_out is set. - // The size of the barrel shifter could be reduced by two bits - // by not adding the leading two zeros until after the shift. - barrel_shifter_r57 bs1 (mantissaB2, Sticky_out, mantissaB1, align_shift); - - // Place either the sign-extened 32-bit value or the original 64-bit value - // into IntValue (to be used for integer to floating point conversion) - assign IntValue [31:0] = SrcXE[31:0]; - assign IntValue [63:32] = FOpCtrlE[0] ? {32{SrcXE[31]}} : SrcXE[63:32]; - - // If doing an integer to floating point conversion, mantissaA3 is set to - // IntVal and the prenomalized exponent is set to 1084. Otherwise, - // mantissaA3 is simply extended to 64-bits by setting the 7 LSBs to zero, - // and the exponent value is left unchanged. - // Under denormalized cases, the exponent before the rounder is set to 1 - // if the normal shift value is 11. - assign AddConvertE = ~FOpCtrlE[2] & FOpCtrlE[1]; - assign mantissaA3 = (FOpCtrlE[3]) ? (FOpCtrlE[0] ? AddFloat1E : ~AddFloat1E) : (AddDenormInE ? ({12'h0, mantissaA}) : (AddConvertE ? IntValue : {mantissaA1, 7'h0})); - - // Put zero in for mantissaB3, if zeroB is one. Otherwise, B is extended to - // 64-bits by setting the 7 LSBs to the Sticky_out bit followed by six - // zeros. - assign mantissaB3[63:7] = (FOpCtrlE[3]) ? (57'h0) : (AddDenormInE ? {12'h0, mantissaB[51:7]} : mantissaB2 & {57{~zeroB}}); - assign mantissaB3[6] = (FOpCtrlE[3]) ? (1'b0) : (AddDenormInE ? mantissaB[6] : Sticky_out & ~zeroB); - assign mantissaB3[5:0] = (FOpCtrlE[3]) ? (6'h01) : (AddDenormInE ? mantissaB[5:0] : 6'h0); - - // The sign of the result needs to be corrected if the true - // operation is subtraction and the input operands were swapped. - assign AddCorrSignE = ~FOpCtrlE[2]&~FOpCtrlE[1]&FOpCtrlE[0]&AddSwapE; - - // 64-bit Mantissa Adder/Subtractor - cla64 add1 (AddSumE, mantissaA3, mantissaB3, sub); //***adder - - // 64-bit Mantissa Subtractor - to get the two's complement of the - // result when the sign from the adder/subtractor is negative. - cla_sub64 sub1 (AddSumTcE, mantissaB3, mantissaA3); //***adder - - // Finds normal underflow result to determine whether to round final exponent down - //***KEP used to be (AddSumE == 16'h0) I am unsure what it's supposed to be - assign AddNormOvflowE = (AddDenormInE & (AddSumE == 64'h0) & (AddOpANormE | AddOpBNormE) & ~FOpCtrlE[0]) ? 1'b1 : (AddSumE[63] ? AddSumTcE[52] : AddSumE[52]); - -endmodule // fpadd - - diff --git a/wally-pipelined/src/fpu/fpuaddcvt2.sv b/wally-pipelined/src/fpu/fpuaddcvt2.sv deleted file mode 100755 index 1fe8ac65..00000000 --- a/wally-pipelined/src/fpu/fpuaddcvt2.sv +++ /dev/null @@ -1,163 +0,0 @@ -// -// File name : fpadd -// Title : Floating-Point Adder/Subtractor -// project : FPU -// Library : fpadd -// Author(s) : James E. Stine, Jr., Brett Mathis -// Purpose : definition of main unit to floating-point add/sub -// notes : -// -// Copyright Oklahoma State University -// Copyright AFRL -// -// Basic and Denormalized Operations -// -// Step 1: Load operands, set flags, and AddConvertM SP to DP -// Step 2: Check for special inputs ( +/- Infinity, NaN) -// Step 3: Compare exponents. Swap the operands of exp1 < exp2 -// or of (exp1 = exp2 AND mnt1 < mnt2) -// Step 4: Shift the mantissa corresponding to the smaller AddExponentM, -// and extend precision by three bits to the right. -// Step 5: Add or subtract the mantissas. -// Step 6: Normalize the result.// -// Shift left until normalized. Normalized when the value to the -// left of the binrary point is 1. -// Step 7: Round the result.// -// Step 8: Put AddSumM onto output. -// - - -module fpuaddcvt2 (FAddResM, FAddFlgM, AddSumM, AddSumTcM, AddSelInvM, AddExpPostSumM, AddCorrSignM, AddOp1NormM, AddOp2NormM, AddOpANormM, AddOpBNormM, AddInvalidM, AddDenormInM, AddConvertM, AddSwapM, AddSignAM, AddFloat1M, AddFloat2M, AddExp1DenormM, AddExp2DenormM, AddExponentM, FrmM, FOpCtrlM, FmtM); - - input [2:0] FrmM; // Rounding mode - specify values - input [3:0] FOpCtrlM; // Function opcode - input FmtM; // Result Precision (0 for double, 1 for single) - // input AddOvEnM; // Overflow trap enabled - // input AddUnEnM; // Underflow trap enabled - input [63:0] AddSumM, AddSumTcM; - input [63:0] AddFloat1M; - input [63:0] AddFloat2M; - input [11:0] AddExp1DenormM, AddExp2DenormM; - input [10:0] AddExponentM, AddExpPostSumM; //exp_pre; - //input exp_valid; - input [3:0] AddSelInvM; - input AddOp1NormM, AddOp2NormM; - input AddOpANormM, AddOpBNormM; - input AddInvalidM; - input AddDenormInM; - input AddSignAM; - input AddCorrSignM; - input AddConvertM; - input AddSwapM; - // input AddNormOvflowM; - - output [63:0] FAddResM; // Result of operation - output [4:0] FAddFlgM; // IEEE exception flags - wire AddDenormM; // AddDenormM on input or output - - wire P; - assign P = ~FmtM | FOpCtrlM[2]; - - wire [10:0] exp_pre; - wire [63:0] Result; - wire [63:0] sum_norm, sum_norm_w_bypass; - wire [5:0] norm_shift, norm_shift_denorm; - wire exp_valid; - wire DenormIO; - wire [4:0] FlagsIn; - wire Sticky_out; - wire sign_corr; - wire zeroB; - wire [10:0] AddExpPostSumM; - wire mantissa_comp; - wire mantissa_comp_sum; - wire mantissa_comp_sum_tc; - wire Float1_sum_comp; - wire Float2_sum_comp; - wire Float1_sum_tc_comp; - wire Float2_sum_tc_comp; - wire normal_underflow; - wire [63:0] sum_corr; - logic AddNormOvflowM; - - - logic AddOvEnM; // Overflow trap enabled - logic AddUnEnM; // Underflow trap enabled - - assign AddOvEnM = 1'b1; - assign AddUnEnM = 1'b1; - //AddExponentM value pre-rounding with considerations for denormalized - //cases/conversion cases - assign exp_pre = AddDenormInM ? - ((norm_shift == 6'b001011) ? 11'b00000000001 : (AddSwapM ? AddExp2DenormM[10:0] : AddExp1DenormM[10:0])) - : (AddConvertM ? 11'b10000111100 : AddExponentM); - - - // Finds normal underflow result to determine whether to round final AddExponentM down - // Comparison between each float and the resulting AddSumM of the primary cla adder/subtractor and cla subtractor - assign Float1_sum_comp = (AddFloat1M[51:0] > AddSumM[51:0]) ? 1'b0 : 1'b1; - assign Float2_sum_comp = (AddFloat2M[51:0] > AddSumM[51:0]) ? 1'b0 : 1'b1; - assign Float1_sum_tc_comp = (AddFloat1M[51:0] > AddSumTcM[51:0]) ? 1'b0 : 1'b1; - assign Float2_sum_tc_comp = (AddFloat2M[51:0] > AddSumTcM[51:0]) ? 1'b0 : 1'b1; - - // Determines the correct Float value to compare based on AddSwapM result - assign mantissa_comp_sum = AddSwapM ? Float2_sum_comp : Float1_sum_comp; - assign mantissa_comp_sum_tc = AddSwapM ? Float2_sum_tc_comp : Float1_sum_tc_comp; - - // Determines the correct comparison result based on operation and sign of resulting AddSumM - assign mantissa_comp = (FOpCtrlM[0] ^ AddSumM[63]) ? mantissa_comp_sum_tc : mantissa_comp_sum; - - // If the signs are different and both operands aren't denormalized - // the normal underflow bit is needed and therefore updated. - assign normal_underflow = ((AddFloat1M[63] ~^ AddFloat2M[63]) & (AddOpANormM | AddOpBNormM)) ? mantissa_comp : 1'b0; - - // Determine the correct sign of the result - assign sign_corr = ((AddCorrSignM ^ AddSignAM) & ~AddConvertM) ^ AddSumM[63]; - - // If the AddSumM is negative, use its two complement instead. - // This value has to be 64-bits to correctly handle the - // case 10...00 - assign sum_corr = (AddDenormInM & (AddOpANormM | AddOpBNormM) & ( ( (AddFloat1M[63] ~^ AddFloat2M[63]) & FOpCtrlM[0] ) | ((AddFloat1M[63] ^ AddFloat2M[63]) & ~FOpCtrlM[0]) )) - ? (AddSumM[63] ? AddSumM : AddSumTcM) : ( (FOpCtrlM[3]) ? AddSumM : (AddSumM[63] ? AddSumTcM : AddSumM)); - - // Finds normal underflow result to determine whether to round final AddExponentM down - //KEP used to be (AddSumM == 16'h0) not sure what it is supposed to be - assign AddNormOvflowM = (AddDenormInM & (AddSumM == 64'h0) & (AddOpANormM | AddOpBNormM) & ~FOpCtrlM[0]) ? 1'b1 : (AddSumM[63] ? AddSumTcM[52] : AddSumM[52]); - - // Leading-Zero Detector. Determine the size of the shift needed for - // normalization. If sum_corrected is all zeros, the exp_valid is - // zero; otherwise, it is one. - lz64 lzd1 (norm_shift, exp_valid, sum_corr); - - assign norm_shift_denorm = (AddDenormInM & ( (~AddOpANormM & ~AddOpBNormM) | normal_underflow)) ? (6'h00) : (norm_shift); - - // Barell shifter used for normalization. It takes as inputs the - // the corrected AddSumM and the amount by which the AddSumM should - // be right shifted. It outputs the normalized AddSumM. - barrel_shifter_l64 bs2 (sum_norm, sum_corr, norm_shift_denorm); - - assign sum_norm_w_bypass = (FOpCtrlM[3]) ? (FOpCtrlM[0] ? ~sum_corr : sum_corr) : (sum_norm); - - // Round the mantissa to a 52-bit value, with the leading one - // removed. If the result is a single precision number, the actual - // mantissa is in the upper 23 bits and the lower 29 bits are zero. - // At this point, normalization has already been performed, so we know - // exactly where the rounding point is. The rounding units also - // handles special cases and set the exception flags. - - // Changed DenormIO -> AddDenormM and FlagsIn -> FAddFlgM in order to - // help in processor reservation station detection of load/stores. In - // other words, the processor would like to know ahead of time that - // if the result is an exception then don't load or store. - rounder round1 (Result, DenormIO, FlagsIn, FrmM, P, AddOvEnM, AddUnEnM, exp_valid, - AddSelInvM, AddInvalidM, AddDenormInM, AddConvertM, sign_corr, exp_pre, norm_shift, sum_norm_w_bypass, - AddExpPostSumM, AddOp1NormM, AddOp2NormM, AddFloat1M[63:52], AddFloat2M[63:52], - AddNormOvflowM, normal_underflow, AddSwapM, FOpCtrlM, AddSumM); - - // Store the final result and the exception flags in registers. - assign FAddResM = Result; - assign {AddDenormM, FAddFlgM} = {DenormIO, FlagsIn}; - -endmodule // fpadd - - diff --git a/wally-pipelined/testbench/testbench-imperas.sv b/wally-pipelined/testbench/testbench-imperas.sv index a4daf7f3..b017ef8d 100644 --- a/wally-pipelined/testbench/testbench-imperas.sv +++ b/wally-pipelined/testbench/testbench-imperas.sv @@ -94,14 +94,14 @@ string tests32f[] = '{ "rv64f/I-FSW-01", "2000", "rv64f/I-FCLASS-S-01", "2000", "rv64f/I-FADD-S-01", "2000", - // "rv64f/I-FCVT-S-L-01", "2000", - // "rv64f/I-FCVT-S-LU-01", "2000", - // "rv64f/I-FCVT-S-W-01", "2000", - // "rv64f/I-FCVT-S-WU-01", "2000", - // "rv64f/I-FCVT-L-S-01", "2000", - // "rv64f/I-FCVT-LU-S-01", "2000", - // "rv64f/I-FCVT-W-S-01", "2000", - // "rv64f/I-FCVT-WU-S-01", "2000", + "rv64f/I-FCVT-S-L-01", "2000", + "rv64f/I-FCVT-S-LU-01", "2000", + "rv64f/I-FCVT-S-W-01", "2000", + "rv64f/I-FCVT-S-WU-01", "2000", + "rv64f/I-FCVT-L-S-01", "2000", + "rv64f/I-FCVT-LU-S-01", "2000", + "rv64f/I-FCVT-W-S-01", "2000", + "rv64f/I-FCVT-WU-S-01", "2000", // "rv64f/I-FDIV-S-01", "2000", "rv64f/I-FEQ-S-01", "2000", "rv64f/I-FLE-S-01", "2000", @@ -122,6 +122,16 @@ string tests32f[] = '{ string tests64d[] = '{ // "rv64d/I-FDIV-D-01", "2000", + "rv64d/I-FCVT-D-L-01", "2000", + "rv64d/I-FCVT-D-LU-01", "2000", + // "rv64d/I-FCVT-D-S-01", "2000", //the number to be converted is in the lower 32 bits need to change the test + "rv64d/I-FCVT-D-W-01", "2000", + "rv64d/I-FCVT-D-WU-01", "2000", + "rv64d/I-FCVT-L-D-01", "2000", + "rv64d/I-FCVT-LU-D-01", "2000", + // "rv64d/I-FCVT-S-D-01", "2000", //the result is in the lower 32 bits needs to be changed in the imperas test + "rv64d/I-FCVT-W-D-01", "2000", + // "rv64d/I-FCVT-WU-D-01", "2000", //this test needs to be fixed it expects 2^64-1 rather then 2^32-1 (specified in spec) "rv64d/I-FSD-01", "2000", "rv64d/I-FLD-01", "2420", "rv64d/I-FNMADD-D-01", "2000", @@ -134,16 +144,6 @@ string tests32f[] = '{ "rv64d/I-FEQ-D-01", "2000", "rv64d/I-FADD-D-01", "2000", "rv64d/I-FCLASS-D-01", "2000", - // "rv64d/I-FCVT-D-L-01", "2000", - // "rv64d/I-FCVT-D-LU-01", "2000", - // "rv64d/I-FCVT-D-S-01", "2000", - // "rv64d/I-FCVT-D-W-01", "2000", - // "rv64d/I-FCVT-D-WU-01", "2000", - // "rv64d/I-FCVT-L-D-01", "2000", - // "rv64d/I-FCVT-LU-D-01", "2000", - // "rv64d/I-FCVT-S-D-01", "2000", - // "rv64d/I-FCVT-W-D-01", "2000", - // "rv64d/I-FCVT-WU-D-01", "2000", "rv64d/I-FMADD-D-01", "2000", "rv64d/I-FMUL-D-01", "2000", "rv64d/I-FMV-D-X-01", "2000", @@ -898,8 +898,22 @@ module instrNameDecTB( else if (funct7[6:2] == 5'b01011) name = "FSQRT"; else if (funct7 == 7'b1100000 && rs2 == 5'b00000) name = "FCVT.W.S"; else if (funct7 == 7'b1100000 && rs2 == 5'b00001) name = "FCVT.WU.S"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00010) name = "FCVT.L.S"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00011) name = "FCVT.LU.S"; else if (funct7 == 7'b1101000 && rs2 == 5'b00000) name = "FCVT.S.W"; else if (funct7 == 7'b1101000 && rs2 == 5'b00001) name = "FCVT.S.WU"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00010) name = "FCVT.S.L"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00011) name = "FCVT.S.LU"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00000) name = "FCVT.W.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00001) name = "FCVT.WU.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00010) name = "FCVT.L.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00011) name = "FCVT.LU.D"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00000) name = "FCVT.D.W"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00001) name = "FCVT.D.WU"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00010) name = "FCVT.D.L"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00011) name = "FCVT.D.LU"; + else if (funct7 == 7'b0100000 && rs2 == 5'b00001) name = "FCVT.S.D"; + else if (funct7 == 7'b0100001 && rs2 == 5'b00000) name = "FCVT.D.S"; else if (funct7 == 7'b1110000 && rs2 == 5'b00000) name = "FMV.X.W"; else if (funct7 == 7'b1111000 && rs2 == 5'b00000) name = "FMV.W.X"; else if (funct7 == 7'b1110001 && rs2 == 5'b00000) name = "FMV.X.D"; // DOUBLE @@ -915,22 +929,50 @@ module instrNameDecTB( else if (funct7[6:2] == 5'b01011) name = "FSQRT"; else if (funct7 == 7'b1100000 && rs2 == 5'b00000) name = "FCVT.W.S"; else if (funct7 == 7'b1100000 && rs2 == 5'b00001) name = "FCVT.WU.S"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00010) name = "FCVT.L.S"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00011) name = "FCVT.LU.S"; else if (funct7 == 7'b1101000 && rs2 == 5'b00000) name = "FCVT.S.W"; else if (funct7 == 7'b1101000 && rs2 == 5'b00001) name = "FCVT.S.WU"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00010) name = "FCVT.S.L"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00011) name = "FCVT.S.LU"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00000) name = "FCVT.W.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00001) name = "FCVT.WU.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00010) name = "FCVT.L.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00011) name = "FCVT.LU.D"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00000) name = "FCVT.D.W"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00001) name = "FCVT.D.WU"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00010) name = "FCVT.D.L"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00011) name = "FCVT.D.LU"; + else if (funct7 == 7'b0100000 && rs2 == 5'b00001) name = "FCVT.S.D"; + else if (funct7 == 7'b0100001 && rs2 == 5'b00000) name = "FCVT.D.S"; else if (funct7[6:2] == 5'b00100) name = "FSGNJN"; else if (funct7[6:2] == 5'b00101) name = "FMAX"; else if (funct7[6:2] == 5'b10100) name = "FLT"; else if (funct7[6:2] == 5'b11100) name = "FCLASS"; else name = "ILLEGAL"; - 10'b0101111_010: if (funct7[6:2] == 5'b00000) name = "FADD"; + 10'b1010011_010: if (funct7[6:2] == 5'b00000) name = "FADD"; else if (funct7[6:2] == 5'b00001) name = "FSUB"; else if (funct7[6:2] == 5'b00010) name = "FMUL"; else if (funct7[6:2] == 5'b00011) name = "FDIV"; else if (funct7[6:2] == 5'b01011) name = "FSQRT"; else if (funct7 == 7'b1100000 && rs2 == 5'b00000) name = "FCVT.W.S"; else if (funct7 == 7'b1100000 && rs2 == 5'b00001) name = "FCVT.WU.S"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00010) name = "FCVT.L.S"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00011) name = "FCVT.LU.S"; else if (funct7 == 7'b1101000 && rs2 == 5'b00000) name = "FCVT.S.W"; else if (funct7 == 7'b1101000 && rs2 == 5'b00001) name = "FCVT.S.WU"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00010) name = "FCVT.S.L"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00011) name = "FCVT.S.LU"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00000) name = "FCVT.W.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00001) name = "FCVT.WU.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00010) name = "FCVT.L.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00011) name = "FCVT.LU.D"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00000) name = "FCVT.D.W"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00001) name = "FCVT.D.WU"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00010) name = "FCVT.D.L"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00011) name = "FCVT.D.LU"; + else if (funct7 == 7'b0100000 && rs2 == 5'b00001) name = "FCVT.S.D"; + else if (funct7 == 7'b0100001 && rs2 == 5'b00000) name = "FCVT.D.S"; else if (funct7[6:2] == 5'b00100) name = "FSGNJX"; else if (funct7[6:2] == 5'b10100) name = "FEQ"; else name = "ILLEGAL"; @@ -941,8 +983,22 @@ module instrNameDecTB( else if (funct7[6:2] == 5'b01011) name = "FSQRT"; else if (funct7 == 7'b1100000 && rs2 == 5'b00000) name = "FCVT.W.S"; else if (funct7 == 7'b1100000 && rs2 == 5'b00001) name = "FCVT.WU.S"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00010) name = "FCVT.L.S"; + else if (funct7 == 7'b1100000 && rs2 == 5'b00011) name = "FCVT.LU.S"; else if (funct7 == 7'b1101000 && rs2 == 5'b00000) name = "FCVT.S.W"; else if (funct7 == 7'b1101000 && rs2 == 5'b00001) name = "FCVT.S.WU"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00010) name = "FCVT.S.L"; + else if (funct7 == 7'b1101000 && rs2 == 5'b00011) name = "FCVT.S.LU"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00000) name = "FCVT.W.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00001) name = "FCVT.WU.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00010) name = "FCVT.L.D"; + else if (funct7 == 7'b1100001 && rs2 == 5'b00011) name = "FCVT.LU.D"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00000) name = "FCVT.D.W"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00001) name = "FCVT.D.WU"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00010) name = "FCVT.D.L"; + else if (funct7 == 7'b1101001 && rs2 == 5'b00011) name = "FCVT.D.LU"; + else if (funct7 == 7'b0100000 && rs2 == 5'b00001) name = "FCVT.S.D"; + else if (funct7 == 7'b0100001 && rs2 == 5'b00000) name = "FCVT.D.S"; else name = "ILLEGAL"; 10'b0000111_010: name = "FLW"; 10'b0100111_010: name = "FSW";