seperate xml parser and bin parser
This commit is contained in:
parent
5b0e52a03b
commit
4d8fae94a4
|
@ -0,0 +1,104 @@
|
||||||
|
#include <capnp/message.h>
|
||||||
|
#include <capnp/serialize.h>
|
||||||
|
#include <kj/io.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
/* Headers from pugi XML library */
|
||||||
|
#include "pugixml.hpp"
|
||||||
|
#include "pugixml_util.hpp"
|
||||||
|
|
||||||
|
/* Headers from vtr util library */
|
||||||
|
#include "vtr_assert.h"
|
||||||
|
#include "vtr_log.h"
|
||||||
|
#include "vtr_time.h"
|
||||||
|
|
||||||
|
/* Headers from libarchfpga */
|
||||||
|
#include "arch_error.h"
|
||||||
|
#include "command_exit_codes.h"
|
||||||
|
#include "device_rr_gsb_utils.h"
|
||||||
|
#include "mmap_file.h"
|
||||||
|
#include "openfpga_digest.h"
|
||||||
|
#include "read_unique_blocks_bin.h"
|
||||||
|
#include "read_unique_blocks_xml.h"
|
||||||
|
#include "read_xml_util.h"
|
||||||
|
#include "rr_gsb.h"
|
||||||
|
#include "unique_blocks_uxsdcxx.capnp.h"
|
||||||
|
#include "write_xml_utils.h"
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* This file includes the top-level functions of this library
|
||||||
|
* which includes:
|
||||||
|
* -- reads a bin file of unique blocks to the associated
|
||||||
|
* data structures: device_rr_gsb
|
||||||
|
*******************************************************************/
|
||||||
|
namespace openfpga {
|
||||||
|
|
||||||
|
/*read the instances' coordinate of a unique block from a bin file*/
|
||||||
|
std::vector<vtr::Point<size_t>> read_bin_unique_instance_coords(
|
||||||
|
const ucap::Uniqueblockpacked::Reader& unique_block) {
|
||||||
|
std::vector<vtr::Point<size_t>> instance_coords;
|
||||||
|
if (unique_block.hasInstances()) {
|
||||||
|
auto instance_list = unique_block.getInstances();
|
||||||
|
for (auto instance : instance_list) {
|
||||||
|
int instance_x = instance.getX();
|
||||||
|
int instance_y = instance.getY();
|
||||||
|
vtr::Point<size_t> instance_coordinate(instance_x, instance_y);
|
||||||
|
instance_coords.push_back(instance_coordinate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return instance_coords;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*read the unique block coordinate from a bin file */
|
||||||
|
vtr::Point<size_t> read_bin_unique_block_coord(
|
||||||
|
const ucap::Uniqueblockpacked::Reader& unique_block, ucap::Blocktype& type) {
|
||||||
|
auto block_info = unique_block.getBlockinfo();
|
||||||
|
int block_x = block_info.getX();
|
||||||
|
int block_y = block_info.getY();
|
||||||
|
type = block_info.getType();
|
||||||
|
vtr::Point<size_t> block_coordinate(block_x, block_y);
|
||||||
|
return block_coordinate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*top-level function to read unique blocks from bin file*/
|
||||||
|
int read_bin_unique_blocks(DeviceRRGSB& device_rr_gsb, const char* file_name,
|
||||||
|
bool verbose_output) {
|
||||||
|
/* clear unique modules & reserve memory to relavant vectors */
|
||||||
|
device_rr_gsb.clear_unique_modules();
|
||||||
|
device_rr_gsb.reserve_unique_modules();
|
||||||
|
MmapFile f(file_name);
|
||||||
|
::capnp::FlatArrayMessageReader reader(f.getData());
|
||||||
|
auto root = reader.getRoot<ucap::UniqueBlocks>();
|
||||||
|
if (root.hasAtominfos()) {
|
||||||
|
auto block_list = root.getAtominfos();
|
||||||
|
for (auto unique_block : block_list) {
|
||||||
|
ucap::Blocktype type;
|
||||||
|
vtr::Point<size_t> block_coordinate = read_bin_unique_block_coord(
|
||||||
|
unique_block, type); /*get block coordinate and type*/
|
||||||
|
std::vector<vtr::Point<size_t>> instance_coords =
|
||||||
|
read_bin_unique_instance_coords(
|
||||||
|
unique_block); /* get a list of instance coordinates*/
|
||||||
|
/* get block coordinate and instance coordinate, try to setup
|
||||||
|
* device_rr_gsb */
|
||||||
|
if (type == ucap::Blocktype::SB) {
|
||||||
|
device_rr_gsb.preload_unique_sb_module(block_coordinate,
|
||||||
|
instance_coords);
|
||||||
|
} else if (type == ucap::Blocktype::CBY) {
|
||||||
|
device_rr_gsb.preload_unique_cby_module(block_coordinate,
|
||||||
|
instance_coords);
|
||||||
|
} else if (type == ucap::Blocktype::CBX) {
|
||||||
|
device_rr_gsb.preload_unique_cbx_module(block_coordinate,
|
||||||
|
instance_coords);
|
||||||
|
} else if (type == ucap::Blocktype::UXSD_INVALID) {
|
||||||
|
VTR_LOG_ERROR("Invalid block type!");
|
||||||
|
return CMD_EXEC_FATAL_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
device_rr_gsb.build_gsb_unique_module();
|
||||||
|
if (verbose_output) {
|
||||||
|
report_unique_module_status_read(device_rr_gsb, true);
|
||||||
|
}
|
||||||
|
return CMD_EXEC_SUCCESS;
|
||||||
|
}
|
||||||
|
} // namespace openfpga
|
|
@ -0,0 +1,36 @@
|
||||||
|
#ifndef READ_XML_UNIQUE_BLOCKS_BIN_H
|
||||||
|
#define READ_XML_UNIQUE_BLOCKS_BIN_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
/* Headers from pugi XML library */
|
||||||
|
#include "pugixml.hpp"
|
||||||
|
#include "pugixml_util.hpp"
|
||||||
|
|
||||||
|
/* Headers from vtr util library */
|
||||||
|
#include "vtr_assert.h"
|
||||||
|
#include "vtr_log.h"
|
||||||
|
#include "vtr_time.h"
|
||||||
|
|
||||||
|
/* Headers from libarchfpga */
|
||||||
|
#include "arch_error.h"
|
||||||
|
#include "device_rr_gsb_utils.h"
|
||||||
|
#include "unique_blocks_uxsdcxx.capnp.h"
|
||||||
|
/********************************************************************
|
||||||
|
* This file includes the top-level functions of this library
|
||||||
|
* which includes:
|
||||||
|
* -- reads a bin file of unique blocks to the associated
|
||||||
|
* data structures: device_rr_gsb
|
||||||
|
*******************************************************************/
|
||||||
|
namespace openfpga {
|
||||||
|
std::vector<vtr::Point<size_t>> read_bin_unique_instance_coords(
|
||||||
|
const ucap::Uniqueblockpacked::Reader& unique_block);
|
||||||
|
|
||||||
|
vtr::Point<size_t> read_bin_unique_block_coord(
|
||||||
|
const ucap::Uniqueblockpacked::Reader& unique_block, ucap::Blocktype& type);
|
||||||
|
|
||||||
|
int read_bin_unique_blocks(DeviceRRGSB& device_rr_gsb, const char* file_name,
|
||||||
|
bool verbose_output);
|
||||||
|
} // namespace openfpga
|
||||||
|
|
||||||
|
#endif
|
|
@ -18,7 +18,7 @@
|
||||||
#include "device_rr_gsb_utils.h"
|
#include "device_rr_gsb_utils.h"
|
||||||
#include "mmap_file.h"
|
#include "mmap_file.h"
|
||||||
#include "openfpga_digest.h"
|
#include "openfpga_digest.h"
|
||||||
#include "read_unique_blocks.h"
|
#include "read_unique_blocks_xml.h"
|
||||||
#include "read_xml_util.h"
|
#include "read_xml_util.h"
|
||||||
#include "rr_gsb.h"
|
#include "rr_gsb.h"
|
||||||
#include "unique_blocks_uxsdcxx.capnp.h"
|
#include "unique_blocks_uxsdcxx.capnp.h"
|
||||||
|
@ -159,73 +159,4 @@ int read_xml_unique_blocks(DeviceRRGSB& device_rr_gsb, const char* file_name,
|
||||||
archfpga_throw(file_name, e.line(), "%s", e.what());
|
archfpga_throw(file_name, e.line(), "%s", e.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*read the instances' coordinate of a unique block from a bin file*/
|
|
||||||
std::vector<vtr::Point<size_t>> read_bin_unique_instance_coords(
|
|
||||||
const ucap::Uniqueblockpacked::Reader& unique_block) {
|
|
||||||
std::vector<vtr::Point<size_t>> instance_coords;
|
|
||||||
if (unique_block.hasInstances()) {
|
|
||||||
auto instance_list = unique_block.getInstances();
|
|
||||||
for (auto instance : instance_list) {
|
|
||||||
int instance_x = instance.getX();
|
|
||||||
int instance_y = instance.getY();
|
|
||||||
vtr::Point<size_t> instance_coordinate(instance_x, instance_y);
|
|
||||||
instance_coords.push_back(instance_coordinate);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return instance_coords;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*read the unique block coordinate from a bin file */
|
|
||||||
vtr::Point<size_t> read_bin_unique_block_coord(
|
|
||||||
const ucap::Uniqueblockpacked::Reader& unique_block, ucap::Blocktype& type) {
|
|
||||||
auto block_info = unique_block.getBlockinfo();
|
|
||||||
int block_x = block_info.getX();
|
|
||||||
int block_y = block_info.getY();
|
|
||||||
type = block_info.getType();
|
|
||||||
vtr::Point<size_t> block_coordinate(block_x, block_y);
|
|
||||||
return block_coordinate;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*top-level function to read unique blocks from bin file*/
|
|
||||||
int read_bin_unique_blocks(DeviceRRGSB& device_rr_gsb, const char* file_name,
|
|
||||||
bool verbose_output) {
|
|
||||||
/* clear unique modules & reserve memory to relavant vectors */
|
|
||||||
device_rr_gsb.clear_unique_modules();
|
|
||||||
device_rr_gsb.reserve_unique_modules();
|
|
||||||
MmapFile f(file_name);
|
|
||||||
::capnp::FlatArrayMessageReader reader(f.getData());
|
|
||||||
auto root = reader.getRoot<ucap::UniqueBlocks>();
|
|
||||||
if (root.hasAtominfos()) {
|
|
||||||
auto block_list = root.getAtominfos();
|
|
||||||
for (auto unique_block : block_list) {
|
|
||||||
ucap::Blocktype type;
|
|
||||||
vtr::Point<size_t> block_coordinate = read_bin_unique_block_coord(
|
|
||||||
unique_block, type); /*get block coordinate and type*/
|
|
||||||
std::vector<vtr::Point<size_t>> instance_coords =
|
|
||||||
read_bin_unique_instance_coords(
|
|
||||||
unique_block); /* get a list of instance coordinates*/
|
|
||||||
/* get block coordinate and instance coordinate, try to setup
|
|
||||||
* device_rr_gsb */
|
|
||||||
if (type == ucap::Blocktype::SB) {
|
|
||||||
device_rr_gsb.preload_unique_sb_module(block_coordinate,
|
|
||||||
instance_coords);
|
|
||||||
} else if (type == ucap::Blocktype::CBY) {
|
|
||||||
device_rr_gsb.preload_unique_cby_module(block_coordinate,
|
|
||||||
instance_coords);
|
|
||||||
} else if (type == ucap::Blocktype::CBX) {
|
|
||||||
device_rr_gsb.preload_unique_cbx_module(block_coordinate,
|
|
||||||
instance_coords);
|
|
||||||
} else if (type == ucap::Blocktype::UXSD_INVALID) {
|
|
||||||
VTR_LOG_ERROR("Invalid block type!");
|
|
||||||
return CMD_EXEC_FATAL_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
device_rr_gsb.build_gsb_unique_module();
|
|
||||||
if (verbose_output) {
|
|
||||||
report_unique_module_status_read(device_rr_gsb, true);
|
|
||||||
}
|
|
||||||
return CMD_EXEC_SUCCESS;
|
|
||||||
}
|
|
||||||
} // namespace openfpga
|
} // namespace openfpga
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef READ_XML_UNIQUE_BLOCKS_H
|
#ifndef READ_XML_UNIQUE_BLOCKS_XML_H
|
||||||
#define READ_XML_UNIQUE_BLOCKS_H
|
#define READ_XML_UNIQUE_BLOCKS_XML_H
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
@ -35,15 +35,6 @@ void report_unique_module_status_read(const DeviceRRGSB& device_rr_gsb,
|
||||||
|
|
||||||
int read_xml_unique_blocks(DeviceRRGSB& device_rr_gsb, const char* file_name,
|
int read_xml_unique_blocks(DeviceRRGSB& device_rr_gsb, const char* file_name,
|
||||||
bool verbose_output);
|
bool verbose_output);
|
||||||
|
|
||||||
std::vector<vtr::Point<size_t>> read_bin_unique_instance_coords(
|
|
||||||
const ucap::Uniqueblockpacked::Reader& unique_block);
|
|
||||||
|
|
||||||
vtr::Point<size_t> read_bin_unique_block_coord(
|
|
||||||
const ucap::Uniqueblockpacked::Reader& unique_block, ucap::Blocktype& type);
|
|
||||||
|
|
||||||
int read_bin_unique_blocks(DeviceRRGSB& device_rr_gsb, const char* file_name,
|
|
||||||
bool verbose_output);
|
|
||||||
} // namespace openfpga
|
} // namespace openfpga
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -0,0 +1,121 @@
|
||||||
|
|
||||||
|
#include <capnp/message.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
/* Headers from pugi XML library */
|
||||||
|
#include "pugixml.hpp"
|
||||||
|
#include "pugixml_util.hpp"
|
||||||
|
#include "serdes_utils.h"
|
||||||
|
/* Headers from vtr util library */
|
||||||
|
#include "vtr_assert.h"
|
||||||
|
#include "vtr_log.h"
|
||||||
|
#include "vtr_time.h"
|
||||||
|
|
||||||
|
/* Headers from libarchfpga */
|
||||||
|
#include "arch_error.h"
|
||||||
|
#include "command_exit_codes.h"
|
||||||
|
#include "device_rr_gsb_utils.h"
|
||||||
|
#include "openfpga_digest.h"
|
||||||
|
#include "read_xml_util.h"
|
||||||
|
#include "rr_gsb.h"
|
||||||
|
#include "unique_blocks_uxsdcxx.capnp.h"
|
||||||
|
#include "write_unique_blocks_bin.h"
|
||||||
|
#include "write_unique_blocks_xml.h"
|
||||||
|
#include "write_xml_utils.h"
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* This file includes the top-level functions of this library
|
||||||
|
* which includes:
|
||||||
|
* -- write the unique blocks' information in the associated data structures:
|
||||||
|
*device_rr_gsb to a bin file
|
||||||
|
*******************************************************************/
|
||||||
|
namespace openfpga {
|
||||||
|
/* write each unique block (including a single unique block info and its mirror
|
||||||
|
* instances' info)into capnp builder */
|
||||||
|
int write_bin_atom_block(const std::vector<vtr::Point<size_t>>& instance_map,
|
||||||
|
const vtr::Point<size_t>& unique_block_coord,
|
||||||
|
const ucap::Blocktype type,
|
||||||
|
ucap::Uniqueblockpacked::Builder& root) {
|
||||||
|
auto block_info = root.initBlockinfo();
|
||||||
|
block_info.setX(unique_block_coord.x());
|
||||||
|
block_info.setY(unique_block_coord.y());
|
||||||
|
block_info.setType(type);
|
||||||
|
if (instance_map.size() > 0) {
|
||||||
|
auto instance_list = root.initInstances(instance_map.size());
|
||||||
|
for (size_t instance_id = 0; instance_id < instance_map.size();
|
||||||
|
instance_id++) {
|
||||||
|
auto instance = instance_list[instance_id];
|
||||||
|
instance.setX(instance_map[instance_id].x());
|
||||||
|
instance.setY(instance_map[instance_id].y());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return openfpga::CMD_EXEC_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Top-level function to write bin file of unique blocks */
|
||||||
|
int write_bin_unique_blocks(const DeviceRRGSB& device_rr_gsb, const char* fname,
|
||||||
|
bool verbose_output) {
|
||||||
|
::capnp::MallocMessageBuilder builder;
|
||||||
|
auto unique_blocks = builder.initRoot<ucap::UniqueBlocks>();
|
||||||
|
int num_unique_blocks = device_rr_gsb.get_num_sb_unique_module() +
|
||||||
|
device_rr_gsb.get_num_cb_unique_module(CHANX) +
|
||||||
|
device_rr_gsb.get_num_cb_unique_module(CHANY);
|
||||||
|
auto block_list = unique_blocks.initAtominfos(num_unique_blocks);
|
||||||
|
|
||||||
|
/*write switch blocks into bin file */
|
||||||
|
for (size_t id = 0; id < device_rr_gsb.get_num_sb_unique_module(); ++id) {
|
||||||
|
const auto unique_block_coord = device_rr_gsb.get_sb_unique_block_coord(id);
|
||||||
|
const std::vector<vtr::Point<size_t>> instance_map =
|
||||||
|
device_rr_gsb.get_sb_unique_block_instance_coord(unique_block_coord);
|
||||||
|
auto unique_block = block_list[id];
|
||||||
|
int status_code = write_bin_atom_block(instance_map, unique_block_coord,
|
||||||
|
ucap::Blocktype::SB, unique_block);
|
||||||
|
if (status_code != 0) {
|
||||||
|
VTR_LOG_ERROR("write sb unique blocks into bin file failed!");
|
||||||
|
return CMD_EXEC_FATAL_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*write cbx blocks into bin file */
|
||||||
|
for (size_t id = 0; id < device_rr_gsb.get_num_cb_unique_module(CHANX);
|
||||||
|
++id) {
|
||||||
|
const auto unique_block_coord =
|
||||||
|
device_rr_gsb.get_cbx_unique_block_coord(id);
|
||||||
|
const std::vector<vtr::Point<size_t>> instance_map =
|
||||||
|
device_rr_gsb.get_cbx_unique_block_instance_coord(unique_block_coord);
|
||||||
|
int block_id = id + device_rr_gsb.get_num_sb_unique_module();
|
||||||
|
auto unique_block = block_list[block_id];
|
||||||
|
int status_code = write_bin_atom_block(instance_map, unique_block_coord,
|
||||||
|
ucap::Blocktype::CBX, unique_block);
|
||||||
|
if (status_code != 0) {
|
||||||
|
VTR_LOG_ERROR("write cbx unique blocks into bin file failed!");
|
||||||
|
return CMD_EXEC_FATAL_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*write cby blocks into bin file */
|
||||||
|
for (size_t id = 0; id < device_rr_gsb.get_num_cb_unique_module(CHANY);
|
||||||
|
++id) {
|
||||||
|
const auto unique_block_coord =
|
||||||
|
device_rr_gsb.get_cby_unique_block_coord(id);
|
||||||
|
const std::vector<vtr::Point<size_t>> instance_map =
|
||||||
|
device_rr_gsb.get_cby_unique_block_instance_coord(unique_block_coord);
|
||||||
|
int block_id = id + device_rr_gsb.get_num_sb_unique_module() +
|
||||||
|
device_rr_gsb.get_num_cb_unique_module(CHANX);
|
||||||
|
auto unique_block = block_list[block_id];
|
||||||
|
int status_code = write_bin_atom_block(instance_map, unique_block_coord,
|
||||||
|
ucap::Blocktype::CBY, unique_block);
|
||||||
|
if (status_code != 0) {
|
||||||
|
VTR_LOG_ERROR("write cby unique blocks into bin file failed!");
|
||||||
|
return CMD_EXEC_FATAL_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
writeMessageToFile(fname, &builder);
|
||||||
|
if (verbose_output) {
|
||||||
|
report_unique_module_status_write(device_rr_gsb, true);
|
||||||
|
}
|
||||||
|
return openfpga::CMD_EXEC_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace openfpga
|
|
@ -0,0 +1,34 @@
|
||||||
|
#ifndef WRITE_XML_UNIQUE_BLOCKS_BIN_H
|
||||||
|
#define WRITE_XML_UNIQUE_BLOCKS_BIN_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
/* Headers from pugi XML library */
|
||||||
|
#include "pugixml.hpp"
|
||||||
|
#include "pugixml_util.hpp"
|
||||||
|
|
||||||
|
/* Headers from vtr util library */
|
||||||
|
#include "vtr_assert.h"
|
||||||
|
#include "vtr_log.h"
|
||||||
|
#include "vtr_time.h"
|
||||||
|
|
||||||
|
/* Headers from libarchfpga */
|
||||||
|
#include "arch_error.h"
|
||||||
|
#include "device_rr_gsb_utils.h"
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* This file includes the top-level functions of this library
|
||||||
|
* which includes:
|
||||||
|
* -- write the unique blocks' information in the associated data structures:
|
||||||
|
*device_rr_gsb to a bin file
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
namespace openfpga {
|
||||||
|
int write_bin_unique_blocks(const DeviceRRGSB& device_rr_gsb, const char* fname,
|
||||||
|
bool verbose_output);
|
||||||
|
int write_bin_atom_block(const std::vector<vtr::Point<size_t>>& instance_map,
|
||||||
|
const vtr::Point<size_t>& unique_block_coord,
|
||||||
|
const ucap::Blocktype type,
|
||||||
|
ucap::Uniqueblockpacked::Builder& root);
|
||||||
|
} // namespace openfpga
|
||||||
|
#endif
|
|
@ -19,7 +19,7 @@
|
||||||
#include "read_xml_util.h"
|
#include "read_xml_util.h"
|
||||||
#include "rr_gsb.h"
|
#include "rr_gsb.h"
|
||||||
#include "unique_blocks_uxsdcxx.capnp.h"
|
#include "unique_blocks_uxsdcxx.capnp.h"
|
||||||
#include "write_unique_blocks.h"
|
#include "write_unique_blocks_xml.h"
|
||||||
#include "write_xml_utils.h"
|
#include "write_xml_utils.h"
|
||||||
|
|
||||||
/********************************************************************
|
/********************************************************************
|
||||||
|
@ -184,93 +184,4 @@ int write_xml_unique_blocks(const DeviceRRGSB& device_rr_gsb, const char* fname,
|
||||||
|
|
||||||
return CMD_EXEC_SUCCESS;
|
return CMD_EXEC_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* write each unique block (including a single unique block info and its mirror
|
|
||||||
* instances' info)into capnp builder */
|
|
||||||
int write_bin_atom_block(const std::vector<vtr::Point<size_t>>& instance_map,
|
|
||||||
const vtr::Point<size_t>& unique_block_coord,
|
|
||||||
const ucap::Blocktype type,
|
|
||||||
ucap::Uniqueblockpacked::Builder& root) {
|
|
||||||
auto block_info = root.initBlockinfo();
|
|
||||||
block_info.setX(unique_block_coord.x());
|
|
||||||
block_info.setY(unique_block_coord.y());
|
|
||||||
block_info.setType(type);
|
|
||||||
if (instance_map.size() > 0) {
|
|
||||||
auto instance_list = root.initInstances(instance_map.size());
|
|
||||||
for (size_t instance_id = 0; instance_id < instance_map.size();
|
|
||||||
instance_id++) {
|
|
||||||
auto instance = instance_list[instance_id];
|
|
||||||
instance.setX(instance_map[instance_id].x());
|
|
||||||
instance.setY(instance_map[instance_id].y());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return openfpga::CMD_EXEC_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Top-level function to write bin file of unique blocks */
|
|
||||||
int write_bin_unique_blocks(const DeviceRRGSB& device_rr_gsb, const char* fname,
|
|
||||||
bool verbose_output) {
|
|
||||||
::capnp::MallocMessageBuilder builder;
|
|
||||||
auto unique_blocks = builder.initRoot<ucap::UniqueBlocks>();
|
|
||||||
int num_unique_blocks = device_rr_gsb.get_num_sb_unique_module() +
|
|
||||||
device_rr_gsb.get_num_cb_unique_module(CHANX) +
|
|
||||||
device_rr_gsb.get_num_cb_unique_module(CHANY);
|
|
||||||
auto block_list = unique_blocks.initAtominfos(num_unique_blocks);
|
|
||||||
|
|
||||||
/*write switch blocks into bin file */
|
|
||||||
for (size_t id = 0; id < device_rr_gsb.get_num_sb_unique_module(); ++id) {
|
|
||||||
const auto unique_block_coord = device_rr_gsb.get_sb_unique_block_coord(id);
|
|
||||||
const std::vector<vtr::Point<size_t>> instance_map =
|
|
||||||
device_rr_gsb.get_sb_unique_block_instance_coord(unique_block_coord);
|
|
||||||
auto unique_block = block_list[id];
|
|
||||||
int status_code = write_bin_atom_block(instance_map, unique_block_coord,
|
|
||||||
ucap::Blocktype::SB, unique_block);
|
|
||||||
if (status_code != 0) {
|
|
||||||
VTR_LOG_ERROR("write sb unique blocks into bin file failed!");
|
|
||||||
return CMD_EXEC_FATAL_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*write cbx blocks into bin file */
|
|
||||||
for (size_t id = 0; id < device_rr_gsb.get_num_cb_unique_module(CHANX);
|
|
||||||
++id) {
|
|
||||||
const auto unique_block_coord =
|
|
||||||
device_rr_gsb.get_cbx_unique_block_coord(id);
|
|
||||||
const std::vector<vtr::Point<size_t>> instance_map =
|
|
||||||
device_rr_gsb.get_cbx_unique_block_instance_coord(unique_block_coord);
|
|
||||||
int block_id = id + device_rr_gsb.get_num_sb_unique_module();
|
|
||||||
auto unique_block = block_list[block_id];
|
|
||||||
int status_code = write_bin_atom_block(instance_map, unique_block_coord,
|
|
||||||
ucap::Blocktype::CBX, unique_block);
|
|
||||||
if (status_code != 0) {
|
|
||||||
VTR_LOG_ERROR("write cbx unique blocks into bin file failed!");
|
|
||||||
return CMD_EXEC_FATAL_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*write cby blocks into bin file */
|
|
||||||
for (size_t id = 0; id < device_rr_gsb.get_num_cb_unique_module(CHANY);
|
|
||||||
++id) {
|
|
||||||
const auto unique_block_coord =
|
|
||||||
device_rr_gsb.get_cby_unique_block_coord(id);
|
|
||||||
const std::vector<vtr::Point<size_t>> instance_map =
|
|
||||||
device_rr_gsb.get_cby_unique_block_instance_coord(unique_block_coord);
|
|
||||||
int block_id = id + device_rr_gsb.get_num_sb_unique_module() +
|
|
||||||
device_rr_gsb.get_num_cb_unique_module(CHANX);
|
|
||||||
auto unique_block = block_list[block_id];
|
|
||||||
int status_code = write_bin_atom_block(instance_map, unique_block_coord,
|
|
||||||
ucap::Blocktype::CBY, unique_block);
|
|
||||||
if (status_code != 0) {
|
|
||||||
VTR_LOG_ERROR("write cby unique blocks into bin file failed!");
|
|
||||||
return CMD_EXEC_FATAL_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
writeMessageToFile(fname, &builder);
|
|
||||||
if (verbose_output) {
|
|
||||||
report_unique_module_status_write(device_rr_gsb, true);
|
|
||||||
}
|
|
||||||
return openfpga::CMD_EXEC_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace openfpga
|
} // namespace openfpga
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef WRITE_XML_UNIQUE_BLOCKS_H
|
#ifndef WRITE_XML_UNIQUE_BLOCKS_XML_H
|
||||||
#define WRITE_XML_UNIQUE_BLOCKS_H
|
#define WRITE_XML_UNIQUE_BLOCKS_XML_H
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
@ -33,11 +33,5 @@ void report_unique_module_status_write(
|
||||||
bool verbose_output); /*report status of written info*/
|
bool verbose_output); /*report status of written info*/
|
||||||
int write_xml_unique_blocks(const DeviceRRGSB& device_rr_gsb, const char* fname,
|
int write_xml_unique_blocks(const DeviceRRGSB& device_rr_gsb, const char* fname,
|
||||||
bool verbose_output);
|
bool verbose_output);
|
||||||
int write_bin_unique_blocks(const DeviceRRGSB& device_rr_gsb, const char* fname,
|
|
||||||
bool verbose_output);
|
|
||||||
int write_bin_atom_block(const std::vector<vtr::Point<size_t>>& instance_map,
|
|
||||||
const vtr::Point<size_t>& unique_block_coord,
|
|
||||||
const ucap::Blocktype type,
|
|
||||||
ucap::Uniqueblockpacked::Builder& root);
|
|
||||||
} // namespace openfpga
|
} // namespace openfpga
|
||||||
#endif
|
#endif
|
|
@ -16,7 +16,8 @@
|
||||||
#include "fabric_key_writer.h"
|
#include "fabric_key_writer.h"
|
||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
#include "openfpga_naming.h"
|
#include "openfpga_naming.h"
|
||||||
#include "read_unique_blocks.h"
|
#include "read_unique_blocks_bin.h"
|
||||||
|
#include "read_unique_blocks_xml.h"
|
||||||
#include "read_xml_fabric_key.h"
|
#include "read_xml_fabric_key.h"
|
||||||
#include "read_xml_io_name_map.h"
|
#include "read_xml_io_name_map.h"
|
||||||
#include "read_xml_module_name_map.h"
|
#include "read_xml_module_name_map.h"
|
||||||
|
@ -25,7 +26,8 @@
|
||||||
#include "report_reference.h"
|
#include "report_reference.h"
|
||||||
#include "vtr_log.h"
|
#include "vtr_log.h"
|
||||||
#include "vtr_time.h"
|
#include "vtr_time.h"
|
||||||
#include "write_unique_blocks.h"
|
#include "write_unique_blocks_bin.h"
|
||||||
|
#include "write_unique_blocks_xml.h"
|
||||||
#include "write_xml_fabric_pin_physical_location.h"
|
#include "write_xml_fabric_pin_physical_location.h"
|
||||||
#include "write_xml_module_name_map.h"
|
#include "write_xml_module_name_map.h"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue