/* * Copyright (C) 2017-2020 The Project X-Ray Authors. * * Use of this source code is governed by a ISC-style * license that can be found in the LICENSE file or at * https://opensource.org/licenses/ISC * * SPDX-License-Identifier: ISC */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace prjxray { namespace xilinx { template <> Configuration::PacketData Configuration::createType2ConfigurationPacketData( const Frames::Frames2Data& frames, absl::optional& part) { // Generate a single type 2 packet that writes everything at once. PacketData packet_data; for (auto& frame : frames) { std::copy(frame.second.begin(), frame.second.end(), std::back_inserter(packet_data)); } // Insert payload length size_t packet_data_size = packet_data.size() - 2; packet_data.insert(packet_data.begin(), packet_data_size & 0xFFFF); packet_data.insert(packet_data.begin(), (packet_data_size >> 16) & 0xFFFF); return packet_data; } template <> void Configuration::createConfigurationPackage( Spartan6::ConfigurationPackage& out_packets, const PacketData& packet_data, absl::optional& part) { using ArchType = Spartan6; using ConfigurationRegister = ArchType::ConfRegType; // Initialization sequence // // Reset CRC out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(spartan6::Command::RCRC)})); // NOP out_packets.emplace_back(new NopPacket()); // Frame length out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::FLR, {0x0380})); // Configuration Options 1 out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::COR1, {0x3d08})); // Configurations Options2 out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::COR2, {0x9ee})); // IDCODE out_packets.emplace_back( new ConfigurationPacketWithPayload<2, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::IDCODE, {part->idcode() >> 16, part->idcode()})); // Control MASK out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::MASK, {0xcf})); // Control options out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CTL, {0x81})); // NOP packets for (int i = 0; i < 17; i++) { out_packets.emplace_back( new NopPacket()); } // CCLK FREQ out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CCLK_FREQ, {0x3cc8})); // PWRDN_REG out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::PWRDN_REG, {0x881})); // EYE MASK out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::EYE_MASK, {0x0})); // House Clean Option out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::HC_OPT_REG, {0x1f})); // Configuration Watchdog Timer out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CWDT, {0xffff})); // GWE cycle during wake-up from suspend out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::PU_GWE, {0x5})); // GTS cycle during wake-up from suspend out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::PU_GTS, {0x4})); // Reboot mode out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::MODE_REG, {0x100})); // General options 1 out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::GENERAL1, {0x0})); // General options 2 out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::GENERAL2, {0x0})); // General options 3 out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::GENERAL3, {0x0})); // General options 4 out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::GENERAL4, {0x0})); // General options 5 out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::GENERAL5, {0x0})); // SEU frequency, enable and status out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::SEU_OPT, {0x1be2})); // Expected readback signature for SEU detection out_packets.emplace_back( new ConfigurationPacketWithPayload<2, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::EXP_SIGN, {0x0, 0x0})); // NOP out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); // FAR out_packets.emplace_back( new ConfigurationPacketWithPayload<2, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::FAR_MAJ, {0x0, 0x0})); // Write Configuration Data out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(spartan6::Command::WCFG)})); // Frame data write out_packets.emplace_back(new ConfigurationPacket( TYPE2, ConfigurationPacket::Opcode::Write, ConfigurationRegister::FDRI, {packet_data})); // NOP packets for (int i = 0; i < 24; i++) { out_packets.emplace_back( new NopPacket()); } // Finalization sequence // // Set/reset the IOB and CLB flip-flops out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(spartan6::Command::GRESTORE)})); // Last Frame out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(spartan6::Command::LFRM)})); // NOP packets for (int i = 0; i < 4; i++) { out_packets.emplace_back( new NopPacket()); } // Set/reset the IOB and CLB flip-flops out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(spartan6::Command::GRESTORE)})); // Startup sequence // // Start out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(spartan6::Command::START)})); // Control MASK out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::MASK, {0xff})); // Control options out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CTL, {0x81})); // CRC out_packets.emplace_back( new ConfigurationPacketWithPayload<2, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CRC, {0x39, 0xe423})); // Desync out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(spartan6::Command::DESYNC)})); // NOP packets for (int i = 0; i < 14; i++) { out_packets.emplace_back( new NopPacket()); } } template <> void Configuration::createConfigurationPackage( Series7::ConfigurationPackage& out_packets, const PacketData& packet_data, absl::optional& part) { using ArchType = Series7; using ConfigurationRegister = ArchType::ConfRegType; // Initialization sequence out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::TIMER, {0x0})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::WBSTAR, {0x0})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::NOP)})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::RCRC)})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::UNKNOWN, {0x0})); // Configuration Options 0 out_packets.emplace_back(new ConfigurationPacketWithPayload< 1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::COR0, {xc7series::ConfigurationOptions0Value() .SetAddPipelineStageForDoneIn(true) .SetReleaseDonePinAtStartupCycle( xc7series::ConfigurationOptions0Value::SignalReleaseCycle:: Phase4) .SetStallAtStartupCycleUntilDciMatch( xc7series::ConfigurationOptions0Value::StallCycle::NoWait) .SetStallAtStartupCycleUntilMmcmLock( xc7series::ConfigurationOptions0Value::StallCycle::NoWait) .SetReleaseGtsSignalAtStartupCycle( xc7series::ConfigurationOptions0Value::SignalReleaseCycle:: Phase5) .SetReleaseGweSignalAtStartupCycle( xc7series::ConfigurationOptions0Value::SignalReleaseCycle:: Phase6)})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::COR1, {0x0})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::IDCODE, {part->idcode()})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::SWITCH)})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::MASK, {0x401})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CTL0, {0x501})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::MASK, {0x0})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CTL1, {0x0})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::FAR, {0x0})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::WCFG)})); out_packets.emplace_back(new NopPacket()); // Frame data write out_packets.emplace_back(new ConfigurationPacket( TYPE1, ConfigurationPacket::Opcode::Write, ConfigurationRegister::FDRI, {})); out_packets.emplace_back(new ConfigurationPacket( TYPE2, ConfigurationPacket::Opcode::Write, ConfigurationRegister::FDRI, packet_data)); // Finalization sequence out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::RCRC)})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::GRESTORE)})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::LFRM)})); for (int ii = 0; ii < 100; ++ii) { out_packets.emplace_back( new NopPacket()); } out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::START)})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::FAR, {0x3be0000})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::MASK, {0x501})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CTL0, {0x501})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::RCRC)})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::DESYNC)})); for (int ii = 0; ii < 400; ++ii) { out_packets.emplace_back( new NopPacket()); } } template <> void Configuration::createConfigurationPackage( UltraScale::ConfigurationPackage& out_packets, const PacketData& packet_data, absl::optional& part) { using ArchType = UltraScale; using ConfigurationRegister = ArchType::ConfRegType; // Initialization sequence out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::TIMER, {0x0})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::WBSTAR, {0x0})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::NOP)})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::RCRC)})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::FAR, {0x0})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::UNKNOWN, {0x0})); // Configuration Options 0 out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::COR0, {0x38003fe5})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::COR1, {0x400000})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::IDCODE, {part->idcode()})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::SWITCH)})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::MASK, {0x1})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CTL0, {0x101})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::MASK, {0x0})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CTL1, {0x0})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::FAR, {0x0})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::WCFG)})); out_packets.emplace_back(new NopPacket()); // Frame data write out_packets.emplace_back(new ConfigurationPacket( TYPE1, ConfigurationPacket::Opcode::Write, ConfigurationRegister::FDRI, {})); out_packets.emplace_back(new ConfigurationPacket( TYPE2, ConfigurationPacket::Opcode::Write, ConfigurationRegister::FDRI, packet_data)); // Finalization sequence out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::RCRC)})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::GRESTORE)})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::LFRM)})); for (int ii = 0; ii < 100; ++ii) { out_packets.emplace_back( new NopPacket()); } out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::START)})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::FAR, {0x3be0000})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::MASK, {0x101})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CTL0, {0x101})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::RCRC)})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::DESYNC)})); for (int ii = 0; ii < 400; ++ii) { out_packets.emplace_back( new NopPacket()); } } template <> void Configuration::createConfigurationPackage( UltraScalePlus::ConfigurationPackage& out_packets, const PacketData& packet_data, absl::optional& part) { using ArchType = UltraScalePlus; using ConfigurationRegister = ArchType::ConfRegType; // Initialization sequence out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::TIMER, {0x0})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::WBSTAR, {0x0})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::NOP)})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::RCRC)})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::FAR, {0x0})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::UNKNOWN, {0x0})); // Configuration Options 0 out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::COR0, {0x38003fe5})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::COR1, {0x400000})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::IDCODE, {part->idcode()})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::SWITCH)})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::MASK, {0x1})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CTL0, {0x101})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::MASK, {0x0})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CTL1, {0x0})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::FAR, {0x0})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::WCFG)})); out_packets.emplace_back(new NopPacket()); // Frame data write out_packets.emplace_back(new ConfigurationPacket( TYPE1, ConfigurationPacket::Opcode::Write, ConfigurationRegister::FDRI, {})); out_packets.emplace_back(new ConfigurationPacket( TYPE2, ConfigurationPacket::Opcode::Write, ConfigurationRegister::FDRI, packet_data)); // Finalization sequence out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::RCRC)})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::GRESTORE)})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::LFRM)})); for (int ii = 0; ii < 100; ++ii) { out_packets.emplace_back( new NopPacket()); } out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::START)})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::FAR, {0x3be0000})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::MASK, {0x101})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CTL0, {0x101})); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::RCRC)})); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back(new NopPacket()); out_packets.emplace_back( new ConfigurationPacketWithPayload<1, ConfigurationRegister>( ConfigurationPacket::Opcode::Write, ConfigurationRegister::CMD, {static_cast(xc7series::Command::DESYNC)})); for (int ii = 0; ii < 400; ++ii) { out_packets.emplace_back( new NopPacket()); } } } // namespace xilinx } // namespace prjxray