initial commit on parser for reading openfpga arch xml

This commit is contained in:
tangxifan 2020-01-12 21:33:28 -07:00
parent 5dea648be6
commit 2e986608ba
3 changed files with 76 additions and 0 deletions

View File

@ -20,6 +20,7 @@ set_target_properties(libarchopenfpga PROPERTIES PREFIX "") #Avoid extra 'lib' p
#Specify link-time dependancies
target_link_libraries(libarchopenfpga
libvtrutil
libarchfpga
libpugixml
libpugiutil)

View File

@ -0,0 +1,65 @@
/********************************************************************
* This file includes the top-level function of this library
* which reads an XML modeling OpenFPGA architecture to the associated
* data structures
*******************************************************************/
/* Headers from pugi XML library */
#include "pugixml.hpp"
#include "pugixml_util.hpp"
/* Headers from libarchfpga */
#include "arch_error.h"
#include "read_xml_util.h"
#include "read_openfpga_xml.h"
/********************************************************************
* Parse XML codes about circuit models to circuit library
*******************************************************************/
static
void read_xml_circuit_models(pugi::xml_node Node,
const pugiutil::loc_data& loc_data,
CircuitLibrary& circuit_lib) {
/* Iterate over the children under this node,
* each child should be named after circuit_model
*/
for (pugi::xml_node model_xml : Node.children()) {
/* Error out if the XML child has an invalid name! */
if (model_xml.name() != std::string("circuit_model")) {
bad_tag(model_xml, loc_data, Node, {"circuit_model"});
}
/* Add a new circuit model to circuit library */
/* Process the XML attributes under the <circuit_model> tag */
for (pugi::xml_attribute attr : model_xml.attributes()) {
/* Find the type of the circuit model */
if (attr.name() == std::string("type")) {
}
}
}
}
/********************************************************************
* Top-level function to parse an XML file and load data to :
* 1. circuit library
*******************************************************************/
void read_xml_openfpga_arch(const char* arch_file_name,
CircuitLibrary& circuit_lib) {
pugi::xml_node Next;
/* Parse the file */
pugi::xml_document doc;
pugiutil::loc_data loc_data;
try {
loc_data = pugiutil::load_xml(doc, arch_file_name);
/* Parse circuit_models to circuit library */
auto module_circuit_models = get_single_child(doc, "module_circuit_models", loc_data);
read_xml_circuit_models(module_circuit_models, loc_data, circuit_lib);
} catch (pugiutil::XmlError& e) {
archfpga_throw(arch_file_name, e.line(),
"%s", e.what());
}
}

View File

@ -0,0 +1,10 @@
#ifndef READ_OPENFPGA_XML_H
#define READ_OPENFPGA_XML_H
#include <string>
#include "circuit_library.h"
void read_xml_openfpga_arch(const char* arch_file_name,
CircuitLibrary& circuit_lib);
#endif