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;i<listNodeInputs.size();i++) {
QDomNode node = listNodeInputs.at(i);
inter = new ReferenceInterface(this,nameStr,typeStr,widthStr,AbstractInterface::Input, purpose, mult);
inputs.append(inter);
}
-
+ // getting each control
+ QDomNodeList listNodeInCtl = eltInputs.elementsByTagName("control");
+ for(int i=0;i<listNodeInCtl.size();i++) {
+ QDomNode node = listNodeInCtl.at(i);
+ QDomElement eltInput = node.toElement();
+ nameStr = eltInput.attribute("iface","none");
+ AbstractInterface* dataIface = getIfaceFromName(nameStr);
+ if (dataIface == NULL) throw (Exception(BLOCKFILE_CORRUPTED));
+ nameStr = dataIface->getName()+"_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;i<listNodeOutputs.size();i++) {
inter = new ReferenceInterface(this,nameStr,typeStr,widthStr,AbstractInterface::Output, purpose, mult);
outputs.append(inter);
}
+ // getting each control
+ QDomNodeList listNodeOutCtl = eltOutputs.elementsByTagName("control");
+ for(int i=0;i<listNodeOutCtl.size();i++) {
+ QDomNode node = listNodeOutCtl.at(i);
+ QDomElement eltOutput = node.toElement();
+ nameStr = eltOutput.attribute("iface","none");
+ AbstractInterface* dataIface = getIfaceFromName(nameStr);
+ if (dataIface == NULL) throw (Exception(BLOCKFILE_CORRUPTED));
+ nameStr = dataIface->getName()+"_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");
}
toWrite << b.inputs.size();
+ // firstly write control ifaces
for(int i=0; i<b.inputs.size(); i++){
ReferenceInterface *iface = (ReferenceInterface *)(b.inputs.at(i));
- toWrite << iface->getName();
- 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; i<b.inputs.size(); i++){
+ ReferenceInterface *iface = (ReferenceInterface *)(b.inputs.at(i));
+ if (iface->getPurpose() != 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; i<b.outputs.size(); i++){
ReferenceInterface *iface = (ReferenceInterface *)(b.outputs.at(i));
- toWrite << iface->getName();
- 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; i<b.outputs.size(); i++){
+ ReferenceInterface *iface = (ReferenceInterface *)(b.outputs.at(i));
+ if (iface->getPurpose() != 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<b.bidirs.size(); i++){
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();
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();