parent
60e4882d0c
commit
0b6f74bda6
|
@ -2,6 +2,7 @@
|
||||||
#include "Technology.h"
|
#include "Technology.h"
|
||||||
using namespace Hurricane;
|
using namespace Hurricane;
|
||||||
|
|
||||||
|
#include "ATechnology.h"
|
||||||
#include "ATechnologyXmlParser.h"
|
#include "ATechnologyXmlParser.h"
|
||||||
|
|
||||||
#include "AEnv.h"
|
#include "AEnv.h"
|
||||||
|
@ -9,7 +10,22 @@ using namespace Hurricane;
|
||||||
void AEnv::create(const char* technoFilePath) {
|
void AEnv::create(const char* technoFilePath) {
|
||||||
DataBase* db = getDataBase();
|
DataBase* db = getDataBase();
|
||||||
if (db) {
|
if (db) {
|
||||||
|
throw Error("");
|
||||||
}
|
}
|
||||||
db = DataBase::create();
|
db = DataBase::create();
|
||||||
Technology* techno = Technology::create(db, Name("AnalogicTechnology"));
|
Technology* techno = Technology::create(db, Name("AnalogicTechnology"));
|
||||||
|
ATechnologyXmlParser::parse(technoFilePath, techno);
|
||||||
|
}
|
||||||
|
|
||||||
|
ATechnology* AEnv::getATechnology() {
|
||||||
|
DataBase* db = getDataBase();
|
||||||
|
if (!db) {
|
||||||
|
throw Error("");
|
||||||
|
}
|
||||||
|
Technology* technology = db->getTechnology();
|
||||||
|
if (!technology) {
|
||||||
|
throw Error("");
|
||||||
|
}
|
||||||
|
ATechnology* atechnology = ATechnology::getATechnology(technology);
|
||||||
|
return atechnology;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
#ifndef AENV_H_
|
#ifndef AENV_H_
|
||||||
#define AENV_H_
|
#define AENV_H_
|
||||||
|
|
||||||
|
class ATechnology;
|
||||||
|
|
||||||
class AEnv {
|
class AEnv {
|
||||||
public:
|
public:
|
||||||
static void create(const char* technoFilePath);
|
static void create(const char* technoFilePath);
|
||||||
|
static ATechnology* getATechnology();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* AENV_H_ */
|
#endif /* AENV_H_ */
|
||||||
|
|
|
@ -5,42 +5,28 @@ using namespace Hurricane;
|
||||||
#include "ATechnology.h"
|
#include "ATechnology.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
static Name ATechnologyPropertyName("ATechnologyProperty");
|
static Name ATechnologyPropertyName("ATechnologyProperty");
|
||||||
|
}
|
||||||
|
|
||||||
|
Name ATechnology::getName() const {
|
||||||
class ATechnologyProperty : public PrivateProperty {
|
|
||||||
public:
|
|
||||||
typedef PrivateProperty Inherit;
|
|
||||||
typedef map<string, ATechnology::PhysicalRule*> PhysicalRules;
|
|
||||||
static ATechnologyProperty* create(Technology* technology);
|
|
||||||
ATechnologyProperty();
|
|
||||||
virtual Name getName() const {
|
|
||||||
return ATechnologyPropertyName;
|
return ATechnologyPropertyName;
|
||||||
}
|
}
|
||||||
virtual string _getTypeName() const {
|
|
||||||
|
string ATechnology::_getTypeName() const {
|
||||||
return _TName("ATechnologyProperty");
|
return _TName("ATechnologyProperty");
|
||||||
}
|
}
|
||||||
void addPhysicalRule(ATechnology::PhysicalRule& physicalRule) {
|
|
||||||
PhysicalRules::iterator prit = physicalRules_.find(physicalRule.name_);
|
void ATechnology::addPhysicalRule(const string& name, double value, const string& reference) {
|
||||||
|
PhysicalRules::iterator prit = physicalRules_.find(name);
|
||||||
if (prit != physicalRules_.end()) {
|
if (prit != physicalRules_.end()) {
|
||||||
throw Error("");
|
throw Error("");
|
||||||
}
|
}
|
||||||
ATechnology::PhysicalRule* newPhysicalRule = new ATechnology::PhysicalRule(physicalRule);
|
PhysicalRule* newPhysicalRule = new PhysicalRule(name, value, reference);
|
||||||
physicalRules_[newPhysicalRule->name_] = newPhysicalRule;
|
physicalRules_[newPhysicalRule->name_] = newPhysicalRule;
|
||||||
}
|
}
|
||||||
private:
|
|
||||||
PhysicalRules physicalRules_;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
ATechnology* ATechnology::create(Technology* technology) {
|
||||||
ATechnologyProperty::ATechnologyProperty():
|
ATechnology* prop = new ATechnology();
|
||||||
Inherit(),
|
|
||||||
physicalRules_()
|
|
||||||
{}
|
|
||||||
|
|
||||||
ATechnologyProperty* ATechnologyProperty::create(Technology* technology) {
|
|
||||||
ATechnologyProperty* prop = new ATechnologyProperty();
|
|
||||||
|
|
||||||
prop->_postCreate();
|
prop->_postCreate();
|
||||||
|
|
||||||
|
@ -49,9 +35,24 @@ ATechnologyProperty* ATechnologyProperty::create(Technology* technology) {
|
||||||
return prop;
|
return prop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ATechnology* ATechnology::getATechnology(Technology* technology) {
|
||||||
|
Property* property = technology->getProperty(ATechnologyPropertyName);
|
||||||
|
if (property) {
|
||||||
|
ATechnology* aTechnology = static_cast<ATechnology*>(property);
|
||||||
|
return aTechnology;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ATechnology::print() {
|
||||||
|
cout << "Printing ATechnology" << endl;
|
||||||
|
cout << " o Physical Rules" << endl;
|
||||||
|
for (PhysicalRules::iterator prit = physicalRules_.begin();
|
||||||
|
prit != physicalRules_.end();
|
||||||
|
prit++) {
|
||||||
|
PhysicalRule* physicalRule = prit->second;
|
||||||
|
cout << " - name = " << physicalRule->name_ <<
|
||||||
|
", value = " << physicalRule->value_ <<
|
||||||
|
", ref = " << physicalRule->reference_ << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,13 +1,22 @@
|
||||||
#ifndef ATECHNOLOGY_H_
|
#ifndef ATECHNOLOGY_H_
|
||||||
#define ATECHNOLOGY_H_
|
#define ATECHNOLOGY_H_
|
||||||
|
|
||||||
class ATechnology {
|
#include "Property.h"
|
||||||
|
using namespace Hurricane;
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
class Technology;
|
||||||
|
}
|
||||||
|
|
||||||
|
class ATechnology : public PrivateProperty {
|
||||||
public:
|
public:
|
||||||
|
typedef PrivateProperty Inherit;
|
||||||
|
|
||||||
class PhysicalRule {
|
class PhysicalRule {
|
||||||
public:
|
public:
|
||||||
PhysicalRule(string& name,
|
PhysicalRule(const string& name,
|
||||||
double value,
|
double value,
|
||||||
string& reference):
|
const string& reference):
|
||||||
name_(name),
|
name_(name),
|
||||||
value_(value),
|
value_(value),
|
||||||
reference_(reference) {}
|
reference_(reference) {}
|
||||||
|
@ -19,7 +28,21 @@ class ATechnology {
|
||||||
const double value_;
|
const double value_;
|
||||||
const string reference_;
|
const string reference_;
|
||||||
};
|
};
|
||||||
static const PhysicalRule& getPhysicalRule(string name);
|
typedef map<string, ATechnology::PhysicalRule*> PhysicalRules;
|
||||||
|
static ATechnology* create(Hurricane::Technology* technology);
|
||||||
|
static ATechnology* getATechnology(Hurricane::Technology* technology);
|
||||||
|
const PhysicalRule* getPhysicalRule(string name);
|
||||||
|
void addPhysicalRule(const string& name, double value, const string& reference);
|
||||||
|
void print();
|
||||||
|
virtual Name getName() const;
|
||||||
|
virtual string _getTypeName() const;
|
||||||
|
|
||||||
|
ATechnology():
|
||||||
|
Inherit(),
|
||||||
|
physicalRules_() {}
|
||||||
|
|
||||||
|
private:
|
||||||
|
PhysicalRules physicalRules_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* ATECHNOLOGY_H_*/
|
#endif /* ATECHNOLOGY_H_*/
|
||||||
|
|
|
@ -1,14 +1,42 @@
|
||||||
|
#include "ATechnologyXmlParser.h"
|
||||||
|
|
||||||
|
#include "ATechnology.h"
|
||||||
|
|
||||||
#include <libxml/parser.h>
|
#include <libxml/parser.h>
|
||||||
#include <libxml/tree.h>
|
#include <libxml/tree.h>
|
||||||
|
|
||||||
#include "Technology.h"
|
#include "Technology.h"
|
||||||
using namespace Hurricane;
|
using namespace Hurricane;
|
||||||
|
|
||||||
#include "ATechnologyXmlParser.h"
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
void readPhysicalRules(xmlNode* node, ATechnology* aTechnology) {
|
||||||
|
if (node->type == XML_ELEMENT_NODE && node->children) {
|
||||||
|
for (xmlNode* ruleNode = node->children;
|
||||||
|
ruleNode;
|
||||||
|
ruleNode = ruleNode->next) {
|
||||||
|
if (ruleNode->type == XML_ELEMENT_NODE) {
|
||||||
|
if (xmlStrEqual(ruleNode->name, (xmlChar*)"rule")) {
|
||||||
|
xmlChar* ruleNameC = xmlGetProp(ruleNode, (xmlChar*)"name");
|
||||||
|
xmlChar* valueC = xmlGetProp(ruleNode, (xmlChar*)"value");
|
||||||
|
xmlChar* refC = xmlGetProp(ruleNode, (xmlChar*)"ref");
|
||||||
|
if (ruleNameC && valueC && refC) {
|
||||||
|
string ruleName((const char*)ruleNameC);
|
||||||
|
double value = atof((const char*)valueC);
|
||||||
|
string reference((const char*)refC);
|
||||||
|
aTechnology->addPhysicalRule(ruleName, value, reference);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ATechnology* parseFileAsTechnology(const char* filePath, Technology* technology) {
|
ATechnology* parseFileAsTechnology(const char* filePath, Technology* technology) {
|
||||||
|
ATechnology* aTechnology = ATechnology::create(technology);
|
||||||
|
|
||||||
|
|
||||||
xmlDocPtr doc; /* the resulting document tree */
|
xmlDocPtr doc; /* the resulting document tree */
|
||||||
|
|
||||||
doc = xmlReadFile(filePath, NULL, 0);
|
doc = xmlReadFile(filePath, NULL, 0);
|
||||||
|
@ -19,13 +47,22 @@ ATechnology* parseFileAsTechnology(const char* filePath, Technology* technology)
|
||||||
|
|
||||||
/*Get the design element node */
|
/*Get the design element node */
|
||||||
xmlNode* rootElement = xmlDocGetRootElement(doc);
|
xmlNode* rootElement = xmlDocGetRootElement(doc);
|
||||||
if (rootElement->type == XML_ELEMENT_NODE && xmlStrEqual(rootElement->name, (xmlChar*)"technology")) {
|
if (rootElement->type == XML_ELEMENT_NODE &&
|
||||||
|
xmlStrEqual(rootElement->name, (xmlChar*)"technology")) {
|
||||||
|
xmlNode* child = rootElement->children;
|
||||||
|
for (xmlNode* node = child; node; node = node->next) {
|
||||||
|
if (node->type == XML_ELEMENT_NODE) {
|
||||||
|
if (xmlStrEqual(node->name, (xmlChar*)"physical_rules")) {
|
||||||
|
readPhysicalRules(node, aTechnology);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ATechnology* parseTechnologyFromXml(const char* filePath, Technology* technology) {
|
ATechnology* ATechnologyXmlParser::parse(const char* filePath, Technology* technology) {
|
||||||
|
|
||||||
LIBXML_TEST_VERSION
|
LIBXML_TEST_VERSION
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ class ATechnology;
|
||||||
|
|
||||||
class ATechnologyXmlParser {
|
class ATechnologyXmlParser {
|
||||||
public:
|
public:
|
||||||
static ATechnology* parseTechnologyFromXml(const char* filePath, Hurricane::Technology* technology);
|
static ATechnology* parse(const char* filePath, Hurricane::Technology* technology);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*ATECHNOLOGYXMLPARSER_H_*/
|
#endif /*ATECHNOLOGYXMLPARSER_H_*/
|
||||||
|
|
|
@ -1,16 +1,27 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "DBo.h"
|
||||||
#include "Warning.h"
|
#include "Warning.h"
|
||||||
#include "Error.h"
|
#include "Error.h"
|
||||||
using namespace Hurricane;
|
using namespace Hurricane;
|
||||||
|
|
||||||
#include "AEnv.h"
|
#include "AEnv.h"
|
||||||
|
#include "ATechnology.h"
|
||||||
|
|
||||||
|
|
||||||
int main() {
|
int main(int argc, char* argv[]) {
|
||||||
try {
|
try {
|
||||||
cout << "simple analogic test" << endl;
|
cout << "simple analogic test" << endl;
|
||||||
AEnv::create("toto");
|
if (argc != 2) {
|
||||||
|
cerr << "atest techno.xml";
|
||||||
|
exit(56);
|
||||||
|
}
|
||||||
|
AEnv::create(argv[1]);
|
||||||
|
ATechnology* aTechnology = AEnv::getATechnology();
|
||||||
|
if (!aTechnology) {
|
||||||
|
exit(56);
|
||||||
|
}
|
||||||
|
aTechnology->print();
|
||||||
exit(0);
|
exit(0);
|
||||||
} catch (Hurricane::Warning& w) {
|
} catch (Hurricane::Warning& w) {
|
||||||
cerr << w.what() << endl;
|
cerr << w.what() << endl;
|
||||||
|
|
Loading…
Reference in New Issue