X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/3bcfe4df6fdde086eb1b59f7a0173358170174a1..HEAD:/ReferenceBlock.cpp?ds=inline diff --git a/ReferenceBlock.cpp b/ReferenceBlock.cpp index b6dee80..56a34db 100644 --- a/ReferenceBlock.cpp +++ b/ReferenceBlock.cpp @@ -8,8 +8,8 @@ #include "BlockParameterWishbone.h" #include "Parameters.h" -ReferenceBlock::ReferenceBlock(const QString _xmlFile) : AbstractBlock() { - xmlFile = _xmlFile; +ReferenceBlock::ReferenceBlock(const QString _xmlFile) : AbstractBlock(NULL) { + xmlFile = _xmlFile; } void ReferenceBlock::addCategory(int id) { @@ -40,6 +40,16 @@ void ReferenceBlock::setHashMd5() { void ReferenceBlock::load(QDomElement &elt) throw(Exception) { + cout << "Block : get version" << endl; + QString verStr = elt.attribute("version","none"); + QString specialStr = elt.attribute("special","none"); + if (verStr != "none") { + setVersion(verStr); + } + else { + setVersion("0.0"); + } + setSpecialType(getSpecialTypeFromString(specialStr)); cout << "Block : get informations" << endl; QDomElement eltInfo = elt.firstChildElement("informations"); @@ -70,7 +80,7 @@ void ReferenceBlock::load(QDomElement &elt) throw(Exception) { // create interfaces that correspond to a wishbone parameter, if any. try { - createInterfaceForParameters(); + createInterfaceForWishbone(); } catch(int err) { throw(err); @@ -210,7 +220,7 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) { int purpose; QString multStr; int mult; - AbstractInterface* inter; + ReferenceInterface* iface; if ((elt.isNull()) || (elt.tagName() != "interfaces")) throw (Exception(BLOCKFILE_CORRUPTED)); @@ -226,9 +236,12 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) { purposeStr = eltInput.attribute("purpose","none"); if (purposeStr == "clock") { nameStr = eltInput.attribute("name","none"); - inter = new ReferenceInterface(this,nameStr,AbstractInterface::Input, AbstractInterface::Clock, "boolean", "1", AbstractInterface::LittleEndian, 1); - inputs.append(inter); - clocks.append(inter); + iface = new ReferenceInterface(this,nameStr,AbstractInterface::Input, AbstractInterface::Clock, "boolean", "1", AbstractInterface::LittleEndian, 1); + if (! iface->checkSetClockIface(nameStr)) { + throw (Exception(BLOCKFILE_CORRUPTED)); + } + inputs.append(iface); + clocks.append(iface); } } cout << "number of clocks: " << clocks.size() << endl; @@ -260,15 +273,19 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) { multStr = eltInput.attribute("multiplicity","none"); mult = ReferenceInterface::translateMultiplicity(multStr); - inter = new ReferenceInterface(this,nameStr, AbstractInterface::Input, purpose, typeStr, widthStr, endianess, mult); + iface = 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 !) + if (clocks.size() > 1) { + // if several clocks, the associated one MUST be given + throw (Exception(BLOCKFILE_CORRUPTED)); + } + // no clock given, take the single one clockStr = clocks.at(0)->getName(); } - if (! inter->setClockIface(clockStr)) { + if (! iface->checkSetClockIface(clockStr)) { throw (Exception(BLOCKFILE_CORRUPTED)); } - inputs.append(inter); + inputs.append(iface); } } // getting each control @@ -279,13 +296,17 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) { nameStr = eltInput.attribute("iface","none"); AbstractInterface* dataIface = getIfaceFromName(nameStr); if (dataIface == NULL) throw (Exception(BLOCKFILE_CORRUPTED)); - nameStr = dataIface->getName()+"_enb"; - inter = new ReferenceInterface(this,nameStr,AbstractInterface::Input, AbstractInterface::Control,"boolean","1", AbstractInterface::LittleEndian, 1); - if (!inter->setAssociatedIface(dataIface)) { + QString nameEnbStr = dataIface->getName()+"_enb"; + iface = new ReferenceInterface(this,nameEnbStr,AbstractInterface::Input, AbstractInterface::Control,"boolean","1", AbstractInterface::LittleEndian, 1); + if (!iface->setAssociatedIface(dataIface)) { throw (Exception(BLOCKFILE_CORRUPTED)); } - cout << "created a control input named " << qPrintable(inter->getName()) << endl; - inputs.append(inter); + clockStr = dataIface->getClockIfaceString(); + if (! iface->checkSetClockIface(clockStr)) { + throw (Exception(BLOCKFILE_CORRUPTED)); + } + cout << "created a control input named " << qPrintable(iface->getName()) << endl; + inputs.append(iface); } QDomElement eltOutputs = eltInputs.nextSiblingElement("outputs"); QDomNodeList listNodeOutputs = eltOutputs.elementsByTagName("output"); @@ -313,15 +334,20 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) { multStr = eltOutput.attribute("multiplicity","none"); mult = ReferenceInterface::translateMultiplicity(multStr); - inter = new ReferenceInterface(this,nameStr,AbstractInterface::Output, purpose,typeStr,widthStr, endianess, mult); + iface = new ReferenceInterface(this,nameStr,AbstractInterface::Output, purpose,typeStr,widthStr, endianess, mult); if (clockStr == "none") { - // no clock given, take the first one (hope that there is a single one !) + if (clocks.size() > 1) { + // if several clocks, the associated one MUST be given + throw (Exception(BLOCKFILE_CORRUPTED)); + } + // no clock given, take the single one clockStr = clocks.at(0)->getName(); } - if (! inter->setClockIface(clockStr)) { + if (! iface->checkSetClockIface(clockStr)) { throw (Exception(BLOCKFILE_CORRUPTED)); } - outputs.append(inter); + + outputs.append(iface); } // getting each control QDomNodeList listNodeOutCtl = eltOutputs.elementsByTagName("control"); @@ -332,12 +358,16 @@ 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,AbstractInterface::Output, AbstractInterface::Control,"boolean","1",AbstractInterface::LittleEndian, 1); - if (!inter->setAssociatedIface(dataIface)) { + iface = new ReferenceInterface(this,nameStr,AbstractInterface::Output, AbstractInterface::Control,"boolean","1",AbstractInterface::LittleEndian, 1); + if (!iface->setAssociatedIface(dataIface)) { throw (Exception(BLOCKFILE_CORRUPTED)); } - cout << "created a control output named " << qPrintable(inter->getName()) << endl; - outputs.append(inter); + clockStr = dataIface->getClockIfaceString(); + if (! iface->checkSetClockIface(clockStr)) { + throw (Exception(BLOCKFILE_CORRUPTED)); + } + cout << "created a control output named " << qPrintable(iface->getName()) << endl; + outputs.append(iface); } QDomElement eltBidirs = eltInputs.nextSiblingElement("bidirs"); @@ -365,19 +395,24 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) { multStr = eltBidir.attribute("multiplicity","none"); mult = ReferenceInterface::translateMultiplicity(multStr); - inter = new ReferenceInterface(this,nameStr,AbstractInterface::InOut, purpose,typeStr,widthStr, endianess, mult); + iface = 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 !) + if (clocks.size() > 1) { + // if several clocks, the associated one MUST be given + throw (Exception(BLOCKFILE_CORRUPTED)); + } + // no clock given, take the single one clockStr = clocks.at(0)->getName(); } - if (! inter->setClockIface(clockStr)) { + if (! iface->checkSetClockIface(clockStr)) { throw (Exception(BLOCKFILE_CORRUPTED)); } - bidirs.append(inter); + + bidirs.append(iface); } } -void ReferenceBlock::createInterfaceForParameters() throw(Exception){ +void ReferenceBlock::createInterfaceForWishbone() throw(Exception){ ReferenceInterface* iface = NULL; foreach(BlockParameter* param, params) { @@ -419,6 +454,8 @@ QDataStream& operator<<(QDataStream &out, const ReferenceBlock &b) { toWrite << b.name; toWrite << b.xmlFile; + toWrite << b.specialType; + toWrite << b.version; toWrite << b.description; toWrite << b.categories; toWrite << b.hashMd5; @@ -472,7 +509,7 @@ QDataStream& operator<<(QDataStream &out, const ReferenceBlock &b) { toWrite << iface->getClockIfaceString(); } } - // secondly, write other ifaces + // thirdly, write other ifaces for(int i=0; igetPurpose() != AbstractInterface::Control) && (iface->getPurpose() != AbstractInterface::Clock)) { @@ -547,6 +584,8 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) { in >> b.name; in >> b.xmlFile; + in >> b.specialType; + in >> b.version; in >> b.description; in >> b.categories; in >> b.hashMd5; @@ -610,13 +649,8 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) { 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; - } - + iface->setClockIfaceName(clk); + iface->setClockIfaceType(clkType); b.inputs.append(iface); if (iface->getPurpose() == AbstractInterface::Data) { QString ctlRefName = iface->getName()+"_enb"; @@ -650,12 +684,8 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) { 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; - } + iface->setClockIfaceName(clk); + iface->setClockIfaceType(clkType); b.outputs.append(iface); if (iface->getPurpose() == AbstractInterface::Data) { QString ctlRefName = iface->getName()+"_enb"; @@ -689,12 +719,8 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) { 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; - } + iface->setClockIfaceName(clk); + iface->setClockIfaceType(clkType); b.bidirs.append(iface); } @@ -745,3 +771,4 @@ QList ReferenceBlock::getExternalResources() { return list; } +