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

Private GIT Repository
moved clocks list to graph
[blast.git] / Parameters.cpp
index 98ea7ebc0d626c016f99bfeb9b6146fa66e940e7..d7621d232a1afa54f59d2a4078eeba3bac0f521b 100644 (file)
@@ -52,6 +52,8 @@ Parameters::Parameters() {
   projectPath = "";\r
   projectName = "";\r
   projectFile = "";\r
   projectPath = "";\r
   projectName = "";\r
   projectFile = "";\r
+\r
+  graph = new Graph();\r
 }\r
 \r
 Parameters::~Parameters() {\r
 }\r
 \r
 Parameters::~Parameters() {\r
@@ -69,8 +71,8 @@ void Parameters::clear() {
   refPathes.clear();\r
 }\r
 \r
   refPathes.clear();\r
 }\r
 \r
-Graph* Parameters::createGraph(bool createTopGroupIfaces) {\r
-  graph = new Graph(createTopGroupIfaces);\r
+Graph* Parameters::initGraph(bool createTopGroupIfaces) {\r
+  graph->createTopGroup(createTopGroupIfaces);\r
   return graph;\r
 }\r
 \r
   return graph;\r
 }\r
 \r
@@ -95,6 +97,72 @@ 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
   delayRef->addCategory(100);\r
 void Parameters::createDelayBlock() {\r
   delayRef = new ReferenceBlock("no.xml");\r
   delayRef->addCategory(100);\r
@@ -280,6 +348,11 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
     else {\r
       cout << "trying to create scene n°" << idScene << " with upper scene n°" <<idUpperScene << endl;\r
       GroupScene* upperScene = searchSceneById(idUpperScene, topScene);\r
     else {\r
       cout << "trying to create scene n°" << idScene << " with upper scene n°" <<idUpperScene << endl;\r
       GroupScene* upperScene = searchSceneById(idUpperScene, topScene);\r
+      /* IMPORTANT: calling addNewEmptyGroup() leads to create a new GroupWidget\r
+       *            AND a BoxItem in upperScene that represents the GroupItem in the\r
+       *            newly created child scene. Thus, it has not to be created when\r
+       *            reading bi_group tags in the following but just searched\r
+       */\r
       groupWidget = dispatcher->addNewEmptyGroup(Dispatcher::Load, upperScene,false);\r
       groupWidget->getScene()->setId(idScene);\r
       groupItem = groupWidget->getScene()->getGroupItem();      \r
       groupWidget = dispatcher->addNewEmptyGroup(Dispatcher::Load, upperScene,false);\r
       groupWidget->getScene()->setId(idScene);\r
       groupItem = groupWidget->getScene()->getGroupItem();      \r