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

Private GIT Repository
changed sources to stimulis
[blast.git] / AbstractInterface.cpp
index 6c51907dc047bd9e89702cac62d696821ca8386c..3295dc8eb99bde841b9351b1a44575ffc8c57366 100644 (file)
@@ -13,6 +13,8 @@ AbstractInterface::AbstractInterface(AbstractBlock* _owner) {
   type = Boolean;
   endianess = LittleEndian;
   associatedIface = NULL;
+  clkIface = "";
+  clkIfaceType = 0;
 
 }
 
@@ -26,6 +28,8 @@ AbstractInterface::AbstractInterface(AbstractBlock* _owner, const QString& _name
   type = typeFromString(_type);
   endianess = _endianess;
   associatedIface = NULL;
+  clkIface = "";
+  clkIfaceType = 0;
 }
 
 AbstractInterface::AbstractInterface(AbstractInterface* other) {
@@ -37,6 +41,8 @@ AbstractInterface::AbstractInterface(AbstractInterface* other) {
   purpose = other->purpose;
   endianess = LittleEndian;
   associatedIface = NULL;
+  clkIface = other->clkIface;
+  clkIfaceType = other->clkIfaceType;
 }
 
 void AbstractInterface::setName(const QString& _name) {
@@ -237,6 +243,53 @@ bool AbstractInterface::setAssociatedIface(AbstractInterface* iface) {
   return true;
 }
 
+AbstractInterface* AbstractInterface::getClockIface() {
+  if (clkIfaceType == ClockName) {
+    return owner->getIfaceFromName(clkIface);
+  }
+  return NULL;
+}
+
+bool AbstractInterface::setClockIface(QString name) {
+  /* 2 cases :
+   *  - this is a Data interface
+   *  - this is a Clock output (from a clkrstgen)
+   *
+   *   iface must correspond to an existing clock interface name
+   * or a user parameter prepend with a $.
+   */
+  if ((purpose == Data) || ((purpose == Clock) && (direction == Output))) {
+    if (name.at(0) == '$') {
+      name.remove(0,1);
+      QList<BlockParameter* > params = owner->getUserParameters();
+      foreach(BlockParameter* p, params) {
+        if (p->getName() == name) {
+          clkIface = name;
+          clkIfaceType = ParameterName;
+          return true;
+        }
+      }
+      // error case: cannot found the input clock
+      return false;
+    }
+    else {
+      QList<AbstractInterface*> clocks = owner->getInterfaces(Input, Clock);
+      foreach(AbstractInterface* iface, clocks) {
+        if (iface->getName() == name) {
+          clkIface = name;
+          clkIfaceType = ClockName;
+          return true;
+        }
+      }
+      // error case: cannot found the user paramter
+      return false;
+    }
+  }
+  clkIface = "";
+  clkIfaceType = NoName;
+  return true;
+}
+
 
 int AbstractInterface::getIntDirection(QString str) {
     if(str == "input") return Input;
@@ -288,7 +341,7 @@ int AbstractInterface::typeFromString(const QString &_type) {
   return ret;
 }
 
-QString AbstractInterface::toVHDL(int context, int flags) throw(Exception) {
+QString AbstractInterface::toVHDL(IfaceVHDLContext context, int flags) throw(Exception) {
 
 
   if (isReferenceInterface()) throw(Exception(IFACE_INVALID_TYPE));
@@ -298,7 +351,17 @@ QString AbstractInterface::toVHDL(int context, int flags) throw(Exception) {
   QString ret="";
 
   bool ok;
-  cout << "iface " << qPrintable(name) << " must be evaluated to vhdl :" << qPrintable(width) << " with type = " << qPrintable(getTypeString()) << endl;
+  //cout << "iface " << qPrintable(name) << " must be evaluated to vhdl :" << qPrintable(width) << " with type = " << qPrintable(getTypeString()) << endl;
+
+  if (context == Instance) {
+    if (direction == Output) {
+      ret = "from_"+owner->getName()+"_"+name;
+    }
+    else if (direction == InOut) {
+      ret = "fromto_"+owner->getName()+"_"+name;
+    }
+    return ret;
+  }
 
   // create the width part
   QString widthStr = "";
@@ -411,10 +474,15 @@ QString AbstractInterface::toVHDL(int context, int flags) throw(Exception) {
     ret += widthStr;
   }
   else if (context == Signal) {
-    ret = widthStr;
-  }
-  else if (context == Architecture) {
-
+    if (direction == Output) {
+      ret = "from_"+owner->getName()+"_"+name+" : "+widthStr;
+    }
+    else if (direction == InOut) {
+      ret = "fromto_"+owner->getName()+"_"+name+" : "+widthStr;
+    }
+    else if (direction == Input) {
+      ret = owner->getName()+"_"+name+" : "+widthStr;
+    }
   }
 
   return ret;