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

Private GIT Repository
added creation of control ifaces
authorstephane Domas <stephane.domas@univ-fcomte.fr>
Fri, 5 May 2017 12:30:12 +0000 (14:30 +0200)
committerstephane Domas <stephane.domas@univ-fcomte.fr>
Fri, 5 May 2017 12:30:12 +0000 (14:30 +0200)
AbstractInterface.cpp
AbstractInterface.h
ConnectedInterface.h
FunctionalBlock.cpp
FunctionalInterface.cpp
ReferenceBlock.cpp
ReferenceInterface.cpp
blast.creator.user
lib/references/references.bmf

index e651f583583e507f0b198288088bcd629114e909..dde5930ab90aebae1d11a4f965bfeb97395c1b48 100644 (file)
@@ -10,6 +10,7 @@ AbstractInterface::AbstractInterface(AbstractBlock* _owner) {
   direction = Input;
   purpose = Data;  
   type = Boolean;
   direction = Input;
   purpose = Data;  
   type = Boolean;
+  associatedIface = NULL;
 
 }
 
 
 }
 
@@ -21,6 +22,7 @@ AbstractInterface::AbstractInterface(AbstractBlock* _owner, const QString& _name
   direction = _direction;
   purpose = _purpose;
   type = typeFromString(_type);
   direction = _direction;
   purpose = _purpose;
   type = typeFromString(_type);
+  associatedIface = NULL;
 }
 
 AbstractInterface::AbstractInterface(AbstractInterface* other) {
 }
 
 AbstractInterface::AbstractInterface(AbstractInterface* other) {
@@ -30,6 +32,7 @@ AbstractInterface::AbstractInterface(AbstractInterface* other) {
   width = other->width;
   direction = other->direction;
   purpose = other->purpose;
   width = other->width;
   direction = other->direction;
   purpose = other->purpose;
+  associatedIface = NULL;
 }
 
 AbstractInterface::~AbstractInterface() {
 }
 
 AbstractInterface::~AbstractInterface() {
@@ -126,6 +129,14 @@ void AbstractInterface::setDirection(int _direction) {
   }
 }
 
   }
 }
 
+bool AbstractInterface::setAssociatedIface(AbstractInterface* iface) {
+  if (purpose != Control) return false;
+  if (iface->purpose != Data) return false;
+  associatedIface = iface;
+  iface->associatedIface = this;  
+  return true;
+}
+
 
 int AbstractInterface::getIntDirection(QString str) {
     if(str == "input") return Input;
 
 int AbstractInterface::getIntDirection(QString str) {
     if(str == "input") return Input;
index 5c0b83aa22287b72ea15e1379f76e5f806c46e8f..29be72915f50648b92b074875d82deb53e2058cd 100644 (file)
@@ -46,6 +46,7 @@ public :
   inline int getDirection() { return direction;}
   QString getDirectionString();  
   inline AbstractBlock *getOwner() { return owner;}
   inline int getDirection() { return direction;}
   QString getDirectionString();  
   inline AbstractBlock *getOwner() { return owner;}
+  inline AbstractInterface* getAssociatedIface() { return associatedIface; }
 
   double getDoubleWidth() throw(QException);
 
 
   double getDoubleWidth() throw(QException);
 
@@ -63,7 +64,8 @@ public :
   inline void setType(int _type) { type = _type;}
   inline void setType(const QString& _type) { type = typeFromString(_type);}
   void setPurpose(int _purpose);
   inline void setType(int _type) { type = _type;}
   inline void setType(const QString& _type) { type = typeFromString(_type);}
   void setPurpose(int _purpose);
-  void setDirection(int _direction);  
+  void setDirection(int _direction);
+  bool setAssociatedIface(AbstractInterface* iface);
 
   // testers
   virtual bool isReferenceInterface();
 
   // testers
   virtual bool isReferenceInterface();
@@ -95,6 +97,15 @@ protected:
   int direction;
 
   AbstractBlock* owner;
   int direction;
 
   AbstractBlock* owner;
+  /*!
+   * \brief associatedIface the control (resp. data) interface that is bounded to this data (resp. control) interface
+   * If a reference block is designed to be fully integrated in Blast, nearly every data interface is bounded
+   * to a control interface that signals if the value presented on the interface is valid or not. associatedIface
+   * references this control interface if this is a data interface, and a data interface is this is a control interface.
+   * Note that the association is done by the call of setAssociatedIface() that must be done only for a control interface.
+   * (NB: a test is done in the method to prevent the other case).
+   */
+  AbstractInterface* associatedIface;
 };
 
 
 };
 
 
index 3a1fb4f698b25bbf8141b0e4869c0c4de2f7090c..fc89e22c31a811d5e41b137dc0db85e8b67621da 100644 (file)
@@ -64,16 +64,7 @@ protected:
    * there may be a single interface owned by another block (functional or group) that is connected to
    * this interface. connecteFrom references such an interface if it exists.
    */
    * there may be a single interface owned by another block (functional or group) that is connected to
    * this interface. connecteFrom references such an interface if it exists.
    */
-  ConnectedInterface* connectedFrom;
-  /*!
-   * \brief associatedIface the control (resp. data) interface that is bounded to this data (resp. control) interface
-   * If a reference block is designed to be fully integrated in Blast, nearly every data interface is bounded
-   * to a control interface that signals if the value presented on the interface is valid or not. associatedIface
-   * references this control interface if this is a data interface, and a data interface is this is a control interface.
-   * Note that the association is done by the call of setAssociatedIface() that must be done only for a control interface.
-   * (NB: a test is done in the method to prevent the other case).
-   */
-  ConnectedInterface* associatedIface;
+  ConnectedInterface* connectedFrom;  
 };
 
 
 };
 
 
index f54708419ae9422e8b9a1b867397ec5f477a9d4f..cb8ceba679d5da8c5f835cbc673483280cbc7f9d 100644 (file)
@@ -46,25 +46,44 @@ void FunctionalBlock::populate() {
   BlockParameter* p;\r
   AbstractInterface* inter;\r
 \r
   BlockParameter* p;\r
   AbstractInterface* inter;\r
 \r
+  // create parameters from reference block\r
   QList<BlockParameter*> lstParam = reference->getParameters();\r
   for(i=0;i<lstParam.size();i++) {\r
     p = lstParam.at(i)->clone();\r
     addParameter(p);\r
   }\r
 \r
   QList<BlockParameter*> lstParam = reference->getParameters();\r
   for(i=0;i<lstParam.size();i++) {\r
     p = lstParam.at(i)->clone();\r
     addParameter(p);\r
   }\r
 \r
-  QList<AbstractInterface *> lstInter = reference->getInterfaces();\r
-  for(i=0;i<lstInter.size();i++) {\r
+  // create interfaces from reference block\r
+  QList<AbstractInterface *> lstRef = reference->getInterfaces();\r
+  // store relation between functional and reference\r
+  QHash<AbstractInterface *, AbstractInterface *> hashIface;\r
+  for(i=0;i<lstRef.size();i++) {\r
     try {\r
     try {\r
-      inter = new FunctionalInterface(this, (ReferenceInterface*)lstInter.at(i));\r
+      inter = new FunctionalInterface(this, AI_TO_REF(lstRef.at(i)));\r
     }\r
     catch(Exception e) {\r
       cerr << "Abnormal case: " << qPrintable(e.getDefaultMessage()) << endl << "Aborting execution." << endl;\r
       exit(1);\r
     }\r
     }\r
     catch(Exception e) {\r
       cerr << "Abnormal case: " << qPrintable(e.getDefaultMessage()) << endl << "Aborting execution." << endl;\r
       exit(1);\r
     }\r
+    hashIface.insert(lstRef.at(i),inter);\r
 \r
     addInterface(inter);\r
   }\r
 \r
     addInterface(inter);\r
   }\r
-\r
+    \r
+  AbstractInterface* funCtlIface = NULL;\r
+  AbstractInterface* funDataIface = NULL;\r
+  \r
+  for(i=0;i<lstRef.size();i++) {    \r
+    AbstractInterface* refIface = lstRef.at(i);    \r
+    if (refIface->getPurpose() == AbstractInterface::Control) {\r
+      funCtlIface = hashIface.value(refIface);\r
+      funDataIface = hashIface.value(refIface->getAssociatedIface());\r
+      if (! funCtlIface->setAssociatedIface(funDataIface)) {\r
+        cerr << "Abnormal case when associating a control interface to data" << endl << "Aborting execution." << endl;\r
+        exit(1);\r
+      }       \r
+    }\r
+  }\r
 }\r
 \r
 \r
 }\r
 \r
 \r
index 1b8ff07961ea4b3062b730c08210979add4244a0..d34cc8daac6490a18f7c4e1b070635502d00723f 100644 (file)
@@ -20,7 +20,7 @@ FunctionalInterface::FunctionalInterface(AbstractBlock* _owner, ReferenceInterfa
   width = reference->getWidth();\r
   direction = reference->getDirection();\r
   purpose = reference->getPurpose();  \r
   width = reference->getWidth();\r
   direction = reference->getDirection();\r
   purpose = reference->getPurpose();  \r
-  connectedFrom = NULL;\r
+  connectedFrom = NULL;  \r
 }\r
 \r
 bool FunctionalInterface::isFunctionalInterface() {\r
 }\r
 \r
 bool FunctionalInterface::isFunctionalInterface() {\r
index 722fc12186da982f691d33db7a402b1b9cb9803b..e09b1188c0dcb8c30b753d23f24a66fae9862bb2 100644 (file)
@@ -224,6 +224,7 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
   if ((elt.isNull()) || (elt.tagName() != "interfaces")) throw (Exception(BLOCKFILE_CORRUPTED));
 
   QDomElement eltInputs = elt.firstChildElement("inputs");
   if ((elt.isNull()) || (elt.tagName() != "interfaces")) throw (Exception(BLOCKFILE_CORRUPTED));
 
   QDomElement eltInputs = elt.firstChildElement("inputs");
+  // getting each input
   QDomNodeList listNodeInputs = eltInputs.elementsByTagName("input");
   for(int i=0;i<listNodeInputs.size();i++) {
     QDomNode node = listNodeInputs.at(i);
   QDomNodeList listNodeInputs = eltInputs.elementsByTagName("input");
   for(int i=0;i<listNodeInputs.size();i++) {
     QDomNode node = listNodeInputs.at(i);
@@ -242,7 +243,21 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
     inter = new ReferenceInterface(this,nameStr,typeStr,widthStr,AbstractInterface::Input, purpose, mult);
     inputs.append(inter);
   }
     inter = new ReferenceInterface(this,nameStr,typeStr,widthStr,AbstractInterface::Input, purpose, mult);
     inputs.append(inter);
   }
-
+  // getting each control
+  QDomNodeList listNodeInCtl = eltInputs.elementsByTagName("control");
+  for(int i=0;i<listNodeInCtl.size();i++) {
+    QDomNode node = listNodeInCtl.at(i);
+    QDomElement eltInput = node.toElement();
+    nameStr = eltInput.attribute("iface","none");
+    AbstractInterface* dataIface = getIfaceFromName(nameStr);
+    if (dataIface == NULL) throw (Exception(BLOCKFILE_CORRUPTED));
+    nameStr = dataIface->getName()+"_ctl";
+    inter = new ReferenceInterface(this,nameStr,"boolean","1",AbstractInterface::Input, AbstractInterface::Control, 1);
+    if (!inter->setAssociatedIface(dataIface)) {
+      throw (Exception(BLOCKFILE_CORRUPTED));      
+    }
+    inputs.append(inter);
+  }
   QDomElement eltOutputs = eltInputs.nextSiblingElement("outputs");
   QDomNodeList listNodeOutputs = eltOutputs.elementsByTagName("output");
   for(int i=0;i<listNodeOutputs.size();i++) {
   QDomElement eltOutputs = eltInputs.nextSiblingElement("outputs");
   QDomNodeList listNodeOutputs = eltOutputs.elementsByTagName("output");
   for(int i=0;i<listNodeOutputs.size();i++) {
@@ -259,6 +274,21 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) {
     inter = new ReferenceInterface(this,nameStr,typeStr,widthStr,AbstractInterface::Output, purpose, mult);
     outputs.append(inter);
   }
     inter = new ReferenceInterface(this,nameStr,typeStr,widthStr,AbstractInterface::Output, purpose, mult);
     outputs.append(inter);
   }
+  // getting each control
+  QDomNodeList listNodeOutCtl = eltOutputs.elementsByTagName("control");
+  for(int i=0;i<listNodeOutCtl.size();i++) {
+    QDomNode node = listNodeOutCtl.at(i);
+    QDomElement eltOutput = node.toElement();
+    nameStr = eltOutput.attribute("iface","none");
+    AbstractInterface* dataIface = getIfaceFromName(nameStr);
+    if (dataIface == NULL) throw (Exception(BLOCKFILE_CORRUPTED));
+    nameStr = dataIface->getName()+"_ctl";
+    inter = new ReferenceInterface(this,nameStr,"boolean","1",AbstractInterface::Output, AbstractInterface::Control, 1);
+    if (!inter->setAssociatedIface(dataIface)) {
+      throw (Exception(BLOCKFILE_CORRUPTED));      
+    }
+    outputs.append(inter);
+  }
 
   QDomElement eltBidirs = eltInputs.nextSiblingElement("bidirs");
   QDomNodeList listNodeBidirs = eltBidirs.elementsByTagName("bidir");
 
   QDomElement eltBidirs = eltInputs.nextSiblingElement("bidirs");
   QDomNodeList listNodeBidirs = eltBidirs.elementsByTagName("bidir");
index faa51e842eb6e858d2f97ad69c68e92b7d2e9c8a..a0f50cad9cc22018db0cffa8555ac6eaf052a76d 100644 (file)
@@ -17,6 +17,13 @@ throw (Exception) : AbstractInterface(_owner, _name, _type, _width, _direction,
   if (_owner->isReferenceBlock()) throw(Exception(BLOCK_INVALID_TYPE));
 
   multiplicity = _multiplicity;
   if (_owner->isReferenceBlock()) throw(Exception(BLOCK_INVALID_TYPE));
 
   multiplicity = _multiplicity;
+  
+  if (purpose == Control) {
+    // override some attributes with forced values
+    type = Boolean;
+    width = "1";
+    multiplicity = 1;
+  }  
   if (direction == InOut) {
     multiplicity = 1;
   }
   if (direction == InOut) {
     multiplicity = 1;
   }
@@ -42,9 +49,9 @@ int ReferenceInterface::translatePurpose(const QString& txt) {
   else if (txt == "reset") {
     return Reset;
   }
   else if (txt == "reset") {
     return Reset;
   }
-  if (txt == "wb") {
+  else if (txt == "wb") {
     return Wishbone;
     return Wishbone;
-  }
+  }  
   return Data;
 }
 
   return Data;
 }
 
index 95c4b8a9922fbca765b79fdda0ef4b4dee4177af..570664a3f6b566f7a8ebd808e8c21c0f3400779f 100755 (executable)
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 3.2.1, 2017-05-04T21:30:29. -->
+<!-- Written by QtCreator 3.2.1, 2017-05-05T14:29:41. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
-  <value type="QByteArray">{c8006d66-d34f-42be-ad10-d0207752286d}</value>
+  <value type="QByteArray">{1d077e47-e3a1-47fd-8b12-4de650e39df5}</value>
  </data>
  <data>
   <variable>ProjectExplorer.Project.ActiveTarget</variable>
  </data>
  <data>
   <variable>ProjectExplorer.Project.ActiveTarget</variable>
   <valuemap type="QVariantMap">
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
   <valuemap type="QVariantMap">
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{2c9bf876-3476-44eb-8065-1f0844704dda}</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{451ee8a3-56ff-4aba-8a8e-3da882cc142e}</value>
    <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
    <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/sdomas/Projet/Blast/code/blast</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/localhome/sdomas/Projet/Blast/code/blast</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <valuelist type="QVariantList" key="GenericProjectManager.GenericMakeStep.BuildTargets">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <valuelist type="QVariantList" key="GenericProjectManager.GenericMakeStep.BuildTargets">
index a5ec5ae4323a138aa8e519fea0d953fca3da8a5b..594beb02874b2614ab1f060248792d2153acc62c 100644 (file)
Binary files a/lib/references/references.bmf and b/lib/references/references.bmf differ