| /* |
| * 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 |