X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/8fb3c55ee009a11db5e1c08a4cfb286979412745..60c13e8b4c7ea3d595969c1e7c0a28b068a17ca6:/Parameters.cpp?ds=inline diff --git a/Parameters.cpp b/Parameters.cpp index 98ea7eb..1195f51 100644 --- a/Parameters.cpp +++ b/Parameters.cpp @@ -95,6 +95,72 @@ ReferenceBlock* Parameters::getHiddenReferenceBlock(QString blockName) { return ref; } +double Parameters::getFeedingClockFrequency(AbstractInterface *iface) { + + int idClock = 0; + + if (iface->isReferenceInterface()) return 0.0; + + if (iface->getClockIfaceType() == AbstractInterface::ParameterName) { + BlockParameter* param = iface->getOwner()->getParameterFromName(iface->getClockIfaceString()); + if (!param->isUserParameter()) return 0.0; + bool ok; + double freq = param->getDoubleValue(&ok); + if (!ok) { + cerr << "Abnormal case: cannot retrieve clock id from parameter " << qPrintable(param->getName()) << endl; + } + return freq; + } + else if ( (iface->getClockIfaceType() == AbstractInterface::ClockName) || ((iface->getDirection() == AbstractInterface::Input) && (iface->getPurpose() == AbstractInterface::Clock))) { + + // if iface is not clock, retrieve the clock related to it + if (iface->getClockIfaceType() == AbstractInterface::ClockName) { + iface = iface->getClockIface(); + } + // if iface is a group interface, then iface name is ext_clk_X, thus extract the X + if (iface->isGroupInterface()) { + QString name = iface->getName(); + name.remove(0,8); + bool ok; + idClock = name.toInt(&ok); + if (!ok) { + cerr << "Abnormal case: cannot retrieve clock id from iface name " << qPrintable(iface->getName()) << endl; + return 0.0; + } + } + // if iface is a functional interface, it is connected to clkrstgen_X (in top group) or to ext_clk_X (in subgroup) + else if (iface->isFunctionalInterface()) { + FunctionalInterface* funIface = AI_TO_FUN(iface); + ConnectedInterface* connFrom = funIface->getConnectedFrom(); + if (connFrom == NULL) { + cerr << "Abnormal case: input clock " << qPrintable(iface->getName()) << " is not connected" << endl; + return 0.0; + } + if (iface->getOwner()->isTopGroupBlock()) { + QString name = connFrom->getOwner()->getName(); + name.remove(0,10); + bool ok; + idClock = name.toInt(&ok); + if (!ok) { + cerr << "Abnormal case: cannot retrieve clock id for " << qPrintable(iface->getName()) << endl; + return 0.0; + } + } + else { + QString name = connFrom->getName(); + name.remove(0,8); + bool ok; + idClock = name.toInt(&ok); + if (!ok) { + cerr << "Abnormal case: cannot retrieve clock id for " << qPrintable(iface->getName()) << endl; + return 0.0; + } + } + } + } + return clocks.at(idClock); +} + void Parameters::createDelayBlock() { delayRef = new ReferenceBlock("no.xml"); delayRef->addCategory(100);