#include #include #include #include #include #include #include using namespace prjxray::xilinx; TEST(BitstreamReaderTest, InitWithEmptyBytesReturnsNull) { absl::Span bitstream; auto reader = BitstreamReader::InitWithBytes(bitstream); EXPECT_FALSE(reader); } TEST(BitstreamReaderTest, InitWithOnlySyncReturnsObject) { std::vector bitstream{0xAA, 0x99, 0x55, 0x66}; absl::Span::value_type> bitstream_span(bitstream); // auto config_packets = // bitstream_span.subspan(bitstream.end() - bitstream.begin()); // auto big_endian_reader = // prjxray::make_big_endian_span(bitstream_span); // std::vector words{big_endian_reader.begin(), // big_endian_reader.end()}; // for (auto word: words) { // std::cout << "0x" << std::hex << word << std::endl; //} auto reader = BitstreamReader::InitWithBytes(bitstream); EXPECT_TRUE(reader); } TEST(BitstreamReaderTest, InitWithSyncAfterNonWordSizedPaddingReturnsObject) { std::vector bitstream{0xFF, 0xFE, 0xAA, 0x99, 0x55, 0x66}; auto reader = BitstreamReader::InitWithBytes(bitstream); EXPECT_TRUE(reader); } TEST(BitstreamReaderTest, InitWithSyncAfterWordSizedPaddingReturnsObject) { std::vector bitstream{0xFF, 0xFE, 0xFD, 0xFC, 0xAA, 0x99, 0x55, 0x66}; auto reader = BitstreamReader::InitWithBytes(bitstream); EXPECT_TRUE(reader); } TEST(BitstreamReaderTest, ParsesType1Packet) { std::vector bitstream{ 0xAA, 0x99, 0x55, 0x66, // sync 0x20, 0x00, 0x20, 0x00, // NOP }; auto reader = BitstreamReader::InitWithBytes(bitstream); ASSERT_TRUE(reader); ASSERT_NE(reader->begin(), reader->end()); auto first_packet = reader->begin(); EXPECT_EQ(first_packet->opcode(), ConfigurationPacket::Opcode::NOP); auto second_packet = ++first_packet; EXPECT_EQ(second_packet->opcode(), ConfigurationPacket::Opcode::NOP); EXPECT_EQ(++second_packet, reader->end()); } TEST(BitstreamReaderTest, ParseType2PacketWithoutType1Fails) { std::vector bitstream{ 0xAA, 0x99, 0x55, 0x66, // sync 0x40, 0x00, 0x40, 0x00, // Type 2 NOP }; auto reader = BitstreamReader::InitWithBytes(bitstream); ASSERT_TRUE(reader); EXPECT_EQ(reader->begin(), reader->end()); } TEST(BitstreamReaderTest, ParsesType2AfterType1Packet) { std::vector bitstream{ 0xAA, 0x99, // sync 0x55, 0x66, // sync 0x28, 0x80, // Type 1 Read zero bytes from FDRO 0x50, 0x60, // Type 2 Write of 8 16-bit words 0x00, 0x00, // WC1 bits 31:16 0x00, 0x08, // WC2 bits 15:0 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10, }; std::vector data_words{0x0102, 0x0304, 0x0506, 0x0708, 0x090A, 0x0B0C, 0x0D0E, 0x0F10}; auto reader = BitstreamReader::InitWithBytes(bitstream); ASSERT_TRUE(reader); ASSERT_NE(reader->begin(), reader->end()); auto first_packet = reader->begin(); EXPECT_EQ(first_packet->opcode(), ConfigurationPacket::Opcode::Read); EXPECT_EQ(first_packet->address(), Spartan6::ConfRegType::FDRO); EXPECT_EQ(first_packet->data(), absl::Span()); auto third_packet = ++first_packet; ASSERT_NE(third_packet, reader->end()); EXPECT_EQ(third_packet->opcode(), ConfigurationPacket::Opcode::Write); EXPECT_EQ(third_packet->address(), Spartan6::ConfRegType::FDRI); (third_packet->data(), absl::Span(data_words)); EXPECT_EQ(++first_packet, reader->end()); }