From 50f61407abd5f5800b44a2f6096c7eb89e7bf93b Mon Sep 17 00:00:00 2001 From: Robert Winkler Date: Wed, 15 Jan 2025 13:24:55 +0100 Subject: [PATCH] Fix decoding multiple frames Signed-off-by: Robert Winkler --- xls/modules/zstd/command_constructor.x | 32 +-- xls/modules/zstd/comp_block_dec.x | 170 +++++++++------ xls/modules/zstd/comp_frame.x | 20 +- xls/modules/zstd/dec_mux.x | 22 +- xls/modules/zstd/fse_dec.x | 2 +- xls/modules/zstd/literals_buffer.x | 2 +- xls/modules/zstd/parallel_rams.x | 15 +- xls/modules/zstd/sequence_dec.x | 30 ++- xls/modules/zstd/sequence_executor.x | 284 ++++++++++++++++++------- xls/modules/zstd/zstd_dec.x | 19 +- xls/modules/zstd/zstd_dec_test.x | 1 + 11 files changed, 399 insertions(+), 198 deletions(-) diff --git a/xls/modules/zstd/command_constructor.x b/xls/modules/zstd/command_constructor.x index 9fd3f9eb9d5..5c76fc079b8 100644 --- a/xls/modules/zstd/command_constructor.x +++ b/xls/modules/zstd/command_constructor.x @@ -27,7 +27,7 @@ type CopyOrMatchContent = common::CopyOrMatchContent; type CopyOrMatchLength = common::CopyOrMatchLength; type SequenceExecutorPacket = common::SequenceExecutorPacket; -type LiteralsBufferCtrl = common::LiteralsBufferCtrl; +type LiteralsBufferCtrl = common::LiteralsBufferCtrl; type CommandConstructorData = common::CommandConstructorData; type ExtendedBlockDataPacket = common::ExtendedBlockDataPacket; type BlockSyncData = common::BlockSyncData; @@ -42,7 +42,7 @@ struct State { status: Status, received_literals: CopyOrMatchLength, literals_to_receive: CopyOrMatchLength, - sync: BlockSyncData, + command: CommandConstructorData, } pub proc CommandConstructor { @@ -64,24 +64,29 @@ pub proc CommandConstructor { let tok0 = join(); let recv_command = state.status == Status::RECV_COMMAND; - let (tok1_0, command) = - recv_if(tok0, sequence_decoder_r, recv_command, zero!()); + let (tok1_0, command) = recv_if(tok0, sequence_decoder_r, recv_command, state.command); + if recv_command { + trace_fmt!("[CommandConstructor] Received command: {:#x}", command); + } else {}; let recv_literals = state.status == Status::RECV_LITERALS; - let (tok1_1, literals) = - recv_if(tok0, literals_buffer_resp_r, recv_literals, zero!()); + let (tok1_1, literals) = recv_if(tok0, literals_buffer_resp_r, recv_literals, zero!()); + if recv_literals { + trace_fmt!("[CommandConstructor] Received literals: {:#x}", literals); + } else {}; let tok1 = join(tok1_0, tok1_1); let (new_state, do_send_command, do_send_literals_req) = match (state.status) { Status::RECV_COMMAND => { - if command.data.msg_type == SequenceExecutorMessageType::LITERAL { + if (command.data.msg_type == SequenceExecutorMessageType::LITERAL) && + (command.data.length != CopyOrMatchLength:0) { ( State { status: Status::RECV_LITERALS, received_literals: CopyOrMatchLength:0, literals_to_receive: command.data.length, - sync: command.sync, + command: command, }, false, true, ) } else { @@ -108,7 +113,7 @@ pub proc CommandConstructor { let resp = match(state.status) { // sent only if the original message was of type SEQUENCE Status::RECV_COMMAND => ExtendedBlockDataPacket { - msg_type: SequenceExecutorMessageType::SEQUENCE, + msg_type: command.data.msg_type, packet: BlockDataPacket { last: command.data.last, last_block: command.sync.last_block, @@ -120,9 +125,9 @@ pub proc CommandConstructor { Status::RECV_LITERALS => ExtendedBlockDataPacket { msg_type: SequenceExecutorMessageType::LITERAL, packet: BlockDataPacket { - last: literals.last, - last_block: state.sync.last_block, - id: state.sync.id, + last: literals.last & command.data.last, + last_block: command.sync.last_block, + id: command.sync.id, data: literals.content, length: literals.length as u32, // FIXME: remove cast after unifying types of 'length' fields } @@ -130,6 +135,9 @@ pub proc CommandConstructor { _ => fail!("resp_match_unreachable", zero!()) }; send_if(tok1, command_aggregator_s, do_send_command, resp); + if do_send_command { + trace_fmt!("[CommandConstructor] Sending command: {:#x}", resp); + } else {}; new_state } diff --git a/xls/modules/zstd/comp_block_dec.x b/xls/modules/zstd/comp_block_dec.x index 9a47caffd16..94a3912ed66 100644 --- a/xls/modules/zstd/comp_block_dec.x +++ b/xls/modules/zstd/comp_block_dec.x @@ -512,27 +512,27 @@ const COMP_BLOCK_DEC_TESTCASES: (u32, u64[64], u32, ExtendedPacket[128])[7] = [ ExtendedPacket[128]:[ ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x431fba7f9f155239, length: u32:8 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:0, data: u64:0x431fba7f9f155239, length: u32:8 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0xe75b86b1dfe3, length: u32:6 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:0, data: u64:0xe75b86b1dfe3, length: u32:6 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x192, length: u32:8 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:0, data: u64:0x192, length: u32:8 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0xd6c643, length: u32:3 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:0, data: u64:0xd6c643, length: u32:3 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x223, length: u32:3 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:0, data: u64:0x223, length: u32:3 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: true, last_block: false, id: u32:1234, data: u64:0x00, length: u32:1 } + packet: BlockDataPacket { last: true, last_block: false, id: u32:0, data: u64:0x00, length: u32:1 } }, zero!(), ... ] @@ -576,43 +576,43 @@ const COMP_BLOCK_DEC_TESTCASES: (u32, u64[64], u32, ExtendedPacket[128])[7] = [ ExtendedPacket[128]:[ ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0xa2bbc79280150052, length: u32:8 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:1, data: u64:0xa2bbc79280150052, length: u32:8 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x2e159be2210a8b13, length: u32:8 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:1, data: u64:0x2e159be2210a8b13, length: u32:8 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x2bcd291994532c42, length: u32:8 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:1, data: u64:0x2bcd291994532c42, length: u32:8 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x64de1c37a8940c11, length: u32:8 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:1, data: u64:0x64de1c37a8940c11, length: u32:8 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x9fa347, length: u32:3 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:1, data: u64:0x9fa347, length: u32:3 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x116, length: u32:4 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:1, data: u64:0x116, length: u32:4 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x9b679780bbc95f95, length: u32:8 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:1, data: u64:0x9b679780bbc95f95, length: u32:8 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0xd90c2f2b9757c107, length: u32:8 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:1, data: u64:0xd90c2f2b9757c107, length: u32:8 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x58ba369e427a819d, length: u32:8 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:1, data: u64:0x58ba369e427a819d, length: u32:8 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: true, last_block: false, id: u32:1234, data: u64:0xd27d5a829f, length: u32:5 } + packet: BlockDataPacket { last: true, last_block: false, id: u32:1, data: u64:0xd27d5a829f, length: u32:5 } }, zero!(), ... ] @@ -651,91 +651,127 @@ const COMP_BLOCK_DEC_TESTCASES: (u32, u64[64], u32, ExtendedPacket[128])[7] = [ u64:0x40381ea080, u64:0, ... ], - u32:21, + u32:30, ExtendedPacket[128]:[ + ExtendedPacket { + msg_type: SequenceExecutorMessageType::LITERAL, + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x0, length: u32:0 } + }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x1f50, length: u32:3 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x1f50, length: u32:3 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x76767676, length: u32:4 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x76767676, length: u32:4 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x21a, length: u32:3 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x21a, length: u32:3 } + }, + ExtendedPacket { + msg_type: SequenceExecutorMessageType::LITERAL, + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x0, length: u32:0 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x2, length: u32:3 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x2, length: u32:3 } + }, + ExtendedPacket { + msg_type: SequenceExecutorMessageType::LITERAL, + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x0, length: u32:0 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x1bee, length: u32:3 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x1bee, length: u32:3 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x76, length: u32:1 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x76, length: u32:1 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x2026, length: u32:3 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x2026, length: u32:3 } + }, + ExtendedPacket { + msg_type: SequenceExecutorMessageType::LITERAL, + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x0, length: u32:0 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x1d93, length: u32:3 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x1d93, length: u32:3 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x76, length: u32:1 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x76, length: u32:1 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x2a39, length: u32:3 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x2a39, length: u32:3 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x76, length: u32:1 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x76, length: u32:1 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x3111, length: u32:3 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x3111, length: u32:3 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x76, length: u32:1 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x76, length: u32:1 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0xe76, length: u32:4 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0xe76, length: u32:4 } + }, + ExtendedPacket { + msg_type: SequenceExecutorMessageType::LITERAL, + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x0, length: u32:0 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x303d, length: u32:3 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x303d, length: u32:3 } + }, + ExtendedPacket { + msg_type: SequenceExecutorMessageType::LITERAL, + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x0, length: u32:0 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x3, length: u32:3 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x3, length: u32:3 } + }, + ExtendedPacket { + msg_type: SequenceExecutorMessageType::LITERAL, + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x0, length: u32:0 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x36ea, length: u32:3 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x36ea, length: u32:3 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: true, last_block: false, id: u32:1234, data: u64:0x7676767676, length: u32:5 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x7676767676, length: u32:5 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x53be, length: u32:3 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x53be, length: u32:3 } + }, + ExtendedPacket { + msg_type: SequenceExecutorMessageType::LITERAL, + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x0, length: u32:0 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x14ef, length: u32:3 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x14ef, length: u32:3 } + }, + ExtendedPacket { + msg_type: SequenceExecutorMessageType::LITERAL, + packet: BlockDataPacket { last: false, last_block: false, id: u32:2, data: u64:0x0, length: u32:0 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: true, last_block: false, id: u32:1234, data: u64:0x2ce2, length: u32:4 } + packet: BlockDataPacket { last: true, last_block: false, id: u32:2, data: u64:0x2ce2, length: u32:4 } }, zero!(), ... ], @@ -772,67 +808,67 @@ const COMP_BLOCK_DEC_TESTCASES: (u32, u64[64], u32, ExtendedPacket[128])[7] = [ ExtendedPacket[128]:[ ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:3, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0xf5f5f5f5f5f5, length: u32:6 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:3, data: u64:0xf5f5f5f5f5f5, length: u32:6 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x2, length: u32:4 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:3, data: u64:0x2, length: u32:4 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0xf5f5f5f5, length: u32:4 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:3, data: u64:0xf5f5f5f5, length: u32:4 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0x4c, length: u32:6 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:3, data: u64:0x4c, length: u32:6 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:3, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:3, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:3, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:3, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:3, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:3, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:3, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:3, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:3, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:3, data: u64:0xf5f5f5f5f5f5f5f5, length: u32:8 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: true, last_block: false, id: u32:1234, data: u64:0xf5f5f5f5, length: u32:4 } + packet: BlockDataPacket { last: true, last_block: false, id: u32:3, data: u64:0xf5f5f5f5, length: u32:4 } }, zero!(), ... ] @@ -865,8 +901,12 @@ const COMP_BLOCK_DEC_TESTCASES: (u32, u64[64], u32, ExtendedPacket[128])[7] = [ u64:0x1501, u64:0, ... ], - u32:0, + u32:1, ExtendedPacket[128]:[ + ExtendedPacket { + msg_type: SequenceExecutorMessageType::LITERAL, + packet: BlockDataPacket { last: true, last_block: false, id: u32:4, data: u64:0x0, length: u32:0 } + }, zero!(), ... ] ), @@ -897,15 +937,23 @@ const COMP_BLOCK_DEC_TESTCASES: (u32, u64[64], u32, ExtendedPacket[128])[7] = [ u64:0x1020070, u64:0, ... ], - u32:2, + u32:4, ExtendedPacket[128]:[ + ExtendedPacket { + msg_type: SequenceExecutorMessageType::LITERAL, + packet: BlockDataPacket { last: false, last_block: false, id: u32:5, data: u64:0x0, length: u32:0 } + }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: false, last_block: false, id: u32:1234, data: u64:0xf06, length: u32:3 } + packet: BlockDataPacket { last: false, last_block: false, id: u32:5, data: u64:0xf06, length: u32:3 } + }, + ExtendedPacket { + msg_type: SequenceExecutorMessageType::LITERAL, + packet: BlockDataPacket { last: false, last_block: false, id: u32:5, data: u64:0, length: u32:0 } }, ExtendedPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, - packet: BlockDataPacket { last: true, last_block: false, id: u32:1234, data: u64:0x2b77, length: u32:4 } + packet: BlockDataPacket { last: true, last_block: false, id: u32:5, data: u64:0x2b77, length: u32:4 } }, zero!(), ... ], @@ -940,7 +988,7 @@ const COMP_BLOCK_DEC_TESTCASES: (u32, u64[64], u32, ExtendedPacket[128])[7] = [ ExtendedPacket[128]:[ ExtendedPacket { msg_type: SequenceExecutorMessageType::LITERAL, - packet: BlockDataPacket { last: true, last_block: false, id: u32:1234, data: u64:0x215a, length: u32:2 } + packet: BlockDataPacket { last: true, last_block: false, id: u32:6, data: u64:0x215a, length: u32:2 } }, zero!(), ... ], @@ -1306,7 +1354,7 @@ proc CompressBlockDecoderTest { }(tok); let tok = send(tok, ml_sel_test_s, u1:1); - let tok = unroll_for!(test_i, tok): (u32, token) in range(u32:6, array_size(COMP_BLOCK_DEC_TESTCASES)) { + let tok = unroll_for!(test_i, tok): (u32, token) in range(u32:0, array_size(COMP_BLOCK_DEC_TESTCASES)) { let (input_length, input, output_length, output) = COMP_BLOCK_DEC_TESTCASES[test_i]; trace_fmt!("Loading testcase {}", test_i); @@ -1330,7 +1378,7 @@ proc CompressBlockDecoderTest { let req = Req { addr: uN[TEST_AXI_ADDR_W]:0x100, length: input_length as BlockSize, - id: u32:1234, + id: test_i, last_block: false, }; diff --git a/xls/modules/zstd/comp_frame.x b/xls/modules/zstd/comp_frame.x index 5e1a97dbd4f..8376d6bf1dc 100644 --- a/xls/modules/zstd/comp_frame.x +++ b/xls/modules/zstd/comp_frame.x @@ -5,17 +5,17 @@ pub struct DataArray{ } pub const FRAMES:DataArray< u32:64, - u32:5 ->[1] = [DataArray<64, 5>{ - length: u32:33, - array_length: u32:5, - data: uN[64][5]:[uN[64]:0x001a3384fd2fb528, uN[64]:0xc1d3500000850000, uN[64]:0xdcf0529b98db8a06, uN[64]:0x308fa3120a430001, uN[64]:0x50] + u32:7 +>[1] = [DataArray<64, 7>{ + length: u32:51, + array_length: u32:7, + data: uN[64][7]:[uN[64]:0x00504784fd2fb528, uN[64]:0xcf95700001150000, uN[64]:0xe17d50b989ac93c4, uN[64]:0x0daf000895a6e608, uN[64]:0xb96010b86f7602a4, uN[64]:0x05b0e051238666e8, uN[64]:0x8470e3] }]; pub const DECOMPRESSED_FRAMES:DataArray< u32:64, - u32:4 ->[1] = [DataArray<64, 4>{ - length: u32:26, - array_length: u32:4, - data: uN[64][4]:[uN[64]:0x529b98db8a06c1d3, uN[64]:0x529b98db8a06dcf0, uN[64]:0x529b98db8a06dcf0, uN[64]:0xdcf0] + u32:10 +>[1] = [DataArray<64, 10>{ + length: u32:80, + array_length: u32:10, + data: uN[64][10]:[uN[64]:0xc4c4cf95cf95cf95, uN[64]:0x93c4c4c4c4c4c4c4, uN[64]:0xacc493c493c493c4, uN[64]:0xc493c493c493c489, uN[64]:0x93c493c489acc493, uN[64]:0x08e17d50b9c493c4, uN[64]:0xc4c4c4cf9595a6e6, uN[64]:0x93c493c4c4c4c4c4, uN[64]:0xc489acc493c493c4, uN[64]:0xc493c493c493c493] }]; diff --git a/xls/modules/zstd/dec_mux.x b/xls/modules/zstd/dec_mux.x index efe1429b1de..44d6f7ae393 100644 --- a/xls/modules/zstd/dec_mux.x +++ b/xls/modules/zstd/dec_mux.x @@ -130,7 +130,7 @@ pub proc DecoderMux { (((state.raw_data.packet.id == (state.prev_id + u32:1)) && state.prev_last) || ((state.raw_data.packet.id == state.prev_id) && !state.prev_last))) { assert!(!state.raw_data_valid_next_frame, "raw_packet_valid_in_current_and_next_frame"); - (true, + ((state.raw_data.packet.length as CopyOrMatchLength) != CopyOrMatchLength:0, SequenceExecutorPacket { msg_type: state.raw_data.msg_type, length: state.raw_data.packet.length as CopyOrMatchLength, @@ -153,7 +153,7 @@ pub proc DecoderMux { (((state.rle_data.packet.id == (state.prev_id + u32:1)) && state.prev_last) || ((state.rle_data.packet.id == state.prev_id) && !state.prev_last))) { assert!(!state.rle_data_valid_next_frame, "rle_packet_valid_in_current_and_next_frame"); - (true, + ((state.rle_data.packet.length as CopyOrMatchLength) != CopyOrMatchLength:0, SequenceExecutorPacket { msg_type: state.rle_data.msg_type, length: state.rle_data.packet.length as CopyOrMatchLength, @@ -282,9 +282,7 @@ proc DecoderMuxEmptyRawBlocksTest { let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x11111111, length: CopyOrMatchLength:4 }); let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x22222222, length: CopyOrMatchLength:4 }); - let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x0, length: CopyOrMatchLength:0 }); let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x33333333, length: CopyOrMatchLength:4 }); - let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: true, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x0 , length: CopyOrMatchLength:0 }); send(tok, terminator, true); } @@ -320,9 +318,7 @@ proc DecoderMuxEmptyRleBlocksTest { let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x11111111, length: CopyOrMatchLength:4 }); let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x22222222, length: CopyOrMatchLength:4 }); - let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x0, length: CopyOrMatchLength:0 }); let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x33333333, length: CopyOrMatchLength:4 }); - let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: true, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x0, length: CopyOrMatchLength:0 }); send(tok, terminator, true); } @@ -361,7 +357,6 @@ proc DecoderMuxEmptyBlockBetweenRegularBlocksOnTheSameInputChannelTest { let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x11111111, length: CopyOrMatchLength:4 }); let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x22222222, length: CopyOrMatchLength:4 }); let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x33333333, length: CopyOrMatchLength:4 }); - let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x0, length: CopyOrMatchLength:0 }); let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0xAAAAAAAA, length: CopyOrMatchLength:4 }); let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0xBBBBBBBB, length: CopyOrMatchLength:4 }); let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: true, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x00000000, length: CopyOrMatchLength:4 }); @@ -403,7 +398,6 @@ proc DecoderMuxEmptyBlockBetweenRegularBlocksOnDifferentInputChannelsTest { let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x11111111, length: CopyOrMatchLength:4 }); let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x22222222, length: CopyOrMatchLength:4 }); let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x33333333, length: CopyOrMatchLength:4 }); - let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x0, length: CopyOrMatchLength:0 }); let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0xAAAAAAAA, length: CopyOrMatchLength:4 }); let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0xBBBBBBBB, length: CopyOrMatchLength:4 }); let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: true, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x00000000, length: CopyOrMatchLength:4 }); @@ -474,19 +468,9 @@ proc DecoderMuxMultipleFramesTest { // Frame #2 let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x44444444, length: CopyOrMatchLength:4 }); let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x0 , length: CopyOrMatchLength:0 }); - let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x0 , length: CopyOrMatchLength:0 }); - let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: true, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x0 , length: CopyOrMatchLength:0 }); + let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x0 , length: CopyOrMatchLength:0 }); // Frame #3 let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x55555555, length: CopyOrMatchLength:4 }); - let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x0 , length: CopyOrMatchLength:0 }); - let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x0 , length: CopyOrMatchLength:0 }); - let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x0 , length: CopyOrMatchLength:0 }); - let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x0 , length: CopyOrMatchLength:0 }); - let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x0 , length: CopyOrMatchLength:0 }); - let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x0 , length: CopyOrMatchLength:0 }); - let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x0 , length: CopyOrMatchLength:0 }); - let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: false, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x0 , length: CopyOrMatchLength:0 }); - let (tok, data) = recv(tok, output_r); assert_eq(data, SequenceExecutorPacket {last: bool: true, msg_type: SequenceExecutorMessageType::LITERAL, content: CopyOrMatchContent:0x0 , length: CopyOrMatchLength:0 }); send(tok, terminator, true); } diff --git a/xls/modules/zstd/fse_dec.x b/xls/modules/zstd/fse_dec.x index 143cd45b7f7..e19943a433f 100644 --- a/xls/modules/zstd/fse_dec.x +++ b/xls/modules/zstd/fse_dec.x @@ -343,13 +343,13 @@ pub proc FseDecoder< } }; let do_send_command = ( - (command_data.length != CopyOrMatchLength:0) && ( state.fsm == FseDecoderFSM::SEND_COMMAND_LITERAL || state.fsm == FseDecoderFSM::SEND_COMMAND_SEQUENCE || state.fsm == FseDecoderFSM::SEND_LEFTOVER_LITERALS_REQ ) ); + let command = CommandConstructorData { sync: state.ctrl.sync, data: command_data, diff --git a/xls/modules/zstd/literals_buffer.x b/xls/modules/zstd/literals_buffer.x index b1e02c21c8e..868953a593f 100644 --- a/xls/modules/zstd/literals_buffer.x +++ b/xls/modules/zstd/literals_buffer.x @@ -709,7 +709,7 @@ proc LiteralsBufferReader< last: ctrl_last, }; - let (read_reqs, read_start, read_len, packet, _) = parallel_rams::sequence_packet_to_read_reqs< + let (read_reqs, read_start, read_len, _, _) = parallel_rams::sequence_packet_to_read_reqs< HISTORY_BUFFER_SIZE_KB, RAM_ADDR_WIDTH, RAM_DATA_WIDTH >( state.hyp_ptr, packet, state.hb_len diff --git a/xls/modules/zstd/parallel_rams.x b/xls/modules/zstd/parallel_rams.x index 24f97183262..2634cd5f238 100644 --- a/xls/modules/zstd/parallel_rams.x +++ b/xls/modules/zstd/parallel_rams.x @@ -443,9 +443,20 @@ pub fn sequence_packet_to_read_reqs< type ReadReq = ram::ReadReq; type Packet = SequenceExecutorPacket; - let max_len = std::umin(seq.length as u32, std::umin(RAM_NUM, hb_len as u32)); + let max_len = std::umin(seq.length as u32, std::umin(RAM_NUM, std::umin(hb_len as u32, seq.content as u32))); let (curr_seq, next_seq, next_seq_valid) = if seq.length > max_len as CopyOrMatchLength { + ( + seq, + Packet { + msg_type: SequenceExecutorMessageType::SEQUENCE, + length: seq.length - max_len as CopyOrMatchLength, + content: seq.content, + last: false, + }, + true, + ) + } else if seq.length > seq.content as CopyOrMatchLength { ( Packet { msg_type: SequenceExecutorMessageType::SEQUENCE, @@ -545,7 +556,7 @@ fn test_sequence_packet_to_read_reqs() { RamReadLen:8, Packet { msg_type: SequenceExecutorMessageType::SEQUENCE, - content: CopyOrMatchContent:18, + content: CopyOrMatchContent:10, length: CopyOrMatchLength:1, last: false }, true, diff --git a/xls/modules/zstd/sequence_dec.x b/xls/modules/zstd/sequence_dec.x index 6f1823df492..b0d11f13309 100644 --- a/xls/modules/zstd/sequence_dec.x +++ b/xls/modules/zstd/sequence_dec.x @@ -495,6 +495,10 @@ pub proc SequenceDecoderCtrl< let (tok_recv_scd, conf_resp) = recv(tok_send_scd, scd_resp_r); trace_fmt!("[SequenceDecoderCtrl]: Received decoded Sequence header: {:#x}", conf_resp); + assert!(conf_resp.header.literals_mode == CompressionMode::PREDEFINED, "unsupported_fse_table_mode"); + assert!(conf_resp.header.match_mode == CompressionMode::PREDEFINED, "unsupported_fse_table_mode"); + assert!(conf_resp.header.offset_mode == CompressionMode::PREDEFINED, "unsupported_fse_table_mode"); + // Request decoding lookups let flc_req = FseLookupCtrlReq { addr: req.start_addr + conf_resp.length as Addr, @@ -1155,7 +1159,13 @@ const TEST_RAM_DATA = u64[40]:[ u64:0x0, ... ]; -const EXPECTED_OUTPUT = SequenceExecutorPacket[16]:[ +const EXPECTED_OUTPUT = SequenceExecutorPacket[20]:[ + SequenceExecutorPacket { + msg_type: SequenceExecutorMessageType::LITERAL, + length: u64:0x0000, + content: u64:0x0, + last: false, + }, SequenceExecutorPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, length: u64:0x0003, @@ -1174,12 +1184,24 @@ const EXPECTED_OUTPUT = SequenceExecutorPacket[16]:[ content: u64:0x0389, last: false, }, + SequenceExecutorPacket { + msg_type: SequenceExecutorMessageType::LITERAL, + length: u64:0x0000, + content: u64:0x0, + last: false, + }, SequenceExecutorPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, length: u64:0x0003, content: u64:0x013c, last: false, }, + SequenceExecutorPacket { + msg_type: SequenceExecutorMessageType::LITERAL, + length: u64:0x0000, + content: u64:0x0, + last: false, + }, SequenceExecutorPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, length: u64:0x0003, @@ -1246,6 +1268,12 @@ const EXPECTED_OUTPUT = SequenceExecutorPacket[16]:[ content: u64:0x03a9, last: false, }, + SequenceExecutorPacket { + msg_type: SequenceExecutorMessageType::LITERAL, + length: u64:0x0, + content: u64:0x0, + last: false, + }, SequenceExecutorPacket { msg_type: SequenceExecutorMessageType::SEQUENCE, length: u64:0x0004, diff --git a/xls/modules/zstd/sequence_executor.x b/xls/modules/zstd/sequence_executor.x index cab106b244e..861783ce8d4 100644 --- a/xls/modules/zstd/sequence_executor.x +++ b/xls/modules/zstd/sequence_executor.x @@ -135,50 +135,40 @@ pub fn handle_repeated_offset_for_sequences -> (SequenceExecutorPacket, Offset[3]) { type Packet = SequenceExecutorPacket; type Content = uN[RAM_DATA_WIDTH * u32:8]; - let modified_repeat_offsets = if repeat_req { - Offset[3]:[repeat_offsets[1], repeat_offsets[2], repeat_offsets[0] - Offset:1] - } else { - repeat_offsets - }; - let (seq, final_repeat_offsets) = if seq.content == Content:0 { - fail!( - "match_offset_zero_not_allowed", - (zero!(), Offset[3]:[Offset:0, ...])) - } else if seq.content == Content:1 { - let offset = modified_repeat_offsets[0]; - ( - Packet { content: offset as Content, ..seq }, - Offset[3]:[ - offset, repeat_offsets[1], repeat_offsets[2], - ], - ) - } else if seq.content == CopyOrMatchContent:2 { - let offset = modified_repeat_offsets[1]; - ( - Packet { content: offset as Content, ..seq }, - Offset[3]:[ - offset, repeat_offsets[0], repeat_offsets[2], - ], - ) - } else if seq.content == CopyOrMatchContent:3 { - let offset = modified_repeat_offsets[2]; - ( - Packet { content: offset as Content, ..seq }, - Offset[3]:[ - offset, repeat_offsets[0], repeat_offsets[1], - ], - ) + let (offset, repeat_offsets) = if (seq.content <= Content:3) { + let idx = (seq.content - Content:1) as u32; + let idx = if (repeat_req) { + idx + u32:1 + } else { idx }; + + if (idx == u32:0) { + (repeat_offsets[0], repeat_offsets) + } else { + let offset = if idx < u32:3 { repeat_offsets[idx] } else { repeat_offsets[0] - Offset:1 }; + + let repeat_offsets = if idx > u32:1 { + update(repeat_offsets, u32:2, repeat_offsets[1]) + } else {repeat_offsets}; + let repeat_offsets = update(repeat_offsets, u32:1, repeat_offsets[0]); + let repeat_offsets = update(repeat_offsets, u32:0, offset); + + (offset, repeat_offsets) + } } else { - let offset = seq.content as Offset - Offset:3; - ( - Packet { content: offset as Content, ..seq }, - Offset[3]:[ - offset, repeat_offsets[0], repeat_offsets[1], - ], - ) + let offset = (seq.content - Content:3) as Offset; + + let repeat_offsets = update(repeat_offsets, u32:2, repeat_offsets[1]); + let repeat_offsets = update(repeat_offsets, u32:1, repeat_offsets[0]); + let repeat_offsets = update(repeat_offsets, u32:0, offset); + + (offset, repeat_offsets) }; - (seq, final_repeat_offsets) + + ( + Packet { content: offset as Content, ..seq }, + repeat_offsets, + ) } pub proc SequenceExecutor()); + if input_packet_valid { + trace_fmt!("[SequenceExecutor]: received input: {:#x}", input_packet); + } else {}; // ... or our own sequences from the looped channel let do_recv_ram = ( @@ -351,6 +344,9 @@ pub proc SequenceExecutor(packet); - if do_write_output { trace_fmt!("Sending output MemWriter data: {:#x}", output_mem_wr_data_in); } else { }; + if do_write_output { + trace_fmt!("*** Sending output MemWriter data: {:#x}", output_mem_wr_data_in); + } else { }; let tok2_10_1 = send_if(tok1, output_mem_wr_data_in_s, do_write_output, output_mem_wr_data_in); // Ask for response @@ -1040,64 +1038,196 @@ proc SequenceExecutorSequenceTest { next(state: ()) { let tok = join(); - // Print RAM content - // let tok = send(tok, print_start_s, ()); - // let (tok, _) = recv(tok, print_finish_r); + let tok = send(tok, print_start_s, ()); + let (tok, _) = recv(tok, print_finish_r); + + trace_fmt!("----------------------- Packet 0 -----------------------"); let tok = send(tok, input_s, SequenceExecutorPacket { - msg_type: SequenceExecutorMessageType::LITERAL, - length: CopyOrMatchLength:1, - content: CopyOrMatchContent:0x31, - last: false + msg_type: SequenceExecutorMessageType::LITERAL, // u1:0, + length: CopyOrMatchLength:0x2, + content: CopyOrMatchContent:0xcf95, + last: false, }); - let (tok, recv_data) = recv(tok, output_mem_wr_data_in_r); - assert_eq(recv_data, TestMemWriterDataPacket { - data: uN[TEST_DATA_W]:0x31, - length: uN[TEST_ADDR_W]:1, - last: false + + let tok = send(tok, print_start_s, ()); + let (tok, _) = recv(tok, print_finish_r); + + trace_fmt!("----------------------- Packet 1 -----------------------"); + + let tok = send(tok, input_s, SequenceExecutorPacket { + msg_type: SequenceExecutorMessageType::SEQUENCE, // u1:1, + length: CopyOrMatchLength:0x4, + content: CopyOrMatchContent:0x5, + last: false, }); let tok = send(tok, print_start_s, ()); let (tok, _) = recv(tok, print_finish_r); + trace_fmt!("----------------------- Packet 2 -----------------------"); + let tok = send(tok, input_s, SequenceExecutorPacket { - msg_type: SequenceExecutorMessageType::SEQUENCE, - length: CopyOrMatchLength:3, - content: CopyOrMatchContent:4, - last: false + msg_type: SequenceExecutorMessageType::LITERAL, // u1:0, + length: CopyOrMatchLength:0x1, + content: CopyOrMatchContent:0xc4, + last: false, }); - let (tok, recv_data) = recv(tok, output_mem_wr_data_in_r); - assert_eq(recv_data, TestMemWriterDataPacket { - data: uN[TEST_DATA_W]:0x31, - length: uN[TEST_ADDR_W]:1, - last: false + + let tok = send(tok, print_start_s, ()); + let (tok, _) = recv(tok, print_finish_r); + + trace_fmt!("----------------------- Packet 3 -----------------------"); + + let tok = send(tok, input_s, SequenceExecutorPacket { + msg_type: SequenceExecutorMessageType::SEQUENCE, // u1:1, + length: CopyOrMatchLength:0x8, + content: CopyOrMatchContent:0x4, + last: false, }); let tok = send(tok, print_start_s, ()); let (tok, _) = recv(tok, print_finish_r); + trace_fmt!("----------------------- Packet 4 -----------------------"); - let (tok, recv_data) = recv(tok, output_mem_wr_data_in_r); - assert_eq(recv_data, TestMemWriterDataPacket { - data: uN[TEST_DATA_W]:0x3131, - length: uN[TEST_ADDR_W]:2, - last: false + let tok = send(tok, input_s, SequenceExecutorPacket { + msg_type: SequenceExecutorMessageType::LITERAL, // u1:0, + length: CopyOrMatchLength:0x1, + content: CopyOrMatchContent:0x93, + last: false, + }); + + let tok = send(tok, print_start_s, ()); + let (tok, _) = recv(tok, print_finish_r); + + trace_fmt!("----------------------- Packet 5 -----------------------"); + + let tok = send(tok, input_s, SequenceExecutorPacket { + msg_type: SequenceExecutorMessageType::SEQUENCE, // u1:1, + length: CopyOrMatchLength:0x7, + content: CopyOrMatchContent:0x2, + last: false, }); let tok = send(tok, print_start_s, ()); let (tok, _) = recv(tok, print_finish_r); + trace_fmt!("----------------------- Packet 6 -----------------------"); + let tok = send(tok, input_s, SequenceExecutorPacket { - msg_type: SequenceExecutorMessageType::SEQUENCE, - length: CopyOrMatchLength:3, - content: CopyOrMatchContent:7, - last: false + msg_type: SequenceExecutorMessageType::LITERAL, // u1:0, + length: CopyOrMatchLength:0x2, + content: CopyOrMatchContent:0x89ac, + last: false, }); - let (tok, recv_data) = recv(tok, output_mem_wr_data_in_r); - assert_eq(recv_data, TestMemWriterDataPacket { - data: uN[TEST_DATA_W]:0x313131, - length: uN[TEST_ADDR_W]:3, - last: false + + let tok = send(tok, print_start_s, ()); + let (tok, _) = recv(tok, print_finish_r); + + trace_fmt!("----------------------- Packet 7 -----------------------"); + + let tok = send(tok, input_s, SequenceExecutorPacket { + msg_type: SequenceExecutorMessageType::SEQUENCE, // u1:1, + length: CopyOrMatchLength:0x5, + content: CopyOrMatchContent:0xc, + last: false, + }); + + let tok = send(tok, print_start_s, ()); + let (tok, _) = recv(tok, print_finish_r); + + trace_fmt!("----------------------- Packet 8 -----------------------"); + + let tok = send(tok, input_s, SequenceExecutorPacket { + msg_type: SequenceExecutorMessageType::LITERAL, // u1:0, + length: CopyOrMatchLength:0x0, + content: CopyOrMatchContent:0x0, + last: false, + }); + + let tok = send(tok, print_start_s, ()); + let (tok, _) = recv(tok, print_finish_r); + + trace_fmt!("----------------------- Packet 9 -----------------------"); + + let tok = send(tok, input_s, SequenceExecutorPacket { + msg_type: SequenceExecutorMessageType::SEQUENCE, // u1:1, + length: CopyOrMatchLength:0x8, + content: CopyOrMatchContent:0xe, + last: false, + }); + + let tok = send(tok, print_start_s, ()); + let (tok, _) = recv(tok, print_finish_r); + + trace_fmt!("----------------------- Packet 10 -----------------------"); + + let tok = send(tok, input_s, SequenceExecutorPacket { + msg_type: SequenceExecutorMessageType::LITERAL, // u1:0, + length: CopyOrMatchLength:0x0, + content: CopyOrMatchContent:0x0, + last: false, + }); + + let tok = send(tok, print_start_s, ()); + let (tok, _) = recv(tok, print_finish_r); + + trace_fmt!("----------------------- Packet 11 -----------------------"); + + let tok = send(tok, input_s, SequenceExecutorPacket { + msg_type: SequenceExecutorMessageType::SEQUENCE, // u1:1, + length: CopyOrMatchLength:0x5, + content: CopyOrMatchContent:0x2, + last: false, + }); + + let tok = send(tok, print_start_s, ()); + let (tok, _) = recv(tok, print_finish_r); + + trace_fmt!("----------------------- Packet 12 -----------------------"); + + let tok = send(tok, input_s, SequenceExecutorPacket { + msg_type: SequenceExecutorMessageType::LITERAL, // u1:0, + length: CopyOrMatchLength:0x8, + content: CopyOrMatchContent:0x95a6_e608_e17d_50b9, + last: false, + }); + + let tok = send(tok, print_start_s, ()); + let (tok, _) = recv(tok, print_finish_r); + + trace_fmt!("----------------------- Packet 13 -----------------------"); + + let tok = send(tok, input_s, SequenceExecutorPacket { + msg_type: SequenceExecutorMessageType::SEQUENCE, // u1:1, + length: CopyOrMatchLength:0x3, + content: CopyOrMatchContent:0x32, + last: false, + }); + + let tok = send(tok, print_start_s, ()); + let (tok, _) = recv(tok, print_finish_r); + + trace_fmt!("----------------------- Packet 14 -----------------------"); + + let tok = send(tok, input_s, SequenceExecutorPacket { + msg_type: SequenceExecutorMessageType::LITERAL, // u1:0, + length: CopyOrMatchLength:0x0, + content: CopyOrMatchContent:0x0, + last: false, + }); + + let tok = send(tok, print_start_s, ()); + let (tok, _) = recv(tok, print_finish_r); + + trace_fmt!("----------------------- Packet 15 -----------------------"); + + let tok = send(tok, input_s, SequenceExecutorPacket { + msg_type: SequenceExecutorMessageType::SEQUENCE, // u1:1, + length: CopyOrMatchLength:0x1a, + content: CopyOrMatchContent:0x3, + last: true }); let tok = send(tok, print_start_s, ()); diff --git a/xls/modules/zstd/zstd_dec.x b/xls/modules/zstd/zstd_dec.x index afe70e6cf66..95872c3a844 100644 --- a/xls/modules/zstd/zstd_dec.x +++ b/xls/modules/zstd/zstd_dec.x @@ -489,8 +489,6 @@ proc ZstdDecoderInternal< block_addr + block_length }; - trace_fmt!("bh_addr: {:#x}", bh_addr); - (block_addr, block_length, bh_resp.header.last, block_rle_symbol, bh_addr) } else { (state.block_addr, state.block_length, state.block_last, state.block_rle_symbol, state.bh_addr) @@ -595,8 +593,8 @@ proc ZstdDecoderInternal< ( _, _, _) => Fsm::DECODE_COMPRESSED_BLOCK, }; - let req_sent = if !raw_resp_valid && !error { true } else { false }; - let block_id = if raw_resp_valid { state.block_id + u32:1} else {state.block_id }; + let req_sent = if !cmp_resp_valid && !error { true } else { false }; + let block_id = if cmp_resp_valid { state.block_id + u32:1} else {state.block_id }; let state = State {fsm, block_id, csr_wr_req, csr_wr_req_valid, req_sent, ..state}; if fsm == Fsm::DECODE_BLOCK_HEADER { @@ -630,7 +628,7 @@ proc ZstdDecoderInternal< }, Fsm::FINISH => { - // trace_fmt!("[FINISH]"); + trace_fmt!("[FINISH]"); let csr_wr_req_valid = true; let csr_wr_req = CsrWrReq { csr: csr(Csr::STATUS), @@ -1051,11 +1049,6 @@ pub proc ZstdDecoder< type LitBufRamWrReq = ram::WriteReq; type LitBufRamWrResp = ram::WriteResp; - // Complex Block Decoder - cmp_output_s: chan out; - comp_block_req_s: chan out; - comp_block_resp_r: chan in; - init {} config( @@ -1384,12 +1377,10 @@ pub proc ZstdDecoder< // fse_dec_axi_ar_s, fse_dec_axi_r_r, // ); - (cmd_output_s, comp_block_req_s, comp_block_resp_r) + () } - next (state: ()) { - send_if(join(), cmp_output_s, false, zero!()); - } + next (state: ()) { } } const INST_AXI_DATA_W = u32:64; diff --git a/xls/modules/zstd/zstd_dec_test.x b/xls/modules/zstd/zstd_dec_test.x index eefa0e90b8d..042d45e05a3 100644 --- a/xls/modules/zstd/zstd_dec_test.x +++ b/xls/modules/zstd/zstd_dec_test.x @@ -762,6 +762,7 @@ proc ZstdDecoderTest { assert_eq(final_transfered_bytes, DECOMPRESSED_BYTES); assert_eq(final_output_memory_id, decomp_frame.array_length); for (memory_id, _): (u32, ()) in range(u32:0, decomp_frame.array_length) { + trace_fmt!("Comparing {} output packet: {:#x} ?= {:#x}", memory_id, final_output_memory[memory_id], decomp_frame.data[memory_id]); assert_eq(final_output_memory[memory_id], decomp_frame.data[memory_id]); }(());