From e688ca13887204cdd725742d54ca4b60d7e4ed05 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 1 Jul 2020 11:54:28 -0600 Subject: [PATCH] update fabric bitstream writer to support various configuration protocols --- openfpga/src/base/openfpga_bitstream.cpp | 10 ++- .../fabric_bitstream_writer.cpp | 82 +++++++++++++++++-- .../fpga_bitstream/fabric_bitstream_writer.h | 8 +- 3 files changed, 88 insertions(+), 12 deletions(-) diff --git a/openfpga/src/base/openfpga_bitstream.cpp b/openfpga/src/base/openfpga_bitstream.cpp index 32fb8b945..3fbffc45d 100644 --- a/openfpga/src/base/openfpga_bitstream.cpp +++ b/openfpga/src/base/openfpga_bitstream.cpp @@ -74,19 +74,21 @@ int build_fabric_bitstream(OpenfpgaContext& openfpga_ctx, cmd_context.option_enable(cmd, opt_verbose)); /* Write fabric bitstream if required */ + int status = CMD_EXEC_SUCCESS; if (true == cmd_context.option_enable(cmd, opt_file)) { std::string src_dir_path = find_path_dir_name(cmd_context.option_value(cmd, opt_file)); /* Create directories */ create_directory(src_dir_path); - write_fabric_bitstream_to_text_file(openfpga_ctx.bitstream_manager(), - openfpga_ctx.fabric_bitstream(), - cmd_context.option_value(cmd, opt_file)); + status = write_fabric_bitstream_to_text_file(openfpga_ctx.bitstream_manager(), + openfpga_ctx.fabric_bitstream(), + openfpga_ctx.arch().config_protocol, + cmd_context.option_value(cmd, opt_file)); } /* TODO: should identify the error code from internal function execution */ - return CMD_EXEC_SUCCESS; + return status; } } /* end namespace openfpga */ diff --git a/openfpga/src/fpga_bitstream/fabric_bitstream_writer.cpp b/openfpga/src/fpga_bitstream/fabric_bitstream_writer.cpp index f8ca706fa..6317fd47d 100644 --- a/openfpga/src/fpga_bitstream/fabric_bitstream_writer.cpp +++ b/openfpga/src/fpga_bitstream/fabric_bitstream_writer.cpp @@ -22,6 +22,64 @@ /* begin namespace openfpga */ namespace openfpga { +/******************************************************************** + * Write a configuration bit into a plain text file + * The format depends on the type of configuration protocol + * - Vanilla (standalone): just put down pure 0|1 bitstream + * - Configuration chain: just put down pure 0|1 bitstream + * - Memory bank : + * - Frame-based configuration protocol :
+ * + * Return: + * - 0 if succeed + * - 1 if critical errors occured + *******************************************************************/ +static +int write_fabric_config_bit_to_text_file(std::fstream& fp, + const BitstreamManager& bitstream_manager, + const FabricBitstream& fabric_bitstream, + const FabricBitId& fabric_bit, + const e_config_protocol_type& config_type) { + if (false == valid_file_stream(fp)) { + return 1; + } + + switch (config_type) { + case CONFIG_MEM_STANDALONE: + case CONFIG_MEM_SCAN_CHAIN: + fp << bitstream_manager.bit_value(fabric_bitstream.config_bit(fabric_bit)); + break; + case CONFIG_MEM_MEMORY_BANK: { + for (const size_t& addr_bit : fabric_bitstream.bit_bl_address(fabric_bit)) { + fp << addr_bit; + } + write_space_to_file(fp, 1); + for (const size_t& addr_bit : fabric_bitstream.bit_wl_address(fabric_bit)) { + fp << addr_bit; + } + write_space_to_file(fp, 1); + fp << bitstream_manager.bit_value(fabric_bitstream.config_bit(fabric_bit)); + fp << "\n"; + break; + } + case CONFIG_MEM_FRAME_BASED: { + for (const size_t& addr_bit : fabric_bitstream.bit_address(fabric_bit)) { + fp << addr_bit; + } + write_space_to_file(fp, 1); + fp << bitstream_manager.bit_value(fabric_bitstream.config_bit(fabric_bit)); + fp << "\n"; + break; + } + default: + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid configuration protocol type!\n"); + return 1; + } + + return 0; +} + /******************************************************************** * Write the fabric bitstream to a plain text file * Notes: @@ -29,10 +87,15 @@ namespace openfpga { * (Verilog netlists etc.) * - Do NOT include any comments or other characters that the 0|1 bitstream content * in this file + * + * Return: + * - 0 if succeed + * - 1 if critical errors occured *******************************************************************/ -void write_fabric_bitstream_to_text_file(const BitstreamManager& bitstream_manager, - const FabricBitstream& fabric_bitstream, - const std::string& fname) { +int write_fabric_bitstream_to_text_file(const BitstreamManager& bitstream_manager, + const FabricBitstream& fabric_bitstream, + const ConfigProtocol& config_protocol, + const std::string& fname) { /* Ensure that we have a valid file name */ if (true == fname.empty()) { VTR_LOG_ERROR("Received empty file name to output bitstream!\n\tPlease specify a valid file name.\n"); @@ -47,15 +110,24 @@ void write_fabric_bitstream_to_text_file(const BitstreamManager& bitstream_manag check_file_stream(fname.c_str(), fp); - /* Put down pure 0|1 bitstream here */ + /* Output fabric bitstream to the file */ + int status = 0; for (const FabricBitId& fabric_bit : fabric_bitstream.bits()) { - fp << bitstream_manager.bit_value(fabric_bitstream.config_bit(fabric_bit)); + status = write_fabric_config_bit_to_text_file(fp, bitstream_manager, + fabric_bitstream, + fabric_bit, + config_protocol.type()); + if (1 == status) { + break; + } } /* Print an end to the file here */ fp << std::endl; /* Close file handler */ fp.close(); + + return status; } } /* end namespace openfpga */ diff --git a/openfpga/src/fpga_bitstream/fabric_bitstream_writer.h b/openfpga/src/fpga_bitstream/fabric_bitstream_writer.h index 71c2addd8..bcf5466b7 100644 --- a/openfpga/src/fpga_bitstream/fabric_bitstream_writer.h +++ b/openfpga/src/fpga_bitstream/fabric_bitstream_writer.h @@ -8,6 +8,7 @@ #include #include "bitstream_manager.h" #include "fabric_bitstream.h" +#include "config_protocol.h" /******************************************************************** * Function declaration @@ -16,9 +17,10 @@ /* begin namespace openfpga */ namespace openfpga { -void write_fabric_bitstream_to_text_file(const BitstreamManager& bitstream_manager, - const FabricBitstream& fabric_bitstream, - const std::string& fname); +int write_fabric_bitstream_to_text_file(const BitstreamManager& bitstream_manager, + const FabricBitstream& fabric_bitstream, + const ConfigProtocol& config_protocol, + const std::string& fname); } /* end namespace openfpga */