URL
https://opencores.org/ocsvn/hdl-deflate/hdl-deflate/trunk
Subversion Repositories hdl-deflate
Compare Revisions
- This comparison shows the changes necessary to convert path
/hdl-deflate
- from Rev 5 to Rev 6
- ↔ Reverse comparison
Rev 5 → Rev 6
/trunk/deflate.py
18,6 → 18,12
IDLE, RESET, WRITE, READ, STARTC, STARTD = range(6) |
|
COMPRESS = True |
DECOMPRESS = False |
DECOMPRESS = True |
|
DYNAMIC = False |
DYNAMIC = True |
|
MATCH10 = False |
MATCH10 = True |
|
27,8 → 33,15
CWINDOW = 32 # Search window for compression |
|
OBSIZE = 8192 # Size of output buffer (BRAM) |
IBSIZE = 4 * CWINDOW # 2048 # Size of input buffer (LUT-RAM) |
OBSIZE = 32768 # Size of output buffer for ANY input (BRAM) |
|
# Size of input buffer (LUT-RAM) |
IBSIZE = 16 * CWINDOW # This size gives method 2 (dynamic tree) for testbench |
IBSIZE = 2 * CWINDOW # Minimal window |
|
LMAX = 24 # Size of progress and I/O counters |
|
|
if OBSIZE > IBSIZE: |
LBSIZE = int(log2(OBSIZE)) |
else: |
35,13 → 48,16
LBSIZE = int(log2(IBSIZE)) |
|
LIBSIZE = int(log2(IBSIZE)) |
LOBSIZE = int(log2(OBSIZE)) |
|
IBS = (1 << LIBSIZE) - 1 |
OBS = (1 << LOBSIZE) - 1 |
|
d_state = enum('IDLE', 'HEADER', 'BL', 'READBL', 'REPEAT', 'DISTTREE', 'INIT3', |
'HF1', 'HF1INIT', 'HF2', 'HF3', 'HF4', 'HF4_2', 'HF4_3', |
'STATIC', 'D_NEXT', 'D_NEXT_2', |
'D_INFLATE', 'SPREAD', 'NEXT', 'INFLATE', 'COPY', 'CSTATIC', |
'SEARCH', 'DISTANCE', 'CHECKSUM') # , encoding='one_hot') |
'SEARCH', 'SEARCHF', 'DISTANCE', 'CHECKSUM') # , encoding='one_hot') |
|
CodeLengthOrder = (16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, |
1, 15) |
58,10 → 74,49
|
ExtraDistanceBits = (0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13) |
|
out_codes = ( |
0x00c, 0x08c, 0x04c, 0x0cc, 0x02c, 0x0ac, 0x06c, 0x0ec, |
0x01c, 0x09c, 0x05c, 0x0dc, 0x03c, 0x0bc, 0x07c, 0x0fc, |
0x002, 0x082, 0x042, 0x0c2, 0x022, 0x0a2, 0x062, 0x0e2, |
0x012, 0x092, 0x052, 0x0d2, 0x032, 0x0b2, 0x072, 0x0f2, |
0x00a, 0x08a, 0x04a, 0x0ca, 0x02a, 0x0aa, 0x06a, 0x0ea, |
0x01a, 0x09a, 0x05a, 0x0da, 0x03a, 0x0ba, 0x07a, 0x0fa, |
0x006, 0x086, 0x046, 0x0c6, 0x026, 0x0a6, 0x066, 0x0e6, |
0x016, 0x096, 0x056, 0x0d6, 0x036, 0x0b6, 0x076, 0x0f6, |
0x00e, 0x08e, 0x04e, 0x0ce, 0x02e, 0x0ae, 0x06e, 0x0ee, |
0x01e, 0x09e, 0x05e, 0x0de, 0x03e, 0x0be, 0x07e, 0x0fe, |
0x001, 0x081, 0x041, 0x0c1, 0x021, 0x0a1, 0x061, 0x0e1, |
0x011, 0x091, 0x051, 0x0d1, 0x031, 0x0b1, 0x071, 0x0f1, |
0x009, 0x089, 0x049, 0x0c9, 0x029, 0x0a9, 0x069, 0x0e9, |
0x019, 0x099, 0x059, 0x0d9, 0x039, 0x0b9, 0x079, 0x0f9, |
0x005, 0x085, 0x045, 0x0c5, 0x025, 0x0a5, 0x065, 0x0e5, |
0x015, 0x095, 0x055, 0x0d5, 0x035, 0x0b5, 0x075, 0x0f5, |
0x00d, 0x08d, 0x04d, 0x0cd, 0x02d, 0x0ad, 0x06d, 0x0ed, |
0x01d, 0x09d, 0x05d, 0x0dd, 0x03d, 0x0bd, 0x07d, 0x0fd, |
0x013, 0x113, 0x093, 0x193, 0x053, 0x153, 0x0d3, 0x1d3, |
0x033, 0x133, 0x0b3, 0x1b3, 0x073, 0x173, 0x0f3, 0x1f3, |
0x00b, 0x10b, 0x08b, 0x18b, 0x04b, 0x14b, 0x0cb, 0x1cb, |
0x02b, 0x12b, 0x0ab, 0x1ab, 0x06b, 0x16b, 0x0eb, 0x1eb, |
0x01b, 0x11b, 0x09b, 0x19b, 0x05b, 0x15b, 0x0db, 0x1db, |
0x03b, 0x13b, 0x0bb, 0x1bb, 0x07b, 0x17b, 0x0fb, 0x1fb, |
0x007, 0x107, 0x087, 0x187, 0x047, 0x147, 0x0c7, 0x1c7, |
0x027, 0x127, 0x0a7, 0x1a7, 0x067, 0x167, 0x0e7, 0x1e7, |
0x017, 0x117, 0x097, 0x197, 0x057, 0x157, 0x0d7, 0x1d7, |
0x037, 0x137, 0x0b7, 0x1b7, 0x077, 0x177, 0x0f7, 0x1f7, |
0x00f, 0x10f, 0x08f, 0x18f, 0x04f, 0x14f, 0x0cf, 0x1cf, |
0x02f, 0x12f, 0x0af, 0x1af, 0x06f, 0x16f, 0x0ef, 0x1ef, |
0x01f, 0x11f, 0x09f, 0x19f, 0x05f, 0x15f, 0x0df, 0x1df, |
0x03f, 0x13f, 0x0bf, 0x1bf, 0x07f, 0x17f, 0x0ff, 0x1ff, |
0x000, 0x040, 0x020, 0x060, 0x010, 0x050, 0x030, 0x070, |
0x008, 0x048, 0x028, 0x068, 0x018, 0x058, 0x038, 0x078, |
0x004, 0x044, 0x024, 0x064, 0x014, 0x054, 0x034, 0x074, |
0x003, 0x083, 0x043, 0x0c3, 0x023, 0x0a3, 0x063, 0x0e3 |
) |
|
|
@block |
def deflate(i_mode, o_done, i_data, o_iprogress, o_oprogress, o_byte, i_addr, |
clk, reset): |
def deflate(i_mode, o_done, i_data, o_iprogress, o_oprogress, o_byte, |
i_waddr, i_raddr, clk, reset): |
|
""" Deflate (de)compress |
|
72,17 → 127,18
iram = [Signal(intbv()[8:]) for _ in range(IBSIZE)] |
oram = [Signal(intbv()[8:]) for _ in range(OBSIZE)] |
|
oaddr = Signal(intbv()[LBSIZE:]) |
oraddr = Signal(intbv()[LBSIZE:]) |
oaddr = Signal(modbv()[LOBSIZE:]) |
oraddr = Signal(modbv()[LOBSIZE:]) |
obyte = Signal(intbv()[8:]) |
orbyte = Signal(intbv()[8:]) |
|
iraddr = Signal(intbv()[LIBSIZE:]) |
# iraddr = Signal(modbv()[LIBSIZE:]) |
|
isize = Signal(intbv()[LBSIZE:]) |
isize = Signal(intbv()[LMAX:]) |
state = Signal(d_state.IDLE) |
method = Signal(intbv()[3:]) |
final = Signal(bool()) |
wtick = Signal(bool()) |
do_compress = Signal(bool()) |
|
numLiterals = Signal(intbv()[9:]) |
98,22 → 154,32
# MaxToken = 285 |
InvalidToken = 300 |
|
CODEBITS = 10 # MaxCodeLength |
BITBITS = 9 |
CODEBITS = MaxCodeLength |
BITBITS = 4 |
|
codeLength = [Signal(intbv()[4:]) for _ in range(MaxBitLength+2)] |
codeLength = [Signal(intbv()[4:]) for _ in range(MaxBitLength+32)] |
bits = Signal(intbv()[4:]) |
bitLengthCount = [Signal(intbv()[9:]) for _ in range(MaxCodeLength+1)] |
nextCode = [Signal(intbv()[CODEBITS:]) for _ in range(MaxCodeLength)] |
reverse = Signal(intbv()[CODEBITS:]) |
code_bits = [Signal(intbv()[9:]) for _ in range(MaxBitLength)] |
nextCode = [Signal(intbv()[CODEBITS+1:]) for _ in range(MaxCodeLength+1)] |
reverse = Signal(modbv()[CODEBITS:]) |
# code_bits = [Signal(intbv()[MaxCodeLength:]) for _ in range(MaxBitLength)] |
distanceLength = [Signal(intbv()[4:]) for _ in range(32)] |
|
leaves = [Signal(intbv()[CODEBITS + BITBITS:]) for _ in range(512)] |
lwaddr = Signal(intbv()[9:]) |
# lraddr = Signal(intbv()[9:]) |
d_leaves = [Signal(intbv()[CODEBITS + BITBITS:]) for _ in range(128)] |
# rleaf = Signal(intbv()[CODEBITS + BITBITS:]) |
if DECOMPRESS: |
if DYNAMIC: |
leaves = [Signal(intbv()[CODEBITS + BITBITS:]) for _ in range(16384)] |
d_leaves = [Signal(intbv()[CODEBITS + BITBITS:]) for _ in range(4096)] |
else: |
leaves = [Signal(intbv()[CODEBITS + BITBITS:]) for _ in range(512)] |
d_leaves = [Signal(bool())] |
# leaves = [Signal(intbv()[CODEBITS + BITBITS:]) for _ in range(32768)] |
# d_leaves = [Signal(intbv()[CODEBITS + BITBITS:]) for _ in range(32768)] |
else: |
leaves = [Signal(bool())] |
d_leaves = [Signal(bool())] |
lwaddr = Signal(intbv()[MaxCodeLength:]) |
lraddr = Signal(intbv()[MaxCodeLength:]) |
rleaf = Signal(intbv()[CODEBITS + BITBITS:]) |
wleaf = Signal(intbv()[CODEBITS + BITBITS:]) |
leaf = Signal(intbv()[CODEBITS + BITBITS:]) |
|
124,8 → 190,8
d_instantMaxBit = Signal(intbv()[InstantMaxBit:]) |
instantMask = Signal(intbv()[MaxCodeLength:]) |
d_instantMask = Signal(intbv()[MaxCodeLength:]) |
spread = Signal(intbv()[10:]) |
step = Signal(intbv()[10:]) |
spread = Signal(intbv()[InstantMaxBit:]) |
step = Signal(intbv()[InstantMaxBit:]) |
|
static = Signal(bool()) |
|
133,23 → 199,24
lastToken = Signal(intbv()[15:]) |
howOften = Signal(intbv()[9:]) |
|
cur_i = Signal(intbv()[LBSIZE:]) |
cur_i = Signal(intbv()[LMAX:]) |
spread_i = Signal(intbv()[9:]) |
cur_HF1 = Signal(intbv()[10:]) |
cur_HF1 = Signal(intbv()[MaxCodeLength+1:]) |
cur_static = Signal(intbv()[9:]) |
cur_cstatic = Signal(intbv()[LBSIZE:]) |
cur_search = Signal(intbv(min=-CWINDOW,max=IBSIZE)) |
cur_cstatic = Signal(intbv()[LMAX:]) |
# cur_search = Signal(intbv(min=-CWINDOW,max=IBSIZE)) |
cur_search = Signal(intbv(min=-1,max=1<<LMAX)) |
cur_dist = Signal(intbv(min=-CWINDOW,max=IBSIZE)) |
# cur_next = Signal(intbv()[5:]) |
cur_next = Signal(bool()) |
cur_next = Signal(intbv()[4:]) |
# cur_next = Signal(bool()) |
|
length = Signal(intbv()[LBSIZE:]) |
offset = Signal(intbv()[LBSIZE:]) |
length = Signal(modbv()[LOBSIZE:]) |
offset = Signal(intbv()[LOBSIZE:]) |
|
di = Signal(intbv()[LBSIZE:]) |
old_di = Signal(intbv()[LBSIZE:]) |
di = Signal(modbv()[LMAX:]) |
old_di = Signal(intbv()[LMAX:]) |
dio = Signal(intbv()[3:]) |
do = Signal(intbv()[LBSIZE:]) |
do = Signal(intbv()[LMAX:]) |
doo = Signal(intbv()[3:]) |
|
b1 = Signal(intbv()[8:]) |
163,6 → 230,7
|
b14 = ConcatSignal(b1, b2, b3, b4) |
b14._markUsed() |
b15 = ConcatSignal(b1, b2, b3, b4, b5) |
|
if MATCH10: |
b6 = Signal(intbv()[8:]) |
202,7 → 270,7
@always(clk.posedge) |
def oramread(): |
orbyte.next = oram[oraddr] |
# rleaf.next = leaves[lraddr] |
rleaf.next = leaves[lraddr] |
|
@block |
def matcher3(o_m, mi): |
231,7 → 299,8
old_di.next = 0 |
else: |
if isize < 4: |
pass |
nb.next = 0 |
old_di.next = 0 |
elif i_mode == STARTC or i_mode == STARTD: |
nb.next = 0 |
old_di.next = 0 |
240,25 → 309,23
if do_compress: |
print("FILL", di, old_di, nb, b1, b2, b3, b4) |
""" |
if FAST: # and nb == 4: |
if FAST: # and do_compress: |
shift = (di - old_di) * 8 |
""" |
if shift != 0: |
print("shift", shift, cwindow, b1, b2, b3, b4) |
""" |
if shift <= 32: |
cwindow.next = (cwindow << shift) | (b14 >> (32 - shift)) |
elif shift == 40: |
cwindow.next = (cwindow << shift) | (b14 << 8) | b5 |
elif MATCH10: |
if MATCH10: |
cwindow.next = (cwindow << shift) | (b110 >> (80 - shift)) |
else: |
cwindow.next = (cwindow << shift) | (b15 >> (40 - shift)) |
|
if old_di == di: |
nb.next = 4 |
# wtick.next = True |
|
old_di.next = di |
|
# iraddr.next = di |
# print("B1", iram[di & IBS]) |
b1.next = iram[di & IBS] |
b2.next = iram[di+1 & IBS] |
b3.next = iram[di+2 & IBS] |
270,77 → 337,6
b8.next = iram[di+7 & IBS] |
b9.next = iram[di+8 & IBS] |
b10.next = iram[di+9 & IBS] |
""" |
@always(clk.posedge) |
def fill_buf(): |
if not reset: |
print("FILL RESET") |
nb.next = 0 |
old_di.next = 0 |
b1.next = 0 |
b2.next = 0 |
b3.next = 0 |
b4.next = 0 |
else: |
if isize < 4: |
pass |
elif i_mode == STARTC or i_mode == STARTD: |
nb.next = 0 |
elif not filled and nb == 4 and di - old_di <= 4: |
delta = di - old_di |
if delta == 1: |
# print("delta == 1") |
if FAST: |
cwindow.next = (cwindow << 8) | b1 |
b1.next = b2 |
b2.next = b3 |
b3.next = b4 |
b4.next = iram[di+3 & IBS] |
# nb.next = 4 |
elif delta == 2: |
print("delta == 2") |
if FAST: |
cwindow.next = (cwindow << 16) | (b14 >> 16) |
b1.next = b3 |
b2.next = b4 |
b3.next = iram[di+2 & IBS] |
nb.next = 3 |
elif delta == 3: |
print("delta == 3") |
if FAST: |
cwindow.next = (cwindow << 24) | (b14 >> 8) |
b1.next = b4 |
b2.next = iram[di+1 & IBS] |
nb.next = 2 |
elif delta == 4: |
print("delta == 4") |
if FAST: |
cwindow.next = (cwindow << 32) | (b14) |
b1.next = iram[di & IBS] |
nb.next = 1 |
else: |
pass |
elif not filled or nb == 0: |
print("nb = 0") |
b1.next = iram[di & IBS] |
nb.next = 1 |
elif not filled or nb == 1: |
print("nb = 1") |
b2.next = iram[di+1 & IBS] |
nb.next = 2 |
elif not filled or nb == 2: |
print("nb = 2") |
# raise Error("nb == 2") |
b3.next = iram[di+2 & IBS] |
nb.next = 3 |
elif not filled or nb == 3: |
print("nb = 3") |
b4.next = iram[di+3 & IBS] |
nb.next = 4 |
else: |
pass |
old_di.next = di |
""" |
|
def get4(boffset, width): |
if nb != 4: |
403,6 → 399,8
if b >= 1 << nb: |
raise Error("too few bits") |
print("too few bits") |
if nb > 15: |
raise Error("nb too large") |
r = (((b >> 14) & 0x1) << 0) | (((b >> 13) & 0x1) << 1) | \ |
(((b >> 12) & 0x1) << 2) | (((b >> 11) & 0x1) << 3) | \ |
(((b >> 10) & 0x1) << 4) | (((b >> 9) & 0x1) << 5) | \ |
429,21 → 427,12
|
@always(clk.posedge) |
def io_logic(): |
o_byte.next = oram[i_raddr & OBS] |
if i_mode == WRITE: |
|
# print("WRITE:", i_addr, i_data) |
iram[i_addr & IBS].next = i_data |
isize.next = i_addr |
iram[i_waddr & IBS].next = i_data |
isize.next = i_waddr |
|
elif i_mode == READ: |
|
# o_data.next = oram[i_addr] |
# oraddr.next = i_addr |
o_byte.next = oram[i_addr] |
|
else: |
pass |
|
@always(clk.posedge) |
def logic(): |
if not reset: |
472,7 → 461,7
cur_static.next = 0 |
state.next = d_state.STATIC |
|
elif i_mode == STARTD: |
elif DECOMPRESS and i_mode == STARTD: |
|
do_compress.next = False |
o_done.next = False |
491,7 → 480,9
|
elif state == d_state.HEADER: |
|
if not filled: |
if not DECOMPRESS: |
pass |
elif not filled: |
filled.next = True |
elif nb < 4: |
pass |
516,6 → 507,9
print("method", hm) |
# print(di, dio, nb, b1, b2, b3, b4, hm, isize) |
if hm == 2: |
if not DYNAMIC: |
print("dynamic tree mode disabled") |
raise Error("dynamic tree mode disabled") |
state.next = d_state.BL |
numCodeLength.next = 0 |
numLiterals.next = 0 |
570,17 → 564,20
obyte.next = put(0x3, 3) |
put_adv(0x3, 3) |
elif flush: |
print("flush", do, ob1) |
# print("flush", do, ob1) |
no_adv = 1 |
oaddr.next = do |
obyte.next = ob1 |
do_flush() |
elif cur_cstatic >= isize - 10 and i_mode != IDLE: |
print("P", cur_cstatic, isize) |
no_adv = 1 |
elif cur_cstatic - 3 > isize: |
if cur_cstatic - 3 == isize + 1: |
print("Put EOF", do) |
cs_i = EndOfBlock |
outlen = codeLength[cs_i] |
outbits = code_bits[cs_i] |
outbits = out_codes[cs_i] # code_bits[cs_i] |
print("EOF BITS:", cs_i, outlen, outbits) |
oaddr.next = do |
obyte.next = put(outbits, outlen) |
597,32 → 594,34
oaddr.next = do |
obyte.next = adler2 >> 8 |
do.next = do + 1 |
o_oprogress.next = do + 1 |
elif cur_cstatic - 3 == isize + 4: |
print("c2") |
oaddr.next = do |
obyte.next = adler2 & 0xFF |
do.next = do + 1 |
o_oprogress.next = do + 1 |
elif cur_cstatic - 3 == isize + 5: |
print("c3") |
oaddr.next = do |
obyte.next = adler1 >> 8 |
do.next = do + 1 |
o_oprogress.next = do + 1 |
elif cur_cstatic - 3 == isize + 6: |
print("c4") |
oaddr.next = do |
obyte.next = adler1 & 0xFF |
o_oprogress.next = do + 1 |
elif cur_cstatic - 3 == isize + 7: |
print("EOF finish", do) |
o_done.next = True |
o_oprogress.next = do + 1 |
state.next = d_state.IDLE |
else: |
print(cur_cstatic, isize) |
raise Error("???") |
else: |
bdata = iram[di] |
# Fix this when > 1 byte output: |
# print("cs1", bdata) |
bdata = iram[di & IBS] |
o_iprogress.next = di # & IBS |
adler1_next = (adler1 + bdata) % 65521 |
adler1.next = adler1_next |
adler2.next = (adler2 + ladler1) % 65521 |
629,7 → 628,7
ladler1.next = adler1_next |
# print("in: ", bdata, di, isize) |
state.next = d_state.SEARCH |
cur_search.next = di - 1 |
cur_search.next = di - 1 # & IBS |
|
if not no_adv: |
cur_cstatic.next = cur_cstatic + 1 |
640,6 → 639,16
pass |
elif flush: |
do_flush() |
elif cur_i == 1024: |
lencode = length + 254 |
# print("fast:", distance, di, isize, match) |
outlen = codeLength[lencode] |
outbits = out_codes[lencode] # code_bits[lencode] |
# print("BITS:", outlen, outbits) |
oaddr.next = do |
obyte.next = put(outbits, outlen) |
put_adv(outbits, outlen) |
cur_i.next = 0 |
else: |
# print("DISTANCE", di, do, cur_i, cur_dist) |
nextdist = CopyDistance[cur_i+1] |
679,6 → 688,56
else: |
state.next = d_state.CSTATIC |
|
elif state == d_state.SEARCHF: |
|
if FAST and COMPRESS: |
lfmatch = length |
distance = lfmatch + 1 |
# print("FSEARCH", distance) |
fmatch2 = di - lfmatch + 2 |
# Length is 3 code |
lencode = 257 |
match = 3 |
|
if di < isize - 4 and \ |
iram[fmatch2 & IBS] == b4: |
lencode = 258 |
match = 4 |
if di < isize - 5 and \ |
iram[fmatch2+1 & IBS] == b5: |
lencode = 259 |
match = 5 |
if MATCH10 and di < isize - 6 and \ |
iram[fmatch2+2 & IBS] == b6: |
lencode = 260 |
match = 6 |
if di < isize - 7 and \ |
iram[fmatch2+3 & IBS] == b7: |
lencode = 261 |
match = 7 |
if di < isize - 8 and \ |
iram[fmatch2+4 & IBS] == b8: |
lencode = 262 |
match = 8 |
if di < isize - 9 and \ |
iram[fmatch2+5 & IBS] == b9: |
lencode = 263 |
match = 9 |
if di < isize - 10 and \ |
iram[fmatch2+6 & IBS] == b10: |
lencode = 264 |
match = 10 |
|
# distance = di - cur_search |
# print("d/l", di, distance, match) |
cur_dist.next = distance |
cur_i.next = 1024 |
# adv(match * 8) |
di.next = di + match |
cur_cstatic.next = cur_cstatic + match - 1 |
length.next = match |
state.next = d_state.DISTANCE |
|
elif state == d_state.SEARCH: |
|
if not COMPRESS: |
688,6 → 747,7
elif nb < 4: |
pass |
else: |
# print("cs", cur_search, di, di - CWINDOW) |
if cur_search >= 0 \ |
and cur_search >= di - CWINDOW \ |
and di < isize - 3: |
698,7 → 758,7
for si in range(CWINDOW): |
# print("test", di, si, di - si - 1) |
if smatch[si]: |
print("fmatch", si) |
# print("fmatch", si) |
fmatch = si |
found = 1 |
break |
706,61 → 766,10
cur_search.next = -1 |
# print("NO FSEARCH") |
else: |
distance = fmatch + 1 |
# print("FSEARCH", distance) |
fmatch = di - fmatch + 2 |
# Length is 3 code |
lencode = 257 |
match = 3 |
length.next = fmatch |
state.next = d_state.SEARCHF |
|
if di < isize - 4 and \ |
iram[fmatch & IBS] == b4: |
lencode = 258 |
match = 4 |
if di < isize - 5 and \ |
iram[fmatch+1 & IBS] == b5: |
lencode = 259 |
match = 5 |
if MATCH10 and di < isize - 6 and \ |
iram[fmatch+2 & IBS] == b6: |
lencode = 260 |
match = 6 |
if di < isize - 7 and \ |
iram[fmatch+3 & IBS] == b7: |
lencode = 261 |
match = 7 |
if di < isize - 8 and \ |
iram[fmatch+4 & IBS] == b8: |
lencode = 262 |
match = 8 |
if di < isize - 9 and \ |
iram[fmatch+5 & IBS] == b9: |
lencode = 263 |
match = 9 |
if di < isize - 10 and \ |
iram[fmatch+6 & IBS] == b10: |
lencode = 264 |
match = 10 |
|
print("fast:", distance, di, isize, match) |
outlen = codeLength[lencode] |
outbits = code_bits[lencode] |
# print("BITS:", outlen, outbits) |
oaddr.next = do |
obyte.next = put(outbits, outlen) |
put_adv(outbits, outlen) |
|
# distance = di - cur_search |
# print("distance", distance) |
cur_dist.next = distance |
cur_i.next = 0 |
# adv(match * 8) |
di.next = di + match |
cur_cstatic.next = cur_cstatic + match - 1 |
length.next = match |
state.next = d_state.DISTANCE |
|
elif iram[cur_search & IBS] == b1 and \ |
elif not FAST and iram[cur_search & IBS] == b1 and \ |
iram[cur_search+1 & IBS] == b2 and \ |
iram[cur_search+2 & IBS] == b3: |
# Length is 3 code |
772,42 → 781,34
lencode = 258 |
match = 4 |
if di < isize - 5 and \ |
iram[cur_search+4 & IBS] == iram[di + 4 & IBS]: |
iram[cur_search+4 & IBS] == b5: |
lencode = 259 |
match = 5 |
if MATCH10 and di < isize - 6 and \ |
iram[cur_search+5 & IBS] == iram[di + 5 & IBS]: |
iram[cur_search+5 & IBS] == b6: |
lencode = 260 |
match = 6 |
if di < isize - 7 and \ |
iram[cur_search+6 & IBS] == iram[di + 6 & IBS]: |
iram[cur_search+6 & IBS] == b7: |
lencode = 261 |
match = 7 |
if di < isize - 8 and \ |
iram[cur_search+7 & IBS] == iram[di + 7 & IBS]: |
iram[cur_search+7 & IBS] == b8: |
lencode = 262 |
match = 8 |
if di < isize - 9 and \ |
iram[cur_search+8 & IBS] == iram[di + 8 & IBS]: |
iram[cur_search+8 & IBS] == b9: |
lencode = 263 |
match = 9 |
if di < isize - 10 and \ |
iram[cur_search+9 & IBS] == iram[di + 9 & IBS]: |
iram[cur_search+9 & IBS] == b10: |
lencode = 264 |
match = 10 |
|
print("found:", cur_search, di, isize, match) |
outlen = codeLength[lencode] |
outbits = code_bits[lencode] |
# print("BITS:", outlen, outbits) |
oaddr.next = do |
obyte.next = put(outbits, outlen) |
put_adv(outbits, outlen) |
|
distance = di - cur_search |
# print("distance", distance) |
cur_dist.next = distance |
cur_i.next = 0 |
cur_i.next = 1024 # 0 |
# adv(match * 8) |
di.next = di + match |
cur_cstatic.next = cur_cstatic + match - 1 |
817,11 → 818,11
cur_search.next = cur_search - 1 |
else: |
# print("NO MATCH") |
bdata = iram[di] |
bdata = b1 # iram[di] |
# adv(8) |
di.next = di + 1 |
outlen = codeLength[bdata] |
outbits = code_bits[bdata] |
outbits = out_codes[bdata] # code_bits[bdata] |
# print("CBITS:", bdata, outlen, outbits) |
oaddr.next = do |
obyte.next = put(outbits, outlen) |
839,32 → 840,22
for stat_i in range(280, 288): |
codeLength[stat_i].next = 8 |
numCodeLength.next = 288 |
cur_HF1.next = 0 |
state.next = d_state.HF1 |
""" |
if cur_static < 288: |
if cur_static < 144: |
codeLength[cur_static].next = 8 |
elif cur_static < 256: |
codeLength[cur_static].next = 9 |
elif cur_static < 280: |
codeLength[cur_static].next = 7 |
else: |
codeLength[cur_static].next = 8 |
cur_static.next = cur_static + 1 |
if do_compress: |
state.next = d_state.CSTATIC |
else: |
numCodeLength.next = 288 |
cur_HF1.next = 0 |
state.next = d_state.HF1 |
""" |
|
elif state == d_state.BL: |
|
if not filled: |
if not DECOMPRESS or not DYNAMIC: |
pass |
elif not filled: |
filled.next = True |
elif nb < 4: |
pass |
elif numLiterals == 0: |
print(di, isize) |
numLiterals.next = 257 + get4(0, 5) |
print("NL:", 257 + get4(0, 5)) |
numDistance.next = 1 + get4(5, 5) |
891,7 → 882,9
|
elif state == d_state.READBL: |
|
if not filled: |
if not DECOMPRESS or not DYNAMIC: |
pass |
elif not filled: |
filled.next = True |
elif nb < 4: |
pass |
937,31 → 930,34
|
elif state == d_state.INIT3: |
|
if cur_i < MaxBitLength: |
codeLength[cur_i].next = 0 |
cur_i.next = cur_i + 1 |
else: |
numCodeLength.next = MaxBitLength |
method.next = 3 # Start building bit tree |
cur_HF1.next = 0 |
state.next = d_state.HF1 |
if not DECOMPRESS: |
pass |
elif cur_i < len(codeLength): # MaxBitLength: |
codeLength[cur_i].next = 0 |
cur_i.next = cur_i + 1 |
else: |
# numCodeLength.next = MaxBitLength |
method.next = 3 # Start building bit tree |
cur_HF1.next = 0 |
state.next = d_state.HF1 |
|
elif state == d_state.DISTTREE: |
|
print("DISTTREE") |
for dist_i in range(32): |
codeLength[dist_i].next = distanceLength[dist_i] |
# print(dist_i, distanceLength[dist_i]) |
numCodeLength.next = 32 |
method.next = 4 # Start building dist tree |
# cur_i.next = 0 |
cur_HF1.next = 0 |
state.next = d_state.HF1 |
if DECOMPRESS and DYNAMIC: |
print("DISTTREE") |
for dist_i in range(32): |
codeLength[dist_i].next = distanceLength[dist_i] |
# print(dist_i, distanceLength[dist_i]) |
numCodeLength.next = 32 |
method.next = 4 # Start building dist tree |
cur_HF1.next = 0 |
state.next = d_state.HF1 |
|
elif state == d_state.REPEAT: |
|
# print("HOWOFTEN: ", numCodeLength, howOften) |
if howOften != 0: |
if not DECOMPRESS: |
pass |
elif howOften != 0: |
codeLength[numCodeLength].next = lastToken |
howOften.next = howOften - 1 |
numCodeLength.next = numCodeLength + 1 |
973,29 → 969,32
|
elif state == d_state.HF1: |
|
if cur_HF1 < len(bitLengthCount): |
bitLengthCount[cur_HF1].next = 0 |
if cur_HF1 < len(d_leaves): |
d_leaves[cur_HF1].next = 0 |
if method != 4 and cur_HF1 < len(leaves): |
lwaddr.next = cur_HF1 |
wleaf.next = 0 |
# leaves[cur_HF1].next = 0 |
limit = len(leaves) |
if method == 4: |
limit = len(d_leaves) |
if cur_HF1 < limit: |
cur_HF1.next = cur_HF1 + 1 |
else: |
print("DID HF1 INIT") |
cur_i.next = 0 |
state.next = d_state.HF1INIT |
if DECOMPRESS: |
if cur_HF1 < len(bitLengthCount): |
bitLengthCount[cur_HF1].next = 0 |
if cur_HF1 < len(d_leaves) and DYNAMIC: |
d_leaves[cur_HF1].next = 0 |
if method != 4 and cur_HF1 < len(leaves): |
lwaddr.next = cur_HF1 |
wleaf.next = 0 |
# leaves[cur_HF1].next = 0 |
limit = len(leaves) |
if method == 4 and DYNAMIC: |
limit = len(d_leaves) |
if cur_HF1 < limit: |
cur_HF1.next = cur_HF1 + 1 |
else: |
print("DID HF1 INIT") |
cur_i.next = 0 |
state.next = d_state.HF1INIT |
|
elif state == d_state.HF1INIT: |
# get frequencies of each bit length and ignore 0's |
|
# print("HF1") |
if cur_i < numCodeLength: |
if not DECOMPRESS: |
pass |
elif cur_i < numCodeLength: |
j = codeLength[cur_i] |
bitLengthCount[j].next = bitLengthCount[j] + 1 |
# print(cur_i, j, bitLengthCount[j] + 1) |
1014,7 → 1013,9
# shortest and longest codes |
|
# print("HF2") |
if cur_i <= MaxCodeLength: |
if not DECOMPRESS: |
pass |
elif cur_i <= MaxCodeLength: |
if bitLengthCount[cur_i] != 0: |
if cur_i < minBits: |
minBits.next = cur_i |
1028,7 → 1029,7
else: |
print(minBits, maxBits) |
t = InstantMaxBit |
if method == 4: |
if method == 4 and DYNAMIC: |
if t > int(d_maxBits): |
t = int(d_maxBits) |
d_instantMaxBit.next = t |
1050,36 → 1051,40
# find bit code for first element of each bitLength group |
|
# print("HF3") |
amb = maxBits |
if method == 4: |
amb = d_maxBits |
if cur_i <= amb: |
ncode = ((code + bitLengthCount[cur_i - 1]) << 1) |
code.next = ncode |
nextCode[cur_i].next = ncode |
# print(cur_i, ncode) |
cur_i.next = cur_i + 1 |
else: |
state.next = d_state.HF4 |
cur_i.next = 0 |
spread_i.next = 0 |
print("to HF4") |
if DECOMPRESS: |
amb = maxBits |
if method == 4 and DYNAMIC: |
amb = d_maxBits |
if cur_i <= amb: |
ncode = ((code + bitLengthCount[cur_i - 1]) << 1) |
code.next = ncode |
nextCode[cur_i].next = ncode |
# print(cur_i, ncode) |
cur_i.next = cur_i + 1 |
else: |
state.next = d_state.HF4 |
cur_i.next = 0 |
spread_i.next = 0 |
print("to HF4") |
|
elif state == d_state.HF4_2: |
|
canonical = nextCode[bits] |
nextCode[bits].next = nextCode[bits] + 1 |
if bits > MaxCodeLength: |
raise Error("too many bits: %d" % bits) |
# print(canonical, bits) |
reverse.next = rev_bits(canonical, bits) |
# print("LEAF: ", spread_i, bits, reverse, canonical) |
leaf.next = makeLeaf(spread_i, bits) |
state.next = d_state.HF4_3 |
if DECOMPRESS: |
canonical = nextCode[bits] |
nextCode[bits].next = nextCode[bits] + 1 |
if bits > MaxCodeLength: |
raise Error("too many bits: %d" % bits) |
# print(canonical, bits) |
reverse.next = rev_bits(canonical, bits) |
# print("LEAF: ", spread_i, bits, reverse, canonical) |
leaf.next = makeLeaf(spread_i, bits) |
state.next = d_state.HF4_3 |
|
elif state == d_state.HF4_3: |
|
if method == 4: |
if not DECOMPRESS: |
pass |
elif method == 4 and DYNAMIC: |
d_leaves[reverse].next = leaf # makeLeaf(spread_i, bits) |
if bits <= d_instantMaxBit: |
if reverse + (1 << bits) <= d_instantMask: |
1096,7 → 1101,7
wleaf.next = leaf |
lwaddr.next = reverse |
# leaves[reverse].next = leaf # makeLeaf(spread_i, bits) |
code_bits[spread_i].next = reverse |
# code_bits[spread_i].next = reverse |
if bits <= instantMaxBit: |
if reverse + (1 << bits) <= instantMask: |
step.next = 1 << bits |
1112,23 → 1117,26
elif state == d_state.HF4: |
# create binary codes for each literal |
|
if spread_i < numCodeLength: |
if not DECOMPRESS: |
pass |
elif spread_i < numCodeLength: |
bits_next = codeLength[spread_i] |
if bits_next != 0: |
bits.next = bits_next |
state.next = d_state.HF4_2 |
else: |
# print("SKIP UNUSED") |
spread_i.next = spread_i + 1 |
else: |
if do_compress: |
state.next = d_state.CSTATIC |
cur_cstatic.next = 0 |
elif method == 3: |
elif method == 3 and DYNAMIC: |
state.next = d_state.DISTTREE |
elif method == 4: |
elif method == 4 and DYNAMIC: |
print("DEFLATE m2!") |
state.next = d_state.NEXT |
elif method == 2: |
elif method == 2 and DYNAMIC: |
numCodeLength.next = 0 |
state.next = d_state.NEXT |
else: |
1138,27 → 1146,30
|
elif state == d_state.SPREAD: |
|
if method == 4: |
# print(spread, spread_i) |
d_leaves[spread].next = makeLeaf( |
spread_i, codeLength[spread_i]) |
else: |
lwaddr.next = spread |
wleaf.next = makeLeaf(spread_i, codeLength[spread_i]) |
# leaves[spread].next = makeLeaf(spread_i, codeLength[spread_i]) |
# print("SPREAD:", spread, step, instantMask) |
aim = instantMask |
if method == 4: |
aim = d_instantMask |
if spread > aim - step: |
spread_i.next = spread_i + 1 |
state.next = d_state.HF4 |
else: |
spread.next = spread + step |
if DECOMPRESS: |
if method == 4 and DYNAMIC: |
# print(spread, spread_i) |
d_leaves[spread].next = makeLeaf( |
spread_i, codeLength[spread_i]) |
else: |
lwaddr.next = spread |
wleaf.next = makeLeaf(spread_i, codeLength[spread_i]) |
# leaves[spread].next = makeLeaf(spread_i, codeLength[spread_i]) |
# print("SPREAD:", spread, step, instantMask) |
aim = instantMask |
if method == 4 and DYNAMIC: |
aim = d_instantMask |
if spread > aim - step: |
spread_i.next = spread_i + 1 |
state.next = d_state.HF4 |
else: |
spread.next = spread + step |
|
elif state == d_state.NEXT: |
|
if not filled: |
if not DECOMPRESS: |
pass |
elif not filled: |
filled.next = True |
elif nb < 4: |
pass |
1165,21 → 1176,36
elif cur_next == 0: |
# print("INIT:", di, dio, instantMaxBit, maxBits) |
cto = get4(0, maxBits) |
cur_next.next = 1 # instantMaxBit |
mask = (1 << instantMaxBit) - 1 |
# lraddr.next = (cto & mask) |
leaf.next = leaves[cto & mask] |
lraddr.next = (cto & mask) |
# leaf.next = leaves[cto & mask] |
filled.next = False |
cur_next.next = instantMaxBit + 1 |
# print(cur_next, mask, leaf, maxBits) |
# elif get_bits(leaf) >= cur_next: |
elif get_bits(rleaf) >= cur_next: |
print("CACHE MISS", cur_next) |
cto = get4(0, maxBits) |
mask = (1 << cur_next) - 1 |
lraddr.next = (cto & mask) |
# leaf.next = leaves[cto & mask] |
filled.next = False |
cur_next.next = cur_next + 1 |
else: |
if get_bits(leaf) < 1: |
# if get_bits(leaf) < 1: |
if get_bits(rleaf) < 1: |
print("< 1 bits: ") |
raise Error("< 1 bits: ") |
adv(get_bits(leaf)) |
#adv(get_bits(leaf)) |
adv(get_bits(rleaf)) |
""" |
if get_code(leaf) == 0: |
print("leaf 0") |
code.next = get_code(leaf) |
print("leaf 0", di, isize) |
""" |
#code.next = get_code(leaf) |
code.next = get_code(rleaf) |
# print("ADV:", di, get_bits(leaf), get_code(leaf)) |
if method == 2: |
if method == 2 and DYNAMIC: |
state.next = d_state.READBL |
else: |
state.next = d_state.INFLATE |
1186,123 → 1212,163
|
elif state == d_state.D_NEXT: |
|
if not filled: |
if not DECOMPRESS or not DYNAMIC: |
pass |
elif not filled: |
filled.next = True |
elif nb < 4: |
pass |
else: |
elif cur_next == 0: |
# print("D_INIT:", di, dio, d_instantMaxBit, d_maxBits) |
if d_instantMaxBit > InstantMaxBit: |
raise Error("???") |
token = code - 257 |
# print("token: ", token) |
extraLength = ExtraLengthBits[token] |
# print("extra length bits:", extraLength) |
# print("d_maxBits", d_maxBits, d_instantMaxBit) |
cto = get4(extraLength, d_maxBits) |
mask = (1 << d_instantMaxBit) - 1 |
leaf.next = d_leaves[cto & mask] |
# state.next = d_state.D_NEXT_2 |
cur_next.next = instantMaxBit + 1 |
elif get_bits(leaf) >= cur_next: |
print("DCACHE MISS", cur_next) |
token = code - 257 |
# print("token: ", token) |
extraLength = ExtraLengthBits[token] |
cto = get4(extraLength, d_maxBits) |
mask = (1 << cur_next) - 1 |
leaf.next = d_leaves[cto & mask] |
cur_next.next = cur_next + 1 |
else: |
state.next = d_state.D_NEXT_2 |
|
elif state == d_state.D_NEXT_2: |
|
if get_bits(leaf) == 0: |
raise Error("0 bits") |
token = code - 257 |
# print("E2:", token, leaf) |
tlength = CopyLength[token] |
# print("tlength:", tlength) |
extraLength = ExtraLengthBits[token] |
# print("extra length bits:", extraLength) |
tlength += get4(0, extraLength) |
# print("extra length:", tlength) |
distanceCode = get_code(leaf) |
# print("distance code:", distanceCode) |
distance = CopyDistance[distanceCode] |
# print("distance:", distance) |
moreBits = ExtraDistanceBits[distanceCode >> 1] |
# print("more bits:", moreBits) |
# print("bits:", get_bits(leaf)) |
mored = get4(extraLength + get_bits(leaf), moreBits) |
# print("mored:", mored) |
distance += mored |
# print("distance more:", distance) |
adv(moreBits + extraLength + get_bits(leaf)) |
# print("offset:", do - distance) |
# print("FAIL?: ", di, dio, do, b1, b2, b3, b4) |
offset.next = do - distance |
length.next = tlength |
# cur_next.next = 0 |
cur_i.next = 0 |
oraddr.next = do - distance |
state.next = d_state.COPY |
if DECOMPRESS and DYNAMIC: |
if get_bits(leaf) == 0: |
raise Error("0 bits") |
token = code - 257 |
# print("E2:", token, leaf) |
tlength = CopyLength[token] |
# print("tlength:", tlength) |
extraLength = ExtraLengthBits[token] |
# print("extra length bits:", extraLength) |
tlength += get4(0, extraLength) |
# print("extra length:", tlength) |
distanceCode = get_code(leaf) |
# print("distance code:", distanceCode) |
distance = CopyDistance[distanceCode] |
# print("distance:", distance) |
moreBits = ExtraDistanceBits[distanceCode >> 1] |
# print("more bits:", moreBits) |
# print("bits:", get_bits(leaf)) |
mored = get4(extraLength + get_bits(leaf), moreBits) |
# print("mored:", mored) |
distance += mored |
# print("distance more:", distance, do, di, isize) |
if distance > do: |
print(distance, do) |
raise Error("distance too big") |
adv(moreBits + extraLength + get_bits(leaf)) |
# print("offset:", do - distance) |
# print("FAIL?: ", di, dio, do, b1, b2, b3, b4) |
offset.next = (do - distance) & OBS |
length.next = tlength |
# cur_next.next = 0 |
cur_i.next = 0 |
oraddr.next = do - distance |
state.next = d_state.COPY |
|
elif state == d_state.INFLATE: |
|
if not filled: |
filled.next = True |
elif nb < 4: # nb <= 2 or (nb == 3 and dio > 1): |
# print("EXTRA FETCH", nb, dio) |
pass # fetch more bytes |
elif di > isize: # - 3: # checksum is 4 bytes |
if not DECOMPRESS: |
pass |
elif not filled: |
filled.next = True |
elif nb < 4: # nb <= 2 or (nb == 3 and dio > 1): |
# print("EXTRA FETCH", nb, dio) |
pass # fetch more bytes |
elif di >= isize - 4 and not i_mode == IDLE: |
pass # fetch more bytes |
elif do >= i_raddr + OBSIZE: # - 10: |
# print("HOLDB") |
# filled.next = False |
pass |
elif di > isize - 3: # checksum is 4 bytes |
state.next = d_state.IDLE |
o_done.next = True |
print("NO EOF ", di) |
raise Error("NO EOF!") |
elif code == EndOfBlock: |
print("EOF:", di, do) |
if not final: |
state.next = d_state.HEADER |
filled.next = False |
print("New Block!") |
else: |
o_done.next = True |
state.next = d_state.IDLE |
o_done.next = True |
print("NO EOF ", di) |
raise Error("NO EOF!") |
elif code == EndOfBlock: |
print("EOF:", di, do) |
if not final: |
state.next = d_state.HEADER |
else: |
o_done.next = True |
o_oprogress.next = do |
state.next = d_state.IDLE |
else: |
if code < EndOfBlock: |
# print("B:", code, di, do) |
oaddr.next = do |
obyte.next = code |
o_oprogress.next = do + 1 |
do.next = do + 1 |
cur_next.next = 0 |
state.next = d_state.NEXT |
# raise Error("DF!") |
elif code == InvalidToken: |
raise Error("invalid token") |
else: |
if code < EndOfBlock: |
# print("B:", code, di, do) |
oaddr.next = do |
obyte.next = code |
o_oprogress.next = do + 1 |
do.next = do + 1 |
cur_next.next = 0 |
state.next = d_state.NEXT |
# raise Error("DF!") |
elif code == InvalidToken: |
raise Error("invalid token") |
if static: |
token = code - 257 |
# print("E:", token) |
tlength = CopyLength[token] |
# print("tlength", tlength) |
extraLength = ExtraLengthBits[token] |
# print("extralengthbits", extraLength) |
tlength += get4(0, extraLength) |
# print("tlength extra", tlength) |
t = get4(extraLength, 5) |
distanceCode = rev_bits(t, 5) |
# print("dcode", distanceCode) |
distance = CopyDistance[distanceCode] |
# print("distance", distance) |
moreBits = ExtraDistanceBits[distanceCode |
>> 1] |
distance += get4(extraLength + 5, moreBits) |
# print("distance2", distance) |
adv(extraLength + 5 + moreBits) |
# print("adv", extraLength + 5 + moreBits) |
offset.next = do - distance |
length.next = tlength |
cur_i.next = 0 |
oraddr.next = do - distance |
state.next = d_state.COPY |
else: |
if static: |
token = code - 257 |
# print("E:", token) |
tlength = CopyLength[token] |
# print("tlength", tlength) |
extraLength = ExtraLengthBits[token] |
# print("extralengthbits", extraLength) |
tlength += get4(0, extraLength) |
# print("tlength extra", tlength) |
t = get4(extraLength, 5) |
distanceCode = rev_bits(t, 5) |
# print("dcode", distanceCode) |
distance = CopyDistance[distanceCode] |
# print("distance", distance) |
moreBits = ExtraDistanceBits[distanceCode |
>> 1] |
distance += get4(extraLength + 5, moreBits) |
# print("distance2", distance) |
adv(extraLength + 5 + moreBits) |
# print("adv", extraLength + 5 + moreBits) |
offset.next = do - distance |
length.next = tlength |
cur_i.next = 0 |
oraddr.next = do - distance |
state.next = d_state.COPY |
else: |
# raise Error("TO DO") |
state.next = d_state.D_NEXT |
cur_next.next = 0 |
if not DYNAMIC: |
print("DYNAMIC mode disabled") |
raise Error("DYNAMIC mode disabled") |
state.next = d_state.D_NEXT |
cur_next.next = 0 |
|
elif state == d_state.COPY: |
|
if not filled: |
if not DECOMPRESS: |
pass |
elif not filled: |
filled.next = True |
elif nb < 4: |
pass |
elif cur_i == 0 and do + length >= i_raddr + OBSIZE: # - 10: |
# print("HOLDW", length, offset, cur_i, do, i_raddr) |
pass |
elif di >= isize - 2: |
# print("HOLD2") |
pass |
elif method == 0: |
if cur_i < length: |
oaddr.next = do |
1312,12 → 1378,15
do.next = do + 1 |
o_oprogress.next = do + 1 |
elif not final: |
adv(16) |
state.next = d_state.HEADER |
filled.next = False |
print("new block") |
else: |
o_oprogress.next = do # + 1 |
o_done.next = True |
state.next = d_state.IDLE |
elif cur_i < length + 2: |
# print("L/O", length, offset) |
oraddr.next = offset + cur_i |
if cur_i == 1: |
copy1.next = orbyte |
1326,10 → 1395,10
copy2.next = orbyte |
if cur_i > 1: |
# Special 1 byte offset handling: |
if offset + cur_i == do + 1: |
if (offset + cur_i) & OBS == (do + 1) & OBS: |
obyte.next = copy1 |
elif cur_i == 3 or offset + cur_i != do: |
obyte.next = orbyte |
elif cur_i == 3 or (offset + cur_i) & OBS != do & OBS: |
obyte.next = orbyte |
# Special 2 byte offset handling: |
elif cur_i > 2: |
if cur_i & 1: |
1359,8 → 1428,9
|
if __name__ == "__main__": |
d = deflate(Signal(intbv()[3:]), Signal(bool(0)), |
Signal(intbv()[8:]), Signal(intbv()[LBSIZE:]), |
Signal(intbv()[LBSIZE:]), |
Signal(intbv()[8:]), Signal(intbv()[LBSIZE:]), |
Signal(intbv()[8:]), Signal(intbv()[LMAX:]), |
Signal(intbv()[LMAX:]), |
Signal(intbv()[8:]), |
Signal(modbv()[LIBSIZE:]), Signal(modbv()[LBSIZE:]), |
Signal(bool(0)), ResetSignal(1, 0, True)) |
d.convert() |
/trunk/deflate.v
1,6 → 1,6
// File: deflate.v |
// Generated by MyHDL 0.10 |
// Date: Sun Dec 23 19:31:53 2018 |
// Date: Tue Jan 1 11:29:55 2019 |
|
|
`timescale 1ns/10ps |
12,7 → 12,8
o_iprogress, |
o_oprogress, |
o_byte, |
i_addr, |
i_waddr, |
i_raddr, |
clk, |
reset |
); |
24,13 → 25,14
output o_done; |
reg o_done; |
input [7:0] i_data; |
output [12:0] o_iprogress; |
reg [12:0] o_iprogress; |
output [12:0] o_oprogress; |
reg [12:0] o_oprogress; |
output [23:0] o_iprogress; |
reg [23:0] o_iprogress; |
output [23:0] o_oprogress; |
reg [23:0] o_oprogress; |
output [7:0] o_byte; |
reg [7:0] o_byte; |
input [12:0] i_addr; |
input [5:0] i_waddr; |
input [14:0] i_raddr; |
input clk; |
input reset; |
|
40,14 → 42,15
reg [4:0] state; |
reg [8:0] spread_i; |
reg [9:0] spread; |
reg [9:0] reverse; |
reg [18:0] rleaf; |
reg [14:0] reverse; |
reg [7:0] orbyte; |
reg [12:0] oraddr; |
reg [12:0] old_di; |
reg [12:0] offset; |
reg [14:0] oraddr; |
reg [23:0] old_di; |
reg [14:0] offset; |
reg [7:0] obyte; |
reg [7:0] ob1; |
reg [12:0] oaddr; |
reg [14:0] oaddr; |
reg [8:0] numLiterals; |
reg [5:0] numDistance; |
reg [8:0] numCodeLength; |
55,12 → 58,13
reg [4:0] minBits; |
reg [2:0] method; |
reg [4:0] maxBits; |
reg [8:0] lwaddr; |
reg [12:0] length; |
reg [14:0] lwaddr; |
reg [14:0] lraddr; |
reg [14:0] length; |
reg [18:0] leaf; |
reg [14:0] lastToken; |
reg [15:0] ladler1; |
reg [12:0] isize; |
reg [23:0] isize; |
reg [9:0] instantMaxBit; |
reg [14:0] instantMask; |
reg [8:0] howOften; |
69,19 → 73,19
reg filled; |
reg [2:0] doo; |
reg do_compress; |
reg [12:0] do; |
reg [23:0] do; |
reg [2:0] dio; |
reg [12:0] di; |
reg [23:0] di; |
reg [4:0] d_maxBits; |
reg [9:0] d_instantMaxBit; |
reg [14:0] d_instantMask; |
reg [8:0] cur_static; |
reg signed [7:0] cur_search; |
reg cur_next; |
reg [12:0] cur_i; |
reg signed [7:0] cur_dist; |
reg [12:0] cur_cstatic; |
reg [9:0] cur_HF1; |
reg signed [24:0] cur_search; |
reg [3:0] cur_next; |
reg [23:0] cur_i; |
reg signed [6:0] cur_dist; |
reg [23:0] cur_cstatic; |
reg [15:0] cur_HF1; |
reg [7:0] copy2; |
reg [7:0] copy1; |
reg [14:0] code; |
96,6 → 100,7
reg [7:0] b4; |
reg [7:0] b3; |
reg [7:0] b2; |
wire [39:0] b15; |
wire [31:0] b14; |
wire [79:0] b110; |
reg [7:0] b10; |
103,14 → 108,13
reg [15:0] adler2; |
reg [15:0] adler1; |
reg [255:0] cwindow; |
reg [7:0] oram [0:8192-1]; |
reg [9:0] nextCode [0:15-1]; |
reg [7:0] oram [0:32768-1]; |
reg [15:0] nextCode [0:16-1]; |
reg [18:0] leaves [0:512-1]; |
reg [7:0] iram [0:128-1]; |
reg [7:0] iram [0:64-1]; |
reg [3:0] distanceLength [0:32-1]; |
reg [18:0] d_leaves [0:128-1]; |
reg [8:0] code_bits [0:288-1]; |
reg [3:0] codeLength [0:290-1]; |
reg d_leaves [0:1-1]; |
reg [3:0] codeLength [0:320-1]; |
reg [8:0] bitLengthCount [0:16-1]; |
wire smatch [0:32-1]; |
|
118,6 → 122,11
assign b41[24-1:16] = b3; |
assign b41[16-1:8] = b2; |
assign b41[8-1:0] = b1; |
assign b15[40-1:32] = b1; |
assign b15[32-1:24] = b2; |
assign b15[24-1:16] = b3; |
assign b15[16-1:8] = b4; |
assign b15[8-1:0] = b5; |
assign b14[32-1:24] = b1; |
assign b14[24-1:16] = b2; |
assign b14[16-1:8] = b3; |
137,7 → 146,7
input width; |
integer width; |
integer nshift; |
begin: MYHDL113_RETURN |
begin: MYHDL115_RETURN |
nshift = ((dio + width) >>> 3); |
o_iprogress <= di; |
dio <= ((dio + width) & 7); |
151,7 → 160,7
function integer MYHDL4_get4; |
input boffset; |
input width; |
begin: MYHDL114_RETURN |
begin: MYHDL116_RETURN |
if ((nb != 4)) begin |
$write("----NB----"); |
$write("\n"); |
158,7 → 167,7
$finish; |
end |
MYHDL4_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
disable MYHDL114_RETURN; |
disable MYHDL116_RETURN; |
end |
endfunction |
|
166,7 → 175,7
input boffset; |
input width; |
integer width; |
begin: MYHDL115_RETURN |
begin: MYHDL117_RETURN |
if ((nb != 4)) begin |
$write("----NB----"); |
$write("\n"); |
173,7 → 182,7
$finish; |
end |
MYHDL5_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
disable MYHDL115_RETURN; |
disable MYHDL117_RETURN; |
end |
endfunction |
|
181,7 → 190,7
input width; |
integer width; |
integer nshift; |
begin: MYHDL116_RETURN |
begin: MYHDL118_RETURN |
nshift = ((dio + width) >>> 3); |
o_iprogress <= di; |
dio <= ((dio + width) & 7); |
196,7 → 205,7
input width; |
integer width; |
integer nshift; |
begin: MYHDL117_RETURN |
begin: MYHDL119_RETURN |
nshift = ((dio + width) >>> 3); |
o_iprogress <= di; |
dio <= ((dio + width) & 7); |
212,7 → 221,7
integer boffset; |
input width; |
integer width; |
begin: MYHDL118_RETURN |
begin: MYHDL120_RETURN |
if ((nb != 4)) begin |
$write("----NB----"); |
$write("\n"); |
219,7 → 228,7
$finish; |
end |
MYHDL8_get4 = ($signed($signed({1'b0, b41}) >>> ($signed({1'b0, dio}) + boffset)) & ((1 << width) - 1)); |
disable MYHDL118_RETURN; |
disable MYHDL120_RETURN; |
end |
endfunction |
|
227,7 → 236,7
input width; |
integer width; |
integer nshift; |
begin: MYHDL119_RETURN |
begin: MYHDL121_RETURN |
nshift = $signed(($signed({1'b0, dio}) + width) >>> 3); |
o_iprogress <= di; |
dio <= (($signed({1'b0, dio}) + width) & 7); |
243,7 → 252,7
integer d; |
input width; |
integer width; |
begin: MYHDL120_RETURN |
begin: MYHDL122_RETURN |
if ((width > 9)) begin |
$finish; |
end |
251,7 → 260,7
$finish; |
end |
MYHDL10_put = ((ob1 | (d << doo)) & 255); |
disable MYHDL120_RETURN; |
disable MYHDL122_RETURN; |
end |
endfunction |
|
263,7 → 272,7
reg pshift; |
integer carry; |
integer doo_next; |
begin: MYHDL121_RETURN |
begin: MYHDL123_RETURN |
if ((width > 9)) begin |
$finish; |
end |
289,7 → 298,7
endtask |
|
task MYHDL12_do_flush; |
begin: MYHDL122_RETURN |
begin: MYHDL124_RETURN |
flush <= 1'b0; |
ob1 <= 0; |
o_oprogress <= (do + 1); |
298,40 → 307,42
endtask |
|
function integer MYHDL13_put; |
input [9-1:0] d; |
input d; |
integer d; |
input [4-1:0] width; |
begin: MYHDL123_RETURN |
begin: MYHDL125_RETURN |
if ((width > 9)) begin |
$finish; |
end |
if (($signed({1'b0, d}) > ((1 << width) - 1))) begin |
if ((d > ((1 << width) - 1))) begin |
$finish; |
end |
MYHDL13_put = ((ob1 | (d << doo)) & 255); |
disable MYHDL123_RETURN; |
MYHDL13_put = (($signed({1'b0, ob1}) | (d << $signed({1'b0, doo}))) & 255); |
disable MYHDL125_RETURN; |
end |
endfunction |
|
task MYHDL14_put_adv; |
input [9-1:0] d; |
input d; |
integer d; |
input [4-1:0] width; |
reg pshift; |
integer carry; |
integer doo_next; |
begin: MYHDL124_RETURN |
begin: MYHDL126_RETURN |
if ((width > 9)) begin |
$finish; |
end |
if (($signed({1'b0, d}) > ((1 << width) - 1))) begin |
if ((d > ((1 << width) - 1))) begin |
$finish; |
end |
pshift = ((doo + width) > 8); |
if (pshift) begin |
carry = ($signed({1'b0, width}) - (8 - $signed({1'b0, doo}))); |
ob1 <= $signed($signed({1'b0, d}) >>> ($signed({1'b0, width}) - carry)); |
ob1 <= $signed(d >>> ($signed({1'b0, width}) - carry)); |
end |
else begin |
ob1 <= (ob1 | (d << doo)); |
ob1 <= ($signed({1'b0, ob1}) | (d << $signed({1'b0, doo}))); |
end |
do <= (do + pshift); |
o_oprogress <= (do + pshift); |
344,7 → 355,7
endtask |
|
task MYHDL15_do_flush; |
begin: MYHDL125_RETURN |
begin: MYHDL127_RETURN |
flush <= 1'b0; |
ob1 <= 0; |
o_oprogress <= (do + 1); |
352,30 → 363,11
end |
endtask |
|
function integer MYHDL16_rev_bits; |
input [13-1:0] b; |
input nb; |
integer nb; |
integer r; |
begin: MYHDL126_RETURN |
if ((b >= (1 << nb))) begin |
$finish; |
$write("too few bits"); |
$write("\n"); |
end |
r = (((((((((((((((((b >>> 14) & 1) << 0) | (((b >>> 13) & 1) << 1)) | (((b >>> 12) & 1) << 2)) | (((b >>> 11) & 1) << 3)) | (((b >>> 10) & 1) << 4)) | (((b >>> 9) & 1) << 5)) | (((b >>> 8) & 1) << 6)) | (((b >>> 7) & 1) << 7)) | (((b >>> 6) & 1) << 8)) | (((b >>> 5) & 1) << 9)) | (((b >>> 4) & 1) << 10)) | (((b >>> 3) & 1) << 11)) | (((b >>> 2) & 1) << 12)) | (((b >>> 1) & 1) << 13)) | (((b >>> 0) & 1) << 14)); |
r = r >>> (15 - $signed({1'b0, nb})); |
MYHDL16_rev_bits = r; |
disable MYHDL126_RETURN; |
end |
endfunction |
|
function integer MYHDL17_put; |
function integer MYHDL16_put; |
input d; |
integer d; |
input width; |
integer width; |
begin: MYHDL127_RETURN |
input [4-1:0] width; |
begin: MYHDL128_RETURN |
if ((width > 9)) begin |
$finish; |
end |
382,20 → 374,19
if ((d > ((1 << width) - 1))) begin |
$finish; |
end |
MYHDL17_put = (($signed({1'b0, ob1}) | (d << $signed({1'b0, doo}))) & 255); |
disable MYHDL127_RETURN; |
MYHDL16_put = (($signed({1'b0, ob1}) | (d << $signed({1'b0, doo}))) & 255); |
disable MYHDL128_RETURN; |
end |
endfunction |
|
task MYHDL18_put_adv; |
task MYHDL17_put_adv; |
input d; |
integer d; |
input width; |
integer width; |
input [4-1:0] width; |
reg pshift; |
integer carry; |
integer doo_next; |
begin: MYHDL128_RETURN |
begin: MYHDL129_RETURN |
if ((width > 9)) begin |
$finish; |
end |
402,10 → 393,10
if ((d > ((1 << width) - 1))) begin |
$finish; |
end |
pshift = (($signed({1'b0, doo}) + width) > 8); |
pshift = ((doo + width) > 8); |
if (pshift) begin |
carry = (width - (8 - $signed({1'b0, doo}))); |
ob1 <= $signed(d >>> (width - carry)); |
carry = ($signed({1'b0, width}) - (8 - $signed({1'b0, doo}))); |
ob1 <= $signed(d >>> ($signed({1'b0, width}) - carry)); |
end |
else begin |
ob1 <= ($signed({1'b0, ob1}) | (d << $signed({1'b0, doo}))); |
412,7 → 403,7
end |
do <= (do + pshift); |
o_oprogress <= (do + pshift); |
doo_next = (($signed({1'b0, doo}) + width) & 7); |
doo_next = ((doo + width) & 7); |
if ((doo_next == 0)) begin |
flush <= 1'b1; |
end |
420,70 → 411,49
end |
endtask |
|
function integer MYHDL21_put; |
input [9-1:0] d; |
input [4-1:0] width; |
begin: MYHDL129_RETURN |
if ((width > 9)) begin |
function integer MYHDL18_rev_bits; |
input [24-1:0] b; |
input nb; |
integer nb; |
integer r; |
begin: MYHDL130_RETURN |
if ((b >= (1 << nb))) begin |
$finish; |
$write("too few bits"); |
$write("\n"); |
end |
if (($signed({1'b0, d}) > ((1 << width) - 1))) begin |
if ((nb > 15)) begin |
$finish; |
end |
MYHDL21_put = ((ob1 | (d << doo)) & 255); |
disable MYHDL129_RETURN; |
r = (((((((((((((((((b >>> 14) & 1) << 0) | (((b >>> 13) & 1) << 1)) | (((b >>> 12) & 1) << 2)) | (((b >>> 11) & 1) << 3)) | (((b >>> 10) & 1) << 4)) | (((b >>> 9) & 1) << 5)) | (((b >>> 8) & 1) << 6)) | (((b >>> 7) & 1) << 7)) | (((b >>> 6) & 1) << 8)) | (((b >>> 5) & 1) << 9)) | (((b >>> 4) & 1) << 10)) | (((b >>> 3) & 1) << 11)) | (((b >>> 2) & 1) << 12)) | (((b >>> 1) & 1) << 13)) | (((b >>> 0) & 1) << 14)); |
r = r >>> (15 - $signed({1'b0, nb})); |
MYHDL18_rev_bits = r; |
disable MYHDL130_RETURN; |
end |
endfunction |
|
task MYHDL22_put_adv; |
input [9-1:0] d; |
input [4-1:0] width; |
reg pshift; |
integer carry; |
integer doo_next; |
begin: MYHDL130_RETURN |
if ((width > 9)) begin |
$finish; |
end |
if (($signed({1'b0, d}) > ((1 << width) - 1))) begin |
$finish; |
end |
pshift = ((doo + width) > 8); |
if (pshift) begin |
carry = ($signed({1'b0, width}) - (8 - $signed({1'b0, doo}))); |
ob1 <= $signed($signed({1'b0, d}) >>> ($signed({1'b0, width}) - carry)); |
end |
else begin |
ob1 <= (ob1 | (d << doo)); |
end |
do <= (do + pshift); |
o_oprogress <= (do + pshift); |
doo_next = ((doo + width) & 7); |
if ((doo_next == 0)) begin |
flush <= 1'b1; |
end |
doo <= doo_next; |
end |
endtask |
|
function integer MYHDL23_put; |
input [9-1:0] d; |
input [4-1:0] width; |
function integer MYHDL19_put; |
input d; |
integer d; |
input width; |
integer width; |
begin: MYHDL131_RETURN |
if ((width > 9)) begin |
$finish; |
end |
if (($signed({1'b0, d}) > ((1 << width) - 1))) begin |
if ((d > ((1 << width) - 1))) begin |
$finish; |
end |
MYHDL23_put = ((ob1 | (d << doo)) & 255); |
MYHDL19_put = (($signed({1'b0, ob1}) | (d << $signed({1'b0, doo}))) & 255); |
disable MYHDL131_RETURN; |
end |
endfunction |
|
task MYHDL24_put_adv; |
input [9-1:0] d; |
input [4-1:0] width; |
task MYHDL20_put_adv; |
input d; |
integer d; |
input width; |
integer width; |
reg pshift; |
integer carry; |
integer doo_next; |
491,20 → 461,20
if ((width > 9)) begin |
$finish; |
end |
if (($signed({1'b0, d}) > ((1 << width) - 1))) begin |
if ((d > ((1 << width) - 1))) begin |
$finish; |
end |
pshift = ((doo + width) > 8); |
pshift = (($signed({1'b0, doo}) + width) > 8); |
if (pshift) begin |
carry = ($signed({1'b0, width}) - (8 - $signed({1'b0, doo}))); |
ob1 <= $signed($signed({1'b0, d}) >>> ($signed({1'b0, width}) - carry)); |
carry = (width - (8 - $signed({1'b0, doo}))); |
ob1 <= $signed(d >>> (width - carry)); |
end |
else begin |
ob1 <= (ob1 | (d << doo)); |
ob1 <= ($signed({1'b0, ob1}) | (d << $signed({1'b0, doo}))); |
end |
do <= (do + pshift); |
o_oprogress <= (do + pshift); |
doo_next = ((doo + width) & 7); |
doo_next = (($signed({1'b0, doo}) + width) & 7); |
if ((doo_next == 0)) begin |
flush <= 1'b1; |
end |
512,23 → 482,25
end |
endtask |
|
function integer MYHDL25_put; |
input [9-1:0] d; |
function integer MYHDL23_put; |
input d; |
integer d; |
input [4-1:0] width; |
begin: MYHDL133_RETURN |
if ((width > 9)) begin |
$finish; |
end |
if (($signed({1'b0, d}) > ((1 << width) - 1))) begin |
if ((d > ((1 << width) - 1))) begin |
$finish; |
end |
MYHDL25_put = ((ob1 | (d << doo)) & 255); |
MYHDL23_put = (($signed({1'b0, ob1}) | (d << $signed({1'b0, doo}))) & 255); |
disable MYHDL133_RETURN; |
end |
endfunction |
|
task MYHDL26_put_adv; |
input [9-1:0] d; |
task MYHDL24_put_adv; |
input d; |
integer d; |
input [4-1:0] width; |
reg pshift; |
integer carry; |
537,16 → 509,16
if ((width > 9)) begin |
$finish; |
end |
if (($signed({1'b0, d}) > ((1 << width) - 1))) begin |
if ((d > ((1 << width) - 1))) begin |
$finish; |
end |
pshift = ((doo + width) > 8); |
if (pshift) begin |
carry = ($signed({1'b0, width}) - (8 - $signed({1'b0, doo}))); |
ob1 <= $signed($signed({1'b0, d}) >>> ($signed({1'b0, width}) - carry)); |
ob1 <= $signed(d >>> ($signed({1'b0, width}) - carry)); |
end |
else begin |
ob1 <= (ob1 | (d << doo)); |
ob1 <= ($signed({1'b0, ob1}) | (d << $signed({1'b0, doo}))); |
end |
do <= (do + pshift); |
o_oprogress <= (do + pshift); |
558,7 → 530,7
end |
endtask |
|
function integer MYHDL35_get4; |
function integer MYHDL33_get4; |
input boffset; |
input width; |
integer width; |
568,12 → 540,12
$write("\n"); |
$finish; |
end |
MYHDL35_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
MYHDL33_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
disable MYHDL135_RETURN; |
end |
endfunction |
|
function integer MYHDL36_get4; |
function integer MYHDL34_get4; |
input boffset; |
input width; |
integer width; |
583,12 → 555,12
$write("\n"); |
$finish; |
end |
MYHDL36_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
MYHDL34_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
disable MYHDL136_RETURN; |
end |
endfunction |
|
function integer MYHDL37_get4; |
function integer MYHDL35_get4; |
input boffset; |
integer boffset; |
input width; |
599,12 → 571,12
$write("\n"); |
$finish; |
end |
MYHDL37_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
MYHDL35_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
disable MYHDL137_RETURN; |
end |
endfunction |
|
function integer MYHDL38_get4; |
function integer MYHDL36_get4; |
input boffset; |
integer boffset; |
input width; |
615,12 → 587,12
$write("\n"); |
$finish; |
end |
MYHDL38_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
MYHDL36_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
disable MYHDL138_RETURN; |
end |
endfunction |
|
function integer MYHDL39_get4; |
function integer MYHDL37_get4; |
input boffset; |
integer boffset; |
input width; |
631,12 → 603,12
$write("\n"); |
$finish; |
end |
MYHDL39_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
MYHDL37_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
disable MYHDL139_RETURN; |
end |
endfunction |
|
function integer MYHDL40_get4; |
function integer MYHDL38_get4; |
input boffset; |
integer boffset; |
input width; |
647,12 → 619,12
$write("\n"); |
$finish; |
end |
MYHDL40_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
MYHDL38_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
disable MYHDL140_RETURN; |
end |
endfunction |
|
task MYHDL41_adv; |
task MYHDL39_adv; |
input width; |
integer width; |
integer nshift; |
667,7 → 639,7
end |
endtask |
|
function integer MYHDL42_get4; |
function integer MYHDL40_get4; |
input boffset; |
input width; |
integer width; |
677,12 → 649,12
$write("\n"); |
$finish; |
end |
MYHDL42_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
MYHDL40_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
disable MYHDL142_RETURN; |
end |
endfunction |
|
task MYHDL43_adv; |
task MYHDL41_adv; |
input width; |
integer width; |
integer nshift; |
697,7 → 669,7
end |
endtask |
|
function integer MYHDL44_get4; |
function integer MYHDL42_get4; |
input boffset; |
input width; |
integer width; |
707,12 → 679,12
$write("\n"); |
$finish; |
end |
MYHDL44_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
MYHDL42_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
disable MYHDL144_RETURN; |
end |
endfunction |
|
function integer MYHDL45_get4; |
function integer MYHDL43_get4; |
input boffset; |
input width; |
integer width; |
722,12 → 694,12
$write("\n"); |
$finish; |
end |
MYHDL45_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
MYHDL43_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
disable MYHDL145_RETURN; |
end |
endfunction |
|
function integer MYHDL46_get4; |
function integer MYHDL44_get4; |
input boffset; |
input width; |
integer width; |
737,12 → 709,12
$write("\n"); |
$finish; |
end |
MYHDL46_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
MYHDL44_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
disable MYHDL146_RETURN; |
end |
endfunction |
|
task MYHDL47_adv; |
task MYHDL45_adv; |
input width; |
integer width; |
integer nshift; |
757,8 → 729,8
end |
endtask |
|
function integer MYHDL54_rev_bits; |
input [10-1:0] b; |
function integer MYHDL52_rev_bits; |
input [16-1:0] b; |
input [4-1:0] nb; |
integer r; |
begin: MYHDL148_RETURN |
767,59 → 739,62
$write("too few bits"); |
$write("\n"); |
end |
if ((nb > 15)) begin |
$finish; |
end |
r = (((((((((((((((((b >>> 14) & 1) << 0) | (((b >>> 13) & 1) << 1)) | (((b >>> 12) & 1) << 2)) | (((b >>> 11) & 1) << 3)) | (((b >>> 10) & 1) << 4)) | (((b >>> 9) & 1) << 5)) | (((b >>> 8) & 1) << 6)) | (((b >>> 7) & 1) << 7)) | (((b >>> 6) & 1) << 8)) | (((b >>> 5) & 1) << 9)) | (((b >>> 4) & 1) << 10)) | (((b >>> 3) & 1) << 11)) | (((b >>> 2) & 1) << 12)) | (((b >>> 1) & 1) << 13)) | (((b >>> 0) & 1) << 14)); |
r = r >>> (15 - $signed({1'b0, nb})); |
MYHDL54_rev_bits = r; |
MYHDL52_rev_bits = r; |
disable MYHDL148_RETURN; |
end |
endfunction |
|
function integer MYHDL55_makeLeaf; |
function integer MYHDL53_makeLeaf; |
input [9-1:0] lcode; |
input [4-1:0] lbits; |
begin: MYHDL149_RETURN |
if ((lcode >= (1 << 10))) begin |
if ((lcode >= (1 << 15))) begin |
$finish; |
end |
if ((lbits >= (1 << 9))) begin |
if ((lbits >= (1 << 4))) begin |
$finish; |
end |
MYHDL55_makeLeaf = ((lcode << 9) | lbits); |
MYHDL53_makeLeaf = ((lcode << 4) | lbits); |
disable MYHDL149_RETURN; |
end |
endfunction |
|
function integer MYHDL56_makeLeaf; |
function integer MYHDL54_makeLeaf; |
input [9-1:0] lcode; |
input [4-1:0] lbits; |
begin: MYHDL150_RETURN |
if ((lcode >= (1 << 10))) begin |
if ((lcode >= (1 << 15))) begin |
$finish; |
end |
if ((lbits >= (1 << 9))) begin |
if ((lbits >= (1 << 4))) begin |
$finish; |
end |
MYHDL56_makeLeaf = ((lcode << 9) | lbits); |
MYHDL54_makeLeaf = ((lcode << 4) | lbits); |
disable MYHDL150_RETURN; |
end |
endfunction |
|
function integer MYHDL57_makeLeaf; |
function integer MYHDL55_makeLeaf; |
input [9-1:0] lcode; |
input [4-1:0] lbits; |
begin: MYHDL151_RETURN |
if ((lcode >= (1 << 10))) begin |
if ((lcode >= (1 << 15))) begin |
$finish; |
end |
if ((lbits >= (1 << 9))) begin |
if ((lbits >= (1 << 4))) begin |
$finish; |
end |
MYHDL57_makeLeaf = ((lcode << 9) | lbits); |
MYHDL55_makeLeaf = ((lcode << 4) | lbits); |
disable MYHDL151_RETURN; |
end |
endfunction |
|
function integer MYHDL58_get4; |
function integer MYHDL56_get4; |
input boffset; |
input [5-1:0] width; |
begin: MYHDL152_RETURN |
828,32 → 803,54
$write("\n"); |
$finish; |
end |
MYHDL58_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
MYHDL56_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
disable MYHDL152_RETURN; |
end |
endfunction |
|
function integer MYHDL59_get_bits; |
function integer MYHDL57_get_bits; |
input [19-1:0] aleaf; |
begin: MYHDL153_RETURN |
MYHDL59_get_bits = ($signed({1'b0, aleaf}) & ((1 << 9) - 1)); |
MYHDL57_get_bits = ($signed({1'b0, aleaf}) & ((1 << 4) - 1)); |
disable MYHDL153_RETURN; |
end |
endfunction |
|
function integer MYHDL60_get_bits; |
input [19-1:0] aleaf; |
function integer MYHDL58_get4; |
input boffset; |
input [5-1:0] width; |
begin: MYHDL154_RETURN |
MYHDL60_get_bits = ($signed({1'b0, aleaf}) & ((1 << 9) - 1)); |
if ((nb != 4)) begin |
$write("----NB----"); |
$write("\n"); |
$finish; |
end |
MYHDL58_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
disable MYHDL154_RETURN; |
end |
endfunction |
|
function integer MYHDL59_get_bits; |
input [19-1:0] aleaf; |
begin: MYHDL155_RETURN |
MYHDL59_get_bits = ($signed({1'b0, aleaf}) & ((1 << 4) - 1)); |
disable MYHDL155_RETURN; |
end |
endfunction |
|
function integer MYHDL60_get_bits; |
input [19-1:0] aleaf; |
begin: MYHDL156_RETURN |
MYHDL60_get_bits = ($signed({1'b0, aleaf}) & ((1 << 4) - 1)); |
disable MYHDL156_RETURN; |
end |
endfunction |
|
task MYHDL61_adv; |
input width; |
integer width; |
integer nshift; |
begin: MYHDL155_RETURN |
begin: MYHDL157_RETURN |
nshift = $signed(($signed({1'b0, dio}) + width) >>> 3); |
o_iprogress <= di; |
dio <= (($signed({1'b0, dio}) + width) & 7); |
866,103 → 863,118
|
function integer MYHDL62_get_code; |
input [19-1:0] aleaf; |
begin: MYHDL156_RETURN |
MYHDL62_get_code = (aleaf >>> 9); |
disable MYHDL156_RETURN; |
begin: MYHDL158_RETURN |
MYHDL62_get_code = (aleaf >>> 4); |
disable MYHDL158_RETURN; |
end |
endfunction |
|
function integer MYHDL63_get_code; |
function integer MYHDL63_get4; |
input boffset; |
integer boffset; |
input [5-1:0] width; |
begin: MYHDL159_RETURN |
if ((nb != 4)) begin |
$write("----NB----"); |
$write("\n"); |
$finish; |
end |
MYHDL63_get4 = ($signed($signed({1'b0, b41}) >>> ($signed({1'b0, dio}) + boffset)) & ((1 << width) - 1)); |
disable MYHDL159_RETURN; |
end |
endfunction |
|
function integer MYHDL64_get_bits; |
input [19-1:0] aleaf; |
begin: MYHDL157_RETURN |
MYHDL63_get_code = (aleaf >>> 9); |
disable MYHDL157_RETURN; |
begin: MYHDL160_RETURN |
MYHDL64_get_bits = ($signed({1'b0, aleaf}) & ((1 << 4) - 1)); |
disable MYHDL160_RETURN; |
end |
endfunction |
|
function integer MYHDL64_get4; |
function integer MYHDL65_get4; |
input boffset; |
integer boffset; |
input [5-1:0] width; |
begin: MYHDL158_RETURN |
begin: MYHDL161_RETURN |
if ((nb != 4)) begin |
$write("----NB----"); |
$write("\n"); |
$finish; |
end |
MYHDL64_get4 = ($signed($signed({1'b0, b41}) >>> ($signed({1'b0, dio}) + boffset)) & ((1 << width) - 1)); |
disable MYHDL158_RETURN; |
MYHDL65_get4 = ($signed($signed({1'b0, b41}) >>> ($signed({1'b0, dio}) + boffset)) & ((1 << width) - 1)); |
disable MYHDL161_RETURN; |
end |
endfunction |
|
function integer MYHDL65_get_bits; |
function integer MYHDL66_get_bits; |
input [19-1:0] aleaf; |
begin: MYHDL159_RETURN |
MYHDL65_get_bits = ($signed({1'b0, aleaf}) & ((1 << 9) - 1)); |
disable MYHDL159_RETURN; |
begin: MYHDL162_RETURN |
MYHDL66_get_bits = ($signed({1'b0, aleaf}) & ((1 << 4) - 1)); |
disable MYHDL162_RETURN; |
end |
endfunction |
|
function integer MYHDL66_get4; |
function integer MYHDL67_get4; |
input boffset; |
input width; |
integer width; |
begin: MYHDL160_RETURN |
begin: MYHDL163_RETURN |
if ((nb != 4)) begin |
$write("----NB----"); |
$write("\n"); |
$finish; |
end |
MYHDL66_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
disable MYHDL160_RETURN; |
MYHDL67_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
disable MYHDL163_RETURN; |
end |
endfunction |
|
function integer MYHDL67_get_code; |
function integer MYHDL68_get_code; |
input [19-1:0] aleaf; |
begin: MYHDL161_RETURN |
MYHDL67_get_code = (aleaf >>> 9); |
disable MYHDL161_RETURN; |
begin: MYHDL164_RETURN |
MYHDL68_get_code = (aleaf >>> 4); |
disable MYHDL164_RETURN; |
end |
endfunction |
|
function integer MYHDL68_get_bits; |
function integer MYHDL69_get_bits; |
input [19-1:0] aleaf; |
begin: MYHDL162_RETURN |
MYHDL68_get_bits = ($signed({1'b0, aleaf}) & ((1 << 9) - 1)); |
disable MYHDL162_RETURN; |
begin: MYHDL165_RETURN |
MYHDL69_get_bits = ($signed({1'b0, aleaf}) & ((1 << 4) - 1)); |
disable MYHDL165_RETURN; |
end |
endfunction |
|
function integer MYHDL69_get4; |
function integer MYHDL70_get4; |
input boffset; |
integer boffset; |
input width; |
integer width; |
begin: MYHDL163_RETURN |
begin: MYHDL166_RETURN |
if ((nb != 4)) begin |
$write("----NB----"); |
$write("\n"); |
$finish; |
end |
MYHDL69_get4 = ($signed($signed({1'b0, b41}) >>> ($signed({1'b0, dio}) + boffset)) & ((1 << width) - 1)); |
disable MYHDL163_RETURN; |
MYHDL70_get4 = ($signed($signed({1'b0, b41}) >>> ($signed({1'b0, dio}) + boffset)) & ((1 << width) - 1)); |
disable MYHDL166_RETURN; |
end |
endfunction |
|
function integer MYHDL70_get_bits; |
function integer MYHDL71_get_bits; |
input [19-1:0] aleaf; |
begin: MYHDL164_RETURN |
MYHDL70_get_bits = ($signed({1'b0, aleaf}) & ((1 << 9) - 1)); |
disable MYHDL164_RETURN; |
begin: MYHDL167_RETURN |
MYHDL71_get_bits = ($signed({1'b0, aleaf}) & ((1 << 4) - 1)); |
disable MYHDL167_RETURN; |
end |
endfunction |
|
task MYHDL71_adv; |
task MYHDL72_adv; |
input width; |
integer width; |
integer nshift; |
begin: MYHDL165_RETURN |
begin: MYHDL168_RETURN |
nshift = $signed(($signed({1'b0, dio}) + width) >>> 3); |
o_iprogress <= di; |
dio <= (($signed({1'b0, dio}) + width) & 7); |
973,77 → 985,80
end |
endtask |
|
function integer MYHDL72_get4; |
function integer MYHDL73_get4; |
input boffset; |
input width; |
integer width; |
begin: MYHDL166_RETURN |
begin: MYHDL169_RETURN |
if ((nb != 4)) begin |
$write("----NB----"); |
$write("\n"); |
$finish; |
end |
MYHDL72_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
disable MYHDL166_RETURN; |
MYHDL73_get4 = ((b41 >>> (dio + boffset)) & ((1 << width) - 1)); |
disable MYHDL169_RETURN; |
end |
endfunction |
|
function integer MYHDL73_get4; |
function integer MYHDL74_get4; |
input boffset; |
integer boffset; |
input width; |
integer width; |
begin: MYHDL167_RETURN |
begin: MYHDL170_RETURN |
if ((nb != 4)) begin |
$write("----NB----"); |
$write("\n"); |
$finish; |
end |
MYHDL73_get4 = ($signed($signed({1'b0, b41}) >>> ($signed({1'b0, dio}) + boffset)) & ((1 << width) - 1)); |
disable MYHDL167_RETURN; |
MYHDL74_get4 = ($signed($signed({1'b0, b41}) >>> ($signed({1'b0, dio}) + boffset)) & ((1 << width) - 1)); |
disable MYHDL170_RETURN; |
end |
endfunction |
|
function integer MYHDL74_rev_bits; |
function integer MYHDL75_rev_bits; |
input b; |
integer b; |
input nb; |
integer nb; |
integer r; |
begin: MYHDL168_RETURN |
begin: MYHDL171_RETURN |
if ((b >= (1 << nb))) begin |
$finish; |
$write("too few bits"); |
$write("\n"); |
end |
if ((nb > 15)) begin |
$finish; |
end |
r = (((((((((((((((((b >>> 14) & 1) << 0) | (((b >>> 13) & 1) << 1)) | (((b >>> 12) & 1) << 2)) | (((b >>> 11) & 1) << 3)) | (((b >>> 10) & 1) << 4)) | (((b >>> 9) & 1) << 5)) | (((b >>> 8) & 1) << 6)) | (((b >>> 7) & 1) << 7)) | (((b >>> 6) & 1) << 8)) | (((b >>> 5) & 1) << 9)) | (((b >>> 4) & 1) << 10)) | (((b >>> 3) & 1) << 11)) | (((b >>> 2) & 1) << 12)) | (((b >>> 1) & 1) << 13)) | (((b >>> 0) & 1) << 14)); |
r = r >>> (15 - $signed({1'b0, nb})); |
MYHDL74_rev_bits = r; |
disable MYHDL168_RETURN; |
MYHDL75_rev_bits = r; |
disable MYHDL171_RETURN; |
end |
endfunction |
|
function integer MYHDL75_get4; |
function integer MYHDL76_get4; |
input boffset; |
integer boffset; |
input width; |
integer width; |
begin: MYHDL169_RETURN |
begin: MYHDL172_RETURN |
if ((nb != 4)) begin |
$write("----NB----"); |
$write("\n"); |
$finish; |
end |
MYHDL75_get4 = ($signed($signed({1'b0, b41}) >>> ($signed({1'b0, dio}) + boffset)) & ((1 << width) - 1)); |
disable MYHDL169_RETURN; |
MYHDL76_get4 = ($signed($signed({1'b0, b41}) >>> ($signed({1'b0, dio}) + boffset)) & ((1 << width) - 1)); |
disable MYHDL172_RETURN; |
end |
endfunction |
|
task MYHDL76_adv; |
task MYHDL77_adv; |
input width; |
integer width; |
integer nshift; |
begin: MYHDL170_RETURN |
begin: MYHDL173_RETURN |
nshift = $signed(($signed({1'b0, dio}) + width) >>> 3); |
o_iprogress <= di; |
dio <= (($signed({1'b0, dio}) + width) & 7); |
1054,11 → 1069,11
end |
endtask |
|
task MYHDL77_adv; |
task MYHDL78_adv; |
input width; |
integer width; |
integer nshift; |
begin: MYHDL171_RETURN |
begin: MYHDL174_RETURN |
nshift = ((dio + width) >>> 3); |
o_iprogress <= di; |
dio <= ((dio + width) & 7); |
1069,20 → 1084,28
end |
endtask |
|
task MYHDL79_adv; |
input width; |
integer width; |
integer nshift; |
begin: MYHDL175_RETURN |
nshift = ((dio + width) >>> 3); |
o_iprogress <= di; |
dio <= ((dio + width) & 7); |
di <= ($signed({1'b0, di}) + nshift); |
if ((nshift != 0)) begin |
filled <= 1'b0; |
end |
end |
endtask |
|
|
always @(posedge clk) begin: DEFLATE_IO_LOGIC |
case (i_mode) |
'h2: begin |
iram[(i_addr & 127)] <= i_data; |
isize <= i_addr; |
end |
'h3: begin |
o_byte <= oram[i_addr]; |
end |
default: begin |
// pass |
end |
endcase |
o_byte <= oram[(i_raddr & 32767)]; |
if ((i_mode == 2)) begin |
iram[(i_waddr & 63)] <= i_data; |
isize <= i_waddr; |
end |
end |
|
|
1092,20 → 1115,22
reg no_adv; |
integer cs_i; |
reg [4-1:0] outlen; |
reg [9-1:0] outbits; |
integer outbits; |
reg [8-1:0] bdata; |
integer adler1_next; |
integer lencode; |
integer nextdist; |
integer copydist; |
integer extra_dist; |
integer extra_bits; |
integer outcode; |
reg [15-1:0] lfmatch; |
integer distance; |
integer fmatch2; |
integer match; |
reg found; |
integer fmatch; |
integer si; |
integer distance; |
integer lencode; |
integer match; |
integer stat_i; |
integer clo_i; |
integer n_adv; |
1118,7 → 1143,7
integer hf2_i; |
reg [5-1:0] amb; |
integer ncode; |
reg [10-1:0] canonical; |
reg [16-1:0] canonical; |
reg [4-1:0] bits_next; |
reg [15-1:0] aim; |
integer cto; |
1154,7 → 1179,7
cur_static <= 0; |
state <= 5'b01110; |
end |
else if ((i_mode == 5)) begin |
else if ((1'b1 && (i_mode == 5))) begin |
do_compress <= 1'b0; |
o_done <= 1'b0; |
o_iprogress <= 0; |
1171,7 → 1196,10
end |
end |
5'b00001: begin |
if ((!filled)) begin |
if ((!1'b1)) begin |
// pass |
end |
else if ((!filled)) begin |
filled <= 1'b1; |
end |
else if ((nb < 4)) begin |
1219,6 → 1247,11
$write("\n"); |
case (hm) |
'h2: begin |
if ((!1'b0)) begin |
$write("dynamic tree mode disabled"); |
$write("\n"); |
$finish; |
end |
state <= 5'b00010; |
numCodeLength <= 0; |
numLiterals <= 0; |
1284,17 → 1317,20
MYHDL11_put_adv(3, 3); |
end |
else if (flush) begin |
$write("flush"); |
$write(" "); |
$write("%h", do); |
$write(" "); |
$write("%h", ob1); |
$write("\n"); |
no_adv = 1; |
oaddr <= do; |
obyte <= ob1; |
MYHDL12_do_flush; |
end |
else if ((($signed({1'b0, cur_cstatic}) >= ($signed({1'b0, isize}) - 10)) && (i_mode != 0))) begin |
$write("P"); |
$write(" "); |
$write("%h", cur_cstatic); |
$write(" "); |
$write("%h", isize); |
$write("\n"); |
no_adv = 1; |
end |
else if ((($signed({1'b0, cur_cstatic}) - 3) > isize)) begin |
if ((($signed({1'b0, cur_cstatic}) - 3) == (isize + 1))) begin |
$write("Put EOF"); |
1303,7 → 1339,296
$write("\n"); |
cs_i = 256; |
outlen = codeLength[cs_i]; |
outbits = code_bits[cs_i]; |
case (cs_i) |
0: outbits = 12; |
1: outbits = 140; |
2: outbits = 76; |
3: outbits = 204; |
4: outbits = 44; |
5: outbits = 172; |
6: outbits = 108; |
7: outbits = 236; |
8: outbits = 28; |
9: outbits = 156; |
10: outbits = 92; |
11: outbits = 220; |
12: outbits = 60; |
13: outbits = 188; |
14: outbits = 124; |
15: outbits = 252; |
16: outbits = 2; |
17: outbits = 130; |
18: outbits = 66; |
19: outbits = 194; |
20: outbits = 34; |
21: outbits = 162; |
22: outbits = 98; |
23: outbits = 226; |
24: outbits = 18; |
25: outbits = 146; |
26: outbits = 82; |
27: outbits = 210; |
28: outbits = 50; |
29: outbits = 178; |
30: outbits = 114; |
31: outbits = 242; |
32: outbits = 10; |
33: outbits = 138; |
34: outbits = 74; |
35: outbits = 202; |
36: outbits = 42; |
37: outbits = 170; |
38: outbits = 106; |
39: outbits = 234; |
40: outbits = 26; |
41: outbits = 154; |
42: outbits = 90; |
43: outbits = 218; |
44: outbits = 58; |
45: outbits = 186; |
46: outbits = 122; |
47: outbits = 250; |
48: outbits = 6; |
49: outbits = 134; |
50: outbits = 70; |
51: outbits = 198; |
52: outbits = 38; |
53: outbits = 166; |
54: outbits = 102; |
55: outbits = 230; |
56: outbits = 22; |
57: outbits = 150; |
58: outbits = 86; |
59: outbits = 214; |
60: outbits = 54; |
61: outbits = 182; |
62: outbits = 118; |
63: outbits = 246; |
64: outbits = 14; |
65: outbits = 142; |
66: outbits = 78; |
67: outbits = 206; |
68: outbits = 46; |
69: outbits = 174; |
70: outbits = 110; |
71: outbits = 238; |
72: outbits = 30; |
73: outbits = 158; |
74: outbits = 94; |
75: outbits = 222; |
76: outbits = 62; |
77: outbits = 190; |
78: outbits = 126; |
79: outbits = 254; |
80: outbits = 1; |
81: outbits = 129; |
82: outbits = 65; |
83: outbits = 193; |
84: outbits = 33; |
85: outbits = 161; |
86: outbits = 97; |
87: outbits = 225; |
88: outbits = 17; |
89: outbits = 145; |
90: outbits = 81; |
91: outbits = 209; |
92: outbits = 49; |
93: outbits = 177; |
94: outbits = 113; |
95: outbits = 241; |
96: outbits = 9; |
97: outbits = 137; |
98: outbits = 73; |
99: outbits = 201; |
100: outbits = 41; |
101: outbits = 169; |
102: outbits = 105; |
103: outbits = 233; |
104: outbits = 25; |
105: outbits = 153; |
106: outbits = 89; |
107: outbits = 217; |
108: outbits = 57; |
109: outbits = 185; |
110: outbits = 121; |
111: outbits = 249; |
112: outbits = 5; |
113: outbits = 133; |
114: outbits = 69; |
115: outbits = 197; |
116: outbits = 37; |
117: outbits = 165; |
118: outbits = 101; |
119: outbits = 229; |
120: outbits = 21; |
121: outbits = 149; |
122: outbits = 85; |
123: outbits = 213; |
124: outbits = 53; |
125: outbits = 181; |
126: outbits = 117; |
127: outbits = 245; |
128: outbits = 13; |
129: outbits = 141; |
130: outbits = 77; |
131: outbits = 205; |
132: outbits = 45; |
133: outbits = 173; |
134: outbits = 109; |
135: outbits = 237; |
136: outbits = 29; |
137: outbits = 157; |
138: outbits = 93; |
139: outbits = 221; |
140: outbits = 61; |
141: outbits = 189; |
142: outbits = 125; |
143: outbits = 253; |
144: outbits = 19; |
145: outbits = 275; |
146: outbits = 147; |
147: outbits = 403; |
148: outbits = 83; |
149: outbits = 339; |
150: outbits = 211; |
151: outbits = 467; |
152: outbits = 51; |
153: outbits = 307; |
154: outbits = 179; |
155: outbits = 435; |
156: outbits = 115; |
157: outbits = 371; |
158: outbits = 243; |
159: outbits = 499; |
160: outbits = 11; |
161: outbits = 267; |
162: outbits = 139; |
163: outbits = 395; |
164: outbits = 75; |
165: outbits = 331; |
166: outbits = 203; |
167: outbits = 459; |
168: outbits = 43; |
169: outbits = 299; |
170: outbits = 171; |
171: outbits = 427; |
172: outbits = 107; |
173: outbits = 363; |
174: outbits = 235; |
175: outbits = 491; |
176: outbits = 27; |
177: outbits = 283; |
178: outbits = 155; |
179: outbits = 411; |
180: outbits = 91; |
181: outbits = 347; |
182: outbits = 219; |
183: outbits = 475; |
184: outbits = 59; |
185: outbits = 315; |
186: outbits = 187; |
187: outbits = 443; |
188: outbits = 123; |
189: outbits = 379; |
190: outbits = 251; |
191: outbits = 507; |
192: outbits = 7; |
193: outbits = 263; |
194: outbits = 135; |
195: outbits = 391; |
196: outbits = 71; |
197: outbits = 327; |
198: outbits = 199; |
199: outbits = 455; |
200: outbits = 39; |
201: outbits = 295; |
202: outbits = 167; |
203: outbits = 423; |
204: outbits = 103; |
205: outbits = 359; |
206: outbits = 231; |
207: outbits = 487; |
208: outbits = 23; |
209: outbits = 279; |
210: outbits = 151; |
211: outbits = 407; |
212: outbits = 87; |
213: outbits = 343; |
214: outbits = 215; |
215: outbits = 471; |
216: outbits = 55; |
217: outbits = 311; |
218: outbits = 183; |
219: outbits = 439; |
220: outbits = 119; |
221: outbits = 375; |
222: outbits = 247; |
223: outbits = 503; |
224: outbits = 15; |
225: outbits = 271; |
226: outbits = 143; |
227: outbits = 399; |
228: outbits = 79; |
229: outbits = 335; |
230: outbits = 207; |
231: outbits = 463; |
232: outbits = 47; |
233: outbits = 303; |
234: outbits = 175; |
235: outbits = 431; |
236: outbits = 111; |
237: outbits = 367; |
238: outbits = 239; |
239: outbits = 495; |
240: outbits = 31; |
241: outbits = 287; |
242: outbits = 159; |
243: outbits = 415; |
244: outbits = 95; |
245: outbits = 351; |
246: outbits = 223; |
247: outbits = 479; |
248: outbits = 63; |
249: outbits = 319; |
250: outbits = 191; |
251: outbits = 447; |
252: outbits = 127; |
253: outbits = 383; |
254: outbits = 255; |
255: outbits = 511; |
256: outbits = 0; |
257: outbits = 64; |
258: outbits = 32; |
259: outbits = 96; |
260: outbits = 16; |
261: outbits = 80; |
262: outbits = 48; |
263: outbits = 112; |
264: outbits = 8; |
265: outbits = 72; |
266: outbits = 40; |
267: outbits = 104; |
268: outbits = 24; |
269: outbits = 88; |
270: outbits = 56; |
271: outbits = 120; |
272: outbits = 4; |
273: outbits = 68; |
274: outbits = 36; |
275: outbits = 100; |
276: outbits = 20; |
277: outbits = 84; |
278: outbits = 52; |
279: outbits = 116; |
280: outbits = 3; |
281: outbits = 131; |
282: outbits = 67; |
283: outbits = 195; |
284: outbits = 35; |
285: outbits = 163; |
286: outbits = 99; |
default: outbits = 227; |
endcase |
$write("EOF BITS:"); |
$write(" "); |
$write("%0d", cs_i); |
1310,7 → 1635,7
$write(" "); |
$write("%h", outlen); |
$write(" "); |
$write("%h", outbits); |
$write("%0d", outbits); |
$write("\n"); |
oaddr <= do; |
obyte <= MYHDL13_put(outbits, outlen); |
1332,6 → 1657,7
oaddr <= do; |
obyte <= (adler2 >>> 8); |
do <= (do + 1); |
o_oprogress <= (do + 1); |
end |
else if ((($signed({1'b0, cur_cstatic}) - 3) == (isize + 4))) begin |
$write("c2"); |
1339,6 → 1665,7
oaddr <= do; |
obyte <= (adler2 & 255); |
do <= (do + 1); |
o_oprogress <= (do + 1); |
end |
else if ((($signed({1'b0, cur_cstatic}) - 3) == (isize + 5))) begin |
$write("c3"); |
1346,6 → 1673,7
oaddr <= do; |
obyte <= (adler1 >>> 8); |
do <= (do + 1); |
o_oprogress <= (do + 1); |
end |
else if ((($signed({1'b0, cur_cstatic}) - 3) == (isize + 6))) begin |
$write("c4"); |
1352,6 → 1680,7
$write("\n"); |
oaddr <= do; |
obyte <= (adler1 & 255); |
o_oprogress <= (do + 1); |
end |
else if ((($signed({1'b0, cur_cstatic}) - 3) == (isize + 7))) begin |
$write("EOF finish"); |
1359,7 → 1688,6
$write("%h", do); |
$write("\n"); |
o_done <= 1'b1; |
o_oprogress <= (do + 1); |
state <= 5'b00000; |
end |
else begin |
1371,7 → 1699,8
end |
end |
else begin |
bdata = iram[di]; |
bdata = iram[(di & 63)]; |
o_iprogress <= di; |
adler1_next = ((adler1 + bdata) % 65521); |
adler1 <= adler1_next; |
adler2 <= ((adler2 + ladler1) % 65521); |
1383,7 → 1712,7
cur_cstatic <= (cur_cstatic + 1); |
end |
end |
5'b11000: begin |
5'b11001: begin |
if ((!1'b1)) begin |
// pass |
end |
1390,6 → 1719,304
else if (flush) begin |
MYHDL15_do_flush; |
end |
else if ((cur_i == 1024)) begin |
lencode = (length + 254); |
outlen = codeLength[lencode]; |
case (lencode) |
0: outbits = 12; |
1: outbits = 140; |
2: outbits = 76; |
3: outbits = 204; |
4: outbits = 44; |
5: outbits = 172; |
6: outbits = 108; |
7: outbits = 236; |
8: outbits = 28; |
9: outbits = 156; |
10: outbits = 92; |
11: outbits = 220; |
12: outbits = 60; |
13: outbits = 188; |
14: outbits = 124; |
15: outbits = 252; |
16: outbits = 2; |
17: outbits = 130; |
18: outbits = 66; |
19: outbits = 194; |
20: outbits = 34; |
21: outbits = 162; |
22: outbits = 98; |
23: outbits = 226; |
24: outbits = 18; |
25: outbits = 146; |
26: outbits = 82; |
27: outbits = 210; |
28: outbits = 50; |
29: outbits = 178; |
30: outbits = 114; |
31: outbits = 242; |
32: outbits = 10; |
33: outbits = 138; |
34: outbits = 74; |
35: outbits = 202; |
36: outbits = 42; |
37: outbits = 170; |
38: outbits = 106; |
39: outbits = 234; |
40: outbits = 26; |
41: outbits = 154; |
42: outbits = 90; |
43: outbits = 218; |
44: outbits = 58; |
45: outbits = 186; |
46: outbits = 122; |
47: outbits = 250; |
48: outbits = 6; |
49: outbits = 134; |
50: outbits = 70; |
51: outbits = 198; |
52: outbits = 38; |
53: outbits = 166; |
54: outbits = 102; |
55: outbits = 230; |
56: outbits = 22; |
57: outbits = 150; |
58: outbits = 86; |
59: outbits = 214; |
60: outbits = 54; |
61: outbits = 182; |
62: outbits = 118; |
63: outbits = 246; |
64: outbits = 14; |
65: outbits = 142; |
66: outbits = 78; |
67: outbits = 206; |
68: outbits = 46; |
69: outbits = 174; |
70: outbits = 110; |
71: outbits = 238; |
72: outbits = 30; |
73: outbits = 158; |
74: outbits = 94; |
75: outbits = 222; |
76: outbits = 62; |
77: outbits = 190; |
78: outbits = 126; |
79: outbits = 254; |
80: outbits = 1; |
81: outbits = 129; |
82: outbits = 65; |
83: outbits = 193; |
84: outbits = 33; |
85: outbits = 161; |
86: outbits = 97; |
87: outbits = 225; |
88: outbits = 17; |
89: outbits = 145; |
90: outbits = 81; |
91: outbits = 209; |
92: outbits = 49; |
93: outbits = 177; |
94: outbits = 113; |
95: outbits = 241; |
96: outbits = 9; |
97: outbits = 137; |
98: outbits = 73; |
99: outbits = 201; |
100: outbits = 41; |
101: outbits = 169; |
102: outbits = 105; |
103: outbits = 233; |
104: outbits = 25; |
105: outbits = 153; |
106: outbits = 89; |
107: outbits = 217; |
108: outbits = 57; |
109: outbits = 185; |
110: outbits = 121; |
111: outbits = 249; |
112: outbits = 5; |
113: outbits = 133; |
114: outbits = 69; |
115: outbits = 197; |
116: outbits = 37; |
117: outbits = 165; |
118: outbits = 101; |
119: outbits = 229; |
120: outbits = 21; |
121: outbits = 149; |
122: outbits = 85; |
123: outbits = 213; |
124: outbits = 53; |
125: outbits = 181; |
126: outbits = 117; |
127: outbits = 245; |
128: outbits = 13; |
129: outbits = 141; |
130: outbits = 77; |
131: outbits = 205; |
132: outbits = 45; |
133: outbits = 173; |
134: outbits = 109; |
135: outbits = 237; |
136: outbits = 29; |
137: outbits = 157; |
138: outbits = 93; |
139: outbits = 221; |
140: outbits = 61; |
141: outbits = 189; |
142: outbits = 125; |
143: outbits = 253; |
144: outbits = 19; |
145: outbits = 275; |
146: outbits = 147; |
147: outbits = 403; |
148: outbits = 83; |
149: outbits = 339; |
150: outbits = 211; |
151: outbits = 467; |
152: outbits = 51; |
153: outbits = 307; |
154: outbits = 179; |
155: outbits = 435; |
156: outbits = 115; |
157: outbits = 371; |
158: outbits = 243; |
159: outbits = 499; |
160: outbits = 11; |
161: outbits = 267; |
162: outbits = 139; |
163: outbits = 395; |
164: outbits = 75; |
165: outbits = 331; |
166: outbits = 203; |
167: outbits = 459; |
168: outbits = 43; |
169: outbits = 299; |
170: outbits = 171; |
171: outbits = 427; |
172: outbits = 107; |
173: outbits = 363; |
174: outbits = 235; |
175: outbits = 491; |
176: outbits = 27; |
177: outbits = 283; |
178: outbits = 155; |
179: outbits = 411; |
180: outbits = 91; |
181: outbits = 347; |
182: outbits = 219; |
183: outbits = 475; |
184: outbits = 59; |
185: outbits = 315; |
186: outbits = 187; |
187: outbits = 443; |
188: outbits = 123; |
189: outbits = 379; |
190: outbits = 251; |
191: outbits = 507; |
192: outbits = 7; |
193: outbits = 263; |
194: outbits = 135; |
195: outbits = 391; |
196: outbits = 71; |
197: outbits = 327; |
198: outbits = 199; |
199: outbits = 455; |
200: outbits = 39; |
201: outbits = 295; |
202: outbits = 167; |
203: outbits = 423; |
204: outbits = 103; |
205: outbits = 359; |
206: outbits = 231; |
207: outbits = 487; |
208: outbits = 23; |
209: outbits = 279; |
210: outbits = 151; |
211: outbits = 407; |
212: outbits = 87; |
213: outbits = 343; |
214: outbits = 215; |
215: outbits = 471; |
216: outbits = 55; |
217: outbits = 311; |
218: outbits = 183; |
219: outbits = 439; |
220: outbits = 119; |
221: outbits = 375; |
222: outbits = 247; |
223: outbits = 503; |
224: outbits = 15; |
225: outbits = 271; |
226: outbits = 143; |
227: outbits = 399; |
228: outbits = 79; |
229: outbits = 335; |
230: outbits = 207; |
231: outbits = 463; |
232: outbits = 47; |
233: outbits = 303; |
234: outbits = 175; |
235: outbits = 431; |
236: outbits = 111; |
237: outbits = 367; |
238: outbits = 239; |
239: outbits = 495; |
240: outbits = 31; |
241: outbits = 287; |
242: outbits = 159; |
243: outbits = 415; |
244: outbits = 95; |
245: outbits = 351; |
246: outbits = 223; |
247: outbits = 479; |
248: outbits = 63; |
249: outbits = 319; |
250: outbits = 191; |
251: outbits = 447; |
252: outbits = 127; |
253: outbits = 383; |
254: outbits = 255; |
255: outbits = 511; |
256: outbits = 0; |
257: outbits = 64; |
258: outbits = 32; |
259: outbits = 96; |
260: outbits = 16; |
261: outbits = 80; |
262: outbits = 48; |
263: outbits = 112; |
264: outbits = 8; |
265: outbits = 72; |
266: outbits = 40; |
267: outbits = 104; |
268: outbits = 24; |
269: outbits = 88; |
270: outbits = 56; |
271: outbits = 120; |
272: outbits = 4; |
273: outbits = 68; |
274: outbits = 36; |
275: outbits = 100; |
276: outbits = 20; |
277: outbits = 84; |
278: outbits = 52; |
279: outbits = 116; |
280: outbits = 3; |
281: outbits = 131; |
282: outbits = 67; |
283: outbits = 195; |
284: outbits = 35; |
285: outbits = 163; |
286: outbits = 99; |
default: outbits = 227; |
endcase |
oaddr <= do; |
obyte <= MYHDL16_put(outbits, outlen); |
MYHDL17_put_adv(outbits, outlen); |
cur_i <= 0; |
end |
else begin |
case ((cur_i + 1)) |
0: nextdist = 1; |
1477,12 → 2104,12
if ((extra_dist > ((1 << extra_bits) - 1))) begin |
$finish; |
end |
outcode = (MYHDL16_rev_bits(cur_i, 5) | (extra_dist << 5)); |
outcode = (MYHDL18_rev_bits(cur_i, 5) | (extra_dist << 5)); |
oaddr <= do; |
obyte <= MYHDL17_put(outcode, (5 + extra_bits)); |
MYHDL18_put_adv(outcode, (5 + extra_bits)); |
obyte <= MYHDL19_put(outcode, (5 + extra_bits)); |
MYHDL20_put_adv(outcode, (5 + extra_bits)); |
cur_i <= (($signed({1'b0, di}) - $signed({1'b0, length})) + 1); |
state <= 5'b11001; |
state <= 5'b11010; |
end |
else begin |
cur_i <= (cur_i + 1); |
1489,12 → 2116,12
end |
end |
end |
5'b11001: begin |
5'b11010: begin |
if ((!1'b1)) begin |
// pass |
end |
else if ((cur_i < di)) begin |
bdata = iram[(cur_i & 127)]; |
bdata = iram[(cur_i & 63)]; |
adler1_next = ((adler1 + bdata) % 65521); |
adler1 <= adler1_next; |
adler2 <= ((adler2 + ladler1) % 65521); |
1505,6 → 2132,49
state <= 5'b10110; |
end |
end |
5'b11000: begin |
if ((1'b1 && 1'b1)) begin |
lfmatch = length; |
distance = (lfmatch + 1); |
fmatch2 = (($signed({1'b0, di}) - $signed({1'b0, lfmatch})) + 2); |
lencode = 257; |
match = 3; |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 4)) && (iram[(fmatch2 & 63)] == b4))) begin |
lencode = 258; |
match = 4; |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 5)) && (iram[((fmatch2 + 1) & 63)] == b5))) begin |
lencode = 259; |
match = 5; |
if ((1'b1 && ($signed({1'b0, di}) < ($signed({1'b0, isize}) - 6)) && (iram[((fmatch2 + 2) & 63)] == b6))) begin |
lencode = 260; |
match = 6; |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 7)) && (iram[((fmatch2 + 3) & 63)] == b7))) begin |
lencode = 261; |
match = 7; |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 8)) && (iram[((fmatch2 + 4) & 63)] == b8))) begin |
lencode = 262; |
match = 8; |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 9)) && (iram[((fmatch2 + 5) & 63)] == b9))) begin |
lencode = 263; |
match = 9; |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 10)) && (iram[((fmatch2 + 6) & 63)] == b10))) begin |
lencode = 264; |
match = 10; |
end |
end |
end |
end |
end |
end |
end |
cur_dist <= distance; |
cur_i <= 1024; |
di <= (di + match); |
cur_cstatic <= ((cur_cstatic + match) - 1); |
length <= match; |
state <= 5'b11001; |
end |
end |
5'b10111: begin |
if ((!1'b1)) begin |
// pass |
1517,20 → 2187,15
end |
else begin |
if (((cur_search >= 0) && (cur_search >= ($signed({1'b0, di}) - 32)) && ($signed({1'b0, di}) < ($signed({1'b0, isize}) - 3)))) begin |
// |
if (1'b1) begin |
found = 0; |
fmatch = 0; |
begin: MYHDL19_BREAK |
begin: MYHDL21_BREAK |
for (si=0; si<32; si=si+1) begin |
if (smatch[si]) begin |
$write("fmatch"); |
$write(" "); |
$write("%0d", si); |
$write("\n"); |
fmatch = si; |
found = 1; |
disable MYHDL19_BREAK; |
disable MYHDL21_BREAK; |
end |
end |
end |
1538,83 → 2203,32
cur_search <= (-1); |
end |
else begin |
distance = (fmatch + 1); |
fmatch = (($signed({1'b0, di}) - fmatch) + 2); |
lencode = 257; |
match = 3; |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 4)) && (iram[(fmatch & 127)] == b4))) begin |
lencode = 258; |
match = 4; |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 5)) && (iram[((fmatch + 1) & 127)] == b5))) begin |
lencode = 259; |
match = 5; |
if ((1'b1 && ($signed({1'b0, di}) < ($signed({1'b0, isize}) - 6)) && (iram[((fmatch + 2) & 127)] == b6))) begin |
lencode = 260; |
match = 6; |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 7)) && (iram[((fmatch + 3) & 127)] == b7))) begin |
lencode = 261; |
match = 7; |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 8)) && (iram[((fmatch + 4) & 127)] == b8))) begin |
lencode = 262; |
match = 8; |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 9)) && (iram[((fmatch + 5) & 127)] == b9))) begin |
lencode = 263; |
match = 9; |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 10)) && (iram[((fmatch + 6) & 127)] == b10))) begin |
lencode = 264; |
match = 10; |
end |
end |
end |
end |
end |
end |
end |
$write("fast:"); |
$write(" "); |
$write("%0d", distance); |
$write(" "); |
$write("%h", di); |
$write(" "); |
$write("%h", isize); |
$write(" "); |
$write("%0d", match); |
$write("\n"); |
outlen = codeLength[lencode]; |
outbits = code_bits[lencode]; |
oaddr <= do; |
obyte <= MYHDL21_put(outbits, outlen); |
MYHDL22_put_adv(outbits, outlen); |
cur_dist <= distance; |
cur_i <= 0; |
di <= (di + match); |
cur_cstatic <= ((cur_cstatic + match) - 1); |
length <= match; |
length <= fmatch; |
state <= 5'b11000; |
end |
end |
else if (((iram[(cur_search & 127)] == b1) && (iram[((cur_search + 1) & 127)] == b2) && (iram[((cur_search + 2) & 127)] == b3))) begin |
else if (((!1'b1) && (iram[(cur_search & 63)] == b1) && (iram[((cur_search + 1) & 63)] == b2) && (iram[((cur_search + 2) & 63)] == b3))) begin |
lencode = 257; |
match = 3; |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 4)) && (iram[((cur_search + 3) & 127)] == b4))) begin |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 4)) && (iram[((cur_search + 3) & 63)] == b4))) begin |
lencode = 258; |
match = 4; |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 5)) && (iram[((cur_search + 4) & 127)] == iram[((di + 4) & 127)]))) begin |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 5)) && (iram[((cur_search + 4) & 63)] == b5))) begin |
lencode = 259; |
match = 5; |
if ((1'b1 && ($signed({1'b0, di}) < ($signed({1'b0, isize}) - 6)) && (iram[((cur_search + 5) & 127)] == iram[((di + 5) & 127)]))) begin |
if ((1'b1 && ($signed({1'b0, di}) < ($signed({1'b0, isize}) - 6)) && (iram[((cur_search + 5) & 63)] == b6))) begin |
lencode = 260; |
match = 6; |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 7)) && (iram[((cur_search + 6) & 127)] == iram[((di + 6) & 127)]))) begin |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 7)) && (iram[((cur_search + 6) & 63)] == b7))) begin |
lencode = 261; |
match = 7; |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 8)) && (iram[((cur_search + 7) & 127)] == iram[((di + 7) & 127)]))) begin |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 8)) && (iram[((cur_search + 7) & 63)] == b8))) begin |
lencode = 262; |
match = 8; |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 9)) && (iram[((cur_search + 8) & 127)] == iram[((di + 8) & 127)]))) begin |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 9)) && (iram[((cur_search + 8) & 63)] == b9))) begin |
lencode = 263; |
match = 9; |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 10)) && (iram[((cur_search + 9) & 127)] == iram[((di + 9) & 127)]))) begin |
if ((($signed({1'b0, di}) < ($signed({1'b0, isize}) - 10)) && (iram[((cur_search + 9) & 63)] == b10))) begin |
lencode = 264; |
match = 10; |
end |
1624,28 → 2238,13
end |
end |
end |
$write("found:"); |
$write(" "); |
$write("%h", cur_search); |
$write(" "); |
$write("%h", di); |
$write(" "); |
$write("%h", isize); |
$write(" "); |
$write("%0d", match); |
$write("\n"); |
outlen = codeLength[lencode]; |
outbits = code_bits[lencode]; |
oaddr <= do; |
obyte <= MYHDL23_put(outbits, outlen); |
MYHDL24_put_adv(outbits, outlen); |
distance = ($signed({1'b0, di}) - cur_search); |
cur_dist <= distance; |
cur_i <= 0; |
cur_i <= 1024; |
di <= (di + match); |
cur_cstatic <= ((cur_cstatic + match) - 1); |
length <= match; |
state <= 5'b11000; |
state <= 5'b11001; |
end |
else begin |
cur_search <= (cur_search - 1); |
1652,13 → 2251,302
end |
end |
else begin |
bdata = iram[di]; |
bdata = b1; |
di <= (di + 1); |
outlen = codeLength[bdata]; |
outbits = code_bits[bdata]; |
case (bdata) |
0: outbits = 12; |
1: outbits = 140; |
2: outbits = 76; |
3: outbits = 204; |
4: outbits = 44; |
5: outbits = 172; |
6: outbits = 108; |
7: outbits = 236; |
8: outbits = 28; |
9: outbits = 156; |
10: outbits = 92; |
11: outbits = 220; |
12: outbits = 60; |
13: outbits = 188; |
14: outbits = 124; |
15: outbits = 252; |
16: outbits = 2; |
17: outbits = 130; |
18: outbits = 66; |
19: outbits = 194; |
20: outbits = 34; |
21: outbits = 162; |
22: outbits = 98; |
23: outbits = 226; |
24: outbits = 18; |
25: outbits = 146; |
26: outbits = 82; |
27: outbits = 210; |
28: outbits = 50; |
29: outbits = 178; |
30: outbits = 114; |
31: outbits = 242; |
32: outbits = 10; |
33: outbits = 138; |
34: outbits = 74; |
35: outbits = 202; |
36: outbits = 42; |
37: outbits = 170; |
38: outbits = 106; |
39: outbits = 234; |
40: outbits = 26; |
41: outbits = 154; |
42: outbits = 90; |
43: outbits = 218; |
44: outbits = 58; |
45: outbits = 186; |
46: outbits = 122; |
47: outbits = 250; |
48: outbits = 6; |
49: outbits = 134; |
50: outbits = 70; |
51: outbits = 198; |
52: outbits = 38; |
53: outbits = 166; |
54: outbits = 102; |
55: outbits = 230; |
56: outbits = 22; |
57: outbits = 150; |
58: outbits = 86; |
59: outbits = 214; |
60: outbits = 54; |
61: outbits = 182; |
62: outbits = 118; |
63: outbits = 246; |
64: outbits = 14; |
65: outbits = 142; |
66: outbits = 78; |
67: outbits = 206; |
68: outbits = 46; |
69: outbits = 174; |
70: outbits = 110; |
71: outbits = 238; |
72: outbits = 30; |
73: outbits = 158; |
74: outbits = 94; |
75: outbits = 222; |
76: outbits = 62; |
77: outbits = 190; |
78: outbits = 126; |
79: outbits = 254; |
80: outbits = 1; |
81: outbits = 129; |
82: outbits = 65; |
83: outbits = 193; |
84: outbits = 33; |
85: outbits = 161; |
86: outbits = 97; |
87: outbits = 225; |
88: outbits = 17; |
89: outbits = 145; |
90: outbits = 81; |
91: outbits = 209; |
92: outbits = 49; |
93: outbits = 177; |
94: outbits = 113; |
95: outbits = 241; |
96: outbits = 9; |
97: outbits = 137; |
98: outbits = 73; |
99: outbits = 201; |
100: outbits = 41; |
101: outbits = 169; |
102: outbits = 105; |
103: outbits = 233; |
104: outbits = 25; |
105: outbits = 153; |
106: outbits = 89; |
107: outbits = 217; |
108: outbits = 57; |
109: outbits = 185; |
110: outbits = 121; |
111: outbits = 249; |
112: outbits = 5; |
113: outbits = 133; |
114: outbits = 69; |
115: outbits = 197; |
116: outbits = 37; |
117: outbits = 165; |
118: outbits = 101; |
119: outbits = 229; |
120: outbits = 21; |
121: outbits = 149; |
122: outbits = 85; |
123: outbits = 213; |
124: outbits = 53; |
125: outbits = 181; |
126: outbits = 117; |
127: outbits = 245; |
128: outbits = 13; |
129: outbits = 141; |
130: outbits = 77; |
131: outbits = 205; |
132: outbits = 45; |
133: outbits = 173; |
134: outbits = 109; |
135: outbits = 237; |
136: outbits = 29; |
137: outbits = 157; |
138: outbits = 93; |
139: outbits = 221; |
140: outbits = 61; |
141: outbits = 189; |
142: outbits = 125; |
143: outbits = 253; |
144: outbits = 19; |
145: outbits = 275; |
146: outbits = 147; |
147: outbits = 403; |
148: outbits = 83; |
149: outbits = 339; |
150: outbits = 211; |
151: outbits = 467; |
152: outbits = 51; |
153: outbits = 307; |
154: outbits = 179; |
155: outbits = 435; |
156: outbits = 115; |
157: outbits = 371; |
158: outbits = 243; |
159: outbits = 499; |
160: outbits = 11; |
161: outbits = 267; |
162: outbits = 139; |
163: outbits = 395; |
164: outbits = 75; |
165: outbits = 331; |
166: outbits = 203; |
167: outbits = 459; |
168: outbits = 43; |
169: outbits = 299; |
170: outbits = 171; |
171: outbits = 427; |
172: outbits = 107; |
173: outbits = 363; |
174: outbits = 235; |
175: outbits = 491; |
176: outbits = 27; |
177: outbits = 283; |
178: outbits = 155; |
179: outbits = 411; |
180: outbits = 91; |
181: outbits = 347; |
182: outbits = 219; |
183: outbits = 475; |
184: outbits = 59; |
185: outbits = 315; |
186: outbits = 187; |
187: outbits = 443; |
188: outbits = 123; |
189: outbits = 379; |
190: outbits = 251; |
191: outbits = 507; |
192: outbits = 7; |
193: outbits = 263; |
194: outbits = 135; |
195: outbits = 391; |
196: outbits = 71; |
197: outbits = 327; |
198: outbits = 199; |
199: outbits = 455; |
200: outbits = 39; |
201: outbits = 295; |
202: outbits = 167; |
203: outbits = 423; |
204: outbits = 103; |
205: outbits = 359; |
206: outbits = 231; |
207: outbits = 487; |
208: outbits = 23; |
209: outbits = 279; |
210: outbits = 151; |
211: outbits = 407; |
212: outbits = 87; |
213: outbits = 343; |
214: outbits = 215; |
215: outbits = 471; |
216: outbits = 55; |
217: outbits = 311; |
218: outbits = 183; |
219: outbits = 439; |
220: outbits = 119; |
221: outbits = 375; |
222: outbits = 247; |
223: outbits = 503; |
224: outbits = 15; |
225: outbits = 271; |
226: outbits = 143; |
227: outbits = 399; |
228: outbits = 79; |
229: outbits = 335; |
230: outbits = 207; |
231: outbits = 463; |
232: outbits = 47; |
233: outbits = 303; |
234: outbits = 175; |
235: outbits = 431; |
236: outbits = 111; |
237: outbits = 367; |
238: outbits = 239; |
239: outbits = 495; |
240: outbits = 31; |
241: outbits = 287; |
242: outbits = 159; |
243: outbits = 415; |
244: outbits = 95; |
245: outbits = 351; |
246: outbits = 223; |
247: outbits = 479; |
248: outbits = 63; |
249: outbits = 319; |
250: outbits = 191; |
251: outbits = 447; |
252: outbits = 127; |
253: outbits = 383; |
254: outbits = 255; |
255: outbits = 511; |
256: outbits = 0; |
257: outbits = 64; |
258: outbits = 32; |
259: outbits = 96; |
260: outbits = 16; |
261: outbits = 80; |
262: outbits = 48; |
263: outbits = 112; |
264: outbits = 8; |
265: outbits = 72; |
266: outbits = 40; |
267: outbits = 104; |
268: outbits = 24; |
269: outbits = 88; |
270: outbits = 56; |
271: outbits = 120; |
272: outbits = 4; |
273: outbits = 68; |
274: outbits = 36; |
275: outbits = 100; |
276: outbits = 20; |
277: outbits = 84; |
278: outbits = 52; |
279: outbits = 116; |
280: outbits = 3; |
281: outbits = 131; |
282: outbits = 67; |
283: outbits = 195; |
284: outbits = 35; |
285: outbits = 163; |
286: outbits = 99; |
default: outbits = 227; |
endcase |
oaddr <= do; |
obyte <= MYHDL25_put(outbits, outlen); |
MYHDL26_put_adv(outbits, outlen); |
obyte <= MYHDL23_put(outbits, outlen); |
MYHDL24_put_adv(outbits, outlen); |
state <= 5'b10110; |
end |
end |
1677,25 → 2565,19
codeLength[stat_i] <= 8; |
end |
numCodeLength <= 288; |
cur_HF1 <= 0; |
state <= 5'b00111; |
// if cur_static < 288: |
// if cur_static < 144: |
// codeLength[cur_static].next = 8 |
// elif cur_static < 256: |
// codeLength[cur_static].next = 9 |
// elif cur_static < 280: |
// codeLength[cur_static].next = 7 |
// else: |
// codeLength[cur_static].next = 8 |
// cur_static.next = cur_static + 1 |
// else: |
// numCodeLength.next = 288 |
// cur_HF1.next = 0 |
// state.next = d_state.HF1 |
if (do_compress) begin |
state <= 5'b10110; |
end |
else begin |
cur_HF1 <= 0; |
state <= 5'b00111; |
end |
end |
5'b00010: begin |
if ((!filled)) begin |
if (((!1'b1) || (!1'b0))) begin |
// pass |
end |
else if ((!filled)) begin |
filled <= 1'b1; |
end |
else if ((nb < 4)) begin |
1702,23 → 2584,27
// pass |
end |
else if ((numLiterals == 0)) begin |
numLiterals <= (257 + MYHDL35_get4(0, 5)); |
$write("%h", di); |
$write(" "); |
$write("%h", isize); |
$write("\n"); |
numLiterals <= (257 + MYHDL33_get4(0, 5)); |
$write("NL:"); |
$write(" "); |
$write("%0d", (257 + MYHDL36_get4(0, 5))); |
$write("%0d", (257 + MYHDL34_get4(0, 5))); |
$write("\n"); |
numDistance <= (1 + MYHDL37_get4(5, 5)); |
numDistance <= (1 + MYHDL35_get4(5, 5)); |
$write("ND:"); |
$write(" "); |
$write("%0d", (1 + MYHDL38_get4(5, 5))); |
$write("%0d", (1 + MYHDL36_get4(5, 5))); |
$write("\n"); |
b_numCodeLength <= (4 + MYHDL39_get4(10, 4)); |
b_numCodeLength <= (4 + MYHDL37_get4(10, 4)); |
$write("NCL:"); |
$write(" "); |
$write("%0d", (4 + MYHDL40_get4(10, 4))); |
$write("%0d", (4 + MYHDL38_get4(10, 4))); |
$write("\n"); |
numCodeLength <= 0; |
MYHDL41_adv(14); |
MYHDL39_adv(14); |
end |
else begin |
if ((numCodeLength < 19)) begin |
1744,8 → 2630,8
default: clo_i = 15; |
endcase |
if ((numCodeLength < b_numCodeLength)) begin |
codeLength[clo_i] <= MYHDL42_get4(0, 3); |
MYHDL43_adv(3); |
codeLength[clo_i] <= MYHDL40_get4(0, 3); |
MYHDL41_adv(3); |
end |
else begin |
codeLength[clo_i] <= 0; |
1760,7 → 2646,10
end |
end |
5'b00011: begin |
if ((!filled)) begin |
if (((!1'b1) || (!1'b0))) begin |
// pass |
end |
else if ((!filled)) begin |
filled <= 1'b1; |
end |
else if ((nb < 4)) begin |
1773,16 → 2662,16
lastToken <= code; |
end |
else if ((code == 16)) begin |
howOften <= (3 + MYHDL44_get4(0, 2)); |
howOften <= (3 + MYHDL42_get4(0, 2)); |
n_adv = 2; |
end |
else if ((code == 17)) begin |
howOften <= (3 + MYHDL45_get4(0, 3)); |
howOften <= (3 + MYHDL43_get4(0, 3)); |
lastToken <= 0; |
n_adv = 3; |
end |
else if ((code == 18)) begin |
howOften <= (11 + MYHDL46_get4(0, 7)); |
howOften <= (11 + MYHDL44_get4(0, 7)); |
lastToken <= 0; |
n_adv = 7; |
end |
1790,7 → 2679,7
$finish; |
end |
if ((n_adv != 0)) begin |
MYHDL47_adv(n_adv); |
MYHDL45_adv(n_adv); |
end |
state <= 5'b00100; |
end |
1808,348 → 2697,624
state <= 5'b00110; |
end |
end |
default: begin |
if ((state == 5'b00110)) begin |
if ((cur_i < 288)) begin |
codeLength[cur_i] <= 0; |
cur_i <= (cur_i + 1); |
5'b00110: begin |
if ((!1'b1)) begin |
// pass |
end |
else if ((cur_i < 320)) begin |
codeLength[cur_i] <= 0; |
cur_i <= (cur_i + 1); |
end |
else begin |
method <= 3; |
cur_HF1 <= 0; |
state <= 5'b00111; |
end |
end |
5'b00101: begin |
if ((1'b1 && 1'b0)) begin |
$write("DISTTREE"); |
$write("\n"); |
for (dist_i=0; dist_i<32; dist_i=dist_i+1) begin |
codeLength[dist_i] <= distanceLength[dist_i]; |
end |
numCodeLength <= 32; |
method <= 4; |
cur_HF1 <= 0; |
state <= 5'b00111; |
end |
end |
5'b00100: begin |
if ((!1'b1)) begin |
// pass |
end |
else if ((howOften != 0)) begin |
codeLength[numCodeLength] <= lastToken; |
howOften <= (howOften - 1); |
numCodeLength <= (numCodeLength + 1); |
end |
else if ((numCodeLength < (numLiterals + numDistance))) begin |
cur_next <= 0; |
state <= 5'b10011; |
end |
else begin |
state <= 5'b00011; |
end |
end |
5'b00111: begin |
if (1'b1) begin |
if ((cur_HF1 < 16)) begin |
bitLengthCount[cur_HF1] <= 0; |
end |
if (((cur_HF1 < 1) && 1'b0)) begin |
d_leaves[cur_HF1] <= 0; |
end |
if (((method != 4) && (cur_HF1 < 512))) begin |
lwaddr <= cur_HF1; |
wleaf <= 0; |
end |
limit = 512; |
if (((method == 4) && 1'b0)) begin |
limit = 1; |
end |
if ((cur_HF1 < limit)) begin |
cur_HF1 <= (cur_HF1 + 1); |
end |
else begin |
numCodeLength <= 288; |
method <= 3; |
cur_HF1 <= 0; |
state <= 5'b00111; |
$write("DID HF1 INIT"); |
$write("\n"); |
cur_i <= 0; |
state <= 5'b01000; |
end |
end |
end |
5'b01000: begin |
if ((!1'b1)) begin |
// pass |
end |
else if ((cur_i < numCodeLength)) begin |
j = codeLength[cur_i]; |
bitLengthCount[j] <= (bitLengthCount[j] + 1); |
cur_i <= (cur_i + 1); |
end |
else begin |
case (state) |
5'b00101: begin |
$write("DISTTREE"); |
$write("\n"); |
for (dist_i=0; dist_i<32; dist_i=dist_i+1) begin |
codeLength[dist_i] <= distanceLength[dist_i]; |
end |
numCodeLength <= 32; |
method <= 4; |
cur_HF1 <= 0; |
state <= 5'b00111; |
bitLengthCount[0] <= 0; |
state <= 5'b01001; |
cur_i <= 1; |
if ((method == 4)) begin |
d_maxBits <= 0; |
end |
else begin |
maxBits <= 0; |
end |
minBits <= 15; |
end |
end |
5'b01001: begin |
if ((!1'b1)) begin |
// pass |
end |
else if ((cur_i <= 15)) begin |
if ((bitLengthCount[cur_i] != 0)) begin |
if ((cur_i < minBits)) begin |
minBits <= cur_i; |
end |
5'b00100: begin |
if ((howOften != 0)) begin |
codeLength[numCodeLength] <= lastToken; |
howOften <= (howOften - 1); |
numCodeLength <= (numCodeLength + 1); |
if ((method == 4)) begin |
if ((cur_i > d_maxBits)) begin |
d_maxBits <= cur_i; |
end |
else if ((numCodeLength < (numLiterals + numDistance))) begin |
cur_next <= 0; |
state <= 5'b10011; |
end |
else begin |
state <= 5'b00011; |
end |
end |
5'b00111: begin |
if ((cur_HF1 < 16)) begin |
bitLengthCount[cur_HF1] <= 0; |
else begin |
if ((cur_i > maxBits)) begin |
maxBits <= cur_i; |
end |
if ((cur_HF1 < 128)) begin |
d_leaves[cur_HF1] <= 0; |
end |
if (((method != 4) && (cur_HF1 < 512))) begin |
lwaddr <= cur_HF1; |
wleaf <= 0; |
end |
limit = 512; |
if ((method == 4)) begin |
limit = 128; |
end |
if ((cur_HF1 < limit)) begin |
cur_HF1 <= (cur_HF1 + 1); |
end |
else begin |
$write("DID HF1 INIT"); |
$write("\n"); |
cur_i <= 0; |
state <= 5'b01000; |
end |
end |
5'b01000: begin |
if ((cur_i < numCodeLength)) begin |
j = codeLength[cur_i]; |
bitLengthCount[j] <= (bitLengthCount[j] + 1); |
cur_i <= (cur_i + 1); |
end |
else begin |
bitLengthCount[0] <= 0; |
state <= 5'b01001; |
cur_i <= 1; |
if ((method == 4)) begin |
d_maxBits <= 0; |
end |
else begin |
maxBits <= 0; |
end |
minBits <= 15; |
end |
end |
cur_i <= (cur_i + 1); |
end |
else begin |
$write("%h", minBits); |
$write(" "); |
$write("%h", maxBits); |
$write("\n"); |
t = 10; |
if (((method == 4) && 1'b0)) begin |
if ((t > d_maxBits)) begin |
t = d_maxBits; |
end |
5'b01001: begin |
if ((cur_i <= 15)) begin |
if ((bitLengthCount[cur_i] != 0)) begin |
if ((cur_i < minBits)) begin |
minBits <= cur_i; |
end |
if ((method == 4)) begin |
if ((cur_i > d_maxBits)) begin |
d_maxBits <= cur_i; |
end |
end |
else begin |
if ((cur_i > maxBits)) begin |
maxBits <= cur_i; |
end |
end |
end |
cur_i <= (cur_i + 1); |
end |
else begin |
$write("%h", minBits); |
$write(" "); |
$write("%h", maxBits); |
$write("\n"); |
t = 10; |
if ((method == 4)) begin |
if ((t > d_maxBits)) begin |
t = d_maxBits; |
end |
d_instantMaxBit <= t; |
d_instantMask <= ((1 << t) - 1); |
end |
else begin |
if ((t > maxBits)) begin |
t = maxBits; |
end |
instantMaxBit <= t; |
instantMask <= ((1 << t) - 1); |
end |
$write("%0d", ((1 << t) - 1)); |
$write("\n"); |
state <= 5'b01010; |
cur_i <= minBits; |
code <= 0; |
for (hf2_i=0; hf2_i<15; hf2_i=hf2_i+1) begin |
nextCode[hf2_i] <= 0; |
end |
$write("to HF3"); |
$write("\n"); |
end |
d_instantMaxBit <= t; |
d_instantMask <= ((1 << t) - 1); |
end |
else begin |
if ((t > maxBits)) begin |
t = maxBits; |
end |
5'b01010: begin |
amb = maxBits; |
if ((method == 4)) begin |
amb = d_maxBits; |
end |
if ((cur_i <= amb)) begin |
ncode = ((code + bitLengthCount[($signed({1'b0, cur_i}) - 1)]) << 1); |
code <= ncode; |
nextCode[cur_i] <= ncode; |
cur_i <= (cur_i + 1); |
end |
else begin |
state <= 5'b01011; |
cur_i <= 0; |
spread_i <= 0; |
$write("to HF4"); |
$write("\n"); |
end |
instantMaxBit <= t; |
instantMask <= ((1 << t) - 1); |
end |
$write("%0d", ((1 << t) - 1)); |
$write("\n"); |
state <= 5'b01010; |
cur_i <= minBits; |
code <= 0; |
for (hf2_i=0; hf2_i<16; hf2_i=hf2_i+1) begin |
nextCode[hf2_i] <= 0; |
end |
$write("to HF3"); |
$write("\n"); |
end |
end |
5'b01010: begin |
if (1'b1) begin |
amb = maxBits; |
if (((method == 4) && 1'b0)) begin |
amb = d_maxBits; |
end |
if ((cur_i <= amb)) begin |
ncode = ((code + bitLengthCount[($signed({1'b0, cur_i}) - 1)]) << 1); |
code <= ncode; |
nextCode[cur_i] <= ncode; |
cur_i <= (cur_i + 1); |
end |
else begin |
state <= 5'b01011; |
cur_i <= 0; |
spread_i <= 0; |
$write("to HF4"); |
$write("\n"); |
end |
end |
end |
5'b01100: begin |
if (1'b1) begin |
canonical = nextCode[bits]; |
nextCode[bits] <= (nextCode[bits] + 1); |
if ((bits > 15)) begin |
$finish; |
end |
reverse <= MYHDL52_rev_bits(canonical, bits); |
leaf <= MYHDL53_makeLeaf(spread_i, bits); |
state <= 5'b01101; |
end |
end |
5'b01101: begin |
if ((!1'b1)) begin |
// pass |
end |
else if (((method == 4) && 1'b0)) begin |
d_leaves[reverse] <= leaf; |
if ((bits <= d_instantMaxBit)) begin |
if (((reverse + (1 << bits)) <= d_instantMask)) begin |
step <= (1 << bits); |
spread <= (reverse + (1 << bits)); |
state <= 5'b10010; |
end |
5'b01100: begin |
canonical = nextCode[bits]; |
nextCode[bits] <= (nextCode[bits] + 1); |
if ((bits > 15)) begin |
$finish; |
end |
reverse <= MYHDL54_rev_bits(canonical, bits); |
leaf <= MYHDL55_makeLeaf(spread_i, bits); |
state <= 5'b01101; |
else begin |
spread_i <= (spread_i + 1); |
state <= 5'b01011; |
end |
5'b01101: begin |
if ((method == 4)) begin |
d_leaves[reverse] <= leaf; |
if ((bits <= d_instantMaxBit)) begin |
if (((reverse + (1 << bits)) <= d_instantMask)) begin |
step <= (1 << bits); |
spread <= (reverse + (1 << bits)); |
state <= 5'b10010; |
end |
else begin |
spread_i <= (spread_i + 1); |
state <= 5'b01011; |
end |
end |
else begin |
state <= 5'b01011; |
spread_i <= (spread_i + 1); |
end |
end |
else begin |
wleaf <= leaf; |
lwaddr <= reverse; |
code_bits[spread_i] <= reverse; |
if ((bits <= instantMaxBit)) begin |
if (((reverse + (1 << bits)) <= instantMask)) begin |
step <= (1 << bits); |
spread <= (reverse + (1 << bits)); |
state <= 5'b10010; |
end |
else begin |
spread_i <= (spread_i + 1); |
state <= 5'b01011; |
end |
end |
else begin |
spread_i <= (spread_i + 1); |
state <= 5'b01011; |
end |
end |
end |
else begin |
state <= 5'b01011; |
spread_i <= (spread_i + 1); |
end |
end |
else begin |
wleaf <= leaf; |
lwaddr <= reverse; |
if ((bits <= instantMaxBit)) begin |
if (((reverse + (1 << bits)) <= instantMask)) begin |
step <= (1 << bits); |
spread <= (reverse + (1 << bits)); |
state <= 5'b10010; |
end |
5'b01011: begin |
if ((spread_i < numCodeLength)) begin |
bits_next = codeLength[spread_i]; |
if ((bits_next != 0)) begin |
bits <= bits_next; |
state <= 5'b01100; |
end |
else begin |
spread_i <= (spread_i + 1); |
end |
end |
else begin |
if (do_compress) begin |
state <= 5'b10110; |
cur_cstatic <= 0; |
end |
else if ((method == 3)) begin |
state <= 5'b00101; |
end |
else if ((method == 4)) begin |
$write("DEFLATE m2!"); |
$write("\n"); |
state <= 5'b10011; |
end |
else if ((method == 2)) begin |
numCodeLength <= 0; |
state <= 5'b10011; |
end |
else begin |
state <= 5'b10011; |
end |
cur_next <= 0; |
cur_i <= 0; |
end |
else begin |
spread_i <= (spread_i + 1); |
state <= 5'b01011; |
end |
5'b10010: begin |
if ((method == 4)) begin |
d_leaves[spread] <= MYHDL56_makeLeaf(spread_i, codeLength[spread_i]); |
end |
else begin |
lwaddr <= spread; |
wleaf <= MYHDL57_makeLeaf(spread_i, codeLength[spread_i]); |
end |
aim = instantMask; |
if ((method == 4)) begin |
aim = d_instantMask; |
end |
if (($signed({1'b0, spread}) > ($signed({1'b0, aim}) - $signed({1'b0, step})))) begin |
spread_i <= (spread_i + 1); |
state <= 5'b01011; |
end |
else begin |
spread <= (spread + step); |
end |
end |
5'b10011: begin |
if ((!filled)) begin |
filled <= 1'b1; |
end |
else if ((nb < 4)) begin |
// pass |
end |
else if ((cur_next == 0)) begin |
cto = MYHDL58_get4(0, maxBits); |
cur_next <= 1; |
mask = ((1 << instantMaxBit) - 1); |
leaf <= leaves[(cto & mask)]; |
end |
else begin |
if ((MYHDL59_get_bits(leaf) < 1)) begin |
$write("< 1 bits: "); |
$write("\n"); |
$finish; |
end |
MYHDL61_adv(MYHDL60_get_bits(leaf)); |
if ((MYHDL62_get_code(leaf) == 0)) begin |
$write("leaf 0"); |
$write("\n"); |
end |
code <= MYHDL63_get_code(leaf); |
if ((method == 2)) begin |
state <= 5'b00011; |
end |
else begin |
state <= 5'b10100; |
end |
end |
end |
5'b01111: begin |
if ((!filled)) begin |
filled <= 1'b1; |
end |
else if ((nb < 4)) begin |
// pass |
end |
else begin |
token = (code - 257); |
case (token) |
0: extraLength = 0; |
1: extraLength = 0; |
2: extraLength = 0; |
3: extraLength = 0; |
4: extraLength = 0; |
5: extraLength = 0; |
6: extraLength = 0; |
7: extraLength = 0; |
8: extraLength = 1; |
9: extraLength = 1; |
10: extraLength = 1; |
11: extraLength = 1; |
12: extraLength = 2; |
13: extraLength = 2; |
14: extraLength = 2; |
15: extraLength = 2; |
16: extraLength = 3; |
17: extraLength = 3; |
18: extraLength = 3; |
19: extraLength = 3; |
20: extraLength = 4; |
21: extraLength = 4; |
22: extraLength = 4; |
23: extraLength = 4; |
24: extraLength = 5; |
25: extraLength = 5; |
26: extraLength = 5; |
27: extraLength = 5; |
default: extraLength = 0; |
endcase |
cto = MYHDL64_get4(extraLength, d_maxBits); |
mask = ((1 << d_instantMaxBit) - 1); |
leaf <= d_leaves[(cto & mask)]; |
state <= 5'b10000; |
end |
end |
5'b10000: begin |
if ((MYHDL65_get_bits(leaf) == 0)) begin |
$finish; |
end |
end |
else begin |
spread_i <= (spread_i + 1); |
state <= 5'b01011; |
end |
end |
end |
5'b01011: begin |
if ((!1'b1)) begin |
// pass |
end |
else if ((spread_i < numCodeLength)) begin |
bits_next = codeLength[spread_i]; |
if ((bits_next != 0)) begin |
bits <= bits_next; |
state <= 5'b01100; |
end |
else begin |
spread_i <= (spread_i + 1); |
end |
end |
else begin |
if (do_compress) begin |
state <= 5'b10110; |
cur_cstatic <= 0; |
end |
else if (((method == 3) && 1'b0)) begin |
state <= 5'b00101; |
end |
else if (((method == 4) && 1'b0)) begin |
$write("DEFLATE m2!"); |
$write("\n"); |
state <= 5'b10011; |
end |
else if (((method == 2) && 1'b0)) begin |
numCodeLength <= 0; |
state <= 5'b10011; |
end |
else begin |
state <= 5'b10011; |
end |
cur_next <= 0; |
cur_i <= 0; |
end |
end |
5'b10010: begin |
if (1'b1) begin |
if (((method == 4) && 1'b0)) begin |
d_leaves[spread] <= MYHDL54_makeLeaf(spread_i, codeLength[spread_i]); |
end |
else begin |
lwaddr <= spread; |
wleaf <= MYHDL55_makeLeaf(spread_i, codeLength[spread_i]); |
end |
aim = instantMask; |
if (((method == 4) && 1'b0)) begin |
aim = d_instantMask; |
end |
if (($signed({1'b0, spread}) > ($signed({1'b0, aim}) - $signed({1'b0, step})))) begin |
spread_i <= (spread_i + 1); |
state <= 5'b01011; |
end |
else begin |
spread <= (spread + step); |
end |
end |
end |
5'b10011: begin |
if ((!1'b1)) begin |
// pass |
end |
else if ((!filled)) begin |
filled <= 1'b1; |
end |
else if ((nb < 4)) begin |
// pass |
end |
else if ((cur_next == 0)) begin |
cto = MYHDL56_get4(0, maxBits); |
mask = ((1 << instantMaxBit) - 1); |
lraddr <= (cto & mask); |
filled <= 1'b0; |
cur_next <= (instantMaxBit + 1); |
end |
else if ((MYHDL57_get_bits(rleaf) >= cur_next)) begin |
$write("CACHE MISS"); |
$write(" "); |
$write("%h", cur_next); |
$write("\n"); |
cto = MYHDL58_get4(0, maxBits); |
mask = ((1 << cur_next) - 1); |
lraddr <= (cto & mask); |
filled <= 1'b0; |
cur_next <= (cur_next + 1); |
end |
else begin |
if ((MYHDL59_get_bits(rleaf) < 1)) begin |
$write("< 1 bits: "); |
$write("\n"); |
$finish; |
end |
MYHDL61_adv(MYHDL60_get_bits(rleaf)); |
// if get_code(leaf) == 0: |
// print("leaf 0", di, isize) |
code <= MYHDL62_get_code(rleaf); |
if (((method == 2) && 1'b0)) begin |
state <= 5'b00011; |
end |
else begin |
state <= 5'b10100; |
end |
end |
end |
5'b01111: begin |
if (((!1'b1) || (!1'b0))) begin |
// pass |
end |
else if ((!filled)) begin |
filled <= 1'b1; |
end |
else if ((nb < 4)) begin |
// pass |
end |
else if ((cur_next == 0)) begin |
if ((d_instantMaxBit > 10)) begin |
$finish; |
end |
token = (code - 257); |
case (token) |
0: extraLength = 0; |
1: extraLength = 0; |
2: extraLength = 0; |
3: extraLength = 0; |
4: extraLength = 0; |
5: extraLength = 0; |
6: extraLength = 0; |
7: extraLength = 0; |
8: extraLength = 1; |
9: extraLength = 1; |
10: extraLength = 1; |
11: extraLength = 1; |
12: extraLength = 2; |
13: extraLength = 2; |
14: extraLength = 2; |
15: extraLength = 2; |
16: extraLength = 3; |
17: extraLength = 3; |
18: extraLength = 3; |
19: extraLength = 3; |
20: extraLength = 4; |
21: extraLength = 4; |
22: extraLength = 4; |
23: extraLength = 4; |
24: extraLength = 5; |
25: extraLength = 5; |
26: extraLength = 5; |
27: extraLength = 5; |
default: extraLength = 0; |
endcase |
cto = MYHDL63_get4(extraLength, d_maxBits); |
mask = ((1 << d_instantMaxBit) - 1); |
leaf <= d_leaves[(cto & mask)]; |
cur_next <= (instantMaxBit + 1); |
end |
else if ((MYHDL64_get_bits(leaf) >= cur_next)) begin |
$write("DCACHE MISS"); |
$write(" "); |
$write("%h", cur_next); |
$write("\n"); |
token = (code - 257); |
case (token) |
0: extraLength = 0; |
1: extraLength = 0; |
2: extraLength = 0; |
3: extraLength = 0; |
4: extraLength = 0; |
5: extraLength = 0; |
6: extraLength = 0; |
7: extraLength = 0; |
8: extraLength = 1; |
9: extraLength = 1; |
10: extraLength = 1; |
11: extraLength = 1; |
12: extraLength = 2; |
13: extraLength = 2; |
14: extraLength = 2; |
15: extraLength = 2; |
16: extraLength = 3; |
17: extraLength = 3; |
18: extraLength = 3; |
19: extraLength = 3; |
20: extraLength = 4; |
21: extraLength = 4; |
22: extraLength = 4; |
23: extraLength = 4; |
24: extraLength = 5; |
25: extraLength = 5; |
26: extraLength = 5; |
27: extraLength = 5; |
default: extraLength = 0; |
endcase |
cto = MYHDL65_get4(extraLength, d_maxBits); |
mask = ((1 << cur_next) - 1); |
leaf <= d_leaves[(cto & mask)]; |
cur_next <= (cur_next + 1); |
end |
else begin |
state <= 5'b10000; |
end |
end |
5'b10000: begin |
if ((1'b1 && 1'b0)) begin |
if ((MYHDL66_get_bits(leaf) == 0)) begin |
$finish; |
end |
token = (code - 257); |
case (token) |
0: tlength = 3; |
1: tlength = 4; |
2: tlength = 5; |
3: tlength = 6; |
4: tlength = 7; |
5: tlength = 8; |
6: tlength = 9; |
7: tlength = 10; |
8: tlength = 11; |
9: tlength = 13; |
10: tlength = 15; |
11: tlength = 17; |
12: tlength = 19; |
13: tlength = 23; |
14: tlength = 27; |
15: tlength = 31; |
16: tlength = 35; |
17: tlength = 43; |
18: tlength = 51; |
19: tlength = 59; |
20: tlength = 67; |
21: tlength = 83; |
22: tlength = 99; |
23: tlength = 115; |
24: tlength = 131; |
25: tlength = 163; |
26: tlength = 195; |
27: tlength = 227; |
default: tlength = 258; |
endcase |
case (token) |
0: extraLength = 0; |
1: extraLength = 0; |
2: extraLength = 0; |
3: extraLength = 0; |
4: extraLength = 0; |
5: extraLength = 0; |
6: extraLength = 0; |
7: extraLength = 0; |
8: extraLength = 1; |
9: extraLength = 1; |
10: extraLength = 1; |
11: extraLength = 1; |
12: extraLength = 2; |
13: extraLength = 2; |
14: extraLength = 2; |
15: extraLength = 2; |
16: extraLength = 3; |
17: extraLength = 3; |
18: extraLength = 3; |
19: extraLength = 3; |
20: extraLength = 4; |
21: extraLength = 4; |
22: extraLength = 4; |
23: extraLength = 4; |
24: extraLength = 5; |
25: extraLength = 5; |
26: extraLength = 5; |
27: extraLength = 5; |
default: extraLength = 0; |
endcase |
tlength = tlength + MYHDL67_get4(0, extraLength); |
distanceCode = MYHDL68_get_code(leaf); |
case (distanceCode) |
0: distance = 1; |
1: distance = 2; |
2: distance = 3; |
3: distance = 4; |
4: distance = 5; |
5: distance = 7; |
6: distance = 9; |
7: distance = 13; |
8: distance = 17; |
9: distance = 25; |
10: distance = 33; |
11: distance = 49; |
12: distance = 65; |
13: distance = 97; |
14: distance = 129; |
15: distance = 193; |
16: distance = 257; |
17: distance = 385; |
18: distance = 513; |
19: distance = 769; |
20: distance = 1025; |
21: distance = 1537; |
22: distance = 2049; |
23: distance = 3073; |
24: distance = 4097; |
25: distance = 6145; |
26: distance = 8193; |
27: distance = 12289; |
28: distance = 16385; |
default: distance = 24577; |
endcase |
case ($signed(distanceCode >>> 1)) |
0: moreBits = 0; |
1: moreBits = 0; |
2: moreBits = 1; |
3: moreBits = 2; |
4: moreBits = 3; |
5: moreBits = 4; |
6: moreBits = 5; |
7: moreBits = 6; |
8: moreBits = 7; |
9: moreBits = 8; |
10: moreBits = 9; |
11: moreBits = 10; |
12: moreBits = 11; |
13: moreBits = 12; |
default: moreBits = 13; |
endcase |
mored = MYHDL70_get4((extraLength + MYHDL69_get_bits(leaf)), moreBits); |
distance = distance + mored; |
if ((distance > $signed({1'b0, do}))) begin |
$write("%0d", distance); |
$write(" "); |
$write("%h", do); |
$write("\n"); |
$finish; |
end |
MYHDL72_adv(((moreBits + extraLength) + MYHDL71_get_bits(leaf))); |
offset <= (($signed({1'b0, do}) - distance) & 32767); |
length <= tlength; |
cur_i <= 0; |
oraddr <= ($signed({1'b0, do}) - distance); |
state <= 5'b10101; |
end |
end |
5'b10100: begin |
if ((!1'b1)) begin |
// pass |
end |
else if ((!filled)) begin |
filled <= 1'b1; |
end |
else if ((nb < 4)) begin |
// pass |
end |
else if ((($signed({1'b0, di}) >= ($signed({1'b0, isize}) - 4)) && (!(i_mode == 0)))) begin |
// pass |
end |
else if ((do >= (i_raddr + 32768))) begin |
// pass |
end |
else if (($signed({1'b0, di}) > ($signed({1'b0, isize}) - 3))) begin |
state <= 5'b00000; |
o_done <= 1'b1; |
$write("NO EOF "); |
$write(" "); |
$write("%h", di); |
$write("\n"); |
$finish; |
end |
else if ((code == 256)) begin |
$write("EOF:"); |
$write(" "); |
$write("%h", di); |
$write(" "); |
$write("%h", do); |
$write("\n"); |
if ((!final)) begin |
state <= 5'b00001; |
filled <= 1'b0; |
$write("New Block!"); |
$write("\n"); |
end |
else begin |
o_done <= 1'b1; |
state <= 5'b00000; |
end |
end |
else begin |
if ((code < 256)) begin |
oaddr <= do; |
obyte <= code; |
o_oprogress <= (do + 1); |
do <= (do + 1); |
cur_next <= 0; |
state <= 5'b10011; |
end |
else if ((code == 300)) begin |
$finish; |
end |
else begin |
if (static) begin |
token = (code - 257); |
case (token) |
0: tlength = 3; |
2213,8 → 3378,9
27: extraLength = 5; |
default: extraLength = 0; |
endcase |
tlength = tlength + MYHDL66_get4(0, extraLength); |
distanceCode = MYHDL67_get_code(leaf); |
tlength = tlength + MYHDL73_get4(0, extraLength); |
t = MYHDL74_get4(extraLength, 5); |
distanceCode = MYHDL75_rev_bits(t, 5); |
case (distanceCode) |
0: distance = 1; |
1: distance = 2; |
2264,9 → 3430,8
13: moreBits = 12; |
default: moreBits = 13; |
endcase |
mored = MYHDL69_get4((extraLength + MYHDL68_get_bits(leaf)), moreBits); |
distance = distance + mored; |
MYHDL71_adv(((moreBits + extraLength) + MYHDL70_get_bits(leaf))); |
distance = distance + MYHDL76_get4((extraLength + 5), moreBits); |
MYHDL77_adv(((extraLength + 5) + moreBits)); |
offset <= ($signed({1'b0, do}) - distance); |
length <= tlength; |
cur_i <= 0; |
2273,260 → 3438,97
oraddr <= ($signed({1'b0, do}) - distance); |
state <= 5'b10101; |
end |
default: begin |
if ((state == 5'b10100)) begin |
if ((!filled)) begin |
filled <= 1'b1; |
end |
else if ((nb < 4)) begin |
// pass |
end |
else if ((di > isize)) begin |
state <= 5'b00000; |
o_done <= 1'b1; |
$write("NO EOF "); |
$write(" "); |
$write("%h", di); |
$write("\n"); |
$finish; |
end |
else if ((code == 256)) begin |
$write("EOF:"); |
$write(" "); |
$write("%h", di); |
$write(" "); |
$write("%h", do); |
$write("\n"); |
if ((!final)) begin |
state <= 5'b00001; |
end |
else begin |
o_done <= 1'b1; |
o_oprogress <= do; |
state <= 5'b00000; |
end |
end |
else begin |
if ((code < 256)) begin |
oaddr <= do; |
obyte <= code; |
o_oprogress <= (do + 1); |
do <= (do + 1); |
cur_next <= 0; |
state <= 5'b10011; |
end |
else if ((code == 300)) begin |
$finish; |
end |
else begin |
if (static) begin |
token = (code - 257); |
case (token) |
0: tlength = 3; |
1: tlength = 4; |
2: tlength = 5; |
3: tlength = 6; |
4: tlength = 7; |
5: tlength = 8; |
6: tlength = 9; |
7: tlength = 10; |
8: tlength = 11; |
9: tlength = 13; |
10: tlength = 15; |
11: tlength = 17; |
12: tlength = 19; |
13: tlength = 23; |
14: tlength = 27; |
15: tlength = 31; |
16: tlength = 35; |
17: tlength = 43; |
18: tlength = 51; |
19: tlength = 59; |
20: tlength = 67; |
21: tlength = 83; |
22: tlength = 99; |
23: tlength = 115; |
24: tlength = 131; |
25: tlength = 163; |
26: tlength = 195; |
27: tlength = 227; |
default: tlength = 258; |
endcase |
case (token) |
0: extraLength = 0; |
1: extraLength = 0; |
2: extraLength = 0; |
3: extraLength = 0; |
4: extraLength = 0; |
5: extraLength = 0; |
6: extraLength = 0; |
7: extraLength = 0; |
8: extraLength = 1; |
9: extraLength = 1; |
10: extraLength = 1; |
11: extraLength = 1; |
12: extraLength = 2; |
13: extraLength = 2; |
14: extraLength = 2; |
15: extraLength = 2; |
16: extraLength = 3; |
17: extraLength = 3; |
18: extraLength = 3; |
19: extraLength = 3; |
20: extraLength = 4; |
21: extraLength = 4; |
22: extraLength = 4; |
23: extraLength = 4; |
24: extraLength = 5; |
25: extraLength = 5; |
26: extraLength = 5; |
27: extraLength = 5; |
default: extraLength = 0; |
endcase |
tlength = tlength + MYHDL72_get4(0, extraLength); |
t = MYHDL73_get4(extraLength, 5); |
distanceCode = MYHDL74_rev_bits(t, 5); |
case (distanceCode) |
0: distance = 1; |
1: distance = 2; |
2: distance = 3; |
3: distance = 4; |
4: distance = 5; |
5: distance = 7; |
6: distance = 9; |
7: distance = 13; |
8: distance = 17; |
9: distance = 25; |
10: distance = 33; |
11: distance = 49; |
12: distance = 65; |
13: distance = 97; |
14: distance = 129; |
15: distance = 193; |
16: distance = 257; |
17: distance = 385; |
18: distance = 513; |
19: distance = 769; |
20: distance = 1025; |
21: distance = 1537; |
22: distance = 2049; |
23: distance = 3073; |
24: distance = 4097; |
25: distance = 6145; |
26: distance = 8193; |
27: distance = 12289; |
28: distance = 16385; |
default: distance = 24577; |
endcase |
case ($signed(distanceCode >>> 1)) |
0: moreBits = 0; |
1: moreBits = 0; |
2: moreBits = 1; |
3: moreBits = 2; |
4: moreBits = 3; |
5: moreBits = 4; |
6: moreBits = 5; |
7: moreBits = 6; |
8: moreBits = 7; |
9: moreBits = 8; |
10: moreBits = 9; |
11: moreBits = 10; |
12: moreBits = 11; |
13: moreBits = 12; |
default: moreBits = 13; |
endcase |
distance = distance + MYHDL75_get4((extraLength + 5), moreBits); |
MYHDL76_adv(((extraLength + 5) + moreBits)); |
offset <= ($signed({1'b0, do}) - distance); |
length <= tlength; |
cur_i <= 0; |
oraddr <= ($signed({1'b0, do}) - distance); |
state <= 5'b10101; |
end |
else begin |
state <= 5'b01111; |
end |
end |
cur_next <= 0; |
end |
else begin |
if ((!1'b0)) begin |
$write("DYNAMIC mode disabled"); |
$write("\n"); |
$finish; |
end |
state <= 5'b01111; |
end |
end |
cur_next <= 0; |
end |
end |
5'b10101: begin |
if ((!1'b1)) begin |
// pass |
end |
else if ((!filled)) begin |
filled <= 1'b1; |
end |
else if ((nb < 4)) begin |
// pass |
end |
else if (((cur_i == 0) && ((do + length) >= (i_raddr + 32768)))) begin |
// pass |
end |
else if (($signed({1'b0, di}) >= ($signed({1'b0, isize}) - 2))) begin |
// pass |
end |
else if ((method == 0)) begin |
if ((cur_i < length)) begin |
oaddr <= do; |
obyte <= b3; |
MYHDL78_adv(8); |
cur_i <= (cur_i + 1); |
do <= (do + 1); |
o_oprogress <= (do + 1); |
end |
else if ((!final)) begin |
MYHDL79_adv(16); |
state <= 5'b00001; |
filled <= 1'b0; |
$write("new block"); |
$write("\n"); |
end |
else begin |
o_done <= 1'b1; |
state <= 5'b00000; |
end |
end |
else if ((cur_i < (length + 2))) begin |
oraddr <= (offset + cur_i); |
if ((cur_i == 1)) begin |
copy1 <= orbyte; |
end |
if ((cur_i == 3)) begin |
copy2 <= orbyte; |
end |
if ((cur_i > 1)) begin |
if ((((offset + cur_i) & 32767) == ((do + 1) & 32767))) begin |
obyte <= copy1; |
end |
else if (((cur_i == 3) || (((offset + cur_i) & 32767) != (do & 32767)))) begin |
obyte <= orbyte; |
end |
else if ((cur_i > 2)) begin |
if ((cur_i & 1)) begin |
obyte <= copy2; |
end |
else begin |
if ((state == 5'b10101)) begin |
if ((!filled)) begin |
filled <= 1'b1; |
end |
else if ((nb < 4)) begin |
// pass |
end |
else if ((method == 0)) begin |
if ((cur_i < length)) begin |
oaddr <= do; |
obyte <= b3; |
MYHDL77_adv(8); |
cur_i <= (cur_i + 1); |
do <= (do + 1); |
o_oprogress <= (do + 1); |
end |
else if ((!final)) begin |
state <= 5'b00001; |
end |
else begin |
o_oprogress <= do; |
o_done <= 1'b1; |
state <= 5'b00000; |
end |
end |
else if ((cur_i < (length + 2))) begin |
oraddr <= (offset + cur_i); |
if ((cur_i == 1)) begin |
copy1 <= orbyte; |
end |
if ((cur_i == 3)) begin |
copy2 <= orbyte; |
end |
if ((cur_i > 1)) begin |
if (((offset + cur_i) == (do + 1))) begin |
obyte <= copy1; |
end |
else begin |
if (((cur_i == 3) || ((offset + cur_i) != do))) begin |
obyte <= orbyte; |
end |
else begin |
if ((cur_i > 2)) begin |
if ((cur_i & 1)) begin |
obyte <= copy2; |
end |
else begin |
obyte <= copy1; |
end |
end |
else begin |
obyte <= copy1; |
end |
end |
end |
oaddr <= do; |
o_oprogress <= (do + 1); |
do <= (do + 1); |
end |
cur_i <= (cur_i + 1); |
end |
else begin |
cur_next <= 0; |
state <= 5'b10011; |
end |
end |
else begin |
$write("unknown state?!"); |
$write("\n"); |
state <= 5'b00000; |
end |
obyte <= copy1; |
end |
end |
endcase |
else begin |
obyte <= copy1; |
end |
oaddr <= do; |
o_oprogress <= (do + 1); |
do <= (do + 1); |
end |
cur_i <= (cur_i + 1); |
end |
else begin |
cur_next <= 0; |
state <= 5'b10011; |
end |
end |
default: begin |
$write("unknown state?!"); |
$write("\n"); |
state <= 5'b00000; |
end |
endcase |
end |
end |
2546,7 → 3548,8
end |
else begin |
if ((isize < 4)) begin |
// pass |
nb <= 0; |
old_di <= 0; |
end |
else if (((i_mode == 4) || (i_mode == 5))) begin |
nb <= 0; |
2559,31 → 3562,28
shift = (($signed({1'b0, di}) - $signed({1'b0, old_di})) * 8); |
// if shift != 0: |
// print("shift", shift, cwindow, b1, b2, b3, b4) |
if ((shift <= 32)) begin |
cwindow <= (($signed({1'b0, cwindow}) << shift) | $signed($signed({1'b0, b14}) >>> (32 - shift))); |
if (1'b1) begin |
cwindow <= (($signed({1'b0, cwindow}) << shift) | $signed($signed({1'b0, b110}) >>> (80 - shift))); |
end |
else if ((shift == 40)) begin |
cwindow <= ((($signed({1'b0, cwindow}) << shift) | (b14 << 8)) | b5); |
else begin |
cwindow <= (($signed({1'b0, cwindow}) << shift) | $signed($signed({1'b0, b15}) >>> (40 - shift))); |
end |
else if (1'b1) begin |
cwindow <= (($signed({1'b0, cwindow}) << shift) | $signed($signed({1'b0, b110}) >>> (80 - shift))); |
end |
end |
if ((old_di == di)) begin |
nb <= 4; |
end |
old_di <= di; |
b1 <= iram[(di & 127)]; |
b2 <= iram[((di + 1) & 127)]; |
b3 <= iram[((di + 2) & 127)]; |
b4 <= iram[((di + 3) & 127)]; |
b5 <= iram[((di + 4) & 127)]; |
b1 <= iram[(di & 63)]; |
b2 <= iram[((di + 1) & 63)]; |
b3 <= iram[((di + 2) & 63)]; |
b4 <= iram[((di + 3) & 63)]; |
b5 <= iram[((di + 4) & 63)]; |
if (1'b1) begin |
b6 <= iram[((di + 5) & 127)]; |
b7 <= iram[((di + 6) & 127)]; |
b8 <= iram[((di + 7) & 127)]; |
b9 <= iram[((di + 8) & 127)]; |
b10 <= iram[((di + 9) & 127)]; |
b6 <= iram[((di + 5) & 63)]; |
b7 <= iram[((di + 6) & 63)]; |
b8 <= iram[((di + 7) & 63)]; |
b9 <= iram[((di + 8) & 63)]; |
b10 <= iram[((di + 9) & 63)]; |
end |
end |
end |
2598,6 → 3598,7
|
always @(posedge clk) begin: DEFLATE_ORAMREAD |
orbyte <= oram[oraddr]; |
rleaf <= leaves[lraddr]; |
end |
|
|
/trunk/test_deflate.py
8,9 → 8,9
always, always_seq, always_comb, enum, Error |
|
from deflate import IDLE, WRITE, READ, STARTC, STARTD, LBSIZE, IBSIZE, \ |
CWINDOW, COMPRESS |
CWINDOW, COMPRESS, DECOMPRESS, OBSIZE, LMAX, LIBSIZE |
|
MAXW = 2 * CWINDOW |
MAXW = CWINDOW |
|
COSIMULATION = True |
COSIMULATION = False |
19,7 → 19,7
from deflate import deflate |
else: |
def deflate(i_mode, o_done, i_data, o_iprogress, o_oprogress, |
o_byte, i_addr, clk, reset): |
o_byte, i_waddr, i_raddr, clk, reset): |
print("Cosimulation") |
cmd = "iverilog -o deflate " + \ |
"deflate.v " + \ |
29,38 → 29,38
i_mode=i_mode, o_done=o_done, |
i_data=i_data, o_iprogress=o_iprogress, |
o_oprogress=o_oprogress, |
o_byte=o_byte, i_addr=i_addr, |
o_byte=o_byte, i_waddr=i_waddr, i_raddr=i_raddr, |
clk=clk, reset=reset) |
|
|
def test_data(m): |
print("MODE", m) |
def test_data(m, tlen=100, limit=False): |
print("MODE", m, tlen) |
if m == 0: |
str_data = " ".join(["Hello World! " + str(1) + " " |
for i in range(100)]) |
for i in range(tlen)]) |
b_data = str_data.encode('utf-8') |
elif m == 1: |
str_data = " ".join([" Hello World! " + str(i) + " " |
# str_data = " ".join(["Hello World! " + str(i) + " " |
for i in range(5)]) |
for i in range(tlen)]) |
b_data = str_data.encode('utf-8') |
elif m == 2: |
str_data = " ".join(["Hi: " + str(random.randrange(0,0x1000)) + " " |
for i in range(100)]) |
for i in range(tlen)]) |
b_data = str_data.encode('utf-8') |
elif m == 3: |
b_data = bytes([random.randrange(0,0x100) for i in range(100)]) |
b_data = bytes([random.randrange(0,0x100) for i in range(tlen)]) |
elif m == 4: |
str_data = "".join([str(random.randrange(0,2)) |
for i in range(1000)]) |
for i in range(tlen)]) |
b_data = str_data.encode('utf-8') |
else: |
raise Error("unknown test mode") |
# print(str_data) |
b_data = b_data[:IBSIZE - 4 - 20] |
if limit: |
b_data = b_data[:IBSIZE - 4 - 10] |
zl_data = zlib.compress(b_data) |
print("From %d to %d bytes" % (len(b_data), len(zl_data))) |
print(zl_data) |
print(zl_data[:500]) |
return b_data, zl_data |
|
|
69,7 → 69,7
def testMain(self): |
|
def test_decompress(i_mode, o_done, i_data, o_iprogress, |
o_oprogress, o_byte, i_addr, clk, reset): |
o_oprogress, o_byte, i_waddr, i_raddr, clk, reset): |
|
def tick(): |
clk.next = not clk |
79,185 → 79,170
print("START TEST MODE", mode) |
print("==========================") |
|
b_data, zl_data = test_data(mode) |
b_data, zl_data = test_data(mode, 25000) |
|
reset.next = 0 |
tick() |
yield delay(5) |
reset.next = 1 |
tick() |
yield delay(5) |
|
print("STARTD") |
i_mode.next = STARTD |
tick() |
yield delay(5) |
tick() |
yield delay(5) |
i_mode.next = IDLE |
|
print("WRITE") |
i_mode.next = WRITE |
i = 0 |
while i < len(zl_data): |
if o_iprogress > i - MAXW: |
# print("write", i) |
i_data.next = zl_data[i] |
i_addr.next = i |
i = i + 1 |
else: |
# print("Wait for space") |
pass |
if mode == 0: |
reset.next = 0 |
tick() |
yield delay(5) |
reset.next = 1 |
tick() |
yield delay(5) |
i_mode.next = IDLE |
print("Wrote input, wait for end of decompression") |
|
# alternative without sliding window: |
""" |
print("WRITE") |
i_mode.next = WRITE |
for i in range(len(zl_data)): |
i_data.next = zl_data[i] |
i_addr.next = i |
tick() |
yield delay(5) |
tick() |
yield delay(5) |
i_mode.next = IDLE |
if DECOMPRESS: |
print("==========STREAMING DECOMPRESS TEST=========") |
|
print("STARTD") |
i_mode.next = STARTD |
tick() |
yield delay(5) |
tick() |
yield delay(5) |
i_mode.next = IDLE |
""" |
print("STREAM LENGTH", len(zl_data)) |
|
print(now()) |
while not o_done: |
i_mode.next = IDLE |
tick() |
yield delay(5) |
tick() |
yield delay(5) |
print(now()) |
|
last = o_oprogress |
print("GOT", last) |
i_mode.next = READ |
d_data = [] |
for i in range(last): |
i_addr.next = i |
print("STARTD") |
i_mode.next = STARTD |
tick() |
yield delay(5) |
tick() |
yield delay(5) |
d_data.append(bytes([o_byte])) |
i_mode.next = IDLE |
|
d_data = b''.join(d_data) |
print("WRITE") |
i = 0 |
ri = 0 |
first = 1 |
sresult = [] |
start = now() |
wait = 0 |
while True: |
if ri >= 1000 and ri % 10000 == 0: |
print(ri) |
if ri < o_oprogress: |
did_read = 1 |
# print("do read", ri, o_oprogress) |
i_mode.next = READ |
i_raddr.next = ri |
tick() |
yield delay(5) |
tick() |
yield delay(5) |
ri = ri + 1 |
else: |
did_read = 0 |
|
self.assertEqual(b_data, d_data, "decompress does NOT match") |
print(len(d_data), len(zl_data)) |
if i < len(zl_data): |
if o_iprogress > i - MAXW: |
i_mode.next = WRITE |
i_waddr.next = i |
i_data.next = zl_data[i] |
# print("write", i, zl_data[i]) |
i = i + 1 |
else: |
# print("Wait for space", i) |
wait += 1 |
else: |
i_mode.next = IDLE |
|
print("==========COMPRESS TEST=========") |
tick() |
yield delay(5) |
tick() |
yield delay(5) |
|
i_mode.next = WRITE |
for i in range(len(b_data)): |
i_data.next = b_data[i] |
i_addr.next = i |
if did_read: |
# print("read", ri, o_oprogress, o_byte) |
sresult.append(bytes([o_byte])) |
|
if o_done: |
# print("DONE", o_oprogress, ri) |
if o_oprogress == ri: |
break; |
|
i_mode.next = IDLE |
tick() |
yield delay(5) |
tick() |
yield delay(5) |
i_mode.next = IDLE |
|
print("IN/OUT/CYCLES/WAIT", len(zl_data), len(sresult), |
(now() - start) // 10, wait) |
sresult = b''.join(sresult) |
self.assertEqual(b_data, sresult) |
# self.assertEqual(b_data[:100000], sresult[:100000]) |
print("Decompress OK!") |
|
print("==========STREAMING COMPRESS TEST=========") |
|
print("STARTC") |
i_mode.next = STARTC |
tick() |
yield delay(5) |
tick() |
yield delay(5) |
i_mode.next = IDLE |
|
print(now()) |
while not o_done: |
tick() |
yield delay(5) |
tick() |
yield delay(5) |
print(now()) |
print("WRITE") |
i = 0 |
ri = 0 |
slen = 25000 |
sresult = [] |
wait = 0 |
start = now() |
while True: |
if ri < o_oprogress: |
did_read = 1 |
# print("do read", ri, o_oprogress) |
i_mode.next = READ |
i_raddr.next = ri |
tick() |
yield delay(5) |
tick() |
yield delay(5) |
if ri % 10000 == 0: |
print(ri) |
ri = ri + 1 |
else: |
did_read = 0 |
|
# raise Error("STOP") |
if i < slen: |
if o_iprogress > i - MAXW: |
i_mode.next = WRITE |
i_waddr.next = i |
i_data.next = b_data[i % len(b_data)] |
# print("write", i, b_data[i % len(b_data)]) |
i = i + 1 |
else: |
# print("Wait for space", i) |
wait += 1 |
else: |
i_mode.next = IDLE |
|
last = o_oprogress |
print("last", last) |
i_mode.next = READ |
c_data = [] |
for i in range(last): |
i_addr.next = i |
tick() |
yield delay(5) |
tick() |
yield delay(5) |
c_data.append(bytes([o_byte])) |
i_mode.next = IDLE |
|
print("b_data:", len(b_data), b_data) |
c_data = b''.join(c_data) |
print("c_data:", len(c_data), c_data) |
print("zl_data:", len(zl_data), zl_data) |
if did_read: |
# print("read", ri, o_oprogress, o_byte) |
sresult.append(bytes([o_byte])) |
|
print("zlib test:", zlib.decompress(c_data)) |
if o_done: |
# print("DONE", o_oprogress, ri) |
if o_oprogress == ri: |
break; |
|
print("WRITE COMPRESSED RESULT") |
i_mode.next = WRITE |
for i in range(len(c_data)): |
i_data.next = c_data[i] |
i_addr.next = i |
tick() |
yield delay(5) |
tick() |
yield delay(5) |
i_mode.next = IDLE |
|
print("STARTD after Compress") |
i_mode.next = STARTD |
tick() |
yield delay(5) |
tick() |
yield delay(5) |
i_mode.next = IDLE |
print("IN/OUT/CYCLES/WAIT", slen, len(sresult), |
(now() - start) // 10, wait) |
sresult = b''.join(sresult) |
print("zlib test:", zlib.decompress(sresult)[:60]) |
rlen = min(len(b_data), slen) |
self.assertEqual(zlib.decompress(sresult)[:rlen], b_data[:rlen]) |
print("DONE!") |
|
print(now()) |
while not o_done: |
tick() |
yield delay(5) |
tick() |
yield delay(5) |
print(now()) |
|
last = o_oprogress |
i_mode.next = READ |
d_data = [] |
for i in range(last): |
i_addr.next = i |
tick() |
yield delay(5) |
tick() |
yield delay(5) |
d_data.append(bytes([o_byte])) |
i_mode.next = IDLE |
|
d_data = b''.join(d_data) |
|
self.assertEqual(b_data, d_data, "decompress after compress does NOT match") |
print(len(b_data), len(zl_data), len(c_data)) |
|
for loop in range(1): |
for mode in range(5): |
# for mode in range(2,3): |
self.runTests(test_decompress) |
|
def runTests(self, test): |
268,18 → 253,19
|
i_data = Signal(intbv()[8:]) |
o_byte = Signal(intbv()[8:]) |
o_iprogress = Signal(intbv()[LBSIZE:]) |
o_oprogress = Signal(intbv()[LBSIZE:]) |
i_addr = Signal(intbv()[LBSIZE:]) |
o_iprogress = Signal(intbv()[LMAX:]) |
o_oprogress = Signal(intbv()[LMAX:]) |
i_waddr = Signal(modbv()[LMAX:]) |
i_raddr = Signal(modbv()[LMAX:]) |
|
clk = Signal(bool(0)) |
reset = ResetSignal(1, 0, True) |
|
dut = deflate(i_mode, o_done, i_data, o_iprogress, o_oprogress, |
o_byte, i_addr, clk, reset) |
o_byte, i_waddr, i_raddr, clk, reset) |
|
check = test(i_mode, o_done, i_data, o_iprogress, o_oprogress, |
o_byte, i_addr, clk, reset) |
o_byte, i_waddr, i_raddr, clk, reset) |
sim = Simulation(dut, check) |
# traceSignals(dut) |
sim.run(quiet=1) |
290,7 → 276,7
@block |
def test_deflate_bench(i_clk, o_led, led0_g, led1_b, led2_r): |
|
u_data, c_data = test_data(1) |
u_data, c_data = test_data(1, 100, IBSIZE) |
|
CDATA = tuple(c_data) |
UDATA = tuple(u_data) |
301,15 → 287,16
i_data = Signal(intbv()[8:]) |
o_byte = Signal(intbv()[8:]) |
u_data = Signal(intbv()[8:]) |
o_iprogress = Signal(intbv()[LBSIZE:]) |
o_oprogress = Signal(intbv()[LBSIZE:]) |
resultlen = Signal(intbv()[LBSIZE:]) |
i_addr = Signal(intbv()[LBSIZE:]) |
o_iprogress = Signal(intbv()[LMAX:]) |
o_oprogress = Signal(intbv()[LMAX:]) |
resultlen = Signal(intbv()[LMAX:]) |
i_waddr = Signal(modbv()[LMAX:]) |
i_raddr = Signal(modbv()[LBSIZE:]) |
|
reset = ResetSignal(1, 0, True) |
|
dut = deflate(i_mode, o_done, i_data, o_iprogress, o_oprogress, |
o_byte, i_addr, i_clk, reset) |
o_byte, i_waddr, i_raddr, i_clk, reset) |
|
tb_state = enum('RESET', 'START', 'WRITE', 'DECOMPRESS', 'WAIT', 'VERIFY', |
'PAUSE', 'CWRITE', 'COMPRESS', 'CWAIT', 'CRESULT', |
384,7 → 371,7
led2_r.next = not led2_r |
i_mode.next = WRITE |
i_data.next = CDATA[tbi] |
i_addr.next = tbi |
i_waddr.next = tbi |
tbi.next = tbi + 1 |
else: |
i_mode.next = IDLE |
400,20 → 387,12
i_mode.next = IDLE |
if i_mode == IDLE and o_done: |
print("result len", o_oprogress) |
if o_oprogress == 0x4F: |
tstate.next = tb_state.HALT |
resultlen.next = o_oprogress |
tbi.next = 0 |
i_addr.next = 0 |
i_raddr.next = 0 |
i_mode.next = READ |
wtick.next = True |
tstate.next = tb_state.VERIFY |
""" |
if o_oprogress == 0x4F: |
tstate.next = tb_state.HALT |
else: |
tstate.next = tb_state.FAIL |
""" |
|
elif tstate == tb_state.VERIFY: |
# print("VERIFY", o_data) |
441,7 → 420,7
else: |
pass |
# print(tbi, o_data) |
i_addr.next = tbi + 1 |
i_raddr.next = tbi + 1 |
tbi.next = tbi + 1 |
wtick.next = True |
else: |
482,7 → 461,7
led1_b.next = not led1_b |
i_mode.next = WRITE |
i_data.next = UDATA[tbi] |
i_addr.next = tbi |
i_waddr.next = tbi |
tbi.next = tbi + 1 |
else: |
print("wrote bytes to compress", tbi) |
503,7 → 482,7
print("result len", o_oprogress) |
resultlen.next = o_oprogress |
tbi.next = 0 |
i_addr.next = 0 |
i_raddr.next = 0 |
i_mode.next = READ |
tstate.next = tb_state.CRESULT |
wtick.next = True |
517,13 → 496,13
if tbi > 0: |
i_mode.next = WRITE |
i_data.next = copy |
i_addr.next = tbi - 1 |
i_waddr.next = tbi - 1 |
wtick.next = False |
tbi.next = tbi + 1 |
elif tbi < resultlen: |
i_mode.next = READ |
led1_b.next = not led1_b |
i_addr.next = tbi |
i_raddr.next = tbi |
copy.next = o_byte |
wtick.next = True |
else: |
544,7 → 523,7
if i_mode == IDLE and o_done: |
print("DONE DECOMPRESS VERIFY", o_oprogress) |
tbi.next = 0 |
i_addr.next = 0 |
i_raddr.next = 0 |
i_mode.next = READ |
wtick.next = True |
tstate.next = tb_state.CVERIFY |
566,7 → 545,7
raise Error("bad result") |
tstate.next = tb_state.FAIL |
tbi.next = tbi + 1 |
i_addr.next = tbi + 1 |
i_raddr.next = tbi + 1 |
wtick.next = True |
else: |
print(len(UDATA)) |