]> AND Private Git Repository - blast.git/blobdiff - BlockImplementation.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
patter compat continued
[blast.git] / BlockImplementation.cpp
index 571b72b5328a91af9e75b10bfe83dcaff769f156..b7510217a5cce885b85b5c522d381fa26ab50e39 100644 (file)
@@ -5,10 +5,13 @@
 #include "ReferenceInterface.h"\r
 #include "FunctionalInterface.h"\r
 #include "BlockParameter.h"\r
+#include <QHashIterator>\r
 \r
 \r
 BlockImplementation::BlockImplementation(const QString& _xmlFile) {\r
-  xmlFile = _xmlFile;  \r
+  xmlFile = _xmlFile;\r
+  productionCounter = "";\r
+  delta = "";\r
 \r
   evaluator = new ArithmeticEvaluator;\r
   evaluator->setVariableMarkers("@$");\r
@@ -16,10 +19,78 @@ BlockImplementation::BlockImplementation(const QString& _xmlFile) {
 \r
 BlockImplementation::BlockImplementation(const QString& _xmlFile, const QString &_referenceXml, const QString &_referenceMd5) {\r
   xmlFile = _xmlFile;  \r
+  productionCounter = "";\r
+  delta = "";\r
   referenceXml = _referenceXml;\r
   referenceMd5 = _referenceMd5;\r
 }\r
 \r
+void BlockImplementation::loadPatterns(QDomElement& root) throw(Exception) {\r
+    \r
+  QDomNodeList patternNode = root.elementsByTagName("patterns");\r
+  \r
+  if (patternNode.isEmpty()) {\r
+    cout << "impl has no patterns" << endl;\r
+    return;\r
+  }\r
+  \r
+  QDomElement patternElt = patternNode.at(0).toElement();\r
+  \r
+  QDomElement eltDelta  = patternElt.firstChildElement("delta");\r
+  delta = eltDelta.attribute("value","none");\r
+  \r
+  QDomElement eltCons  = eltDelta.nextSiblingElement("consumption");\r
+  \r
+  QDomNodeList listNodeInput = eltCons.elementsByTagName("input");\r
+  for(int i=0; i<listNodeInput.size(); i++) {\r
+    QDomNode node = listNodeInput.at(i);    \r
+    QDomElement elt = node.toElement();    \r
+    QString nameStr = elt.attribute("name","none");\r
+    if (nameStr == "none") throw(Exception(IMPLFILE_CORRUPTED));\r
+    QString patternStr = elt.attribute("pattern","none");    \r
+    consumptionPattern.insert(nameStr,patternStr);\r
+  }\r
+  \r
+  QDomElement eltProd  = eltCons.nextSiblingElement("production");\r
+  \r
+  productionCounter = eltProd.attribute("counter","none");\r
+  QDomNodeList listNodeOutput = eltProd.elementsByTagName("output");\r
+  for(int i=0; i<listNodeOutput.size(); i++) {\r
+    QDomNode node = listNodeOutput.at(i);    \r
+    QDomElement elt = node.toElement();        \r
+    QString nameStr = elt.attribute("name","none");\r
+    if (nameStr == "none") throw(Exception(IMPLFILE_CORRUPTED));\r
+    QString patternStr = elt.attribute("pattern","none");    \r
+    productionPattern.insert(nameStr,patternStr);    \r
+  }\r
+  cout << "patterns summary:" << endl;\r
+  QHashIterator<QString,QString> iterP(productionPattern);\r
+  while (iterP.hasNext()) {\r
+    iterP.next();\r
+    cout << qPrintable(iterP.key()) << " -> " << qPrintable(iterP.value()) << endl;\r
+  }\r
+  cout << "impls patterns read correctly" << endl;\r
+}\r
+\r
+bool BlockImplementation::checkPatterns() {\r
+  if (reference == NULL) return false;\r
+  \r
+  AbstractInterface* iface;  \r
+  QHashIterator<QString,QString> iterI(consumptionPattern);\r
+  while (iterI.hasNext()) {\r
+    iterI.next();\r
+    iface = reference->getIfaceFromName(iterI.key());\r
+    if (iface == NULL) return false;\r
+  }\r
+  QHashIterator<QString,QString> iterO(productionPattern);\r
+  while (iterO.hasNext()) {\r
+    iterO.next();\r
+    iface = reference->getIfaceFromName(iterO.key());\r
+    if (iface == NULL) return false;\r
+  }  \r
+  return true;  \r
+}\r
+\r
 void BlockImplementation::generateVHDL(FunctionalBlock* _block, const QString &path) throw(Exception) {\r
 \r
   block = _block;\r
@@ -503,7 +574,12 @@ QDataStream& operator<<(QDataStream &out, const BlockImplementation &impl) {
   toWrite << impl.xmlFile;\r
   toWrite << impl.referenceXml;\r
   toWrite << impl.referenceMd5;\r
-\r
+  // saving patterns\r
+  toWrite << impl.delta;\r
+  toWrite << impl.consumptionPattern;\r
+  toWrite << impl.productionPattern;\r
+  toWrite << impl.productionCounter;\r
+  \r
   out << blockData;\r
 \r
   return out;\r
@@ -520,6 +596,11 @@ QDataStream& operator>>(QDataStream &in, BlockImplementation &impl) {
   in >> impl.xmlFile;\r
   in >> impl.referenceXml;\r
   in >> impl.referenceMd5;\r
+  // loading patterns\r
+  in >> impl.delta;\r
+  in >> impl.consumptionPattern;\r
+  in >> impl.productionPattern;\r
+  in >> impl.productionCounter;\r
 \r
   return in;\r
 }\r