X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/5d4e709cb8d460b2efc083e6e7999f1c3a0eb602..e40a5399ec7887c2606f18575c809b0d05b09278:/ReferenceBlock.cpp?ds=inline diff --git a/ReferenceBlock.cpp b/ReferenceBlock.cpp index 12db4b4..c2d9bff 100644 --- a/ReferenceBlock.cpp +++ b/ReferenceBlock.cpp @@ -6,6 +6,7 @@ #include "BlockParameterGeneric.h" #include "BlockParameterPort.h" #include "BlockParameterWishbone.h" +#include "Parameters.h" ReferenceBlock::ReferenceBlock(const QString _xmlFile) : AbstractBlock() { xmlFile = _xmlFile; @@ -94,7 +95,7 @@ void ReferenceBlock::loadInformations(QDomElement &elt) throw(Exception) { } else { QDomText txtName = nodeNameTxt.toText(); - name = txtName.data().trimmed(); + name = Parameters::normalizeName(txtName.data().trimmed()); cout<< "block name : " << qPrintable(name) << endl; } @@ -104,11 +105,16 @@ void ReferenceBlock::loadInformations(QDomElement &elt) throw(Exception) { QString idsStr = eltCat.attribute("ids","none"); if (idsStr == "none") throw (Exception(BLOCKFILE_CORRUPTED)); - QStringList listCat = idsStr.split(","); - foreach(QString str, listCat) - { - int idCat = str.toInt(&ok); - categories.append(idCat); + if (idsStr.isEmpty()) { + categories.append(99); + } + else { + QStringList listCat = idsStr.split(","); + foreach(QString str, listCat) + { + int idCat = str.toInt(&ok); + categories.append(idCat); + } } // getting description @@ -215,7 +221,9 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) { QString nameStr; QString typeStr; QString widthStr; + QString endianStr; QString purposeStr; + QString clockStr; int purpose; QString multStr; int mult; @@ -226,22 +234,59 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) { QDomElement eltInputs = elt.firstChildElement("inputs"); // getting each input QDomNodeList listNodeInputs = eltInputs.elementsByTagName("input"); + + // find all input clocks + QList clocks; + for(int i=0;igetName().toStdString() << endl; - cout << "purpose for " << nameStr.toStdString() << " : " << purposeStr.toStdString() << endl; purpose = ReferenceInterface::translatePurpose(purposeStr); - cout << "translated purpose : " << purpose << endl; - multStr = eltInput.attribute("multiplicity","none"); - mult = ReferenceInterface::translateMultiplicity(multStr); + if (purpose != AbstractInterface::Clock) { + cout << "translated purpose : " << purpose << endl; + nameStr = eltInput.attribute("name","none"); + typeStr = eltInput.attribute("type","none"); + widthStr = eltInput.attribute("width","none"); + endianStr = eltInput.attribute("endian","none"); + clockStr = eltInput.attribute("clock","none"); + int endianess; + if ((endianStr == "none") || (endianStr == "little")) { + endianess = AbstractInterface::LittleEndian; + } + else if (endianStr == "big") { + endianess = AbstractInterface::BigEndian; + } + else { + throw (Exception(BLOCKFILE_CORRUPTED)); + } - inter = new ReferenceInterface(this,nameStr,typeStr,widthStr,AbstractInterface::Input, purpose, mult); - inputs.append(inter); + multStr = eltInput.attribute("multiplicity","none"); + mult = ReferenceInterface::translateMultiplicity(multStr); + + inter = new ReferenceInterface(this,nameStr, AbstractInterface::Input, purpose, typeStr, widthStr, endianess, mult); + if (clockStr == "none") { + // no clock given, take the first one (hope that there is a single one !) + clockStr = clocks.at(0)->getName(); + } + if (! inter->setClockIface(clockStr)) { + throw (Exception(BLOCKFILE_CORRUPTED)); + } + inputs.append(inter); + } } // getting each control QDomNodeList listNodeInCtl = eltInputs.elementsByTagName("control"); @@ -252,7 +297,7 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) { AbstractInterface* dataIface = getIfaceFromName(nameStr); if (dataIface == NULL) throw (Exception(BLOCKFILE_CORRUPTED)); nameStr = dataIface->getName()+"_enb"; - inter = new ReferenceInterface(this,nameStr,"boolean","1",AbstractInterface::Input, AbstractInterface::Control, 1); + inter = new ReferenceInterface(this,nameStr,AbstractInterface::Input, AbstractInterface::Control,"boolean","1", AbstractInterface::LittleEndian, 1); if (!inter->setAssociatedIface(dataIface)) { throw (Exception(BLOCKFILE_CORRUPTED)); } @@ -264,15 +309,35 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) { for(int i=0;igetName(); + } + if (! inter->setClockIface(clockStr)) { + throw (Exception(BLOCKFILE_CORRUPTED)); + } outputs.append(inter); } // getting each control @@ -284,7 +349,7 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) { AbstractInterface* dataIface = getIfaceFromName(nameStr); if (dataIface == NULL) throw (Exception(BLOCKFILE_CORRUPTED)); nameStr = dataIface->getName()+"_enb"; - inter = new ReferenceInterface(this,nameStr,"boolean","1",AbstractInterface::Output, AbstractInterface::Control, 1); + inter = new ReferenceInterface(this,nameStr,AbstractInterface::Output, AbstractInterface::Control,"boolean","1",AbstractInterface::LittleEndian, 1); if (!inter->setAssociatedIface(dataIface)) { throw (Exception(BLOCKFILE_CORRUPTED)); } @@ -300,12 +365,31 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) { nameStr = eltBidir.attribute("name","none"); typeStr = eltBidir.attribute("type","none"); widthStr = eltBidir.attribute("width","none"); + endianStr = eltBidir.attribute("endian","none"); + clockStr = eltBidir.attribute("clock","none"); + int endianess; + if ((endianStr == "none") || (endianStr == "little")) { + endianess = AbstractInterface::LittleEndian; + } + else if (endianStr == "big") { + endianess = AbstractInterface::BigEndian; + } + else { + throw (Exception(BLOCKFILE_CORRUPTED)); + } purposeStr = eltBidir.attribute("purpose","none"); purpose = ReferenceInterface::translatePurpose(purposeStr); multStr = eltBidir.attribute("multiplicity","none"); mult = ReferenceInterface::translateMultiplicity(multStr); - inter = new ReferenceInterface(this,nameStr,typeStr,widthStr,AbstractInterface::InOut, purpose, mult); + inter = new ReferenceInterface(this,nameStr,AbstractInterface::InOut, purpose,typeStr,widthStr, endianess, mult); + if (clockStr == "none") { + // no clock given, take the first one (hope that there is a single one !) + clockStr = clocks.at(0)->getName(); + } + if (! inter->setClockIface(clockStr)) { + throw (Exception(BLOCKFILE_CORRUPTED)); + } bidirs.append(inter); } } @@ -320,11 +404,11 @@ void ReferenceBlock::createInterfaceForParameters() throw(Exception){ cout << "creating interface for parameter wb " << qPrintable(p->getName()) << endl; if (p->getWBAccess() == BlockParameter::Read) { - iface = new ReferenceInterface(this,p->getName(),p->getTypeString(),p->getWidth(), AbstractInterface::Output, AbstractInterface::Wishbone,1); + iface = new ReferenceInterface(this,p->getName(), AbstractInterface::Output, AbstractInterface::Wishbone, p->getTypeString(),p->getWidth(), AbstractInterface::LittleEndian, 1); outputs.append(iface); } else if (p->getWBAccess() == BlockParameter::Write) { - iface = new ReferenceInterface(this,p->getName(),p->getTypeString(),p->getWidth(), AbstractInterface::Input, AbstractInterface::Wishbone,1); + iface = new ReferenceInterface(this,p->getName(), AbstractInterface::Input, AbstractInterface::Wishbone,p->getTypeString(),p->getWidth(),AbstractInterface::LittleEndian,1); inputs.append(iface); } else { @@ -378,26 +462,46 @@ QDataStream& operator<<(QDataStream &out, const ReferenceBlock &b) { } toWrite << b.inputs.size(); - // firstly write control ifaces + // firstly write clock ifaces + for(int i=0; igetPurpose() == AbstractInterface::Clock) { + toWrite << iface->getName(); + toWrite << iface->getType(); + toWrite << iface->getWidthString(); + toWrite << iface->getPurpose(); + toWrite << iface->getDirection(); + toWrite << iface->getMultiplicity(); + toWrite << iface->getClockIfaceType(); + toWrite << iface->getClockIfaceString(); + } + } + // secondly write control ifaces for(int i=0; igetPurpose() == AbstractInterface::Control) { toWrite << iface->getName(); - toWrite << iface->getWidth(); + toWrite << iface->getType(); + toWrite << iface->getWidthString(); toWrite << iface->getPurpose(); toWrite << iface->getDirection(); toWrite << iface->getMultiplicity(); + toWrite << iface->getClockIfaceType(); + toWrite << iface->getClockIfaceString(); } } // secondly, write other ifaces for(int i=0; igetPurpose() != AbstractInterface::Control) { + if ((iface->getPurpose() != AbstractInterface::Control) && (iface->getPurpose() != AbstractInterface::Clock)) { toWrite << iface->getName(); - toWrite << iface->getWidth(); + toWrite << iface->getType(); + toWrite << iface->getWidthString(); toWrite << iface->getPurpose(); toWrite << iface->getDirection(); toWrite << iface->getMultiplicity(); + toWrite << iface->getClockIfaceType(); + toWrite << iface->getClockIfaceString(); } } toWrite << b.outputs.size(); @@ -406,10 +510,13 @@ QDataStream& operator<<(QDataStream &out, const ReferenceBlock &b) { ReferenceInterface *iface = (ReferenceInterface *)(b.outputs.at(i)); if (iface->getPurpose() == AbstractInterface::Control) { toWrite << iface->getName(); - toWrite << iface->getWidth(); + toWrite << iface->getType(); + toWrite << iface->getWidthString(); toWrite << iface->getPurpose(); toWrite << iface->getDirection(); toWrite << iface->getMultiplicity(); + toWrite << iface->getClockIfaceType(); + toWrite << iface->getClockIfaceString(); } } // secondly, write other ifaces @@ -417,20 +524,26 @@ QDataStream& operator<<(QDataStream &out, const ReferenceBlock &b) { ReferenceInterface *iface = (ReferenceInterface *)(b.outputs.at(i)); if (iface->getPurpose() != AbstractInterface::Control) { toWrite << iface->getName(); - toWrite << iface->getWidth(); + toWrite << iface->getType(); + toWrite << iface->getWidthString(); toWrite << iface->getPurpose(); toWrite << iface->getDirection(); toWrite << iface->getMultiplicity(); + toWrite << iface->getClockIfaceType(); + toWrite << iface->getClockIfaceString(); } } toWrite << b.bidirs.size(); for(int i=0; igetName(); - toWrite << iface->getWidth(); + toWrite << iface->getType(); + toWrite << iface->getWidthString(); toWrite << iface->getPurpose(); toWrite << iface->getDirection(); toWrite << iface->getMultiplicity(); + toWrite << iface->getClockIfaceType(); + toWrite << iface->getClockIfaceString(); } out << blockData; @@ -501,6 +614,9 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) { iface = new ReferenceInterface(&b); in >> txt; iface->setName(txt); + int type; + in >> type; + iface->setType(type); in >> txt; iface->setWidth(txt); in >> val; @@ -509,13 +625,24 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) { iface->setDirection(val); in >> val; iface->setMultiplicity(val); + int clkType; + QString clk; + in >> clkType; + in >> clk; + if (clkType == AbstractInterface::ParameterName) { + clk = "$"+clk; + } + if (! iface->setClockIface(clk)) { + cerr << "Abnormal case while reading a reference block in library: cannot set ref clock for an interface" << endl; + } + b.inputs.append(iface); if (iface->getPurpose() == AbstractInterface::Data) { QString ctlRefName = iface->getName()+"_enb"; ReferenceInterface* ctlRefIface = AI_TO_REF(b.getIfaceFromName(ctlRefName)); if (ctlRefIface != NULL) { if (! ctlRefIface->setAssociatedIface(iface)) { - cerr << "Abnormal case while reading a reference block in library" << endl; + cerr << "Abnormal case while reading a reference block in library: cannot set associated control interface for data interface" << endl; } } } @@ -527,6 +654,9 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) { iface = new ReferenceInterface(&b); in >> txt; iface->setName(txt); + int type; + in >> type; + iface->setType(type); in >> txt; iface->setWidth(txt); in >> val; @@ -535,6 +665,16 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) { iface->setDirection(val); in >> val; iface->setMultiplicity(val); + int clkType; + QString clk; + in >> clkType; + in >> clk; + if (clkType == AbstractInterface::ParameterName) { + clk = "$"+clk; + } + if (! iface->setClockIface(clk)) { + cerr << "Abnormal case while reading a reference block in library: cannot set ref clock for an interface" << endl; + } b.outputs.append(iface); if (iface->getPurpose() == AbstractInterface::Data) { QString ctlRefName = iface->getName()+"_enb"; @@ -553,6 +693,9 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) { iface = new ReferenceInterface(&b); in >> txt; iface->setName(txt); + int type; + in >> type; + iface->setType(type); in >> txt; iface->setWidth(txt); in >> val; @@ -561,13 +704,63 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) { iface->setDirection(val); in >> val; iface->setMultiplicity(val); + int clkType; + QString clk; + in >> clkType; + in >> clk; + if (clkType == AbstractInterface::ParameterName) { + clk = "$"+clk; + } + if (! iface->setClockIface(clk)) { + cerr << "Abnormal case while reading a reference block in library: cannot set ref clock for an interface" << endl; + } b.bidirs.append(iface); } return in; } -bool ReferenceBlock::computeOutputPattern(int nbExec) { +void ReferenceBlock::checkInputPatternCompatibility() throw(Exception){ + throw(Exception(INVALID_REFBLOCK_USE)); +} + +void ReferenceBlock::computeOutputPattern(int nbExec) throw(Exception) { // does strictly nothing - return false; + throw(Exception(INVALID_REFBLOCK_USE)); } + +void ReferenceBlock::computeAdmittanceDelays() throw(Exception) { + // does strictly nothing + throw(Exception(INVALID_REFBLOCK_USE)); +} + + +void ReferenceBlock::generateVHDL(const QString& path) throw(Exception){ + throw(Exception(INVALID_REFBLOCK_USE)); +} + +void ReferenceBlock::generateComments(QTextStream& out, QDomElement &elt, QString coreFile) throw(Exception) { + throw(Exception(INVALID_REFBLOCK_USE)); +} + +void ReferenceBlock::generateLibraries(QTextStream& out, QDomElement &elt) throw(Exception) { + throw(Exception(INVALID_REFBLOCK_USE)); +} + +void ReferenceBlock::generateArchitecture(QTextStream& out, QDomElement &elt ) throw(Exception) { + throw(Exception(INVALID_REFBLOCK_USE)); +} + +void ReferenceBlock::generateController(QTextStream& out) throw(Exception) { + throw(Exception(INVALID_REFBLOCK_USE)); +} + +void ReferenceBlock::generateEntityOrComponentBody(QTextStream &out, int indentLevel, bool hasController) throw(Exception) { + throw(Exception(INVALID_REFBLOCK_USE)); +} + +QList ReferenceBlock::getExternalResources() { + QList list; + return list; +} +