X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/abbc64cf04a35ab3549d5c516f44c7c5921baa63..756baf5c8eaf003e8271dab9c395de2b0e704857:/ReferenceBlock.cpp diff --git a/ReferenceBlock.cpp b/ReferenceBlock.cpp index 8b50bfa..fbf7828 100644 --- a/ReferenceBlock.cpp +++ b/ReferenceBlock.cpp @@ -68,6 +68,14 @@ void ReferenceBlock::load(QDomElement &elt) throw(Exception) { try { loadInterfaces(eltInter); } + catch(int err) { + throw(err); + } + + // create interfaces that correspond to a wishbone parameter, if any. + try { + createInterfaceForParameters(); + } catch(int err) { throw(err); } @@ -96,11 +104,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 @@ -149,7 +162,7 @@ void ReferenceBlock::loadParameters(QDomElement &elt) throw(Exception) { valueStr = ""; } if (contextStr == "user") { - param = new BlockParameterUser(this,nameStr,valueStr); + param = new BlockParameterUser(this,nameStr,typeStr,valueStr); } else if (contextStr == "generic") { param = new BlockParameterGeneric(this,nameStr,typeStr,valueStr); @@ -161,11 +174,16 @@ void ReferenceBlock::loadParameters(QDomElement &elt) throw(Exception) { int duration = 0; QString wbValue = ""; QStringList listWb = wbStr.split(","); + cout << "wb param has:"; + foreach(QString s, listWb) { + cout << qPrintable(s) << " | "; + } + cout << endl; if (listWb.at(0) == "r") { access = BlockParameter::Read; } - else if (wbStr == "w") { + else if (listWb.at(0) == "w") { access = BlockParameter::Write; bool ok; wbValue = listWb.at(1).toInt(&ok); @@ -202,10 +220,9 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) { QString nameStr; QString typeStr; QString widthStr; + QString endianStr; QString purposeStr; int purpose; - QString levelStr; - int level; QString multStr; int mult; AbstractInterface* inter; @@ -213,6 +230,7 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) { if ((elt.isNull()) || (elt.tagName() != "interfaces")) throw (Exception(BLOCKFILE_CORRUPTED)); QDomElement eltInputs = elt.firstChildElement("inputs"); + // getting each input QDomNodeList listNodeInputs = eltInputs.elementsByTagName("input"); for(int i=0;igetName().toStdString() << endl; cout << "purpose for " << nameStr.toStdString() << " : " << purposeStr.toStdString() << endl; purpose = ReferenceInterface::translatePurpose(purposeStr); cout << "translated purpose : " << purpose << endl; - levelStr = eltInput.attribute("level","none"); - level = ReferenceInterface::translateLevel(levelStr); multStr = eltInput.attribute("multiplicity","none"); mult = ReferenceInterface::translateMultiplicity(multStr); - inter = new ReferenceInterface(this,nameStr,typeStr,widthStr,AbstractInterface::Input, purpose, level, mult); + inter = new ReferenceInterface(this,nameStr,AbstractInterface::Input, purpose, typeStr, widthStr, endianess, mult); + inputs.append(inter); + } + // getting each control + QDomNodeList listNodeInCtl = eltInputs.elementsByTagName("control"); + for(int i=0;igetName()+"_enb"; + inter = new ReferenceInterface(this,nameStr,AbstractInterface::Input, AbstractInterface::Control,"boolean","1", AbstractInterface::LittleEndian, 1); + if (!inter->setAssociatedIface(dataIface)) { + throw (Exception(BLOCKFILE_CORRUPTED)); + } + cout << "created a control input named " << qPrintable(inter->getName()) << endl; inputs.append(inter); } - QDomElement eltOutputs = eltInputs.nextSiblingElement("outputs"); QDomNodeList listNodeOutputs = eltOutputs.elementsByTagName("output"); for(int i=0;igetName()+"_enb"; + inter = new ReferenceInterface(this,nameStr,AbstractInterface::Output, AbstractInterface::Control,"boolean","1",AbstractInterface::LittleEndian, 1); + if (!inter->setAssociatedIface(dataIface)) { + throw (Exception(BLOCKFILE_CORRUPTED)); + } + cout << "created a control output named " << qPrintable(inter->getName()) << endl; outputs.append(inter); } @@ -261,20 +328,52 @@ void ReferenceBlock::loadInterfaces(QDomElement &elt) throw(Exception) { nameStr = eltBidir.attribute("name","none"); typeStr = eltBidir.attribute("type","none"); widthStr = eltBidir.attribute("width","none"); - purposeStr = eltBidir.attribute("type","none"); + endianStr = eltBidir.attribute("endian","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); - levelStr = eltBidir.attribute("level","none"); - level = ReferenceInterface::translateLevel(levelStr); multStr = eltBidir.attribute("multiplicity","none"); mult = ReferenceInterface::translateMultiplicity(multStr); - inter = new ReferenceInterface(this,nameStr,typeStr,widthStr,AbstractInterface::InOut, purpose, level, mult); + inter = new ReferenceInterface(this,nameStr,AbstractInterface::InOut, purpose,typeStr,widthStr, endianess, mult); bidirs.append(inter); } } -void ReferenceBlock::parametersValidation(QList *checkedBlocks, QList *blocksToConfigure) -{ +void ReferenceBlock::createInterfaceForParameters() throw(Exception){ + ReferenceInterface* iface = NULL; + foreach(BlockParameter* param, params) { + + if (param->isWishboneParameter()) { + + BlockParameterWishbone* p = (BlockParameterWishbone*)param; + cout << "creating interface for parameter wb " << qPrintable(p->getName()) << endl; + + if (p->getWBAccess() == BlockParameter::Read) { + 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(), AbstractInterface::Input, AbstractInterface::Wishbone,p->getTypeString(),p->getWidth(),AbstractInterface::LittleEndian,1); + inputs.append(iface); + } + else { + throw (Exception(BLOCKFILE_CORRUPTED)); + } + } + } +} + +void ReferenceBlock::parametersValidation(QList *checkedBlocks, QList *blocksToConfigure) { return; } @@ -318,33 +417,63 @@ QDataStream& operator<<(QDataStream &out, const ReferenceBlock &b) { } toWrite << b.inputs.size(); + // firstly write control ifaces for(int i=0; igetName(); - toWrite << iface->getWidth(); - toWrite << iface->getPurpose(); - toWrite << iface->getDirection(); - toWrite << iface->getLevel(); - toWrite << iface->getMultiplicity(); + if (iface->getPurpose() == AbstractInterface::Control) { + toWrite << iface->getName(); + toWrite << iface->getType(); + toWrite << iface->getWidth(); + toWrite << iface->getPurpose(); + toWrite << iface->getDirection(); + toWrite << iface->getMultiplicity(); + } + } + // secondly, write other ifaces + for(int i=0; igetPurpose() != AbstractInterface::Control) { + toWrite << iface->getName(); + toWrite << iface->getType(); + toWrite << iface->getWidth(); + toWrite << iface->getPurpose(); + toWrite << iface->getDirection(); + toWrite << iface->getMultiplicity(); + } } toWrite << b.outputs.size(); + // firstly write control ifaces for(int i=0; igetName(); - toWrite << iface->getWidth(); - toWrite << iface->getPurpose(); - toWrite << iface->getDirection(); - toWrite << iface->getLevel(); - toWrite << iface->getMultiplicity(); + if (iface->getPurpose() == AbstractInterface::Control) { + toWrite << iface->getName(); + toWrite << iface->getType(); + toWrite << iface->getWidth(); + toWrite << iface->getPurpose(); + toWrite << iface->getDirection(); + toWrite << iface->getMultiplicity(); + } + } + // secondly, write other ifaces + for(int i=0; igetPurpose() != AbstractInterface::Control) { + toWrite << iface->getName(); + toWrite << iface->getType(); + toWrite << iface->getWidth(); + toWrite << iface->getPurpose(); + toWrite << iface->getDirection(); + toWrite << iface->getMultiplicity(); + } } toWrite << b.bidirs.size(); for(int i=0; igetName(); + toWrite << iface->getType(); toWrite << iface->getWidth(); toWrite << iface->getPurpose(); - toWrite << iface->getDirection(); - toWrite << iface->getLevel(); + toWrite << iface->getDirection(); toWrite << iface->getMultiplicity(); } @@ -386,7 +515,7 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) { in >> valueStr; if (contextStr == "user") { - p = new BlockParameterUser(&b,nameStr,valueStr); + p = new BlockParameterUser(&b,nameStr,typeStr,valueStr); } else if (contextStr == "generic") { p = new BlockParameterGeneric(&b,nameStr,typeStr,valueStr); @@ -416,17 +545,27 @@ 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; - iface->setPurpose(val); + iface->setPurpose(val); in >> val; - iface->setDirection(val); - in >> val; - iface->setLevel(val); + iface->setDirection(val); in >> val; iface->setMultiplicity(val); 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; + } + } + } } b.outputs.clear(); @@ -435,17 +574,27 @@ 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; - iface->setPurpose(val); + iface->setPurpose(val); in >> val; iface->setDirection(val); - in >> val; - iface->setLevel(val); - in >> val; + in >> val; iface->setMultiplicity(val); b.outputs.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; + } + } + } } b.bidirs.clear(); @@ -454,18 +603,33 @@ 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; iface->setPurpose(val); in >> val; iface->setDirection(val); - in >> val; - iface->setLevel(val); - in >> val; + in >> val; iface->setMultiplicity(val); b.bidirs.append(iface); } return in; } + +void ReferenceBlock::checkInputPatternCompatibility() throw(Exception){ + throw(Exception(INVALID_REFBLOCK_USE)); +} + +void ReferenceBlock::computeOutputPattern(int nbExec) throw(Exception) { + // does strictly nothing + throw(Exception(INVALID_REFBLOCK_USE)); +} + +void ReferenceBlock::computeAdmittanceDelays() throw(Exception) { + // does strictly nothing + throw(Exception(INVALID_REFBLOCK_USE)); +}