#include #include #include #include #include #include using namespace prjxray::xilinx; constexpr uint32_t kType1NOP = prjxray::bit_field_set(0, 31, 29, 0x1); constexpr uint32_t MakeType1(const int opcode, const int address, const int word_count) { return prjxray::bit_field_set( prjxray::bit_field_set( prjxray::bit_field_set( prjxray::bit_field_set(0x0, 31, 29, 0x1), 28, 27, opcode), 26, 13, address), 10, 0, word_count); } constexpr uint32_t MakeType2(const int opcode, const int word_count) { return prjxray::bit_field_set( prjxray::bit_field_set( prjxray::bit_field_set(0x0, 31, 29, 0x2), 28, 27, opcode), 26, 0, word_count); } TEST(ConfigPacket, InitWithZeroBytes) { auto packet = ConfigurationPacket::InitWithWords({}); EXPECT_EQ(packet.first, absl::Span()); EXPECT_FALSE(packet.second); } TEST(ConfigPacket, InitWithType1Nop) { std::vector words{kType1NOP}; absl::Span word_span(words); auto packet = ConfigurationPacket::InitWithWords(word_span); EXPECT_EQ(packet.first, absl::Span()); ASSERT_TRUE(packet.second); EXPECT_EQ(packet.second->opcode(), ConfigurationPacket::Opcode::NOP); EXPECT_EQ(packet.second->address(), Series7::ConfRegType::CRC); EXPECT_EQ(packet.second->data(), absl::Span()); } TEST(ConfigPacket, InitWithType1Read) { std::vector words{MakeType1(0x1, 0x2, 2), 0xAA, 0xBB}; absl::Span word_span(words); auto packet = ConfigurationPacket::InitWithWords(word_span); EXPECT_EQ(packet.first, absl::Span()); ASSERT_TRUE(packet.second); EXPECT_EQ(packet.second->opcode(), ConfigurationPacket::Opcode::Read); EXPECT_EQ(packet.second->address(), Series7::ConfRegType::FDRI); EXPECT_EQ(packet.second->data(), word_span.subspan(1)); } TEST(ConfigPacket, InitWithType1Write) { std::vector words{MakeType1(0x2, 0x3, 2), 0xAA, 0xBB}; absl::Span word_span(words); auto packet = ConfigurationPacket::InitWithWords(word_span); EXPECT_EQ(packet.first, absl::Span()); ASSERT_TRUE(packet.second); EXPECT_EQ(packet.second->opcode(), ConfigurationPacket::Opcode::Write); EXPECT_EQ(packet.second->address(), Series7::ConfRegType::FDRO); EXPECT_EQ(packet.second->data(), word_span.subspan(1)); } TEST(ConfigPacket, InitWithType2WithoutPreviousPacketFails) { std::vector words{MakeType2(0x01, 12)}; absl::Span word_span(words); auto packet = ConfigurationPacket::InitWithWords(word_span); EXPECT_EQ(packet.first, words); EXPECT_FALSE(packet.second); } TEST(ConfigPacket, InitWithType2WithPreviousPacket) { ConfigurationPacket previous_packet( static_cast(0x1), ConfigurationPacket::Opcode::Read, Series7::ConfRegType::MFWR, absl::Span()); std::vector words{ MakeType2(0x01, 12), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; absl::Span word_span(words); auto packet = ConfigurationPacket::InitWithWords( word_span, &previous_packet); EXPECT_EQ(packet.first, absl::Span()); ASSERT_TRUE(packet.second); EXPECT_EQ(packet.second->opcode(), ConfigurationPacket::Opcode::Read); EXPECT_EQ(packet.second->address(), Series7::ConfRegType::MFWR); EXPECT_EQ(packet.second->data(), word_span.subspan(1)); }