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

Private GIT Repository
add clk/rst to groups
authorstephane Domas <stephane.domas@univ-fcomte.fr>
Wed, 24 Jan 2018 12:27:01 +0000 (13:27 +0100)
committerstephane Domas <stephane.domas@univ-fcomte.fr>
Wed, 24 Jan 2018 12:27:01 +0000 (13:27 +0100)
39 files changed:
AbstractBlock.cpp
AbstractBlock.h
AbstractInputModifier.cpp
AbstractInputModifier.h
AbstractInterface.cpp
AbstractInterface.h
BlockCategory.cpp
BlockCategory.h
BlockImplementation.cpp
BoxItem.cpp
ConnectedInterface.h
DelayInputModifier.cpp
DelayInputModifier.h
Dispatcher.cpp
Dispatcher.h
FunctionalBlock.cpp
FunctionalBlock.h
GroupBlock.cpp
GroupBlock.h
GroupScene.cpp
GroupScene.h
InterfaceItem.cpp
Parameters.cpp
Parameters.h
blast.creator.user
lib/implementations/boxfilter_3x3_impl.xml
lib/implementations/checker_impl.xml
lib/implementations/clkrstgen_impl.xml [new file with mode: 0644]
lib/implementations/deserializer_3x1_impl.xml
lib/implementations/impls.bmf
lib/implementations/logical_AND_3_impl.xml
lib/implementations/rgb3sx8_to_gs_impl.xml
lib/implementations/rgb3sx8_to_ycbcr_3DSP_impl.xml
lib/implementations/threshold_extctl_impl.xml
lib/references/apf27-wb-master.xml
lib/references/clkrstgen.xml [new file with mode: 0644]
lib/references/references.bmf
projectfile.xsd
threshold_extctl.vhd [deleted file]

index f551b302bb0f9cd11b0ab00e2e3a8f0eaac537a6..cdde69fcdc9b6051c396c62559a84f4151b60e04 100644 (file)
@@ -10,7 +10,7 @@ AbstractBlock::AbstractBlock() {
 }\r
 \r
 AbstractBlock::AbstractBlock(const QString& _name) {\r
-  name = _name;\r
+  name = normalizeName(_name);\r
   parent = NULL;\r
 }\r
 \r
@@ -25,7 +25,7 @@ AbstractBlock::~AbstractBlock() {
 }\r
 \r
 void AbstractBlock::setName(const QString& str) {\r
-  name = str;\r
+  name = normalizeName(str);\r
 }\r
 \r
 void AbstractBlock::setParent(AbstractBlock* _parent) {\r
@@ -235,3 +235,11 @@ QList<BlockParameter *> AbstractBlock::getWishboneParameters() {
   return lst;\r
 }\r
 \r
+QString AbstractBlock::normalizeName(const QString &name) {\r
+  QString s = name;\r
+  s.replace(QRegularExpression("[^a-zA-Z0-9_]"),"_");\r
+  s.replace(QRegularExpression("[_]+"),"_");\r
+  return s;\r
+}\r
+\r
+\r
index 80e0413db200ec330ceb6df7bd20245ce8891f70..042a59883b90d4bcf5339a8f491ce3e0ca98234d 100644 (file)
@@ -56,6 +56,8 @@ public:
   bool isWBConfigurable();\r
 \r
   // others\r
+  static QString normalizeName(const QString& name);\r
+\r
   virtual void parametersValidation(QList<AbstractBlock*>* checkedBlocks, QList<AbstractBlock*>* blocksToConfigure) = 0; // ugly but usefull   \r
 \r
   void addParameter(BlockParameter *param);\r
@@ -98,6 +100,8 @@ protected:
   \r
   // NB: only GroupBlock and FunctionalBlock have a real parent, except sources that have no parents\r
   AbstractBlock* parent;\r
+\r
+\r
 };\r
 \r
 #endif // __ABSTRACTBLOCK_H__\r
index aa9c9a215a24cdf0f61f6735babe77ff06b40ad1..67578e677184c51024574a0be0ed71da18a1f8e5 100644 (file)
@@ -1,8 +1,9 @@
 #include "AbstractInputModifier.h"\r
 \r
-AbstractInputModifier::AbstractInputModifier() {\r
+AbstractInputModifier::AbstractInputModifier(ConnectedInterface *_associatedIface) {\r
 \r
   pattern = new QList<char>();\r
+  associatedIface = _associatedIface;\r
 }\r
 \r
 AbstractInputModifier::~AbstractInputModifier() {\r
index bbc5bdd224bc10127b4bb3e53a020050e8041962..6f3abe8f8b3360f3b2c8beb77f3511c14449287d 100644 (file)
@@ -5,14 +5,21 @@
 \r
 #include <QtCore>\r
 \r
+#include "Exception.h"\r
+\r
+class ConnectedInterface;\r
+\r
 using namespace std;\r
 using namespace Qt;\r
 \r
 class AbstractInputModifier {\r
 \r
-public:  \r
+public:\r
+\r
+  enum ModifierVHDLContext {AnyContext = 0, Entity = 1, Component = 2, Architecture = 3 };\r
+  enum ModifierVHDLFlags { NoComma = 1 };\r
       \r
-  AbstractInputModifier();\r
+  AbstractInputModifier(ConnectedInterface* _associatedIface);\r
   virtual ~AbstractInputModifier();\r
 \r
   //getters\r
@@ -29,9 +36,11 @@ public:
 \r
   // others\r
   virtual QList<char>* getModifiedInput(QList<char>* input) = 0;\r
+  virtual QString toVHDL(int context, int flags) throw(Exception) = 0;\r
 \r
  protected:\r
   QList<char>* pattern; // the pattern modified by this\r
+  ConnectedInterface* associatedIface;\r
 };\r
 \r
 #endif // __ABSTRACTINPUTMODIFIER_H__\r
index c03cba9f082953cd6bf16cfbe8f468f73f173f36..1d1e41d15c4ffa4bce34c1e6f7e5764a573a4665 100644 (file)
@@ -18,7 +18,7 @@ AbstractInterface::AbstractInterface(AbstractBlock* _owner) {
 AbstractInterface::AbstractInterface(AbstractBlock* _owner, const QString& _name, int _direction, int _purpose, const QString& _type, const QString& _width, int _endianess) {
 
   owner = _owner;  
-  name = _name;
+  name = AbstractBlock::normalizeName(_name);
   width = _width;
   direction = _direction;
   purpose = _purpose;
@@ -29,7 +29,7 @@ AbstractInterface::AbstractInterface(AbstractBlock* _owner, const QString& _name
 
 AbstractInterface::AbstractInterface(AbstractInterface* other) {
   owner = NULL;
-  name = other->name;
+  name = AbstractBlock::normalizeName(other->name);
   type = other->type;
   width = other->width;
   direction = other->direction;
@@ -38,6 +38,10 @@ AbstractInterface::AbstractInterface(AbstractInterface* other) {
   associatedIface = NULL;
 }
 
+void AbstractInterface::setName(const QString& _name) {
+  name = AbstractBlock::normalizeName(_name);
+}
+
 AbstractInterface::~AbstractInterface() {
 
 }
index b318f92b879174b95579a1d1617bf8d14b5b1948..a214831919378f3a8fce1923a686b70a3073b893 100644 (file)
@@ -58,7 +58,7 @@ public :
 
   // setters
   inline void setOwner(AbstractBlock* _owner) { owner = _owner; }
-  inline void setName(const QString& _name) { name = _name; }
+  void setName(const QString& _name);
   inline void setWidth(const QString& _width) { width = _width; }
   inline void setType(int _type) { type = _type;}
   inline void setEndianess(int _endianess) { endianess = _endianess;}
index 0de4d869a5ef4541e434bc2e31acca108327e4cc..1e70385a8f5785c53e41d665cf7bbcab258ed706 100644 (file)
@@ -34,7 +34,7 @@ QList<BlockCategory *> BlockCategory::getAllChilds()
     return childs;\r
 }\r
 \r
-ReferenceBlock *BlockCategory::getBlock(int index) {\r
+ReferenceBlock *BlockCategory::getBlockById(int index) {\r
     if ((index >=0) && (index < blocks.size()) ) {\r
     return blocks.at(index);\r
   }\r
@@ -42,6 +42,14 @@ ReferenceBlock *BlockCategory::getBlock(int index) {
   return NULL;\r
 }\r
 \r
+ReferenceBlock *BlockCategory::getBlockByName(QString name) {\r
+  foreach(ReferenceBlock* block, blocks) {\r
+    if (block->getName() == name) return block;\r
+  }\r
+  cout << "block null!" << endl;\r
+  return NULL;\r
+}\r
+\r
 QDomElement BlockCategory::save(QDomDocument &doc) {\r
 }\r
 \r
index 78f646e9a02f0837a1ecab497271eda674eba953..aa1c0c4547b305f6901c693f6dd88c000bdb11ec 100644 (file)
@@ -27,7 +27,8 @@ public :
   BlockCategory* getChild(int index);\r
   QList<BlockCategory *> getAllChilds();\r
   inline QList<ReferenceBlock*> getBlocks() { return blocks; }\r
-  ReferenceBlock *getBlock(int index);\r
+  ReferenceBlock *getBlockById(int index);\r
+  ReferenceBlock *getBlockByName(QString name);\r
 \r
   // setters\r
   void addChild(BlockCategory* child);\r
index f71297f1440f8a82845469d9ed9b84126dba3d06..46c97229ab07479a59057949a2c87f616573898b 100644 (file)
@@ -127,6 +127,7 @@ void BlockImplementation::generateVHDL(FunctionalBlock* _block, const QString &p
   if (reference->isWBConfigurable()) {\r
     genController = true;\r
     controllerFile = path;\r
+    controllerFile += "/";\r
     controllerFile.append(block->getName());\r
     controllerFile.append("_ctrl.vhd");    \r
   }\r
@@ -134,6 +135,7 @@ void BlockImplementation::generateVHDL(FunctionalBlock* _block, const QString &p
     controllerFile = "nofile.vhd";    \r
   }\r
   coreFile = path;\r
+  coreFile += "/";\r
   coreFile.append(block->getName());\r
   coreFile.append(".vhd");\r
 \r
@@ -185,38 +187,38 @@ void BlockImplementation::generateComments(QDomElement &elt, QString coreFile, Q
   for(int i = 0; i < 50; i++) {\r
     out << "--";\r
   }\r
-  out << "\n--\n";\r
+  out << "\n--" << endl;\r
   QString fileName = coreFile;\r
-  out << "--  File        : " << fileName << "\n";\r
-  out << "--\n";\r
+  out << "--  File        : " << fileName << endl;\r
+  out << "--" << endl;\r
   QDomElement eltAuthor = elt.firstChildElement("author");\r
   QString firstName = eltAuthor.attribute("firstname","");\r
   QString lastName = eltAuthor.attribute("lastname","");\r
   QString mail = eltAuthor.attribute("mail","");\r
-  out << "--  Author(s)   : "<<firstName+" "<<lastName<<" ("<<mail<<")\n";\r
-  out << "--\n";\r
+  out << "--  Author(s)   : "<<firstName+" "<<lastName<<" ("<<mail<<")" << endl;\r
+  out << "--" << endl;\r
   QDomElement eltDate = eltAuthor.nextSiblingElement("date");\r
   QString crea = eltDate.attribute("creation","");\r
-  out << "--  Creation Date   : "<<crea<<"\n";\r
-  out << "--\n";\r
+  out << "--  Creation Date   : "<<crea<< endl;\r
+  out << "--" << endl;\r
   QDomElement eltRelated = eltDate.nextSiblingElement("related_files");\r
   QString relateds = eltRelated.attribute("list","");\r
-  out << "--  Related files   :\n"<<relateds<<"\n";\r
-  out << "--\n";\r
+  out << "--  Related files   :\n"<<relateds<<endl;\r
+  out << "--" << endl;\r
   QDomElement eltDesc = eltRelated.nextSiblingElement("description");\r
   QDomElement desc = eltDesc.firstChildElement();\r
   QString descTxt = desc.text();\r
-  out << "--  Decription      :\n"<<descTxt<<"\n";\r
-  out << "--\n";\r
+  out << "--  Decription      :\n"<<descTxt<<endl;\r
+  out << "--" << endl;\r
   QDomElement eltNote = eltDesc.nextSiblingElement("description");\r
   QDomElement note = eltNote.firstChildElement();\r
   QString noteTxt = note.text();\r
-  out << "--  Note          :\n"<<noteTxt<<"\n";\r
-  out << "--\n";\r
+  out << "--  Note          :\n"<<noteTxt<<endl;\r
+  out << "--" << endl;\r
   for(int i = 0; i < 50; i++) {\r
     out << "--";\r
   }\r
-  out << "\n\n";\r
+  out << endl << endl;\r
 }\r
 \r
 // This function generates the library part of the VHDL document\r
@@ -227,7 +229,7 @@ void BlockImplementation::generateLibraries(QDomElement &elt, QTextStream& out)
     QDomNode nodeLib = listLib.item(i);\r
     QDomElement eltLib = nodeLib.toElement();\r
     QString nameLib = eltLib.attribute("name","none");\r
-    out << "library " << nameLib << ";\n";\r
+    out << "library " << nameLib << ";" << endl;\r
     QDomNodeList listPack = eltLib.elementsByTagName("package");\r
     for(int j = 0; j < listPack.length(); j++) {\r
       QDomNode nodePack = listPack.item(j);\r
@@ -251,7 +253,7 @@ void BlockImplementation::generateEntity(QTextStream& out, bool hasController) t
   QList<AbstractInterface*> listBidirs = block->getBidirs();\r
   QString typePort, namePort;\r
 \r
-  out << "entity " << nameEnt << " is\n";\r
+  out << "entity " << nameEnt << " is" << endl;\r
 \r
 \r
   /* TODO : rewrite the generation to take into acocunt the new object hierarchy */\r
index 34b567a94dcb9ef1b76d5facc92c9d9a224f8a35..4471c86e8bf3544e7ae37d0dc24dd4eeb9c32c57 100644 (file)
@@ -572,11 +572,14 @@ void BoxItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) {
       }
     }    
 
-    if (iface->getInputModifier() != NULL) {
-      removeModifier = menu.addAction("Remove input modifier");
-    }
-    if (iface->getInputModifier() != NULL) {
-      showModifier = menu.addAction("Show input modifier parameters");
+    if (iface->getAssociatedIface() != NULL) {
+      ConnectedInterface* assoIface = AI_TO_CON(iface->getAssociatedIface());
+      if (assoIface->getInputModifier() != NULL) {
+        removeModifier = menu.addAction("Remove input modifier");
+      }
+      if (assoIface->getInputModifier() != NULL) {
+        showModifier = menu.addAction("Show input modifier parameters");
+      }
     }
 
   }
index f0a36a486a265d02ae4a5fbe615cfd2e24342327..c9e03e883164ebec5ebd9db4a879f428cffb841d 100644 (file)
@@ -46,6 +46,7 @@ public :
   virtual bool canConnectFrom(AbstractInterface* iface) = 0;
 
   // others  
+  void resetOutputPattern() { outputPattern = NULL; }
   void connectTo(ConnectedInterface* iface);
   void disconnectTo(ConnectedInterface* iface);
   //bool connectFrom(ConnectedInterface* iface);
index a35aa2110f535d18ff3c15857174215910445361..e035c388fde9c80836c8421d5c53812510e1a388 100644 (file)
@@ -1,6 +1,7 @@
 #include "DelayInputModifier.h"\r
+#include "ConnectedInterface.h"\r
 \r
-DelayInputModifier::DelayInputModifier(int _delayLength) : AbstractInputModifier() {\r
+DelayInputModifier::DelayInputModifier(ConnectedInterface *_associatedInterface, int _delayLength) : AbstractInputModifier(_associatedInterface) {\r
   setDelayLength(_delayLength);\r
 }\r
 \r
@@ -17,6 +18,10 @@ QList<char>* DelayInputModifier::getModifiedInput(QList<char>* input) {
   return pattern;\r
 }\r
 \r
+QString DelayInputModifier::toVHDL(int context, int flags) throw(Exception) {\r
+\r
+}\r
+\r
 QString DelayInputModifier::getTypeStr() {\r
   return "delay";\r
 }\r
index 1fda2ecf7a8aa5f1ee57e50df7ee1b8682eed89e..c5595f69998b36451ae48fbcf7b9f65595bb134f 100644 (file)
@@ -5,6 +5,7 @@
 #include <QtCore>\r
 \r
 #include "AbstractInputModifier.h"\r
+\r
 using namespace std;\r
 using namespace Qt;\r
 \r
@@ -12,7 +13,7 @@ class DelayInputModifier : public AbstractInputModifier {
 \r
 public:  \r
       \r
-  DelayInputModifier(int _delayLength = 1);\r
+  DelayInputModifier(ConnectedInterface* _associatedInterface, int _delayLength = 1);\r
   // getters\r
   inline int getDelayLength() { return delayLength; }\r
   // setters\r
@@ -22,6 +23,7 @@ public:
 \r
   // others\r
   QList<char>* getModifiedInput(QList<char>* input);\r
+  QString toVHDL(int context, int flags) throw(Exception);\r
 \r
   QString getTypeStr();\r
   QString getParametersStr();\r
index a552f208fa0a1c96064c7ae9aeeac91e893aad93..a9beb481f8bdb412c7cec0e5414d5fd85ba5882d 100644 (file)
@@ -85,7 +85,7 @@ void Dispatcher::closeCurrentProject() {
   sceneCounter = 0;
 }
 
-bool Dispatcher::createConnection(InterfaceItem *iface1, InterfaceItem *iface2) {
+bool Dispatcher::createConnection(InterfaceItem *iface1, InterfaceItem *iface2, bool visible) {
     
   ConnectedInterface* ref1 = iface1->refInter;
   ConnectedInterface* ref2 = iface2->refInter;  
@@ -106,7 +106,7 @@ bool Dispatcher::createConnection(InterfaceItem *iface1, InterfaceItem *iface2)
   }
   if ((ok1 == true) || (ok2 == true)) {
 
-    iface1->getOwner()->getScene()->createConnectionItem(iface1,iface2);
+    iface1->getOwner()->getScene()->createConnectionItem(iface1,iface2, visible);
 
     unselectAllItems();
     params->unsaveModif = true;
@@ -182,7 +182,7 @@ void Dispatcher::generateBlockVHDL(BoxItem *item){
     ReferenceBlock* ref = block->getReference();
     BlockImplementation* impl = ref->getImplementations().at(0);
     try {
-      impl->generateVHDL(block,"/home/sdomas/");
+      impl->generateVHDL(block,params->projectPath);
     }
     catch(Exception e) {
       cout << qPrintable(e.getMessage()) << endl;
@@ -371,10 +371,18 @@ void Dispatcher::showPatterns(InterfaceItem *item) {
     msg += " owned by ";
     msg += item->refInter->getOwner()->getName();
     msg += " is:\n";
-    ConnectedInterface* iface = AI_TO_CON(item->refInter->getAssociatedIface());
-    ConnectedInterface* fromIface = iface->getConnectedFrom();
-    if (fromIface->getOutputPattern() == NULL) return;
-    foreach(char c, *(fromIface->getOutputPattern())) {
+    // get the precursor output pattern
+    ConnectedInterface* connIface = AI_TO_CON(item->refInter->getAssociatedIface());
+    QList<char>* out = connIface->getConnectedFrom()->getOutputPattern();
+    // get the modifier
+    AbstractInputModifier* modifier = connIface->getInputModifier();
+    // check if the input is modified
+    if (modifier != NULL) {
+
+      out = modifier->getModifiedInput(out);
+    }
+
+    foreach(char c, *out) {
       msg += QString::number((int)c);
     }
     msg += "\n";
@@ -401,7 +409,8 @@ void Dispatcher::showModifier(InterfaceItem *item) {
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
   QString msg = "";
-  AbstractInputModifier* mod = item->refInter->getInputModifier();
+  ConnectedInterface* assoIface = AI_TO_CON(item->refInter->getAssociatedIface());
+  AbstractInputModifier* mod = assoIface->getInputModifier();
   if (mod->isDelay()) {
     DelayInputModifier* delay = (DelayInputModifier *)mod;
     msg = "Pattern of iface ";
@@ -421,7 +430,8 @@ void Dispatcher::removeModifier(InterfaceItem *item) {
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 
-  item->refInter->clearInputModifier();
+  ConnectedInterface* assoIface = AI_TO_CON(item->refInter->getAssociatedIface());
+  assoIface->clearInputModifier();
 }
 
 
@@ -546,7 +556,16 @@ GroupWidget *Dispatcher::createTopScene(){
 
   // creating the model part of the group
   Graph* graph = params->createGraph();
-  GroupBlock *refBlock = graph->getTopGroup();
+  GroupBlock *topBlock = graph->getTopGroup();
+  // creating the clkrstgen block
+  ReferenceBlock* ref = params->getHiddenReferenceBlock("clkrstgen");
+  FunctionalBlock* newOne = params->getGraph()->createFunctionalBlock(topBlock, ref);
+  ConnectedInterface* fromIface = AI_TO_CON(topBlock->getIfaceFromName("ext_clk"));
+  ConnectedInterface* toIface = AI_TO_CON(newOne->getIfaceFromName("ext_clk"));
+  fromIface->connectTo(toIface);
+  fromIface = AI_TO_CON(topBlock->getIfaceFromName("ext_reset"));
+  toIface = AI_TO_CON(newOne->getIfaceFromName("ext_reset"));
+  fromIface->connectTo(toIface);
 
   // creating a fake and not connected interface
   //AbstractInterface* iface = new GroupInterface(refBlock,"grp_iface",AbstractInterface::Input,AbstractInterface::Top);
@@ -560,7 +579,7 @@ GroupWidget *Dispatcher::createTopScene(){
   params->setTopScene(scene);
   params->setCurrentScene(scene);
   // creating the view part of the group
-  GroupItem *group = new GroupItem(NULL,refBlock,this,params);
+  GroupItem *group = new GroupItem(NULL,topBlock,this,params);
 
 
   // adding the fake interface to the top group item
@@ -1073,10 +1092,12 @@ void Dispatcher::connectInterToGroup(InterfaceItem *item){
   // creating/adding the group interface in the graph model
   GroupInterface *groupInter = new GroupInterface(parentBlock,refInter->getName()+"_group",refInter->getDirection(),refInter->getPurpose());  
   parentItem->getRefBlock()->addInterface(groupInter);
-  // creating/adding the group control interface in the graph model
-  GroupInterface *groupCtlInter = new GroupInterface(parentBlock,refInter->getName()+"_group_enb",refInter->getDirection(),AbstractInterface::Control);
-  groupCtlInter->setAssociatedIface(groupInter);
-  parentItem->getRefBlock()->addInterface(groupCtlInter);  
+  // creating/adding the group control interface in the graph model if the purpose is data
+  if (refInter->getPurpose() == AbstractInterface::Data) {
+    GroupInterface *groupCtlInter = new GroupInterface(parentBlock,refInter->getName()+"_group_enb",refInter->getDirection(),AbstractInterface::Control);
+    groupCtlInter->setAssociatedIface(groupInter);
+    parentItem->getRefBlock()->addInterface(groupCtlInter);
+  }
   // creating/adding the group interface in the current scene model, and connection item
   InterfaceItem *groupIfaceItem = new InterfaceItem(0,item->getOrientation(),groupInter,parentItem,params);
   parentItem->addInterfaceItem(groupIfaceItem,true);
@@ -1216,8 +1237,9 @@ void Dispatcher::findGraphModifications(FunctionalBlock *block) {
     QList<int>* delay = iterD.value();
     if (delay->at(0) > 0) {
       // create delay and associate it to the connected input
-      AbstractInputModifier* mod = new DelayInputModifier(delay->at(0));
-      ConnectedInterface* toIface = AI_TO_CON(iterD.key()->getAssociatedIface());
+
+      ConnectedInterface* toIface = AI_TO_CON(iterD.key());
+      AbstractInputModifier* mod = new DelayInputModifier(toIface, delay->at(0));
       cout << "modify input of " << qPrintable(toIface->getName()) << endl;
       toIface->setInputModifier(mod);
       // repaint
index ae4cc640e93176a033b83a9140264bd556aced2b..538ee667d23cfcded6ff7b63e4fc55ef12bf0fdd 100644 (file)
@@ -119,7 +119,7 @@ public slots:
   void removeModifier(InterfaceItem* item);
 
   // connection ops
-  bool createConnection(InterfaceItem *iface1, InterfaceItem *iface2);    
+  bool createConnection(InterfaceItem *iface1, InterfaceItem *iface2, bool visible = true);
   void removeAllBlockConnections(AbstractBoxItem *item);
   void removeConnection(ConnectionItem *conn);
 
index 91f4e03798c1403f63cd0128258df45630c01f7a..b4947840a6b8b16a41ad03edd47586cbbbc1291a 100644 (file)
@@ -649,9 +649,7 @@ void FunctionalBlock::createInputPattern()  throw(Exception) {
     }\r
     // get the precursor output pattern\r
     QList<char>* out = connIface->getConnectedFrom()->getOutputPattern();\r
-\r
-    ConnectedInterface* assoIface = AI_TO_CON(connIface->getAssociatedIface());\r
-    AbstractInputModifier* modifier = assoIface->getInputModifier();\r
+    AbstractInputModifier* modifier = connIface->getInputModifier();\r
     // check if the input is modified\r
     if (modifier != NULL) {\r
 \r
@@ -815,12 +813,13 @@ void FunctionalBlock::computeOutputPattern(int nbExec) throw(Exception) {
 #ifdef DEBUG_FCTNAME\r
   cout << "call to " << qPrintable(fctName) << endl;\r
 #endif\r
-  \r
+\r
+  clearOutputPattern();\r
+\r
   /* case 1: the block is a generator for which output pattern\r
      must be computed for a nbExec following executions\r
   */\r
-  \r
-  \r
+\r
   if (nbExec > 0) {\r
     cout << "computing output pattern of " << qPrintable(name) << " for " << nbExec << " executions" << endl;\r
     foreach(AbstractInterface* iface, getControlOutputs()) {\r
@@ -1243,6 +1242,20 @@ void FunctionalBlock::clearInputPattern() {
   lengthIP = -1;\r
 }\r
 \r
+void FunctionalBlock::clearOutputPattern() {\r
+\r
+  QMapIterator<AbstractInterface*,QList<char>* > iterO(outputPattern);\r
+  while (iterO.hasNext()) {\r
+    iterO.next();\r
+    ConnectedInterface* connIface = AI_TO_CON(iterO.key());\r
+    connIface->resetOutputPattern();\r
+    QList<char>* pattern = iterO.value();\r
+    if (pattern != NULL) delete pattern;\r
+  }\r
+  outputPattern.clear();\r
+  lengthOP = -1;\r
+}\r
+\r
 void FunctionalBlock::clearAdmittanceDelays() {\r
   QMapIterator<AbstractInterface*, QList<int>* > iterA(admittanceDelays);\r
   while (iterA.hasNext()) {\r
index 404ce176b43e8e13ceb5564f236acf0c09f21cfb..c51ff77ef715f7c43b81e1e2a266cf4a251b7b8f 100644 (file)
@@ -74,6 +74,7 @@ private:
   void clearProductionPattern();\r
   void createInputPattern() throw(Exception);\r
   void clearInputPattern();\r
+  void clearOutputPattern();\r
   void clearAdmittanceDelays();\r
   int createTriggers(); // compute the clock cycle at which the block is triggered\r
   \r
index b515b543aae9f1e8643de694235d224e31163097..422cf97691442c25f63aeeb451ca91c5e9c4ede6 100644 (file)
@@ -2,6 +2,7 @@
 #include "BlockParameterGeneric.h"
 #include "AbstractInterface.h"
 #include "ConnectedInterface.h"
+#include "GroupInterface.h"
 #include "string.h"
 #include <sstream>
 
@@ -17,6 +18,12 @@ GroupBlock::GroupBlock(GroupBlock *_parent) throw(Exception) :  AbstractBlock()
   else {
     topGroup = true;
     name = QString("top_group");
+    // creating external clk/rst interfaces
+    GroupInterface* clk = new GroupInterface(this,"ext_clk", AbstractInterface::Input, AbstractInterface::Clock);
+    GroupInterface* rst = new GroupInterface(this,"ext_reset", AbstractInterface::Input, AbstractInterface::Reset);
+    addInterface(clk);
+    addInterface(rst);
+    // creating clkrstgen block : done in Dispatcher since this has no access to library
   }
   parent = _parent;
   if (parent != NULL) {
@@ -239,5 +246,154 @@ void GroupBlock::computeOutputPattern(int nbExec) throw(Exception) {
     }
     setPatternComputed(true);
   }
+}
+
+void GroupBlock::generateVHDL(const QString& path) throw(Exception) {
+
+  QString coreFile = "";
+
+  coreFile = path;
+  coreFile.append(normalizeName(name));
+  coreFile.append(".vhd");
+
+  QFile vhdlCore(coreFile);
+
+  if (!vhdlCore.open(QIODevice::WriteOnly)) {
+    throw(Exception(VHDLFILE_NOACCESS));
+  }
+
+  QTextStream outCore(&vhdlCore);
+
+  try {
+    generateComments(outCore);
+    generateLibraries(outCore);
+    generateEntity(outCore);
+    generateArchitecture(outCore);
+  }
+  catch(Exception err) {
+    throw(err);
+  }
+
+  vhdlCore.close();
+}
+
+
+void GroupBlock::generateComments(QTextStream& out) throw(Exception) {
+  out << " -- VHDL generated automatically for " << name << " --" << endl << endl;
+}
+
+void GroupBlock::generateLibraries(QTextStream& out) throw(Exception) {
+
+  out << "library IEEE;" << endl;
+  out << "use IEEE.STD_LOGIC_1164.all;" << endl;
+  out << "use IEEE.numeric_std.all;" << endl;
+
+}
+
+void GroupBlock::generateEntity(QTextStream& out) throw(Exception) {
+
+  int i;
+
+  out << "entity " << name << " is " << endl;
+
+  QList<BlockParameter*> listGenerics = getGenericParameters();
+  QList<AbstractInterface*> listInputs = getInputs();
+  QList<AbstractInterface*> listOutputs = getOutputs();
+  QList<AbstractInterface*> listBidirs = getBidirs();
+
+  if (!listGenerics.isEmpty()) {
+    out << "  generic (" << endl;
+    for(i=0;i<listGenerics.size()-1;i++) {
+      out << "    " << listGenerics.at(i)->toVHDL(BlockParameter::Entity, 0) << endl;
+    }
+    out << "    " << listGenerics.at(i)->toVHDL(BlockParameter::Entity,BlockParameter::NoComma) << endl;
+    out << "    );" << endl;
+  }
+
+  out << "  port (" << endl;
+
+  // Generation of the clk & rst signals
+  out << "    -- clk/rst" << endl;
+  foreach(AbstractInterface* iface, listInputs) {
+    if(iface->getPurpose() == AbstractInterface::Clock || iface->getPurpose() == AbstractInterface::Reset) {
+      out << "    " << iface->getName() << " : in std_logic;" << endl;
+    }
+  }
+
+  int count = 0;
+  foreach(AbstractInterface* iface, getInterfaces()) {
+    if((iface->getPurpose() == AbstractInterface::Data)||(iface->getPurpose() == AbstractInterface::Control)) count++;
+  }
+  // Generation of the data/control signals
+
+  int flag = 0;
+  bool first = true;
+
+  foreach(AbstractInterface* iface, listInputs) {
+    if(iface->getPurpose() == AbstractInterface::Data) {
+      if (first) {
+        out << "    -- input data ports" << endl;
+        first = false;
+      }
+      count--;
+      if (count == 0) flag = AbstractInterface::NoComma;
+      out << "    " << iface->toVHDL(AbstractInterface::Entity, flag) << endl;
+    }
+  }
+  first = true;
+  foreach(AbstractInterface* iface, listInputs) {
+    if(iface->getPurpose() == AbstractInterface::Control) {
+      if (first) {
+        out << "    -- input control ports" << endl;
+        first = false;
+      }
+      count--;
+      if (count == 0) flag = AbstractInterface::NoComma;
+      out << "    " << iface->toVHDL(AbstractInterface::Entity, flag) << endl;
+    }
+  }
+  first = true;
+  foreach(AbstractInterface* iface, listOutputs) {
+    if(iface->getPurpose() == AbstractInterface::Data) {
+      if (first) {
+        out << "    -- output data ports" << endl;
+        first = false;
+      }
+      count--;
+      if (count == 0) flag = AbstractInterface::NoComma;
+      out << "    " << iface->toVHDL(AbstractInterface::Entity, flag) << endl;
+    }
+  }
+  first = true;
+  foreach(AbstractInterface* iface, listOutputs) {
+    if(iface->getPurpose() == AbstractInterface::Control) {
+      if (first) {
+        out << "    -- output control ports" << endl;
+        first = false;
+      }
+      count--;
+      if (count == 0) flag = AbstractInterface::NoComma;
+      out << "    " << iface->toVHDL(AbstractInterface::Entity, flag) << endl;
+    }
+  }
+  first = true;
+  foreach(AbstractInterface* iface, listBidirs) {
+    if(iface->getPurpose() == AbstractInterface::Data) {
+      if (first) {
+        out << "    -- bidirs data ports" << endl;
+        first = false;
+      }
+      count--;
+      if (count == 0) flag = AbstractInterface::NoComma;
+      out << "    " << iface->toVHDL(AbstractInterface::Entity, flag) << endl;
+    }
+  }
+  out << "    );" << endl << endl;
+  out << "end " << name << ";" << endl << endl;
+
+}
+
+void GroupBlock::generateArchitecture(QTextStream& out) throw(Exception) {
 
 }
+
index f7a9c2c6bc2900dbb343d406faee080ad90c52df..0f0d206fa3d1c9716b94db94dd8049f01a6ca87a 100644 (file)
@@ -46,6 +46,8 @@ public:
   void computeOutputPattern(int nbExec = -1) throw(Exception);
   void computeAdmittanceDelays() throw(Exception);
   
+  void generateVHDL(const QString& path) throw(Exception); // main entry to generate the VHDL code
+
 private:    
   // patterns  
   /* NB: in opposition to FunctionalBlock, the input pattern and output pattern of a block
@@ -62,7 +64,11 @@ private:
    * found by taking the output pattern of the connectedFrom interface.
    */   
   void createInputPattern();
-  
+  void generateComments(QTextStream& out) throw(Exception);
+  void generateLibraries(QTextStream& out) throw(Exception);
+  void generateEntity(QTextStream& out) throw(Exception);
+  void generateArchitecture(QTextStream& out) throw(Exception);
+
   
   bool topGroup;  
   QList<AbstractBlock*> blocks; // contains instances of FunctionalBlock or GroupBlock that are children of this group
index 778a0b04a3a7614a8416508c30d6d10915686a62..2ceb21fdc2b63264b6c937cb65566bb149b5aabc 100644 (file)
@@ -166,10 +166,11 @@ void GroupScene::removeSourceItem(SourceItem* item) {
   sourceItems.removeAll(item);  
 }
 
-void GroupScene::createConnectionItem(InterfaceItem *iface1, InterfaceItem *iface2) {
+void GroupScene::createConnectionItem(InterfaceItem *iface1, InterfaceItem *iface2, bool visible) {
   ConnectionItem* conn = NULL;
   
   conn = new ConnectionItem(iface1,iface2, dispatcher, params);
+  conn->setVisible(visible);
   addItem(conn);  
   addConnectionItem(conn);
 }
index e32dd53509fde5a45c9e7be884e5b27cf5d57bdb..e2e47633ef8d842ea277df0fc2074426379d24a8 100644 (file)
@@ -79,7 +79,7 @@ public:
   void removeBoxItem(BoxItem* item);
   
   // ConnectionItem related
-  void createConnectionItem(InterfaceItem* iface1, InterfaceItem* iface2);
+  void createConnectionItem(InterfaceItem* iface1, InterfaceItem* iface2, bool visible = true);
   ConnectionItem* searchConnectionItem(InterfaceItem* iface1, InterfaceItem* iface2);
   void addConnectionItem(ConnectionItem* item);
   void removeConnectionItem(ConnectionItem* item);
index 443cee06e4f022bd4ce944e716acfe8284ffe1a3..18397f33cd0564239b9003e980bbec8d47630b22 100644 (file)
@@ -118,19 +118,22 @@ void InterfaceItem::paint(QPainter *painter) {
     }
 
     // draw arrows
-    if(refInter->getDirection() == AbstractInterface::Input) {
-      painter->drawPath(params->inArrow);
+    if ( (refInter->getPurpose() == AbstractInterface::Clock) || (refInter->getPurpose() == AbstractInterface::Reset)) {
+      painter->drawPath(params->clkrstArrow);
+    }
+    else if(refInter->getDirection() == AbstractInterface::Input) {
+      painter->drawPath(params->dataArrowIn);
     }
     else if(refInter->getDirection() == AbstractInterface::Output) {
-      painter->drawPath(params->outArrow);
+      painter->drawPath(params->dataArrowOut);
     } else if(refInter->getDirection() == AbstractInterface::InOut) {
-      painter->drawPath(params->inArrow);
-      painter->drawPath(params->outArrow);
+      painter->drawPath(params->dataArrowIn);
+      painter->drawPath(params->dataArrowOut);
     }
 
     // paint modifier box if needed
-
-    if (refInter->getInputModifier() != NULL) {
+    ConnectedInterface* connIface = AI_TO_CON(refInter->getAssociatedIface());
+    if ((connIface != NULL) && (connIface->getInputModifier() != NULL)) {
       painter->save();
       painter->translate(params->arrowWidth+params->arrowLineLength,0);
       painter->drawRect(0,-5,10,10);
index d3a8dd4f7c669328a4ec87fad7fb880680d77872..c60a927cf26715e20991f9d3559bc2c29a7c83f8 100644 (file)
@@ -81,7 +81,15 @@ ReferenceBlock* Parameters::getReferenceBlock(int idCategory, int idBlock) {
   BlockCategory* blockCat = categoryTree->searchCategory(idCategory);\r
 \r
   if (blockCat == NULL) return NULL;\r
-  ReferenceBlock* ref = blockCat->getBlock(idBlock);\r
+  ReferenceBlock* ref = blockCat->getBlockById(idBlock);\r
+  return ref;\r
+}\r
+\r
+ReferenceBlock* Parameters::getHiddenReferenceBlock(QString blockName) {\r
+\r
+  BlockCategory* blockCat = categoryTree->searchCategory(100);\r
+  if (blockCat == NULL) return NULL;\r
+  ReferenceBlock* ref = blockCat->getBlockByName(blockName);\r
   return ref;\r
 }\r
 \r
@@ -237,6 +245,16 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
   GroupBlock *groupBlock = NULL;\r
 \r
   GroupWidget* topGroup = NULL;\r
+\r
+  QString path = root.attribute("project_path","none");\r
+  if (path != "none") {\r
+    QDir dir(path);\r
+    if (dir.exists()) {\r
+      projectPath = path;\r
+\r
+    }\r
+    cout << "project path set to " << qPrintable(projectPath) << endl;\r
+  }\r
   /**********************************************************\r
    1 : getting scene and creating associated group widgets\r
   ***********************************************************/\r
@@ -457,23 +475,25 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
     QString paramsStr = currentModifierNode.attribute("params","none");\r
     if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));\r
 \r
-    AbstractInputModifier* mod = NULL;\r
-    if (typeStr == "delay") {\r
-      int delay = paramsStr.toInt(&ok);\r
-      if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));\r
-      mod = new DelayInputModifier(delay);\r
-    }\r
-\r
     /* NB: just adding delays for now. To be cont'd */\r
     InterfaceItem *iface = searchInterfaceItemById(id,topScene);\r
 \r
-    if(iface != NULL ) {\r
-      iface->refInter->setInputModifier(mod);\r
+    if ((iface == NULL ) || (iface->refInter == NULL) || (iface->refInter->getAssociatedIface() == NULL)) {\r
+      cout << "modified interface not found, modifiers setup canceled!" << endl;\r
+    }\r
+    else {\r
+      ConnectedInterface* connIface = AI_TO_CON(iface->refInter->getAssociatedIface());\r
 \r
-    } else {\r
-      cout << "interfaces not found, modifiers setup canceled!" << endl;\r
+      AbstractInputModifier* mod = NULL;\r
+      if (typeStr == "delay") {\r
+        int delay = paramsStr.toInt(&ok);\r
+        if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));\r
+        mod = new DelayInputModifier(connIface, delay);\r
+        connIface->setInputModifier(mod);\r
+      }\r
     }\r
   }\r
+\r
   cout << "modifiers loaded and created succefully!" << endl;\r
 \r
   return topGroup;\r
@@ -1092,8 +1112,13 @@ void Parameters::setArrowPathes() {
   _inArrow.lineTo(arrowLineLength+arrowWidth,-arrowHeight/2);\r
   _inArrow.lineTo(arrowLineLength+arrowWidth,arrowHeight/2);\r
   _inArrow.lineTo(arrowLineLength,0);\r
-  _inArrow.closeSubpath();\r
-  inArrow = _inArrow;\r
+  //_inArrow.closeSubpath();\r
+  dataArrowIn = _inArrow;\r
+\r
+  QPainterPath _inArrowC;\r
+  _inArrowC.lineTo(arrowLineLength,0);\r
+  _inArrowC.addEllipse(arrowLineLength,-arrowHeight/2,arrowHeight-1,arrowHeight-1);\r
+  clkrstArrow = _inArrowC;\r
 \r
   QPainterPath _outArrow;\r
   _outArrow.lineTo(arrowLineLength,0);\r
@@ -1101,8 +1126,8 @@ void Parameters::setArrowPathes() {
   _outArrow.lineTo(arrowLineLength+arrowWidth,0);\r
   _outArrow.lineTo(arrowLineLength,arrowHeight/2);\r
   _outArrow.lineTo(arrowLineLength,0);\r
-  _outArrow.closeSubpath();\r
-  outArrow = _outArrow;\r
+  //_outArrow.closeSubpath();\r
+  dataArrowOut = _outArrow;\r
 \r
 }\r
 \r
index 8a71cfbbae2b96c60600443ab2e37062223383c3..ccd24ff92b35fc1196cb6f3d7d55159741bd9e11 100644 (file)
@@ -110,8 +110,10 @@ public :
   QString defaultIfaceFontName;\r
   int defaultIfaceFontSize;\r
   int connGapLength;\r
-  QPainterPath inArrow;\r
-  QPainterPath outArrow;\r
+  QPainterPath dataArrowIn;\r
+  QPainterPath dataArrowOut;\r
+  QPainterPath clkrstArrow;\r
+\r
 \r
   /***************************************************\r
    attributes that are specific for the current project\r
@@ -128,6 +130,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
+  ReferenceBlock* getHiddenReferenceBlock(QString blockName); // get a hidden block by name, i.e. in category 100\r
   FunctionalBlock* duplicateFunctionalBlock(FunctionalBlock* block); // adding a copy of a functional block to current group\r
 \r
 \r
index 91a1bca71ba296bde394a49d0d161c60ae64e541..709b7cad22280c10e7bbba2c2e80263aa9a22821 100755 (executable)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.2.0, 2018-01-15T00:01:27. -->
+<!-- Written by QtCreator 4.2.0, 2018-01-24T13:25:48. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
index 6776fc1fd61d6de7b79c9a8890f1e9a1f295b705..50d2d0c589e10eb37028d6ebab0e7fbceca4f9a1 100644 (file)
@@ -387,8 +387,6 @@ end process final_div_process;
 
 @{pix_out} &lt;= std_logic_vector(mult_result(24 downto 17));
 @{pix_out_enb} &lt;= do_out;
-
-end rtl;
 </architecture>
   <patterns>
     <delta value="$img_width*$img_height"/>
index 2f6167a6ee22c11b8590e5b1bdfa62bb7a196199..a9d780df628d087b790eac69f2f7641d47808e9b 100644 (file)
@@ -55,8 +55,6 @@ end if;
 end if;
 
 end process check_process;
-
-end rtl;
 </architecture>
   <patterns>
     <delta value="1"/>
diff --git a/lib/implementations/clkrstgen_impl.xml b/lib/implementations/clkrstgen_impl.xml
new file mode 100644 (file)
index 0000000..7e9d15a
--- /dev/null
@@ -0,0 +1,36 @@
+<!DOCTYPE checker>
+<block_impl ref_name="clkrstgen.xml" ref_md5="">
+  <comments>
+    <author lastname="Domas" mail="sdomas@univ-fcomte.fr" firstname="Stephane"/>
+    <date creation="2018-01-10"/>
+    <related_files list=""/>
+    <description>implementation of cljrstgen that does the connection between
+    external and internal clock and reset</description>    
+    <notes>none</notes>
+  </comments>
+  <libraries>
+    <library name="ieee">
+      <package name="std_logic_1164" use="all"/>
+      <package name="numeric_std" use="all"/>
+    </library>
+  </libraries>
+  <architecture>
+signal dly       : std_logic := '0';
+signal rst       : std_logic := '0';
+
+begin
+
+  process(ext_clk)
+  begin
+    if(rising_edge(ext_clk)) then
+      dly &lt;= (not(ext_reset) and dly and not(rst))
+             or (not(ext_reset) and not(dly) and rst);
+
+      rst &lt;= (not(ext_reset) and not(dly) and not(rst));
+    end if;
+  end process;
+
+  clk   &lt;= ext_clk;
+  reset &lt;= rst xor invert_reset;
+</architecture>
+</block_impl>
index 83971efa6ae7d89afc81e52a48e792c278305815..9b484701911f07d82000a74348849c3d67868a00 100644 (file)
@@ -64,8 +64,6 @@ end process deser_process;
 @{data1_out_enb} &lt;= do_out;
 @{data2_out_enb} &lt;= do_out;
 @{data3_out_enb} &lt;= do_out;
-
-end rtl;
 </architecture>
   <patterns>
     <delta value="3"/>
index 4c1682a3c986cd5ebd474039dbd230bbed4f6f3d..c49e68f25fa1ac28c28ef0fdce6e97d230d2c9c1 100644 (file)
Binary files a/lib/implementations/impls.bmf and b/lib/implementations/impls.bmf differ
index 71aedf6ba60b8f4f764c18c4caf1c1299a500599..8d6e479f45849b25e50e227e79641780890b2b94 100644 (file)
@@ -37,8 +37,6 @@ end if;
 end if;
 
 end process and_process;
-
-end rtl;
 </architecture>
   <patterns>
     <delta value="1"/>
index 4032757bbc72cc1f5c0615fa738f4959734d6261..26e171aa1617aa923ccc4611e6d14ad8200a924f 100644 (file)
@@ -72,8 +72,6 @@ end process mult_process;
 
 @{gs_out} &lt;= std_logic_vector(result(dsp_in_width+7 downto dsp_in_width));
 @{gs_out_enb} &lt;= do_out;
-
-end rtl;
 </architecture>
   <patterns>
     <delta value="3"/>
index 3db4b59982937de98dc43deaf691c33e378bcdeb..e186114e0ab6008e76f6880177b1c1dab1cef349 100644 (file)
@@ -304,8 +304,6 @@ std_logic_vector(cb_dly1(7 downto 0)) when do_out_cb = '1' else
 std_logic_vector(cr(7 downto 0)) when do_out_cr = '1' else
 (others => '0');
 @{ycbcr_out_enb} &lt;= do_out_y or do_out_cb or do_out_cr;
-
-end rtl;
 </architecture>
   <patterns>
     <delta value="3"/>
index a136203f07cc6299e9ccb3320f2c85a96e799854..e41744601b2aadcf5ea564ac53da0ccb601c796f 100644 (file)
@@ -43,8 +43,6 @@ end if;
 end if;
 end if;
 end process threshold_process;
-
-end rtl;
 </architecture>
   <patterns>
     <delta value="1"/>
index 60a381d21d9a0faee8439de524b25477a792450b..8c770f8933aea8e4e3cf6f52b18b354bad9d5744 100644 (file)
@@ -2,9 +2,9 @@
 <block>
   <informations>
     <name>
-      wishbone master for apf27
+      clkrstgen
     </name>
-    <category ids="5" />  
+    <category ids="100" />  
     <description>
       <brief>
        This block is the wishbone master of the design, connected to the i.MX of APF27
diff --git a/lib/references/clkrstgen.xml b/lib/references/clkrstgen.xml
new file mode 100644 (file)
index 0000000..79b60a9
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<block>
+  <informations>
+    <name>
+      clkrstgen
+    </name>
+    <category ids="100" />  
+    <description>
+      <brief>
+       This block generate a reset signal synchronous to clock
+      </brief>
+      <detailed>
+       This block generate a reset signal synchronous to clock and is the entry point
+       of the external clock and asynchronous reset.
+      </detailed>     
+    </description>    
+  </informations>
+
+  <parameters>
+    <parameter value="0" type="boolean" context="generic" name="invert_reset"/>
+  </parameters>
+
+  <interfaces>
+    <inputs>
+      <input name="ext_clk" type="boolean" width="1" purpose="clock" />
+      <input name="ext_reset" type="boolean" width="1" purpose="reset" />
+    </inputs>
+    <outputs>
+      <output name="clk" type="boolean" width="1" purpose="clock" />
+      <output name="reset" type="boolean" width="1" purpose="reset" />
+    </outputs>
+  </interfaces>
+  
+</block>
index b01fb7cf634c0b6999096c5e7cca2b7b5eb1c33a..201d7b69b499f838524ce159af8a32fc6e05fbb6 100644 (file)
Binary files a/lib/references/references.bmf and b/lib/references/references.bmf differ
index de6ec42d1ef7bbee7fb0e4797518169e118eff8a..02ba8fd19a8475b24844559e5d0dd0ddd8105322 100644 (file)
   <xs:attribute name="ref_md5" type="xs:string"/>
   <xs:attribute name="context" type="xs:string"/>
   <xs:attribute name="type" type="xs:string"/>
-  <xs:attribute name="params" type="xs:string"/>  
+  <xs:attribute name="params" type="xs:string"/>
+  <xs:attribute name="project_path" type="xs:string"/>  
 
 
   <!-- déclaration des groupes d'éléments -->
   <xs:element name="blast_project">
     <xs:complexType>
       <xs:group ref="rootElmtGroup"/>
+      <xs:attribute ref="project_path" />
     </xs:complexType>
   </xs:element>
 
diff --git a/threshold_extctl.vhd b/threshold_extctl.vhd
deleted file mode 100644 (file)
index 90daeae..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
--------------------------------------------------------------------------------
---
---  File          : threshold _extctl.vhd
---  Related files : 
---
---  Author(s)     : stephane Domas (sdomas@univ-fcomte.fr)
---
---  Creation Date : 2017/10/16
---
---  Description   : This IP does a threshold based on a external signal
---  
---
---  Note          : input data is kept as is depending on the fact that
---                  the keep_in signal is asserted to 1 or not. It it is not,
---                  then input is replaced by the default_value given as a
---                  generic. Note that keep_in_enb and data_in_enb must be
---                  asserted to 1 at the same time so that the block gives an output
---
--------------------------------------------------------------------------------
-
-library IEEE;
-use IEEE.std_logic_1164.all;
-use IEEE.numeric_std.all;
-
-entity threshold_extctl is
-  generic(
-    in_width      : natural := 8;
-    default_value : natural := 0
-    );
-  port(
-    clk          : in  std_logic;
-    reset        : in  std_logic;
-    data_in      : in  std_logic_vector(in_width-1 downto 0);
-    data_in_enb  : in  std_logic;
-    keep_in      : in  std_logic;
-    keep_in_enb  : in  std_logic;
-    data_out     : out std_logic_vector(in_width-1 downto 0);
-    data_out_enb : out std_logic
-
-    );
-end threshold_extctl;
-
-
-architecture rtl of threshold_extctl is
-
-  -- Signals
-  signal def_val : unsigned(in_width-1 downto 0);
-
-begin
-
-  def_val <= to_unsigned(default_value, in_width);
-
-  threshold_process : process (clk, reset)
-  begin
-    if reset = '1' then
-
-      data_out_enb <= '0';
-      data_out     <= (others => '0');
-
-    elsif rising_edge(clk) then
-
-      data_out_enb <= '0';
-
-      if data_in_enb = '1' and keep_in_enb = '1' then
-
-        if keep_in = '1' then
-          data_out <= data_in;
-        else
-          data_out <= std_logic_vector(def_val);
-        end if;
-        data_out_enb <= '1';
-      end if;
-    end if;
-  end process threshold_process;
-
-end rtl;
-