update fabric bitstream writer to support various configuration protocols
This commit is contained in:
parent
73e75bf456
commit
e688ca1388
|
@ -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 */
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in New Issue