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

Private GIT Repository
started clkconvert output gen
authorstephane Domas <stephane.domas@univ-fcomte.fr>
Fri, 4 May 2018 13:20:06 +0000 (15:20 +0200)
committerstephane Domas <stephane.domas@univ-fcomte.fr>
Fri, 4 May 2018 13:20:06 +0000 (15:20 +0200)
23 files changed:
AbstractBlock.cpp
AbstractBlock.h
AbstractInterface.cpp
AbstractInterface.h
Exception.cpp
Exception.h
FunctionalBlock.cpp
FunctionalBlock.h
FunctionalInterface.cpp
FunctionalInterface.h
Graph.cpp
GroupBlock.cpp
GroupBlock.h
GroupInterface.cpp
GroupInterface.h
Parameters.cpp
Parameters.h
ReferenceBlock.cpp
ReferenceInterface.cpp
ReferenceInterface.h
SpecialBlock.cpp
SpecialBlock.h
blast.creator.user

index b8ce5e5e1ddd8747ad461b278bbc215cfa093322..0f3f8015920df89b13bc3b19c4c2157913203519 100644 (file)
@@ -8,10 +8,11 @@
 #include "ConnectedInterface.h"\r
 \r
 \r
 #include "ConnectedInterface.h"\r
 \r
 \r
-AbstractBlock::AbstractBlock() {\r
+AbstractBlock::AbstractBlock(Graph *_graph) {\r
   name = "";\r
   parent = NULL;\r
   specialType = NotSpecial;\r
   name = "";\r
   parent = NULL;\r
   specialType = NotSpecial;\r
+  graph = _graph;\r
 }\r
 \r
 /*\r
 }\r
 \r
 /*\r
index 8f09410f44011e1dd44fa090cae84453bf0205e3..fad9b53ecfbf0167781f74a4c20ffc1bfdc1f361 100644 (file)
@@ -9,6 +9,7 @@
 #include "AbstractInterface.h"\r
 class AbstractInterface;\r
 class BlockParameter;\r
 #include "AbstractInterface.h"\r
 class AbstractInterface;\r
 class BlockParameter;\r
+class Graph;\r
 \r
 #define AB_TO_REF(ptr) ((ReferenceBlock*)ptr)\r
 #define AB_TO_FUN(ptr) ((FunctionalBlock*)ptr)\r
 \r
 #define AB_TO_REF(ptr) ((ReferenceBlock*)ptr)\r
 #define AB_TO_FUN(ptr) ((FunctionalBlock*)ptr)\r
@@ -26,7 +27,7 @@ public:
   enum SpecialType { NotSpecial = 0, Source = 1, Sink = 2, ClkConvert = 3 };\r
 \r
 \r
   enum SpecialType { NotSpecial = 0, Source = 1, Sink = 2, ClkConvert = 3 };\r
 \r
 \r
-  AbstractBlock();\r
+  AbstractBlock(Graph* _graph);\r
   //AbstractBlock(const QString& _name);\r
   virtual ~AbstractBlock();\r
 \r
   //AbstractBlock(const QString& _name);\r
   virtual ~AbstractBlock();\r
 \r
@@ -35,6 +36,7 @@ public:
   inline int getSpecialType() { return specialType; }\r
   inline QString getVersion() { return version; }\r
   inline int nbParameters() { return params.size(); }\r
   inline int getSpecialType() { return specialType; }\r
   inline QString getVersion() { return version; }\r
   inline int nbParameters() { return params.size(); }\r
+  inline Graph* getGraph() { return graph; }\r
 \r
   inline QList<AbstractInterface*> getInputs() { return inputs; }\r
   inline QList<AbstractInterface*> getOutputs() { return outputs; }\r
 \r
   inline QList<AbstractInterface*> getInputs() { return inputs; }\r
   inline QList<AbstractInterface*> getOutputs() { return outputs; }\r
@@ -112,6 +114,7 @@ protected:
   QString name;\r
   int specialType;\r
   QString version;\r
   QString name;\r
   int specialType;\r
   QString version;\r
+  Graph* graph;\r
 \r
   // parameters\r
   QList<BlockParameter *> params;\r
 \r
   // parameters\r
   QList<BlockParameter *> params;\r
index d040598b58e3d50ab48added85ba419e2e7fd955..3fdd87ad152912f9a850b4ea96799c8f9a2ff6db 100644 (file)
@@ -2,6 +2,7 @@
 #include "BlockParameterPort.h"
 #include "AbstractBlock.h"
 #include "Parameters.h"
 #include "BlockParameterPort.h"
 #include "AbstractBlock.h"
 #include "Parameters.h"
+#include "Graph.h"
 
 AbstractInterface::AbstractInterface(AbstractBlock* _owner) {
 
 
 AbstractInterface::AbstractInterface(AbstractBlock* _owner) {
 
@@ -192,36 +193,6 @@ QString AbstractInterface::getDirectionString() {
     return str;
 }
 
     return str;
 }
 
-double AbstractInterface::getDoubleWidth() throw(QException) {
-
-  static QString fctName = "AbstractInterface::getDoubleWidth()";
- #ifdef DEBUG_FCTNAME
-   cout << "call to " << qPrintable(fctName) << endl;
- #endif
-
-   /*
-    cout << "start AbstractInterface::getDoubleWidth()" << endl;
-    bool ok;
-    double width = getWidth().toDouble(&ok);
-
-    if(!ok){
-      ArithmeticEvaluator *evaluator = new ArithmeticEvaluator;
-      cout << "evaluator created!" << endl;
-      evaluator->setExpression(getWidth());
-      cout << "expression defined!" << endl;
-      foreach(BlockParameter *param, getOwner()->getParameters()){
-        evaluator->setVariableValue(param->getName(), param->getIntValue());
-        cout << "param : " << param->getName().toStdString() << " evaluated!" << endl;
-      }
-      width = evaluator->evaluate();
-      cout << "expression evaluated succefully!" << endl;
-    }
-    cout << "real width : " << width << endl;
-    return width;
-    */
-
-   return 1.0;
-}
 
 void AbstractInterface::setPurpose(int _purpose) {
   if ((_purpose>=Data) && (_purpose <= Wishbone)) {
 
 void AbstractInterface::setPurpose(int _purpose) {
   if ((_purpose>=Data) && (_purpose <= Wishbone)) {
@@ -250,6 +221,32 @@ AbstractInterface* AbstractInterface::getClockIface() {
   return NULL;
 }
 
   return NULL;
 }
 
+
+double AbstractInterface::getClockFrequency() throw(Exception) {
+
+  int idClock = -1;
+
+  if (clkIfaceType == ParameterName) {
+    BlockParameter* param = owner->getParameterFromName(clkIface);
+    if (!param->isUserParameter()) throw(Exception(IFACE_INVALID_CLKFREQ,this));
+    bool ok;
+    double freq = param->getDoubleValue(&ok);
+    if (!ok) throw(Exception(IFACE_INVALID_CLKFREQ,this));
+    return freq;
+  }
+  else {
+    try {
+      idClock = getClockDomain();
+    }
+    catch(Exception e) {
+      throw(e);
+    }
+    return owner->getGraph()->getClock(idClock);
+  }
+  return 0.0;
+}
+
+
 bool AbstractInterface::setClockIface(QString name) {
   /* 2 cases :
    *  - this is a Data interface
 bool AbstractInterface::setClockIface(QString name) {
   /* 2 cases :
    *  - this is a Data interface
index 1e208bfbbd275e33bc7e8cf6b1b66daae3b2e834..832fe483c19741693751dfea9bbce44aa64c8411 100644 (file)
@@ -56,9 +56,9 @@ public :
   inline AbstractInterface* getAssociatedIface() { return associatedIface; }
   inline QString getClockIfaceString() { return clkIface; }
   inline int getClockIfaceType() { return clkIfaceType; }
   inline AbstractInterface* getAssociatedIface() { return associatedIface; }
   inline QString getClockIfaceString() { return clkIface; }
   inline int getClockIfaceType() { return clkIfaceType; }
-  AbstractInterface* getClockIface();  
-
-  double getDoubleWidth() throw(QException);
+  AbstractInterface* getClockIface();
+  virtual int getClockDomain() throw(Exception) = 0; // determine on which clock domain is sync this interface
+  double getClockFrequency() throw(Exception);
   
 
   // setters
   
 
   // setters
index 100339783aa12695b67bc9563dd977c5f1ac4bd3..4bb5ff0ee1103f310c79285a7cc5e4f9f587018b 100644 (file)
@@ -33,11 +33,12 @@ QString Exception::getDefaultMessage() {
   case VHDLFILE_NOACCESS : ret = tr("VHDL file cannot be read"); break;
   case VHDLFILE_CORRUPTED : ret = tr("VHDL file is corrupted"); break;
   case IFACE_NULL : ret = tr("A parameter of type AbstractInterface* has been provided with NULL value."); break;
   case VHDLFILE_NOACCESS : ret = tr("VHDL file cannot be read"); break;
   case VHDLFILE_CORRUPTED : ret = tr("VHDL file is corrupted"); break;
   case IFACE_NULL : ret = tr("A parameter of type AbstractInterface* has been provided with NULL value."); break;
-  case IFACE_INVALID_TYPE : ret = tr("A parameter of type AbstractInterface* is used with an incorrect instance type."); break;
+  case IFACE_INVALID_TYPE : ret = tr("an interface is used for an unauthorized operation according its instance type."); break;
   case IFACE_MULTIPLICITY_REACHED : ret = tr("Impossible to create another instance of a GraphInterface: the maximum multiplicity is reached."); break;
   case IFACE_BLOCK_NOCLKRST : ret = tr("Cannot find a clk or rst for a block."); break;
   case IFACE_GROUP_NOCLKRST : ret = tr("Cannot find a clk or rst for a group."); break;
   case IFACE_TOP_NOCLKRSTGEN : ret = tr("Cannot find the clkrstgen block in top group."); break;
   case IFACE_MULTIPLICITY_REACHED : ret = tr("Impossible to create another instance of a GraphInterface: the maximum multiplicity is reached."); break;
   case IFACE_BLOCK_NOCLKRST : ret = tr("Cannot find a clk or rst for a block."); break;
   case IFACE_GROUP_NOCLKRST : ret = tr("Cannot find a clk or rst for a group."); break;
   case IFACE_TOP_NOCLKRSTGEN : ret = tr("Cannot find the clkrstgen block in top group."); break;
+  case IFACE_INVALID_CLKFREQ : ret = tr("Cannot determine the frequency of the clock that synchronizes an interface."); break;
   case BLOCKITEM_NULL : ret = tr("A parameter of type AbstractBlockItem* has been provided with NULL value."); break;
   case BLOCKITEM_INVALID_TYPE : ret = tr("A parameter of type AbstractBlockItem* is used with an incorrect instance type."); break;
   case WIDTHS_NOT_EQUALS : ret = tr("Two interfaces are connected but don't have the same widths."); break;
   case BLOCKITEM_NULL : ret = tr("A parameter of type AbstractBlockItem* has been provided with NULL value."); break;
   case BLOCKITEM_INVALID_TYPE : ret = tr("A parameter of type AbstractBlockItem* is used with an incorrect instance type."); break;
   case WIDTHS_NOT_EQUALS : ret = tr("Two interfaces are connected but don't have the same widths."); break;
index 0c2cd5ed619418a49f49f4df62bf9aac8c8b79d9..9fc2b0890e2b4b7c437664d29b0522e8d79eb4e7 100644 (file)
@@ -53,6 +53,7 @@ supp. infos : saved in UTF-8 [éè]
 #define IFACE_BLOCK_NOCLKRST 2004
 #define IFACE_GROUP_NOCLKRST 2005
 #define IFACE_TOP_NOCLKRSTGEN 2006
 #define IFACE_BLOCK_NOCLKRST 2004
 #define IFACE_GROUP_NOCLKRST 2005
 #define IFACE_TOP_NOCLKRSTGEN 2006
+#define IFACE_INVALID_CLKFREQ 2007
 
 // exceptions for block items manipulations
 #define BLOCKITEM_NULL 3001
 
 // exceptions for block items manipulations
 #define BLOCKITEM_NULL 3001
index 0fb38c39881ec64c9a45d84eac3a2b09fae95d9b..925a0f96027795486d704ac9834d03694746c5b4 100644 (file)
@@ -8,7 +8,7 @@
 #include "ArithmeticEvaluator.h"\r
 \r
 \r
 #include "ArithmeticEvaluator.h"\r
 \r
 \r
-FunctionalBlock::FunctionalBlock(GroupBlock *_parent, ReferenceBlock *_reference, bool createIfaces) throw(Exception) :  AbstractBlock() {\r
+FunctionalBlock::FunctionalBlock(Graph *_graph, GroupBlock *_parent, ReferenceBlock *_reference, bool createIfaces) throw(Exception) :  AbstractBlock(_graph) {\r
   //if (! _reference->isReferenceBlock()) throw(Exception(BLOCK_INVALID_TYPE));\r
   //if (! _group->isGroupBlock()) throw(Exception(BLOCK_INVALID_TYPE));\r
   reference = _reference;\r
   //if (! _reference->isReferenceBlock()) throw(Exception(BLOCK_INVALID_TYPE));\r
   //if (! _group->isGroupBlock()) throw(Exception(BLOCK_INVALID_TYPE));\r
   reference = _reference;\r
index ced4ab679d871b8f25abe5291f0512ed373c21bc..e3b816709af3f829a4abe27c4e558b8053999c44 100644 (file)
@@ -26,7 +26,7 @@ using namespace Qt;
 class FunctionalBlock : public AbstractBlock {\r
 public:\r
 \r
 class FunctionalBlock : public AbstractBlock {\r
 public:\r
 \r
-  FunctionalBlock(GroupBlock* _parent, ReferenceBlock* _reference, bool createIfaces = true) throw(Exception);\r
+  FunctionalBlock(Graph* _graph, GroupBlock* _parent, ReferenceBlock* _reference, bool createIfaces = true) throw(Exception);\r
   ~FunctionalBlock();\r
   // getters\r
   inline ReferenceBlock* getReference() { return reference; }\r
   ~FunctionalBlock();\r
   // getters\r
   inline ReferenceBlock* getReference() { return reference; }\r
index c0b63af1327c97c7e0aea14f34e80a14fb92d02a..7d1217a88a31bec7c76f89fca1632e432ec0f16f 100644 (file)
@@ -5,7 +5,6 @@
 #include "FunctionalBlock.h"\r
 #include "GroupBlock.h"\r
 \r
 #include "FunctionalBlock.h"\r
 #include "GroupBlock.h"\r
 \r
-\r
 FunctionalInterface::FunctionalInterface(AbstractBlock* _owner, ReferenceInterface *_reference) throw(Exception) : ConnectedInterface(_owner) {\r
 \r
   if (_owner == NULL) throw(Exception(BLOCK_NULL));\r
 FunctionalInterface::FunctionalInterface(AbstractBlock* _owner, ReferenceInterface *_reference) throw(Exception) : ConnectedInterface(_owner) {\r
 \r
   if (_owner == NULL) throw(Exception(BLOCK_NULL));\r
@@ -157,6 +156,45 @@ bool FunctionalInterface::canConnectFrom(AbstractInterface *iface) {
   return false;\r
 }\r
 \r
   return false;\r
 }\r
 \r
+int FunctionalInterface::getClockDomain() throw(Exception) {\r
+\r
+  int idClock = -1;\r
+\r
+  FunctionalInterface* iface = NULL;\r
+  if (clkIfaceType == ClockName) {\r
+    iface = AI_TO_FUN(getClockIface());\r
+  }\r
+  else if ((direction == Input) && (purpose == Clock)) {\r
+    iface = this;\r
+  }\r
+\r
+  if ( iface != NULL) {\r
+\r
+    // if iface is a functional interface, it is connected to clkrstgen_X (in top group) or to ext_clk_X (in subgroup)\r
+    ConnectedInterface* connFrom = iface->getConnectedFrom();\r
+    if (connFrom == NULL) throw(Exception(IFACE_INVALID_CLKFREQ,this));\r
+\r
+    if (connFrom->getOwner()->isFunctionalBlock()) {\r
+      QString name = connFrom->getOwner()->getName();\r
+      cout << "conn from clkrstgen: searching for clkdomain in " << qPrintable(name) << endl;\r
+      name.remove(0,10);\r
+      bool ok;\r
+      idClock = name.toInt(&ok);\r
+      if (!ok) throw(Exception(IFACE_INVALID_CLKFREQ,this));\r
+    }\r
+    else {\r
+      QString name = connFrom->getName();\r
+      cout << "conn from group: searching for clkdomain in " << qPrintable(name) << endl;\r
+      name.remove(0,8);\r
+      bool ok;\r
+      idClock = name.toInt(&ok);\r
+      if (!ok) throw(Exception(IFACE_INVALID_CLKFREQ,this));\r
+    }\r
+  }\r
+\r
+  return idClock;\r
+}\r
+\r
 \r
 void FunctionalInterface::connectionsValidation(QStack<AbstractInterface *> *interfacetoValidate, QList<AbstractInterface *> *validatedInterfaces) throw(Exception) {\r
 \r
 \r
 void FunctionalInterface::connectionsValidation(QStack<AbstractInterface *> *interfacetoValidate, QList<AbstractInterface *> *validatedInterfaces) throw(Exception) {\r
 \r
index 43f31c3aa6c6b47259d6d299c815522fe941fdb7..3c7070358fe25ab8690017c01cf5d5bde3335a44 100644 (file)
@@ -35,6 +35,7 @@ public :
 \r
   // getters\r
   inline ReferenceInterface* getReference() { return reference; }\r
 \r
   // getters\r
   inline ReferenceInterface* getReference() { return reference; }\r
+  int getClockDomain() throw(Exception); // determine at which freq. is synchronized iface\r
   //inline QList<char>* getConsumptionPattern() { return consumptionPattern; }\r
   //inline QList<char>* getProductionPattern() { return productionPattern; }  \r
 \r
   //inline QList<char>* getConsumptionPattern() { return consumptionPattern; }\r
   //inline QList<char>* getProductionPattern() { return productionPattern; }  \r
 \r
index 8e55077e6d069759f837f790924f0661fb33fea2..808dbda2f18486c8e247651e4290cea3fdebd109 100644 (file)
--- a/Graph.cpp
+++ b/Graph.cpp
@@ -14,7 +14,7 @@ Graph::~Graph() {
 }
 
 void Graph::createTopGroup(bool createTopGroupIfaces) {
 }
 
 void Graph::createTopGroup(bool createTopGroupIfaces) {
-  topGroup = new GroupBlock(NULL, createTopGroupIfaces);
+  topGroup = new GroupBlock(this, NULL, createTopGroupIfaces);
   topGroup->setName("top group");
   groups.append(topGroup);
 }
   topGroup->setName("top group");
   groups.append(topGroup);
 }
@@ -24,7 +24,7 @@ QList<AbstractInterface *> Graph::getOutsideInterfaces() {
 }
 
 GroupBlock* Graph::createChildGroupBlock(GroupBlock* parent, bool createGroupIface) {
 }
 
 GroupBlock* Graph::createChildGroupBlock(GroupBlock* parent, bool createGroupIface) {
-  GroupBlock* b = new GroupBlock(parent, createGroupIface);
+  GroupBlock* b = new GroupBlock(this, parent, createGroupIface);
   groups.append(b);
   return b;
 }
   groups.append(b);
   return b;
 }
@@ -47,10 +47,12 @@ FunctionalBlock* Graph::createFunctionalBlock(GroupBlock* group, ReferenceBlock*
 
   FunctionalBlock* newBlock = NULL;
   if (ref->getSpecialType() != -1) {
 
   FunctionalBlock* newBlock = NULL;
   if (ref->getSpecialType() != -1) {
-    newBlock = new SpecialBlock(ref->getSpecialType(), group,ref, createIfaces);
+    cout << "Graph: create special block from " << qPrintable(ref->getName()) << endl;
+    newBlock = new SpecialBlock(this, ref->getSpecialType(), group,ref, createIfaces);
   }
   else {
   }
   else {
-    newBlock = new FunctionalBlock(group,ref, createIfaces);
+    cout << "Graph: create normal block from " << qPrintable(ref->getName()) << endl;
+    newBlock = new FunctionalBlock(this, group,ref, createIfaces);
   }
   group->addBlock(newBlock);
 
   }
   group->addBlock(newBlock);
 
@@ -91,7 +93,7 @@ FunctionalBlock* Graph::getFunctionalBlockByName(QString name, GroupBlock* paren
 FunctionalBlock* Graph::createStimuliBlock(ReferenceBlock* ref, bool createIfaces) {
   /* A stimuli block is always a special block with idSpecial = 1 */
 
 FunctionalBlock* Graph::createStimuliBlock(ReferenceBlock* ref, bool createIfaces) {
   /* A stimuli block is always a special block with idSpecial = 1 */
 
-  FunctionalBlock* newBlock = new SpecialBlock(AbstractBlock::Source, NULL,ref, createIfaces);
+  FunctionalBlock* newBlock = new SpecialBlock(this, AbstractBlock::Source, NULL,ref, createIfaces);
   stimulis.append(newBlock);
   return newBlock;
 }
   stimulis.append(newBlock);
   return newBlock;
 }
index d682a57b2990ab23d738221d6d515de9e9d292a7..206d8cba6e33e0a7ee799a1f4a6014f4083f1196 100644 (file)
@@ -10,7 +10,7 @@
 
 int GroupBlock::counter = 1;
 
 
 int GroupBlock::counter = 1;
 
-GroupBlock::GroupBlock(GroupBlock *_parent, bool createIfaces) throw(Exception) :  AbstractBlock() {
+GroupBlock::GroupBlock(Graph *_graph, GroupBlock *_parent, bool createIfaces) throw(Exception) :  AbstractBlock(_graph) {
 
   parent = _parent;
   GroupInterface* clk = NULL;
 
   parent = _parent;
   GroupInterface* clk = NULL;
index 63104def7d2b08ca88e330b474e71cfa890b37a5..8502a21d6beb768df734b8c6fe379410c8282c4b 100644 (file)
@@ -17,7 +17,7 @@ using namespace Qt;
 class GroupBlock : public AbstractBlock {
 public:
 
 class GroupBlock : public AbstractBlock {
 public:
 
-  GroupBlock(GroupBlock* _parent, bool createIfaces = true) throw(Exception);
+  GroupBlock(Graph* _graph, GroupBlock* _parent, bool createIfaces = true) throw(Exception);
   virtual ~GroupBlock();
 
   // getters
   virtual ~GroupBlock();
 
   // getters
index b42e7a047020869c98cbe341d8804f455106a0bc..bfeb1ff2373a4fe113854772826892dd9f0187d3 100644 (file)
@@ -129,6 +129,32 @@ bool GroupInterface::canConnectFrom(AbstractInterface *iface) {
   return false;
 }
 
   return false;
 }
 
+int GroupInterface::getClockDomain() throw(Exception) {
+
+  int idClock = -1;
+
+  GroupInterface* iface = NULL;
+  if (clkIfaceType == ClockName) {
+    iface = AI_TO_GRP(getClockIface());
+  }
+  else if ((direction == Input) && (purpose == Clock)) {
+    iface = this;
+  }
+
+  if ( iface != NULL) {
+
+    QString name = iface->getName();
+    name.remove(0,8);
+    bool ok;
+    idClock = name.toInt(&ok);
+    if (!ok) throw(Exception(IFACE_INVALID_CLKFREQ,this));
+
+  }
+
+  return idClock;
+}
+
+
 void GroupInterface::connectionsValidation(QStack<AbstractInterface*> *interfacetoValidate, QList<AbstractInterface*> *validatedInterfaces) throw(Exception) {
     cout << "group interface connection validation" << endl;
 }
 void GroupInterface::connectionsValidation(QStack<AbstractInterface*> *interfacetoValidate, QList<AbstractInterface*> *validatedInterfaces) throw(Exception) {
     cout << "group interface connection validation" << endl;
 }
index 2f7ac609d74b737e458621e3ecb244127203d392..35f0916ba55fa86d60ed549f525981f51b1ff051 100644 (file)
@@ -38,7 +38,7 @@ public :
 
   // getters
   int getWidth();
 
   // getters
   int getWidth();
-
+  int getClockDomain() throw(Exception); // determine at which freq. is synchronized iface
   // setters
 
   // testers
   // setters
 
   // testers
index d7621d232a1afa54f59d2a4078eeba3bac0f521b..ec0041f48c3432062533f54779382fae3fb4a5c6 100644 (file)
@@ -97,71 +97,6 @@ ReferenceBlock* Parameters::getHiddenReferenceBlock(QString blockName) {
   return ref;\r
 }\r
 \r
   return ref;\r
 }\r
 \r
-double Parameters::getFeedingClockFrequency(AbstractInterface *iface) {\r
-\r
-  int idClock = 0;\r
-\r
-  if (iface->isReferenceInterface()) return 0.0;\r
-\r
-  if (iface->getClockIfaceType() == AbstractInterface::ParameterName) {\r
-    BlockParameter* param = iface->getOwner()->getParameterFromName(iface->getClockIfaceString());\r
-    if (!param->isUserParameter()) return 0.0;\r
-    bool ok;\r
-    double freq = param->getDoubleValue(&ok);\r
-    if (!ok) {\r
-      cerr << "Abnormal case: cannot retrieve clock id from parameter  " << qPrintable(param->getName()) << endl;\r
-    }\r
-    return freq;\r
-  }\r
-  else if ( (iface->getClockIfaceType() == AbstractInterface::ClockName) || ((iface->getDirection() == AbstractInterface::Input) && (iface->getPurpose() == AbstractInterface::Clock))) {\r
-\r
-    // if iface is not clock, retrieve the clock related to it\r
-    if (iface->getClockIfaceType() == AbstractInterface::ClockName) {\r
-      iface = iface->getClockIface();\r
-    }\r
-    // if iface is a group interface, then iface name is ext_clk_X, thus extract the X\r
-    if (iface->isGroupInterface()) {\r
-      QString name = iface->getName();\r
-      name.remove(0,8);\r
-      bool ok;\r
-      idClock = name.toInt(&ok);\r
-      if (!ok) {\r
-        cerr << "Abnormal case: cannot retrieve clock id from iface name " << qPrintable(iface->getName()) << endl;\r
-        return 0.0;\r
-      }\r
-    }\r
-    // if iface is a functional interface, it is connected to clkrstgen_X (in top group) or to ext_clk_X (in subgroup)\r
-    else if (iface->isFunctionalInterface()) {\r
-      FunctionalInterface* funIface = AI_TO_FUN(iface);\r
-      ConnectedInterface* connFrom = funIface->getConnectedFrom();\r
-      if (connFrom == NULL) {\r
-        cerr << "Abnormal case: input clock " << qPrintable(iface->getName()) << " is not connected" << endl;\r
-        return 0.0;\r
-      }\r
-      if (iface->getOwner()->isTopGroupBlock()) {\r
-        QString name = connFrom->getOwner()->getName();\r
-        name.remove(0,10);\r
-        bool ok;\r
-        idClock = name.toInt(&ok);\r
-        if (!ok) {\r
-          cerr << "Abnormal case: cannot retrieve clock id for " << qPrintable(iface->getName()) << endl;\r
-          return 0.0;\r
-        }\r
-      }\r
-      else {\r
-        QString name = connFrom->getName();\r
-        name.remove(0,8);\r
-        bool ok;\r
-        idClock = name.toInt(&ok);\r
-        if (!ok) {\r
-          cerr << "Abnormal case: cannot retrieve clock id for " << qPrintable(iface->getName()) << endl;\r
-          return 0.0;\r
-        }\r
-      }\r
-    }\r
-  }\r
-  return graph->getClock(idClock);\r
-}\r
 \r
 void Parameters::createDelayBlock() {\r
   delayRef = new ReferenceBlock("no.xml");\r
 \r
 void Parameters::createDelayBlock() {\r
   delayRef = new ReferenceBlock("no.xml");\r
index e14b3fe11cc856e2d2705c440f157fd6335e58d9..8d2fc8cddbfdc77bef07a69c7977ddf85f1d53fc 100644 (file)
@@ -145,8 +145,7 @@ public :
   void destroyGraph();\r
   inline Graph* getGraph() { return graph; }  \r
   ReferenceBlock* getReferenceBlock(int idCategory, int idBlock); // get the reference block from its category and index\r
   void destroyGraph();\r
   inline Graph* getGraph() { return graph; }  \r
   ReferenceBlock* getReferenceBlock(int idCategory, int idBlock); // get the reference block from its category and index\r
-  ReferenceBlock* getHiddenReferenceBlock(QString blockName); // get a hidden block by name, i.e. in category 100  \r
-  double getFeedingClockFrequency(AbstractInterface* iface); // determine at which freq. is synchronized iface\r
+  ReferenceBlock* getHiddenReferenceBlock(QString blockName); // get a hidden block by name, i.e. in category 100    \r
 \r
   void clear();\r
 \r
 \r
   void clear();\r
 \r
index 9b3959c052fccde774b6584e5bef6c39bab06de6..553955b414c24a5157c34a96934b391509bcc8e1 100644 (file)
@@ -8,7 +8,7 @@
 #include "BlockParameterWishbone.h"
 #include "Parameters.h"
 
 #include "BlockParameterWishbone.h"
 #include "Parameters.h"
 
-ReferenceBlock::ReferenceBlock(const QString _xmlFile) : AbstractBlock() {
+ReferenceBlock::ReferenceBlock(const QString _xmlFile) : AbstractBlock(NULL) {
   xmlFile = _xmlFile;  
 }
 
   xmlFile = _xmlFile;  
 }
 
@@ -759,3 +759,4 @@ QList<QString> ReferenceBlock::getExternalResources() {
   return list;
 }
 
   return list;
 }
 
+
index 89369525932d8f0aac2afa1f46215b3631f4e41b..fdebeaa6d611eafe3e1ed5703ad382343161606a 100644 (file)
@@ -71,3 +71,8 @@ int ReferenceInterface::translateMultiplicity(const QString& txt) {
   }
   return mult;
 }
   }
   return mult;
 }
+
+int ReferenceInterface::getClockDomain() throw(Exception) {
+
+  throw(Exception(IFACE_INVALID_TYPE,this));
+}
index 1ba21ed2f295c5977a1630c7bb0b48a01bc07bf1..cf54f4a6cc86f3d2d0726df25649a4745545f123 100644 (file)
@@ -22,7 +22,8 @@ public :
   ReferenceInterface(AbstractBlock* _owner, const QString& _name, int _direction, int _purpose, const QString& _type, const QString& _width, int _endianess = LittleEndian, int _multiplicity=1) throw (Exception);
 
   // getters
   ReferenceInterface(AbstractBlock* _owner, const QString& _name, int _direction, int _purpose, const QString& _type, const QString& _width, int _endianess = LittleEndian, int _multiplicity=1) throw (Exception);
 
   // getters
-  inline int getMultiplicity() { return multiplicity; }  
+  inline int getMultiplicity() { return multiplicity; }
+  int getClockDomain() throw(Exception); // determine at which freq. is synchronized iface
   // setters
   void setMultiplicity(int _multiplicity);
 
   // setters
   void setMultiplicity(int _multiplicity);
 
index fdec328f7252f72045f1828b8480527e1045469e..9576dc96184cfab349f8ddc4de4cc8b86b780e8e 100644 (file)
@@ -1,7 +1,7 @@
 #include "SpecialBlock.h"\r
 #include "FunctionalInterface.h"\r
 \r
 #include "SpecialBlock.h"\r
 #include "FunctionalInterface.h"\r
 \r
-SpecialBlock::SpecialBlock(int _type, GroupBlock* _parent, ReferenceBlock* _reference, bool createIfaces) throw(Exception) : FunctionalBlock(_parent, _reference, createIfaces) {\r
+SpecialBlock::SpecialBlock(Graph *_graph, int _type, GroupBlock* _parent, ReferenceBlock* _reference, bool createIfaces) throw(Exception) : FunctionalBlock(_graph, _parent, _reference, createIfaces) {\r
   specialType = _type;\r
 }\r
 \r
   specialType = _type;\r
 }\r
 \r
@@ -58,7 +58,7 @@ void SpecialBlock::checkInputPatternCompatibilitySource() throw(Exception) {
 }\r
 void SpecialBlock::computeOutputPatternSource(int nbExec) throw(Exception) {\r
 \r
 }\r
 void SpecialBlock::computeOutputPatternSource(int nbExec) throw(Exception) {\r
 \r
-  cout << "computing output pattern of " << qPrintable(name) << " for " << nbExec << " executions" << endl;\r
+  cout << "computing output pattern of special block " << qPrintable(name) << " for " << nbExec << " executions" << endl;\r
   foreach(AbstractInterface* iface, getControlOutputs()) {\r
     FunctionalInterface* connIface = AI_TO_FUN(iface);\r
     // create output pattern\r
   foreach(AbstractInterface* iface, getControlOutputs()) {\r
     FunctionalInterface* connIface = AI_TO_FUN(iface);\r
     // create output pattern\r
@@ -97,14 +97,15 @@ void SpecialBlock::computeOutputPatternClockConvert(int nbExec) throw(Exception)
 #ifdef DEBUG_FCTNAME\r
   cout << "call to " << qPrintable(fctName) << endl;\r
 #endif\r
 #ifdef DEBUG_FCTNAME\r
   cout << "call to " << qPrintable(fctName) << endl;\r
 #endif\r
-  cout << "computing output pattern of " << qPrintable(name) << endl;\r
+  cout << "computing output pattern of special block " << qPrintable(name) << endl;\r
 \r
   /* CAUTION: it is assumed that all clock domain converters are using\r
    * a clk_in and clk_out signals for input and output clocks.\r
    */\r
   AbstractInterface* clkIn = getIfaceFromName("clk_in");\r
   AbstractInterface* clkOut = getIfaceFromName("clk_out");\r
 \r
   /* CAUTION: it is assumed that all clock domain converters are using\r
    * a clk_in and clk_out signals for input and output clocks.\r
    */\r
   AbstractInterface* clkIn = getIfaceFromName("clk_in");\r
   AbstractInterface* clkOut = getIfaceFromName("clk_out");\r
-  //cout << "freq clk_in = " << clkIn-\r
+  cout << "freq clk_in = " << clkIn->getClockFrequency() << endl;\r
+  cout << "freq clk_out = " << clkOut->getClockFrequency() << endl;\r
 \r
   // in case of inputPattern not created, do it\r
   if (lengthIP <= 0) {\r
 \r
   // in case of inputPattern not created, do it\r
   if (lengthIP <= 0) {\r
index aff0d6bc7720401c127266ea787d30bdefa9fb30..5e47cd922ab1e3655a90ddc29516305424dacacc 100644 (file)
@@ -16,7 +16,7 @@ using namespace Qt;
 class SpecialBlock : public FunctionalBlock {\r
 public:  \r
   \r
 class SpecialBlock : public FunctionalBlock {\r
 public:  \r
   \r
-  SpecialBlock(int _type, GroupBlock* _parent, ReferenceBlock* _reference, bool createIfaces = true) throw(Exception);\r
+  SpecialBlock(Graph* _graph, int _type, GroupBlock* _parent, ReferenceBlock* _reference, bool createIfaces = true) throw(Exception);\r
   ~SpecialBlock();\r
   // getters  \r
   \r
   ~SpecialBlock();\r
   // getters  \r
   \r
index 72704001018bca42e1712ba6394763775efa1fa3..1890744c499a74469e765ff095c25e7bc31164eb 100644 (file)
@@ -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 4.2.0, 2018-05-03T21:14:33. -->
+<!-- Written by QtCreator 4.2.0, 2018-05-04T14:41:26. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
-  <value type="QByteArray">{c8006d66-d34f-42be-ad10-d0207752286d}</value>
+  <value type="QByteArray">{3701e197-5b6c-48ea-9e98-a6cf6de18672}</value>
  </data>
  <data>
   <variable>ProjectExplorer.Project.ActiveTarget</variable>
  </data>
  <data>
   <variable>ProjectExplorer.Project.ActiveTarget</variable>
@@ -61,7 +61,7 @@
   <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">{ed04208c-8774-456b-99b9-4a02094ca7a4}</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>
    <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>