QString widthStr;
QString endianStr;
QString purposeStr;
+ QString clockStr;
int purpose;
QString multStr;
int mult;
QDomElement eltInputs = elt.firstChildElement("inputs");
// getting each input
QDomNodeList listNodeInputs = eltInputs.elementsByTagName("input");
+
+ // find all input clocks
+ QList<AbstractInterface*> clocks;
for(int i=0;i<listNodeInputs.size();i++) {
QDomNode node = listNodeInputs.at(i);
QDomElement eltInput = node.toElement();
- nameStr = eltInput.attribute("name","none");
- typeStr = eltInput.attribute("type","none");
- widthStr = eltInput.attribute("width","none");
- endianStr = eltInput.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 = 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);
}
+ }
+ cout << "number of clocks: " << clocks.size() << endl;
+
+ // find inputs
+ for(int i=0;i<listNodeInputs.size();i++) {
+ QDomNode node = listNodeInputs.at(i);
+ QDomElement eltInput = node.toElement();
purposeStr = eltInput.attribute("purpose","none");
- cout << "block : " << this->getName().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,AbstractInterface::Input, purpose, typeStr, widthStr, endianess, 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");
for(int i=0;i<listNodeOutputs.size();i++) {
QDomNode node = listNodeOutputs.at(i);
QDomElement eltOutput = node.toElement();
+
nameStr = eltOutput.attribute("name","none");
typeStr = eltOutput.attribute("type","none");
widthStr = eltOutput.attribute("width","none");
endianStr = eltOutput.attribute("endian","none");
+ clockStr = eltOutput.attribute("clock","none");
int endianess;
if ((endianStr == "none") || (endianStr == "little")) {
endianess = AbstractInterface::LittleEndian;
mult = ReferenceInterface::translateMultiplicity(multStr);
inter = 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 !)
+ clockStr = clocks.at(0)->getName();
+ }
+ if (! inter->setClockIface(clockStr)) {
+ throw (Exception(BLOCKFILE_CORRUPTED));
+ }
outputs.append(inter);
}
// getting each control
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;
mult = ReferenceInterface::translateMultiplicity(multStr);
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);
}
}
}
toWrite << b.inputs.size();
- // firstly write control ifaces
+ // firstly write clock ifaces
+ for(int i=0; i<b.inputs.size(); i++){
+ ReferenceInterface *iface = (ReferenceInterface *)(b.inputs.at(i));
+ if (iface->getPurpose() == 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; i<b.inputs.size(); i++){
ReferenceInterface *iface = (ReferenceInterface *)(b.inputs.at(i));
if (iface->getPurpose() == AbstractInterface::Control) {
toWrite << iface->getPurpose();
toWrite << iface->getDirection();
toWrite << iface->getMultiplicity();
+ toWrite << iface->getClockIfaceType();
+ toWrite << iface->getClockIfaceString();
}
}
// 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) {
+ if ((iface->getPurpose() != AbstractInterface::Control) && (iface->getPurpose() != 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();
}
}
toWrite << b.outputs.size();
toWrite << iface->getPurpose();
toWrite << iface->getDirection();
toWrite << iface->getMultiplicity();
+ toWrite << iface->getClockIfaceType();
+ toWrite << iface->getClockIfaceString();
}
}
// secondly, write other ifaces
toWrite << iface->getPurpose();
toWrite << iface->getDirection();
toWrite << iface->getMultiplicity();
+ toWrite << iface->getClockIfaceType();
+ toWrite << iface->getClockIfaceString();
}
}
toWrite << b.bidirs.size();
toWrite << iface->getPurpose();
toWrite << iface->getDirection();
toWrite << iface->getMultiplicity();
+ toWrite << iface->getClockIfaceType();
+ toWrite << iface->getClockIfaceString();
}
out << blockData;
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;
}
}
}
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";
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);
}