X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/df84660fd98b39737692d57b68c8b2c2d34af0f1..4cf57e6db08da791233d75237f62e74bc88dd427:/AbstractInterface.cpp diff --git a/AbstractInterface.cpp b/AbstractInterface.cpp index 76654ff..c03cba9 100644 --- a/AbstractInterface.cpp +++ b/AbstractInterface.cpp @@ -209,15 +209,21 @@ int AbstractInterface::typeFromString(const QString &_type) { QString AbstractInterface::toVHDL(int context, int flags) throw(Exception) { + if (isReferenceInterface()) throw(Exception(IFACE_INVALID_TYPE)); QString msb = width; QString ret=""; bool ok; + cout << "iface " << qPrintable(name) << " must be evaluated to vhdl :" << qPrintable(msb) << " with type = " << qPrintable(getTypeString()) << endl; + if ((context == BlockParameter::Entity) || (context == BlockParameter::Component)) { QString formatBool = "%1 : %2 std_logic"; - QString formatVector = "%1 : %2 std_logic_vector(%3 downto %4)"; + QString formatVector = ""; + if (endianess == LittleEndian) formatVector = "%1 : %2 std_logic_vector(%3 downto %4)"; + else formatVector = "%1 : %2 std_logic_vector(%4 to %3)"; + if ((flags & BlockParameter::NoComma) == 0) { formatBool.append(";"); formatVector.append(";"); @@ -233,7 +239,7 @@ QString AbstractInterface::toVHDL(int context, int flags) throw(Exception) { orientation = "inout"; } if (type == Boolean) { - ret = formatVector.arg(name).arg(orientation); + ret = formatBool.arg(name).arg(orientation); } else if (type == Natural) { int w = width.toInt(&ok); @@ -246,6 +252,8 @@ QString AbstractInterface::toVHDL(int context, int flags) throw(Exception) { } } else if (type == Expression) { + + /* must check the following conditions : - if it contains user/port parameters : must evaluate their numeric value - if it contains generic parameters : just remove the $ -> the expression is not arithmetically evaluated. @@ -255,7 +263,7 @@ QString AbstractInterface::toVHDL(int context, int flags) throw(Exception) { QList listPorts = owner->getPortParameters(); foreach(BlockParameter* p, listUsers) { QString var = "$"; - var.append(p->getName()); + var += p->getName(); if (width.contains(var)) { int w = p->getValue().toInt(&ok); if (!ok) throw(Exception(INVALID_VALUE)); @@ -264,18 +272,21 @@ QString AbstractInterface::toVHDL(int context, int flags) throw(Exception) { } foreach(BlockParameter* p, listPorts) { QString var = "$"; - var.append(p->getName()); + var += p->getName(); + if (width.contains(var)) { + msb.replace(var,p->toVHDL(0,0)); + } + } + foreach(BlockParameter* p, listGenerics) { + QString var = "$"; + var += p->getName(); if (width.contains(var)) { - BlockParameterPort* pp = (BlockParameterPort*)p; - AbstractInterface* iface = owner->getIfaceFromName(pp->getIfaceName()); - - int w = p->getValue().toInt(&ok); - if (!ok) throw(Exception(INVALID_VALUE)); - msb.replace(var,p->getValue().toString()); + msb.replace(var,p->getName()); } } - - ret = formatVector.arg(name).arg(orientation).arg("toto").arg("0"); + msb += "-1"; + cout << "iface size :" << qPrintable(msb) << endl; + ret = formatVector.arg(name).arg(orientation).arg(msb).arg("0"); } } return ret;