#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) {
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");
// create interfaces that correspond to a wishbone parameter, if any.
try {
- createInterfaceForParameters();
+ createInterfaceForWishbone();
}
catch(int err) {
throw(err);
int purpose;
QString multStr;
int mult;
- AbstractInterface* inter;
+ ReferenceInterface* iface;
if ((elt.isNull()) || (elt.tagName() != "interfaces")) 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);
+ 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;
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
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");
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");
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");
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) {
toWrite << b.name;
toWrite << b.xmlFile;
+ toWrite << b.specialType;
+ toWrite << b.version;
toWrite << b.description;
toWrite << b.categories;
toWrite << b.hashMd5;
toWrite << iface->getClockIfaceString();
}
}
- // secondly, write other ifaces
+ // thirdly, write other ifaces
for(int i=0; i<b.inputs.size(); i++){
ReferenceInterface *iface = (ReferenceInterface *)(b.inputs.at(i));
if ((iface->getPurpose() != AbstractInterface::Control) && (iface->getPurpose() != AbstractInterface::Clock)) {
in >> b.name;
in >> b.xmlFile;
+ in >> b.specialType;
+ in >> b.version;
in >> b.description;
in >> b.categories;
in >> b.hashMd5;
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";
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";
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);
}
return list;
}
+