-
Notifications
You must be signed in to change notification settings - Fork 0
/
HardwareProjectXmlParser.cpp
129 lines (93 loc) · 3.99 KB
/
HardwareProjectXmlParser.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include "HardwareProjectXmlParser.h"
#include "HardwareComponentXmlParser.h"
#include "HardwareComponent.h"
using namespace std;
HardwareProjectXmlParser::HardwareProjectXmlParser(){
communicationHardwareXmlParser = new CommunicationHardwareXmlParser();
hardwareComponentXmlParser = new HardwareComponentXmlParser();
}
void HardwareProjectXmlParser::parseHardwareProject(xmlNode *hardwareProjectNode){
xmlNode *currentNode = NULL;
xmlNode *communicationHardwareNode = NULL;
xmlNode *defaultTopComponentNode = NULL;
for (currentNode = hardwareProjectNode->xmlChildrenNode; currentNode; currentNode = currentNode->next) {
if (currentNode->type == XML_ELEMENT_NODE) {
if(xmlStrcmp(currentNode->name, (const xmlChar *)"reconfigurableRegion") == 0){
xmlChar *regionNameChar = xmlGetProp(currentNode, (const xmlChar *)"name");
string regionName = "";
if(regionNameChar!=NULL){
regionName = string((const char*)regionNameChar);
}
if( regionName != "") {
/*search for the communicationHardware tag*/
for (communicationHardwareNode = currentNode->xmlChildrenNode; communicationHardwareNode; communicationHardwareNode = communicationHardwareNode->next){
if (xmlStrcmp(communicationHardwareNode->name, (const xmlChar *)"communicationHardware") == 0){
break;
}
}
HardwareComponent *communicationHardware = communicationHardwareXmlParser->parseCommunicationHardwareNode(regionName,communicationHardwareNode);
ReconfigurableRegion *region = new ReconfigurableRegion(regionName, communicationHardware);
for (defaultTopComponentNode = currentNode->xmlChildrenNode; defaultTopComponentNode; defaultTopComponentNode = defaultTopComponentNode->next){
if (xmlStrcmp(defaultTopComponentNode->name, (const xmlChar *)"defaultArchitecture") == 0){
xmlChar *filePathChar = xmlGetProp(defaultTopComponentNode, (const xmlChar *)"file");
std::string filePath = string((const char*)filePathChar);
if(xmlStrcmp(filePathChar, (const xmlChar *)"") != 0){
cout << "parsing default component for region "<<regionName<<endl;
cout << "default component file "<<filePath<<endl;
Architecture *defaultArch = hardwareComponentXmlParser->parseArchitectureFile(filePath, region);
defaultArch->uid = 0; //default arch has always uid 0
region->assignArchitecture(defaultArch);
cout << "region default component parsing successfull"<<endl;
}
break;
}
}
loadedReconfigurableRegions[regionName] = region;
}
}
}
}
}
void HardwareProjectXmlParser::parseProjectXmlDescription(std::string xmlUri){
xmlDoc *doc = NULL;
xmlNode *root_element = NULL;
doc = xmlReadFile(xmlUri.c_str(), NULL, 0);
if (doc == NULL)
{
cout<<"error: could not parse file "<<xmlUri<<endl;
cout<<"Lib xml error message:"<<endl<<(xmlGetLastError())->message<<endl;
}
else
{
root_element = xmlDocGetRootElement(doc);
xmlNode *currentNode = NULL;
for (currentNode = root_element; currentNode; currentNode = currentNode->next) {
if (currentNode->type == XML_ELEMENT_NODE) {
if(xmlStrcmp(currentNode->name, (const xmlChar *)"hardwareProject") == 0){
xmlChar *projectPathChar = xmlGetProp(currentNode, (const xmlChar *)"path");
projectPath = "";
if(projectPathChar!=NULL){
projectPath = string((const char*)projectPathChar);
}
xmlChar *projectNameChar = xmlGetProp(currentNode, (const xmlChar *)"name");
projectName = "";
if(projectNameChar!=NULL){
projectName = string((const char*)projectNameChar);
}
parseHardwareProject(currentNode);
}
}
}
xmlFreeDoc(doc);
xmlCleanupParser();
}
}
std::map<std::string, ReconfigurableRegion* > HardwareProjectXmlParser::getReconfigurableRegions(){
return this->loadedReconfigurableRegions;
}
std::string HardwareProjectXmlParser::getProjectName(){
return this->projectName;
}
std::string HardwareProjectXmlParser::getProjectPath(){
return this->projectPath;
}