X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/561d4f45e60504cc9e041370dd908b002fe776a5..819b9aaf8a357efbf4d095ef9268cbcbb46c52e9:/ReferenceBlock.cpp diff --git a/ReferenceBlock.cpp b/ReferenceBlock.cpp index a0a8220..05fd29a 100644 --- a/ReferenceBlock.cpp +++ b/ReferenceBlock.cpp @@ -169,11 +169,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); @@ -219,6 +224,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()+"_ctl"; + inter = new ReferenceInterface(this,nameStr,"boolean","1",AbstractInterface::Input, AbstractInterface::Control, 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()+"_ctl"; + inter = new ReferenceInterface(this,nameStr,"boolean","1",AbstractInterface::Output, AbstractInterface::Control, 1); + if (!inter->setAssociatedIface(dataIface)) { + throw (Exception(BLOCKFILE_CORRUPTED)); + } + cout << "created a control output named " << qPrintable(inter->getName()) << endl; + outputs.append(inter); + } QDomElement eltBidirs = eltInputs.nextSiblingElement("bidirs"); QDomNodeList listNodeBidirs = eltBidirs.elementsByTagName("bidir"); @@ -263,7 +300,7 @@ 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"); + purposeStr = eltBidir.attribute("purpose","none"); purpose = ReferenceInterface::translatePurpose(purposeStr); multStr = eltBidir.attribute("multiplicity","none"); mult = ReferenceInterface::translateMultiplicity(multStr); @@ -278,17 +315,21 @@ void ReferenceBlock::createInterfaceForParameters() throw(Exception){ foreach(BlockParameter* param, params) { if (param->isWishboneParameter()) { - BlockParameterWishbone* p = (BlockParameterWishbone*)param; - int orientation = -1; + + 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(),p->getType(),p->getWidth(), AbstractInterface::Output, AbstractInterface::Wishbone,1); + iface = new ReferenceInterface(this,p->getName(),p->getTypeString(),p->getWidth(), AbstractInterface::Output, AbstractInterface::Wishbone,1); outputs.append(iface); } else if (p->getWBAccess() == BlockParameter::Write) { - iface = new ReferenceInterface(this,p->getName(),p->getType(),p->getWidth(), AbstractInterface::Input, AbstractInterface::Wishbone,1); + iface = new ReferenceInterface(this,p->getName(),p->getTypeString(),p->getWidth(), AbstractInterface::Input, AbstractInterface::Wishbone,1); inputs.append(iface); } - ReferenceInterface* iface = new ReferenceInterface(this,p->getName(),p->getType(),p->getWidth(), orientation, AbstractInterface::Wishbone,1); + else { + throw (Exception(BLOCKFILE_CORRUPTED)); + } } } } @@ -337,22 +378,50 @@ 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->getMultiplicity(); + if (iface->getPurpose() == AbstractInterface::Control) { + toWrite << iface->getName(); + 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->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->getMultiplicity(); + if (iface->getPurpose() == AbstractInterface::Control) { + toWrite << iface->getName(); + 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->getWidth(); + toWrite << iface->getPurpose(); + toWrite << iface->getDirection(); + toWrite << iface->getMultiplicity(); + } } toWrite << b.bidirs.size(); for(int i=0; i>(QDataStream &in, ReferenceBlock &b) { in >> txt; iface->setWidth(txt); in >> val; - iface->setPurpose(val); + iface->setPurpose(val); in >> val; iface->setDirection(val); in >> val; iface->setMultiplicity(val); b.inputs.append(iface); + if (iface->getPurpose() == AbstractInterface::Data) { + QString ctlRefName = iface->getName()+"_ctl"; + 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(); @@ -452,12 +530,21 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) { in >> txt; iface->setWidth(txt); in >> val; - iface->setPurpose(val); + iface->setPurpose(val); in >> val; iface->setDirection(val); in >> val; iface->setMultiplicity(val); b.outputs.append(iface); + if (iface->getPurpose() == AbstractInterface::Data) { + QString ctlRefName = iface->getName()+"_ctl"; + 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();