| /* | 
 |  * 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 <fstream> | 
 | #include <iostream> | 
 |  | 
 | #include <absl/strings/str_cat.h> | 
 | #include <absl/strings/str_split.h> | 
 | #include <absl/time/clock.h> | 
 | #include <absl/time/time.h> | 
 |  | 
 | #include <prjxray/xilinx/architectures.h> | 
 | #include <prjxray/xilinx/bitstream_writer.h> | 
 | #include <prjxray/xilinx/configuration.h> | 
 | #include <prjxray/xilinx/configuration_packet_with_payload.h> | 
 | #include <prjxray/xilinx/nop_packet.h> | 
 | #include <prjxray/xilinx/spartan6/command.h> | 
 | #include <prjxray/xilinx/xc7series/command.h> | 
 | #include <prjxray/xilinx/xc7series/configuration_options_0_value.h> | 
 |  | 
 | namespace prjxray { | 
 | namespace xilinx { | 
 |  | 
 | template <> | 
 | Configuration<Spartan6>::PacketData | 
 | Configuration<Spartan6>::createType2ConfigurationPacketData( | 
 |     const Frames<Spartan6>::Frames2Data& frames, | 
 |     absl::optional<Spartan6::Part>& 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<Spartan6>::createConfigurationPackage( | 
 |     Spartan6::ConfigurationPackage& out_packets, | 
 |     const PacketData& packet_data, | 
 |     absl::optional<Spartan6::Part>& part) { | 
 | 	using ArchType = Spartan6; | 
 | 	using ConfigurationRegister = ArchType::ConfRegType; | 
 | 	// Initialization sequence | 
 | 	// | 
 | 	// Reset CRC | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(spartan6::Command::RCRC)})); | 
 |  | 
 | 	// NOP | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 |  | 
 | 	// Frame length | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::FLR, {0x0380})); | 
 |  | 
 | 	// Configuration Options 1 | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::COR1, {0x3d08})); | 
 |  | 
 | 	// Configurations Options2 | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::COR2, {0x9ee})); | 
 |  | 
 | 	// IDCODE | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<2, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::IDCODE, | 
 | 	        {part->idcode() >> 16, part->idcode()})); | 
 |  | 
 | 	// Control MASK | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::MASK, {0xcf})); | 
 |  | 
 | 	// Control options | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CTL, {0x81})); | 
 |  | 
 | 	// NOP packets | 
 | 	for (int i = 0; i < 17; i++) { | 
 | 		out_packets.emplace_back( | 
 | 		    new NopPacket<ConfigurationRegister>()); | 
 | 	} | 
 |  | 
 | 	// CCLK FREQ | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CCLK_FREQ, {0x3cc8})); | 
 |  | 
 | 	// PWRDN_REG | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::PWRDN_REG, {0x881})); | 
 |  | 
 | 	// EYE MASK | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::EYE_MASK, {0x0})); | 
 |  | 
 | 	// House Clean Option | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::HC_OPT_REG, {0x1f})); | 
 |  | 
 | 	// Configuration Watchdog Timer | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CWDT, {0xffff})); | 
 |  | 
 | 	// GWE cycle during wake-up from suspend | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::PU_GWE, {0x5})); | 
 |  | 
 | 	// GTS cycle during wake-up from suspend | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::PU_GTS, {0x4})); | 
 |  | 
 | 	// Reboot mode | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::MODE_REG, {0x100})); | 
 |  | 
 | 	// General options 1 | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::GENERAL1, {0x0})); | 
 |  | 
 | 	// General options 2 | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::GENERAL2, {0x0})); | 
 |  | 
 | 	// General options 3 | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::GENERAL3, {0x0})); | 
 |  | 
 | 	// General options 4 | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::GENERAL4, {0x0})); | 
 |  | 
 | 	// General options 5 | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::GENERAL5, {0x0})); | 
 |  | 
 | 	// SEU frequency, enable and status | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::SEU_OPT, {0x1be2})); | 
 |  | 
 | 	// Expected readback signature for SEU detection | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<2, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::EXP_SIGN, {0x0, 0x0})); | 
 |  | 
 | 	// NOP | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 |  | 
 | 	// FAR | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<2, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::FAR_MAJ, {0x0, 0x0})); | 
 |  | 
 | 	// Write Configuration Data | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(spartan6::Command::WCFG)})); | 
 |  | 
 | 	// Frame data write | 
 | 	out_packets.emplace_back(new ConfigurationPacket<ConfigurationRegister>( | 
 | 	    TYPE2, ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	    ConfigurationRegister::FDRI, {packet_data})); | 
 |  | 
 | 	// NOP packets | 
 | 	for (int i = 0; i < 24; i++) { | 
 | 		out_packets.emplace_back( | 
 | 		    new NopPacket<ConfigurationRegister>()); | 
 | 	} | 
 |  | 
 | 	// Finalization sequence | 
 | 	// | 
 | 	// Set/reset the IOB and CLB flip-flops | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(spartan6::Command::GRESTORE)})); | 
 |  | 
 | 	// Last Frame | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(spartan6::Command::LFRM)})); | 
 |  | 
 | 	// NOP packets | 
 | 	for (int i = 0; i < 4; i++) { | 
 | 		out_packets.emplace_back( | 
 | 		    new NopPacket<ConfigurationRegister>()); | 
 | 	} | 
 |  | 
 | 	// Set/reset the IOB and CLB flip-flops | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(spartan6::Command::GRESTORE)})); | 
 |  | 
 | 	// Startup sequence | 
 | 	// | 
 | 	// Start | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(spartan6::Command::START)})); | 
 |  | 
 | 	// Control MASK | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::MASK, {0xff})); | 
 |  | 
 | 	// Control options | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CTL, {0x81})); | 
 |  | 
 | 	// CRC | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<2, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CRC, {0x39, 0xe423})); | 
 |  | 
 | 	// Desync | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(spartan6::Command::DESYNC)})); | 
 |  | 
 | 	// NOP packets | 
 | 	for (int i = 0; i < 14; i++) { | 
 | 		out_packets.emplace_back( | 
 | 		    new NopPacket<ConfigurationRegister>()); | 
 | 	} | 
 | } | 
 |  | 
 | template <> | 
 | void Configuration<Series7>::createConfigurationPackage( | 
 |     Series7::ConfigurationPackage& out_packets, | 
 |     const PacketData& packet_data, | 
 |     absl::optional<Series7::Part>& part) { | 
 | 	using ArchType = Series7; | 
 | 	using ConfigurationRegister = ArchType::ConfRegType; | 
 | 	// Initialization sequence | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::TIMER, {0x0})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::WBSTAR, {0x0})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::NOP)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::RCRC)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::UNKNOWN, {0x0})); | 
 |  | 
 | 	// Configuration Options 0 | 
 | 	out_packets.emplace_back(new ConfigurationPacketWithPayload< | 
 | 	                         1, ConfigurationRegister>( | 
 | 	    ConfigurationPacket<ConfigurationRegister>::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<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::COR1, {0x0})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::IDCODE, {part->idcode()})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::SWITCH)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::MASK, {0x401})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CTL0, {0x501})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::MASK, {0x0})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CTL1, {0x0})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::FAR, {0x0})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::WCFG)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 |  | 
 | 	// Frame data write | 
 | 	out_packets.emplace_back(new ConfigurationPacket<ConfigurationRegister>( | 
 | 	    TYPE1, ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	    ConfigurationRegister::FDRI, {})); | 
 | 	out_packets.emplace_back(new ConfigurationPacket<ConfigurationRegister>( | 
 | 	    TYPE2, ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	    ConfigurationRegister::FDRI, packet_data)); | 
 |  | 
 | 	// Finalization sequence | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::RCRC)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::GRESTORE)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::LFRM)})); | 
 | 	for (int ii = 0; ii < 100; ++ii) { | 
 | 		out_packets.emplace_back( | 
 | 		    new NopPacket<ConfigurationRegister>()); | 
 | 	} | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::START)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::FAR, {0x3be0000})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::MASK, {0x501})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CTL0, {0x501})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::RCRC)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::DESYNC)})); | 
 | 	for (int ii = 0; ii < 400; ++ii) { | 
 | 		out_packets.emplace_back( | 
 | 		    new NopPacket<ConfigurationRegister>()); | 
 | 	} | 
 | } | 
 |  | 
 | template <> | 
 | void Configuration<UltraScale>::createConfigurationPackage( | 
 |     UltraScale::ConfigurationPackage& out_packets, | 
 |     const PacketData& packet_data, | 
 |     absl::optional<UltraScale::Part>& part) { | 
 | 	using ArchType = UltraScale; | 
 | 	using ConfigurationRegister = ArchType::ConfRegType; | 
 | 	// Initialization sequence | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::TIMER, {0x0})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::WBSTAR, {0x0})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::NOP)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::RCRC)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::FAR, {0x0})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::UNKNOWN, {0x0})); | 
 |  | 
 | 	// Configuration Options 0 | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::COR0, {0x38003fe5})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::COR1, {0x400000})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::IDCODE, {part->idcode()})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::SWITCH)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::MASK, {0x1})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CTL0, {0x101})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::MASK, {0x0})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CTL1, {0x0})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::FAR, {0x0})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::WCFG)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 |  | 
 | 	// Frame data write | 
 | 	out_packets.emplace_back(new ConfigurationPacket<ConfigurationRegister>( | 
 | 	    TYPE1, ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	    ConfigurationRegister::FDRI, {})); | 
 | 	out_packets.emplace_back(new ConfigurationPacket<ConfigurationRegister>( | 
 | 	    TYPE2, ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	    ConfigurationRegister::FDRI, packet_data)); | 
 |  | 
 | 	// Finalization sequence | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::RCRC)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::GRESTORE)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::LFRM)})); | 
 | 	for (int ii = 0; ii < 100; ++ii) { | 
 | 		out_packets.emplace_back( | 
 | 		    new NopPacket<ConfigurationRegister>()); | 
 | 	} | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::START)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::FAR, {0x3be0000})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::MASK, {0x101})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CTL0, {0x101})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::RCRC)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::DESYNC)})); | 
 | 	for (int ii = 0; ii < 400; ++ii) { | 
 | 		out_packets.emplace_back( | 
 | 		    new NopPacket<ConfigurationRegister>()); | 
 | 	} | 
 | } | 
 |  | 
 | template <> | 
 | void Configuration<UltraScalePlus>::createConfigurationPackage( | 
 |     UltraScalePlus::ConfigurationPackage& out_packets, | 
 |     const PacketData& packet_data, | 
 |     absl::optional<UltraScalePlus::Part>& part) { | 
 | 	using ArchType = UltraScalePlus; | 
 | 	using ConfigurationRegister = ArchType::ConfRegType; | 
 | 	// Initialization sequence | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::TIMER, {0x0})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::WBSTAR, {0x0})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::NOP)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::RCRC)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::FAR, {0x0})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::UNKNOWN, {0x0})); | 
 |  | 
 | 	// Configuration Options 0 | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::COR0, {0x38003fe5})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::COR1, {0x400000})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::IDCODE, {part->idcode()})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::SWITCH)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::MASK, {0x1})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CTL0, {0x101})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::MASK, {0x0})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CTL1, {0x0})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::FAR, {0x0})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::WCFG)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 |  | 
 | 	// Frame data write | 
 | 	out_packets.emplace_back(new ConfigurationPacket<ConfigurationRegister>( | 
 | 	    TYPE1, ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	    ConfigurationRegister::FDRI, {})); | 
 | 	out_packets.emplace_back(new ConfigurationPacket<ConfigurationRegister>( | 
 | 	    TYPE2, ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	    ConfigurationRegister::FDRI, packet_data)); | 
 |  | 
 | 	// Finalization sequence | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::RCRC)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::GRESTORE)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::LFRM)})); | 
 | 	for (int ii = 0; ii < 100; ++ii) { | 
 | 		out_packets.emplace_back( | 
 | 		    new NopPacket<ConfigurationRegister>()); | 
 | 	} | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::START)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::FAR, {0x3be0000})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::MASK, {0x101})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CTL0, {0x101})); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::RCRC)})); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back(new NopPacket<ConfigurationRegister>()); | 
 | 	out_packets.emplace_back( | 
 | 	    new ConfigurationPacketWithPayload<1, ConfigurationRegister>( | 
 | 	        ConfigurationPacket<ConfigurationRegister>::Opcode::Write, | 
 | 	        ConfigurationRegister::CMD, | 
 | 	        {static_cast<uint32_t>(xc7series::Command::DESYNC)})); | 
 | 	for (int ii = 0; ii < 400; ++ii) { | 
 | 		out_packets.emplace_back( | 
 | 		    new NopPacket<ConfigurationRegister>()); | 
 | 	} | 
 | } | 
 | }  // namespace xilinx | 
 | }  // namespace prjxray |