add read and write uniqueblocks commands
This commit is contained in:
parent
66baf7e605
commit
48a386c9b6
|
@ -25,6 +25,7 @@
|
||||||
#include "vtr_time.h"
|
#include "vtr_time.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"
|
||||||
|
#include "read_xml_unique_blocks.h"
|
||||||
|
|
||||||
/* begin namespace openfpga */
|
/* begin namespace openfpga */
|
||||||
namespace openfpga {
|
namespace openfpga {
|
||||||
|
@ -472,6 +473,49 @@ int write_fabric_pin_physical_location_template(
|
||||||
cmd_context.option_enable(cmd, opt_verbose));
|
cmd_context.option_enable(cmd, opt_verbose));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
int read_unique_blocks_template(const T& openfpga_ctx, const Command& cmd,
|
||||||
|
const CommandContext& cmd_context) {
|
||||||
|
CommandOptionId opt_verbose = cmd.option("verbose");
|
||||||
|
CommandOptionId opt_file = cmd.option("file");
|
||||||
|
CommandOptionId opt_type = cmd.option("type");
|
||||||
|
|
||||||
|
/* Check the option '--file' is enabled or not
|
||||||
|
* Actually, it must be enabled as the shell interface will check
|
||||||
|
* before reaching this fuction
|
||||||
|
*/
|
||||||
|
VTR_ASSERT(true == cmd_context.option_enable(cmd, opt_file));
|
||||||
|
VTR_ASSERT(false == cmd_context.option_value(cmd, opt_file).empty());
|
||||||
|
|
||||||
|
std::string file_name = cmd_context.option_value(cmd, opt_file);
|
||||||
|
std::string file_type = cmd_context.option_value(cmd, opt_type);
|
||||||
|
/* Write hierarchy to a file */
|
||||||
|
return read_xml_unique_blocks(file_name.c_str(), file_type.c_str(),
|
||||||
|
cmd_context.option_enable(cmd, opt_verbose));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
int write_unique_blocks_template(const T& openfpga_ctx, const Command& cmd,
|
||||||
|
const CommandContext& cmd_context) {
|
||||||
|
CommandOptionId opt_verbose = cmd.option("verbose");
|
||||||
|
CommandOptionId opt_file = cmd.option("file");
|
||||||
|
CommandOptionId opt_type = cmd.option("type");
|
||||||
|
|
||||||
|
/* Check the option '--file' is enabled or not
|
||||||
|
* Actually, it must be enabled as the shell interface will check
|
||||||
|
* before reaching this fuction
|
||||||
|
*/
|
||||||
|
VTR_ASSERT(true == cmd_context.option_enable(cmd, opt_file));
|
||||||
|
VTR_ASSERT(false == cmd_context.option_value(cmd, opt_file).empty());
|
||||||
|
|
||||||
|
std::string file_name = cmd_context.option_value(cmd, opt_file);
|
||||||
|
std::string file_type = cmd_context.option_value(cmd, opt_type);
|
||||||
|
|
||||||
|
/* Write hierarchy to a file */
|
||||||
|
return read_xml_unique_blocks(file_name.c_str(), file_type.c_str(),
|
||||||
|
cmd_context.option_enable(cmd, opt_verbose));
|
||||||
|
}
|
||||||
|
|
||||||
} /* end namespace openfpga */
|
} /* end namespace openfpga */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -924,6 +924,79 @@ ShellCommandId add_write_fabric_pin_physical_location_command_template(
|
||||||
return shell_cmd_id;
|
return shell_cmd_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* - Add a command to Shell environment: read_unique_blocks
|
||||||
|
* - Add associated options
|
||||||
|
* - Add command dependency
|
||||||
|
*******************************************************************/
|
||||||
|
template <class T>
|
||||||
|
ShellCommandId add_read_unique_blocks_command_template(
|
||||||
|
openfpga::Shell<T>& shell, const ShellCommandClassId& cmd_class_id,
|
||||||
|
const std::vector<ShellCommandId>& dependent_cmds, const bool& hidden) {
|
||||||
|
Command shell_cmd("read_unique_blocks");
|
||||||
|
|
||||||
|
/* Add an option '--file' */
|
||||||
|
shell_cmd.add_option(
|
||||||
|
"file", true,
|
||||||
|
"unique blocks xml file");
|
||||||
|
|
||||||
|
/* Add an option '--type' */
|
||||||
|
shell_cmd.add_option("type", true,
|
||||||
|
"the file type of input file");
|
||||||
|
|
||||||
|
/* Add an option '--verbose' */
|
||||||
|
shell_cmd.add_option("verbose", false, "Show verbose outputs");
|
||||||
|
|
||||||
|
/* Add command 'compact_routing_hierarchy' to the Shell */
|
||||||
|
ShellCommandId shell_cmd_id = shell.add_command(
|
||||||
|
shell_cmd, "Preload unique blocks from xml file", hidden);
|
||||||
|
shell.set_command_class(shell_cmd_id, cmd_class_id);
|
||||||
|
shell.set_command_execute_function(shell_cmd_id, read_unique_blocks_template<T>);
|
||||||
|
|
||||||
|
/* Add command dependency to the Shell */
|
||||||
|
shell.set_command_dependency(shell_cmd_id, dependent_cmds);
|
||||||
|
|
||||||
|
return shell_cmd_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* - Add a command to Shell environment: write_unique_blocks
|
||||||
|
* - Add associated options
|
||||||
|
* - Add command dependency
|
||||||
|
*******************************************************************/
|
||||||
|
template <class T>
|
||||||
|
ShellCommandId add_write_unique_blocks_command_template(
|
||||||
|
openfpga::Shell<T>& shell, const ShellCommandClassId& cmd_class_id,
|
||||||
|
const std::vector<ShellCommandId>& dependent_cmds, const bool& hidden) {
|
||||||
|
Command shell_cmd("write_unique_blocks");
|
||||||
|
|
||||||
|
/* Add an option '--file' */
|
||||||
|
shell_cmd.add_option(
|
||||||
|
"file", true,
|
||||||
|
"unique blocks xml file");
|
||||||
|
|
||||||
|
/* Add an option '--type' */
|
||||||
|
shell_cmd.add_option("type", true,
|
||||||
|
"the file type of input file");
|
||||||
|
|
||||||
|
/* Add an option '--verbose' */
|
||||||
|
shell_cmd.add_option("verbose", false, "Show verbose outputs");
|
||||||
|
|
||||||
|
/* Add command 'compact_routing_hierarchy' to the Shell */
|
||||||
|
ShellCommandId shell_cmd_id = shell.add_command(
|
||||||
|
shell_cmd, "Preload unique blocks from xml file", hidden);
|
||||||
|
shell.set_command_class(shell_cmd_id, cmd_class_id);
|
||||||
|
shell.set_command_execute_function(shell_cmd_id, write_unique_blocks_template<T>);
|
||||||
|
|
||||||
|
/* Add command dependency to the Shell */
|
||||||
|
shell.set_command_dependency(shell_cmd_id, dependent_cmds);
|
||||||
|
|
||||||
|
return shell_cmd_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void add_setup_command_templates(openfpga::Shell<T>& shell,
|
void add_setup_command_templates(openfpga::Shell<T>& shell,
|
||||||
const bool& hidden = false) {
|
const bool& hidden = false) {
|
||||||
|
@ -1175,8 +1248,21 @@ void add_setup_command_templates(openfpga::Shell<T>& shell,
|
||||||
add_write_fabric_pin_physical_location_command_template<T>(
|
add_write_fabric_pin_physical_location_command_template<T>(
|
||||||
shell, openfpga_setup_cmd_class,
|
shell, openfpga_setup_cmd_class,
|
||||||
cmd_dependency_write_fabric_pin_physical_location, hidden);
|
cmd_dependency_write_fabric_pin_physical_location, hidden);
|
||||||
}
|
|
||||||
|
|
||||||
|
/********************************
|
||||||
|
* Command 'read_unique_blocks'
|
||||||
|
*/
|
||||||
|
add_read_unique_blocks_command_template<T>(
|
||||||
|
shell, openfpga_setup_cmd_class, std::vector<openfpga::ShellCommandId>(), hidden);
|
||||||
|
|
||||||
|
/********************************
|
||||||
|
* Command 'write_unique_blocks'
|
||||||
|
*/
|
||||||
|
add_write_unique_blocks_command_template<T>(
|
||||||
|
shell, openfpga_setup_cmd_class, std::vector<openfpga::ShellCommandId>(), hidden);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
} /* end namespace openfpga */
|
} /* end namespace openfpga */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,112 @@
|
||||||
|
/********************************************************************
|
||||||
|
* This file includes the top-level function of this library
|
||||||
|
* which reads an XML of a fabric key to the associated
|
||||||
|
* data structures
|
||||||
|
*******************************************************************/
|
||||||
|
#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 libopenfpga util library */
|
||||||
|
#include "openfpga_port_parser.h"
|
||||||
|
|
||||||
|
/* Headers from libarchfpga */
|
||||||
|
#include "arch_error.h"
|
||||||
|
#include "read_xml_unique_blocks.h"
|
||||||
|
#include "read_xml_util.h"
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* Parse XML codes of a <key> to an object of FabricKey
|
||||||
|
*******************************************************************/
|
||||||
|
static void read_xml_unique_block_info(
|
||||||
|
pugi::xml_node& xml_pin_constraint, const pugiutil::loc_data& loc_data) {
|
||||||
|
std::string pass = "pass here";
|
||||||
|
// /* Create a new design constraint in the storage */
|
||||||
|
// RepackDesignConstraintId design_constraint_id =
|
||||||
|
// repack_design_constraints.create_design_constraint(
|
||||||
|
// RepackDesignConstraints::IGNORE_NET);
|
||||||
|
|
||||||
|
// if (false == repack_design_constraints.valid_design_constraint_id(
|
||||||
|
// design_constraint_id)) {
|
||||||
|
// archfpga_throw(loc_data.filename_c_str(), loc_data.line(xml_pin_constraint),
|
||||||
|
// "Fail to create design constraint!\n");
|
||||||
|
// }
|
||||||
|
|
||||||
|
// std::string pin_ctx_to_parse =
|
||||||
|
// get_attribute(xml_pin_constraint, "pin", loc_data).as_string();
|
||||||
|
// openfpga::StringToken pin_tokenizer(pin_ctx_to_parse);
|
||||||
|
// std::vector<std::string> pin_info = pin_tokenizer.split('.');
|
||||||
|
// /* Expect two contents, otherwise error out */
|
||||||
|
// if (pin_info.size() != 2) {
|
||||||
|
// std::string err_msg =
|
||||||
|
// std::string("Invalid content '") + pin_ctx_to_parse +
|
||||||
|
// std::string("' to skip, expect <pb_type_name>.<pin>\n");
|
||||||
|
// VTR_LOG_ERROR(err_msg.c_str());
|
||||||
|
// VTR_ASSERT(pin_info.size() == 2);
|
||||||
|
// }
|
||||||
|
// std::string pb_type_name = pin_info[0];
|
||||||
|
// openfpga::PortParser port_parser(pin_info[1]);
|
||||||
|
// openfpga::BasicPort curr_port = port_parser.port();
|
||||||
|
// if (!curr_port.is_valid()) {
|
||||||
|
// std::string err_msg =
|
||||||
|
// std::string("Invalid pin definition '") + pin_ctx_to_parse +
|
||||||
|
// std::string("', expect <pb_type_name>.<pin_name>[int:int]\n");
|
||||||
|
// VTR_LOG_ERROR(err_msg.c_str());
|
||||||
|
// VTR_ASSERT(curr_port.is_valid());
|
||||||
|
// }
|
||||||
|
// repack_design_constraints.set_pb_type(design_constraint_id, pb_type_name);
|
||||||
|
// repack_design_constraints.set_pin(design_constraint_id, curr_port);
|
||||||
|
// repack_design_constraints.set_net(
|
||||||
|
// design_constraint_id,
|
||||||
|
// get_attribute(xml_pin_constraint, "name", loc_data).as_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* Parse XML codes about <repack_design_constraints> to an object of
|
||||||
|
*RepackDesignConstraints
|
||||||
|
*******************************************************************/
|
||||||
|
int read_xml_unique_blocks(const char* file_name, const char* file_type,
|
||||||
|
bool verbose) {
|
||||||
|
vtr::ScopedStartFinishTimer timer("Read unique blocks xml file");
|
||||||
|
|
||||||
|
// RepackDesignConstraints repack_design_constraints;
|
||||||
|
|
||||||
|
/* Parse the file */
|
||||||
|
pugi::xml_document doc;
|
||||||
|
pugiutil::loc_data loc_data;
|
||||||
|
|
||||||
|
try {
|
||||||
|
loc_data = pugiutil::load_xml(doc, file_name);
|
||||||
|
|
||||||
|
pugi::xml_node xml_root =
|
||||||
|
get_single_child(doc, "unique_blocks", loc_data);
|
||||||
|
|
||||||
|
// size_t num_design_constraints =
|
||||||
|
// std::distance(xml_root.children().begin(), xml_root.children().end());
|
||||||
|
// /* Reserve memory space for the region */
|
||||||
|
// repack_design_constraints.reserve_design_constraints(
|
||||||
|
// num_design_constraints);
|
||||||
|
|
||||||
|
for (pugi::xml_node xml_block_info : xml_root.children()) {
|
||||||
|
/* Error out if the XML child has an invalid name! */
|
||||||
|
if (xml_block_info.name() == std::string("block")) {
|
||||||
|
read_xml_unique_block_info(xml_block_info, loc_data);
|
||||||
|
} else {
|
||||||
|
bad_tag(xml_block_info, loc_data, xml_root,
|
||||||
|
{"block"});
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (pugiutil::XmlError& e) {
|
||||||
|
archfpga_throw(file_name, e.line(), "%s", e.what());
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
#ifndef READ_XML_UNIQUE_BLOCKS_H
|
||||||
|
#define READ_XML_UNIQUE_BLOCKS_H
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* Include header files that are required by function declaration
|
||||||
|
*******************************************************************/
|
||||||
|
#include "pugixml.hpp"
|
||||||
|
#include "pugixml_util.hpp"
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* Function declaration
|
||||||
|
*******************************************************************/
|
||||||
|
int read_xml_unique_blocks(const char* file_name, const char* file_type,
|
||||||
|
bool verbose);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue