X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/6e2b3026c6a496e81642c373796bd39dad33d2a6..8f0bedf735fe2b306c11c3f4a168245a05e37ccd:/GroupBlock.cpp diff --git a/GroupBlock.cpp b/GroupBlock.cpp index 9a8bb0f..66268b9 100644 --- a/GroupBlock.cpp +++ b/GroupBlock.cpp @@ -21,8 +21,17 @@ GroupBlock::GroupBlock(GroupBlock *_parent) throw(Exception) : AbstractBlock() // creating clk/rst interfaces clk = new GroupInterface(this,"clk", AbstractInterface::Input, AbstractInterface::Clock); rst = new GroupInterface(this,"reset", AbstractInterface::Input, AbstractInterface::Reset); - addInterface(clk); - addInterface(rst); + addInterface(clk); + addInterface(rst); + + try { + connectClkReset(); + } + catch(Exception e) { + AbstractBlock* source = (AbstractBlock *)(e.getSource()); + cerr << qPrintable(source->getName()) << ":" << qPrintable(e.getMessage()) << endl; + throw(e); + } } else { topGroup = true; @@ -436,33 +445,133 @@ void GroupBlock::generateArchitecture(QTextStream& out, QDomElement &elt) throw( out << " SIGNALS" << endl; out << " ----------------------------" << endl << endl; - out << " -- signals from input ports of " << name << endl; - QList listInputs = getInputs(); - foreach(AbstractInterface* iface, listInputs) { + + foreach(AbstractBlock* block, blocks) { + try { + out << " -- signals from output ports of " << block->getName() << endl; + QList listOutputs = block->getOutputs(); + foreach(AbstractInterface* iface, listOutputs) { + if ((iface->getPurpose() == AbstractInterface::Data)||(iface->getPurpose() == AbstractInterface::Control)) { + out << " signal " << iface->toVHDL(AbstractInterface::Signal,0) << endl; + } + else if (block->getName() == "clkrstgen") { + if ((iface->getPurpose() == AbstractInterface::Clock)||(iface->getPurpose() == AbstractInterface::Reset)) { + out << " signal " << iface->toVHDL(AbstractInterface::Signal,0) << endl; + } + } + } + } + catch(Exception e) { + throw(e); + } + out << endl; + } + foreach(AbstractBlock* block, blocks) { + try { + out << " -- signals for modified input ports of " << block->getName() << endl; + QList listInputs = block->getInputs(); + foreach(AbstractInterface* iface, listInputs) { + if (iface->getPurpose() == AbstractInterface::Control) { + ConnectedInterface* connCtlIface = AI_TO_CON(iface); + AbstractInputModifier* modifier = connCtlIface->getInputModifier(); + if (modifier != NULL) { + out << modifier->toVHDL(AbstractInputModifier::Signal,0) << endl; + } + } + } + } + catch(Exception e) { + throw(e); + } + out << endl; + } + + out << "begin" << endl; + + // generate signals that goes to the output ports + + out << " -- connections to output ports of " << name << endl; + QList listOutputs = getOutputs(); + foreach(AbstractInterface* iface, listOutputs) { if ((iface->getPurpose() == AbstractInterface::Data)||(iface->getPurpose() == AbstractInterface::Control)) { ConnectedInterface* connIface = AI_TO_CON(iface); - QString prefixName = name+"_"+iface->getName()+"_TO_"; - foreach(ConnectedInterface* toIface, connIface->getConnectedTo()) { - QString sigName = prefixName+toIface->getOwner()->getName()+"_"+toIface->getName(); - out << " signal " << sigName << " : " << iface->toVHDL(AbstractInterface::Signal,0) << endl; - } + ConnectedInterface* fromIface = connIface->getConnectedFrom(); + out << " " << connIface->getName() << " <= " << fromIface->toVHDL(AbstractInterface::Instance,0) << ";" << endl; } } + out << endl; + + + + // generate instances foreach(AbstractBlock* block, blocks) { try { - out << " -- signals from output ports of " << block->getName() << endl; + out << " " << block->getName() << "_1 : " << block->getName() << endl; + + QList listGenerics = block->getGenericParameters(); + QList listInputs = block->getInputs(); QList listOutputs = block->getOutputs(); - foreach(AbstractInterface* iface, listOutputs) { - if ((iface->getPurpose() == AbstractInterface::Data)||(iface->getPurpose() == AbstractInterface::Control)) { - ConnectedInterface* connIface = AI_TO_CON(iface); - QString prefixName = block->getName()+"_"+iface->getName()+"_TO_"; - foreach(ConnectedInterface* toIface, connIface->getConnectedTo()) { - QString sigName = prefixName+toIface->getOwner()->getName()+"_"+toIface->getName(); - out << " signal " << sigName << " : " << iface->toVHDL(AbstractInterface::Signal,0) << endl; + QList listBidirs = block->getBidirs(); + + if (!listGenerics.isEmpty()) { + out << " generic map (" << endl; + for(i=0;itoVHDL(BlockParameter::Instance, BlockParameter::NoComma) << "," << endl; + } + out << " " << listGenerics.at(i)->toVHDL(BlockParameter::Instance,BlockParameter::NoComma) << endl; + out << " )" << endl; + } + + out << " port map (" << endl; + QString portMap = ""; + + for(i=0;igetConnectedFrom(); + + if (fromIface->isFunctionalInterface()) { + portMap += " " + connIface->getName() + " => "; + bool hasMod = false; + if (connIface->getPurpose() == AbstractInterface::Data) { + ConnectedInterface* connCtlIface = AI_TO_CON(connIface->getAssociatedIface()); + if ((connCtlIface != NULL) && (connCtlIface->getInputModifier() != NULL)) { + hasMod = true; + } + } + else if (connIface->getPurpose() == AbstractInterface::Control) { + if (connIface->getInputModifier() != NULL) { + hasMod = true; + } } + if (hasMod) { + portMap += connIface->getOwner()->getName()+"_"+connIface->getName()+"_mod,\n"; + } + else { + portMap += fromIface->toVHDL(AbstractInterface::Instance, AbstractInterface::NoComma) + ",\n"; + } + } + else if (fromIface->isGroupInterface()) { + portMap += " " + connIface->getName() + " => " + fromIface->getName() + ",\n"; + } + } + if (listOutputs.size()>0) { + for(i=0;igetName() + " => " + connIface->toVHDL(AbstractInterface::Instance, AbstractInterface::NoComma) + ",\n"; + } + } + if (listBidirs.size()>0) { + for(i=0;igetName() + " => " + connIface->toVHDL(AbstractInterface::Instance, AbstractInterface::NoComma) + ",\n"; } } + portMap.chop(2); + out << portMap << endl; + + + out << " );" << endl; } catch(Exception e) { throw(e); @@ -470,6 +579,26 @@ void GroupBlock::generateArchitecture(QTextStream& out, QDomElement &elt) throw( out << endl; } + // generate input modifiers + foreach(AbstractBlock* block, blocks) { + + foreach(AbstractInterface* iface, block->getControlInputs()) { + ConnectedInterface* connIface = AI_TO_CON(iface); + // check if it is connected + if (connIface->getConnectedFrom() == NULL) { + throw(Exception(IFACE_NOT_CONNECTED,this)); + } + AbstractInputModifier* modifier = connIface->getInputModifier(); + if (modifier != NULL) { + try { + out << modifier->toVHDL(AbstractInputModifier::Architecture,0) << endl; + } + catch(Exception e) { + throw(e); + } + } + } + } out << "end architecture rtl;" << endl; }