[lib] developing io

This commit is contained in:
tangxifan 2023-09-15 16:19:10 -07:00
parent b65dda90c4
commit e5bc936144
4 changed files with 129 additions and 0 deletions

View File

@ -0,0 +1,11 @@
#ifndef MODULE_NAME_MAP_XML_CONSTANTS_H
#define MODULE_NAME_MAP_XML_CONSTANTS_H
/* Constants required by XML parser */
constexpr const char* XML_MODULE_NAMES_ROOT_NAME = "module_names";
constexpr const char* XML_MODULE_NAME_NODE_NAME = "module_name";
constexpr const char* XML_MODULE_NAME_ATTRIBUTE_DEFAULT = "default";
constexpr const char* XML_MODULE_NAME_ATTRIBUTE_GIVEN = "given";
#endif

View File

@ -0,0 +1,77 @@
/********************************************************************
* This file includes the top-level function of this library
* which reads an XML of clock network file 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 libarchfpga */
#include "arch_error.h"
#include "command_exit_codes.h"
#include "module_name_map_xml_constants.h"
#include "read_xml_module_name_map.h"
#include "read_xml_util.h"
namespace openfpga { // Begin namespace openfpga
/********************************************************************
* Parse XML codes of a <port> to an object of I/O naming
*******************************************************************/
static int read_xml_module_name_binding(pugi::xml_node& xml_binding,
const pugiutil::loc_data& loc_data,
ModuleNameMap& module_name_map) {
std::string default_name =
get_attribute(xml_port, XML_MODULE_NAME_ATTRIBUTE_DEFAULT, loc_data)
.as_string();
std::string given_name =
get_attribute(xml_port, XML_MODULE_NAME_ATTRIBUTE_GIVEN, loc_data)
.as_string();
return module_name_map.set_tag_to_name_pair(default_name, given_name);
}
/********************************************************************
* Parse XML codes about <ports> to an object of ClockNetwork
*******************************************************************/
int read_xml_module_name_map(const char* fname, ModuleNameMap& module_name_map) {
vtr::ScopedStartFinishTimer timer("Read module rename rules");
int status = CMD_EXEC_SUCCESS;
/* Parse the file */
pugi::xml_document doc;
pugiutil::loc_data loc_data;
try {
loc_data = pugiutil::load_xml(doc, fname);
pugi::xml_node xml_root =
get_single_child(doc, XML_MODULE_NAMES_ROOT_NAME, loc_data);
for (pugi::xml_node xml_binding : xml_root.children()) {
/* Error out if the XML child has an invalid name! */
if (xml_binding.name() != std::string(XML_MODULE_NAME_NODE_NAME)) {
bad_tag(xml_binding, loc_data, xml_root, {XML_MODULE_NAME_NODE_NAME});
}
status = read_xml_module_name_binding(xml_binding, loc_data, module_name_map);
if (status != CMD_EXEC_SUCCESS) {
return CMD_EXEC_FATAL_ERROR;
}
}
} catch (pugiutil::XmlError& e) {
archfpga_throw(fname, e.line(), "%s", e.what());
}
return status;
}
} // End of namespace openfpga

View File

@ -0,0 +1,21 @@
#ifndef READ_XML_MODULE_NAME_MAP_H
#define READ_XML_MODULE_NAME_MAP_H
/********************************************************************
* Include header files that are required by function declaration
*******************************************************************/
#include "module_name_map.h"
#include "pugixml.hpp"
#include "pugixml_util.hpp"
/********************************************************************
* Function declaration
*******************************************************************/
namespace openfpga { // Begin namespace openfpga
int read_xml_module_name_map(const char* fname, ModuleNameMap& module_name_map);
} // End of namespace openfpga
#endif

View File

@ -0,0 +1,20 @@
#ifndef WRITE_XML_MODULE_NAME_MAP_H
#define WRITE_XML_MODULE_NAME_MAP_H
/********************************************************************
* Include header files that are required by function declaration
*******************************************************************/
#include <fstream>
#include "module_name_map.h"
/********************************************************************
* Function declaration
*******************************************************************/
namespace openfpga { // Begin namespace openfpga
int write_xml_module_name_map(const char* fname, const ModuleNameMap& module_name_map);
} // End of namespace openfpga
#endif