update fabric bitstream writer to support various configuration protocols

This commit is contained in:
tangxifan 2020-07-01 11:54:28 -06:00
parent 73e75bf456
commit e688ca1388
3 changed files with 88 additions and 12 deletions

View File

@ -74,19 +74,21 @@ int build_fabric_bitstream(OpenfpgaContext& openfpga_ctx,
cmd_context.option_enable(cmd, opt_verbose)); cmd_context.option_enable(cmd, opt_verbose));
/* Write fabric bitstream if required */ /* Write fabric bitstream if required */
int status = CMD_EXEC_SUCCESS;
if (true == cmd_context.option_enable(cmd, opt_file)) { 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)); std::string src_dir_path = find_path_dir_name(cmd_context.option_value(cmd, opt_file));
/* Create directories */ /* Create directories */
create_directory(src_dir_path); create_directory(src_dir_path);
write_fabric_bitstream_to_text_file(openfpga_ctx.bitstream_manager(), status = write_fabric_bitstream_to_text_file(openfpga_ctx.bitstream_manager(),
openfpga_ctx.fabric_bitstream(), openfpga_ctx.fabric_bitstream(),
openfpga_ctx.arch().config_protocol,
cmd_context.option_value(cmd, opt_file)); cmd_context.option_value(cmd, opt_file));
} }
/* TODO: should identify the error code from internal function execution */ /* TODO: should identify the error code from internal function execution */
return CMD_EXEC_SUCCESS; return status;
} }
} /* end namespace openfpga */ } /* end namespace openfpga */

View File

@ -22,6 +22,64 @@
/* begin namespace openfpga */ /* begin namespace openfpga */
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 : <BL address> <WL address> <bit>
* - Frame-based configuration protocol : <address> <bit>
*
* 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 * Write the fabric bitstream to a plain text file
* Notes: * Notes:
@ -29,9 +87,14 @@ namespace openfpga {
* (Verilog netlists etc.) * (Verilog netlists etc.)
* - Do NOT include any comments or other characters that the 0|1 bitstream content * - Do NOT include any comments or other characters that the 0|1 bitstream content
* in this file * in this file
*
* Return:
* - 0 if succeed
* - 1 if critical errors occured
*******************************************************************/ *******************************************************************/
void write_fabric_bitstream_to_text_file(const BitstreamManager& bitstream_manager, int write_fabric_bitstream_to_text_file(const BitstreamManager& bitstream_manager,
const FabricBitstream& fabric_bitstream, const FabricBitstream& fabric_bitstream,
const ConfigProtocol& config_protocol,
const std::string& fname) { const std::string& fname) {
/* Ensure that we have a valid file name */ /* Ensure that we have a valid file name */
if (true == fname.empty()) { if (true == fname.empty()) {
@ -47,15 +110,24 @@ void write_fabric_bitstream_to_text_file(const BitstreamManager& bitstream_manag
check_file_stream(fname.c_str(), fp); 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()) { 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 */ /* Print an end to the file here */
fp << std::endl; fp << std::endl;
/* Close file handler */ /* Close file handler */
fp.close(); fp.close();
return status;
} }
} /* end namespace openfpga */ } /* end namespace openfpga */

View File

@ -8,6 +8,7 @@
#include <vector> #include <vector>
#include "bitstream_manager.h" #include "bitstream_manager.h"
#include "fabric_bitstream.h" #include "fabric_bitstream.h"
#include "config_protocol.h"
/******************************************************************** /********************************************************************
* Function declaration * Function declaration
@ -16,8 +17,9 @@
/* begin namespace openfpga */ /* begin namespace openfpga */
namespace openfpga { namespace openfpga {
void write_fabric_bitstream_to_text_file(const BitstreamManager& bitstream_manager, int write_fabric_bitstream_to_text_file(const BitstreamManager& bitstream_manager,
const FabricBitstream& fabric_bitstream, const FabricBitstream& fabric_bitstream,
const ConfigProtocol& config_protocol,
const std::string& fname); const std::string& fname);
} /* end namespace openfpga */ } /* end namespace openfpga */