1 /******************************************************************************
3 * Copyright (C) 1997-2012 by Dimitri van Heesch.
5 * Permission to use, copy, modify, and distribute this software and its
6 * documentation under the terms of the GNU General Public License is hereby
7 * granted. No representations are made about the suitability of this software
8 * for any purpose. It is provided "as is" without express or implied warranty.
9 * See the GNU General Public License for more details.
11 * Documents produced by Doxygen are derivative works derived from the
12 * input used in their production; they are not affected by this license.
15 /******************************************************************************
16 * Parser for VHDL subset
18 * supports VHDL-87/93/2002
19 * does not support VHDL-AMS
20 ******************************************************************************/
28 #include <qfileinfo.h>
29 #include <qstringlist.h>
30 #include "memberdef.h"
31 /* --------------------------------------------------------------- */
34 #include "vhdldocgen.h"
40 #include "commentscan.h"
42 #include "definition.h"
43 #include "searchindex.h"
44 #include "outputlist.h"
45 #include "parserintf.h"
46 #include "vhdlscanner.h"
48 #include "arguments.h"
51 #define theTranslator_vhdlType VhdlDocGen::trVhdlType
53 static QDict<QCString> g_vhdlKeyDict0(17,FALSE);
54 static QDict<QCString> g_vhdlKeyDict1(17,FALSE);
55 static QDict<QCString> g_vhdlKeyDict2(17,FALSE);
57 static QDict<QCString> g_xilinxUcfDict(17,FALSE);
59 static void initUCF(Entry* root,const char* type,QCString & qcs,int line,QCString & fileName,QCString & brief);
60 static void writeUCFLink(const MemberDef* mdef,OutputList &ol);
61 static void assignConfiguration(VhdlConfNode* ,QCString);
62 static void assignBinding(VhdlConfNode* conf,QCString label);
63 static void addInstance(ClassDef* entity, ClassDef* arch, ClassDef *inst,Entry *cur,ClassDef* archBind=NULL);
65 //---------- create svg -------------------------------------------------------------
66 static void createSVG();
67 static void startDot(FTextStream &t);
68 static void startTable(FTextStream &t,const QCString &className);
69 static QList<MemberDef>* getPorts(ClassDef *cd);
70 static void writeVhdlEntityToolTip(FTextStream& t,ClassDef *cd);
71 static void endDot(FTextStream &t);
72 static void writeTable(QList<MemberDef>* port,FTextStream & t);
73 static void endTabel(FTextStream &t);
74 static void writeClassToDot(FTextStream &t,ClassDef* cd);
75 static void writeVhdlDotLink(FTextStream &t,const QCString &a,const QCString &b,const QCString &style);
76 static void writeVhdlPortToolTip(FTextStream& t,QList<MemberDef>* port,ClassDef *cd);
82 //--------------------------------------------------------------------------------------------------
83 static void codify(FTextStream &t,const char *str)
95 case '<': t << "<";
97 case '>': t << ">";
99 case '&': t << "&";
101 case '\'': t << "'";
103 case '"': t << """;
112 static void createSVG()
114 QCString ov =Config_getString("HTML_OUTPUT");
115 QCString dir="-o \""+ov+"/vhdl_design_overview.html\"";
116 ov+="/vhdl_design.dot";
119 QCString vlargs="-Tsvg \""+ov+"\" "+dir ;
121 if (portable_system("dot",vlargs)!=0)
123 err("could not create dot file");
127 // Creates a svg image. All in/out/inout ports are shown with brief description and direction.
128 // Brief descriptions for entities are shown too.
129 void VhdlDocGen::writeOverview()
131 ClassSDict::Iterator cli(*Doxygen::classSDict);
134 for ( ; (cd=cli.current()) ; ++cli )
136 if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS )
145 QCString ov =Config_getString("HTML_OUTPUT");
146 QCString fileName=ov+"/vhdl_design.dot";
151 if (!f.open(IO_WriteOnly))
153 fprintf(stderr,"Warning: Cannot open file %s for writing\n",fileName.data());
159 for (cli.toFirst() ; (cd=cli.current()) ; ++cli )
161 if ((VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS )
166 QList<MemberDef>* port= getPorts(cd);
171 if (port->count()==0)
178 startTable(t,cd->name());
179 writeClassToDot(t,cd);
183 writeVhdlPortToolTip(t,port,cd);
184 writeVhdlEntityToolTip(t,cd);
187 BaseClassList *bl=cd->baseClasses();
190 BaseClassListIterator bcli(*bl);
192 for ( ; (bcd=bcli.current()) ; ++bcli )
194 ClassDef *bClass=bcd->classDef;
195 QCString dotn=cd->name()+":";
197 QCString csc=bClass->name()+":";
199 // fprintf(stderr,"\n <%s| %s>",dotn.data(),csc.data());
200 writeVhdlDotLink(t,dotn,csc,0);
206 // writePortLinks(t);
211 //------------------------------------------------------------------------------------------------------------------------------------------------------
213 static void startDot(FTextStream &t)
215 t << " digraph G { \n";
216 t << "rankdir=LR \n";
217 t << "concentrate=true\n";
218 t << "stylesheet=\"doxygen.css\"\n";
221 static void endDot(FTextStream &t)
226 static void startTable(FTextStream &t,const QCString &className)
228 t << className <<" [ shape=none , fontname=\"arial\", fontcolor=\"blue\" , \n";
229 t << "label=<<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\">\n";
232 static void writeVhdlDotLink(FTextStream &t,
233 const QCString &a,const QCString &b,const QCString &style)
236 if (!style.isEmpty())
238 t << "[style=" << style << "];\n";
244 static QCString formatBriefNote(const QCString &brief,ClassDef * cd)
248 QCString repl("<BR ALIGN=\"LEFT\"/>");
249 QCString file=cd->getDefFileName();
251 int k=cd->briefLine();
253 QStringList qsl=QStringList::split(ep,brief);
254 for(uint j=0;j<qsl.count();j++)
256 QCString qcs=qsl[j].data();
257 vForm+=parseCommentAsText(cd,NULL,qcs,file,k);
262 vForm.replace(ep,repl.data());
267 static void writeVhdlPortToolTip(FTextStream& t,QList<MemberDef>* port,ClassDef *cd)
270 uint len=port->count();
274 for (uint j=0;j<len;j++)
276 md=(MemberDef*)port->at(j);
277 QCString brief=md->briefDescriptionAsTooltip();
278 if (brief.isEmpty()) continue;
280 QCString node="node";
281 node+=VhdlDocGen::getRecordNumber();
282 t << node <<"[shape=box margin=0.1, label=<\n";
283 t<<"<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\" CELLPADDING=\"2\" >\n ";
284 t<<"<TR><TD BGCOLOR=\"lightcyan\"> ";
286 t<<" </TD></TR></TABLE>>];";
287 QCString dotn=cd->name()+":";
289 // writeVhdlDotLink(t,dotn,node,"dotted");
294 static void writeVhdlEntityToolTip(FTextStream& t,ClassDef *cd)
297 QCString brief=cd->briefDescription();
299 if (brief.isEmpty()) return;
301 brief=formatBriefNote(brief,cd);
303 QCString node="node";
304 node+=VhdlDocGen::getRecordNumber();
305 t << node <<"[shape=none margin=0.1, label=<\n";
306 t << "<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\" CELLPADDING=\"2\" >\n ";
307 t << "<TR><TD BGCOLOR=\"lightcyan\"> ";
309 t << " </TD></TR></TABLE>>];";
310 QCString dotn=cd->name()+":";
312 writeVhdlDotLink(t,dotn,node,"dotted");
315 static void writeColumn(FTextStream &t,MemberDef *md,bool start)
319 static QRegExp reg("[%]");
320 bool bidir=(md!=0 &&( stricmp(md->typeString(),"inout")==0));
324 toolTip=md->briefDescriptionAsTooltip();
325 if (!toolTip.isEmpty())
327 QCString largs = md->argsString();
328 if (!largs.isEmpty())
329 largs=largs.replace(reg," ");
340 t << "<TD ALIGN=\"LEFT\" ";
344 t << md->getOutputFileBase()<< Doxygen::htmlFileExtension;
345 t << "#" << md->anchor();
349 if(!toolTip.isEmpty())
350 codify(t,toolTip.data());
352 QCString largs = md->argsString();
353 if(!largs.isEmpty()){
354 largs=largs.replace(reg," ");
355 codify(t,largs.data());
364 if (!toolTip.isEmpty())
366 // if (!toolTip.isEmpty())
369 t << "BGCOLOR=\"orange\">";
371 t << "BGCOLOR=\"azure\">";
375 t << "BGCOLOR=\"pink\">";
379 t << "BGCOLOR=\"lightgrey\">";
397 static void endTabel(FTextStream &t)
403 static void writeClassToDot(FTextStream &t,ClassDef* cd)
405 t << "<TR><TD COLSPAN=\"2\" BGCOLOR=\"yellow\" ";
410 t << cd->getOutputFileBase() << Doxygen::htmlFileExtension;
414 t << " </TD></TR>\n";
417 static QList<MemberDef>* getPorts(ClassDef *cd)
420 QList<MemberDef> *portList=new QList<MemberDef>;
421 MemberList *ml=cd->getMemberList(MemberList::variableMembers);
423 if (ml==0) return NULL;
425 MemberListIterator fmni(*ml);
427 for (fmni.toFirst();(md=fmni.current());++fmni)
429 if (md->getMemberSpecifiers()==VhdlDocGen::PORT)
431 portList->append(md);
438 //writeColumn(FTextStream &t,QCString name,bool start)
440 static void writeTable(QList<MemberDef>* port,FTextStream & t)
444 uint len=port->count();
446 QList<MemberDef> inPorts;
447 QList<MemberDef> outPorts;
452 md=(MemberDef*)port->at(j);
453 QCString qc=md->typeString();
464 int inp = inPorts.count();
465 int outp = outPorts.count();
478 for(i=0;i<maxLen;i++)
483 md=(MemberDef*)inPorts.at(i);
484 writeColumn(t,md,true);
488 writeColumn(t,NULL,true);
493 md=(MemberDef*)outPorts.at(i);
494 writeColumn(t,md,false);
498 writeColumn(t,NULL,false);
503 //--------------------------------------------------------------------------------------------------
506 VhdlDocGen::VhdlDocGen()
510 VhdlDocGen::~VhdlDocGen()
514 void VhdlDocGen::init()
517 // vhdl keywords inlcuded VHDL 2008
518 const char* g_vhdlKeyWordMap0[] =
520 "abs","access","after","alias","all","and","architecture","array","assert","assume","assume_guarantee","attribute",
521 "begin","block","body","buffer","bus",
522 "case","component","configuration","constant","context","cover",
523 "default","disconnect","downto",
524 "else","elsif","end","entity","exit",
525 "fairness","file","for","force","function",
526 "generate","generic","group","guarded",
527 "if","impure","in","inertial","inout","is",
528 "label","library","linkage","literal","loop",
530 "nand","new","next","nor","not","null",
531 "of","on","open","or","others","out",
532 "package","parameter","port","postponed","procedure","process","property","proctected","pure",
533 "range","record","register","reject","release","restrict","restrict_guarantee","rem","report","rol","ror","return",
534 "select","sequence","severity","signal","shared","sla","sll","sra","srl","strong","subtype",
535 "then","to","transport","type",
536 "unaffected","units","until","use",
537 "variable","vmode","vprop","vunit",
538 "wait","when","while","with",
544 const char* g_vhdlKeyWordMap1[] =
546 "natural","unsigned","signed","string","boolean", "bit","bit_vector","character",
547 "std_ulogic","std_ulogic_vector","std_logic","std_logic_vector","integer",
548 "real","float","ufixed","sfixed","time",0
552 const char* g_vhdlKeyWordMap2[] =
554 "abs","and","or","not","mod", "xor","rem","xnor","ror","rol","sla",
559 g_vhdlKeyDict0.setAutoDelete(TRUE);
560 g_vhdlKeyDict1.setAutoDelete(TRUE);
561 g_vhdlKeyDict2.setAutoDelete(TRUE);
564 while (g_vhdlKeyWordMap0[j])
566 g_vhdlKeyDict0.insert(g_vhdlKeyWordMap0[j],
567 new QCString(g_vhdlKeyWordMap0[j]));
572 while (g_vhdlKeyWordMap1[j])
574 g_vhdlKeyDict1.insert(g_vhdlKeyWordMap1[j],
575 new QCString(g_vhdlKeyWordMap1[j]));
580 while (g_vhdlKeyWordMap2[j])
582 g_vhdlKeyDict2.insert(g_vhdlKeyWordMap2[j],
583 new QCString(g_vhdlKeyWordMap2[j]));
590 * returns the color of a keyword
593 QCString* VhdlDocGen::findKeyWord(const QCString& word)
595 static QCString g_vhdlkeyword("vhdlkeyword");
596 static QCString g_vhdltype("comment");
597 static QCString g_vhdllogic("vhdllogic");
599 if (word.isEmpty() || word.at(0)=='\0') return 0;
600 //printf("VhdlDocGen::findKeyWord(%s)\n",word.data());
602 if (g_vhdlKeyDict0.find(word.lower()))
603 return &g_vhdlkeyword;
605 if (g_vhdlKeyDict1.find(word.lower()))
608 if (g_vhdlKeyDict2.find(word.lower()))
615 * returns the parsed entry at line xxx
623 ClassDef *VhdlDocGen::getClass(const char *name)
625 if (name==0 || name[0]=='\0') return 0;
630 temp=temp.stripWhiteSpace();
631 cd= Doxygen::classSDict->find(temp.data());
638 ClassDef* VhdlDocGen::getPackageName(const QCString & name)
641 QStringList ql=QStringList::split(".",name,FALSE);
647 MemberDef* VhdlDocGen::findMember(const QCString& className, const QCString& memName)
649 QDict<QCString> packages(17,FALSE);
650 packages.setAutoDelete(TRUE);
654 cd=getClass(className);
655 //printf("VhdlDocGen::findMember(%s,%s)=%p\n",className.data(),memName.data(),cd);
658 mdef=VhdlDocGen::findMemberDef(cd,memName,MemberList::variableMembers);
659 if (mdef) return mdef;
660 mdef=VhdlDocGen::findMemberDef(cd,memName,MemberList::pubMethods);
661 if (mdef) return mdef;
663 // nothing found so far
664 // if we are an architecture or package body search in entitiy
666 if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ARCHITECTURECLASS ||
667 (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS)
669 Definition *d = cd->getOuterScope();
670 // searching upper/lower case names
672 QCString tt=d->name();
673 ClassDef *ecd =getClass(tt);
685 if (ecd) //d && d->definitionType()==Definition::TypeClass)
687 //ClassDef *ecd = (ClassDef*)d;
688 mdef=VhdlDocGen::findMemberDef(ecd,memName,MemberList::variableMembers);
689 if (mdef) return mdef;
690 mdef=VhdlDocGen::findMemberDef(cd,memName,MemberList::pubMethods);
691 if (mdef) return mdef;
693 //cd=getClass(getClassName(cd));
696 // nothing found , so we are now searching all included packages
697 VhdlDocGen::findAllPackages(className,packages);
698 //cd=getClass(className.data());
699 if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ARCHITECTURECLASS ||
700 (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS)
702 Definition *d = cd->getOuterScope();
704 QCString tt=d->name();
705 ClassDef *ecd =getClass(tt);
717 if (ecd) //d && d->definitionType()==Definition::TypeClass)
719 VhdlDocGen::findAllPackages(ecd->className(),packages);
723 QDictIterator<QCString> packli(packages);
725 for (packli.toFirst();(curString=packli.current());++packli)
729 cd=VhdlDocGen::getPackageName(*curString);
732 *curString=curString->upper();
733 cd=VhdlDocGen::getPackageName(*curString);
737 *curString=curString->lower();
738 cd=VhdlDocGen::getPackageName(*curString);
743 mdef=VhdlDocGen::findMemberDef(cd,memName,MemberList::variableMembers);
744 if (mdef) return mdef;
745 mdef=VhdlDocGen::findMemberDef(cd,memName,MemberList::pubMethods);
746 if (mdef) return mdef;
753 * This function returns the entity|package
754 * in which the key (type) is found
757 MemberDef* VhdlDocGen::findMemberDef(ClassDef* cd,const QCString& key,MemberList::ListType type)
759 // return cd->getMemberByName(key);//does not work
762 MemberList *ml= cd->getMemberList(type);
765 MemberListIterator fmni(*ml);
767 for (fmni.toFirst();(md=fmni.current());++fmni)
769 if (stricmp(key.data(),md->name().data())==0)
778 * finds all included packages of an Entity or Package
781 void VhdlDocGen::findAllPackages(const QCString& className,QDict<QCString>& qdict)
783 ClassDef *cdef=getClass(className);
786 MemberList *mem=cdef->getMemberList(MemberList::variableMembers);
791 MemberListIterator fmni(*mem);
792 for (fmni.toFirst();(md=fmni.current());++fmni)
794 if (VhdlDocGen::isPackage(md))
796 QCString *temp1=new QCString(md->name().data());
797 //*temp1=temp1->lower();
798 QCString p(md->name().data());
800 ClassDef* cd=VhdlDocGen::getPackageName(*temp1);
803 QCString *ss=qdict.find(*temp1);
806 qdict.insert(p,temp1);
807 QCString tmp=cd->className();
808 VhdlDocGen::findAllPackages(tmp,qdict);
820 * returns the function with the matching argument list
821 * is called in vhdlcode.l
824 MemberDef* VhdlDocGen::findFunction(const QList<Argument> &ql,
825 const QCString& funcname,
826 const QCString& package, bool /*type*/)
830 ClassDef *cdef=getClass(package.data());
831 if (cdef==0) return 0;
834 // funcType=VhdlDocGen::PROCEDURE;
836 // funcType=VhdlDocGen::FUNCTION;
838 MemberList *mem=cdef->getMemberList(MemberList::pubMethods);
842 MemberListIterator fmni(*mem);
843 for (fmni.toFirst();(mdef=fmni.current());++fmni)
845 QCString mname=mdef->name();
846 if ((VhdlDocGen::isProcedure(mdef) || VhdlDocGen::isVhdlFunction(mdef)) && (VhdlDocGen::compareString(funcname,mname)==0))
848 LockingPtr<ArgumentList> alp = mdef->argumentList();
850 // ArgumentList* arg2=mdef->getArgumentList();
852 ArgumentListIterator ali(*alp.pointer());
853 ArgumentListIterator ali1(ql);
855 if (ali.count() != ali1.count()) break;
860 for (;(arg=ali.current());++ali)
862 arg1=ali1.current(); ++ali1;
863 equ+=abs(VhdlDocGen::compareString(arg->type,arg1->type));
865 QCString s1=arg->type;
866 QCString s2=arg1->type;
867 VhdlDocGen::deleteAllChars(s1,' ');
868 VhdlDocGen::deleteAllChars(s2,' ');
869 equ+=abs(VhdlDocGen::compareString(s1,s2));
872 VhdlDocGen::deleteAllChars(s1,' ');
873 VhdlDocGen::deleteAllChars(s2,' ');
874 equ+=abs(VhdlDocGen::compareString(s1,s2));
875 // printf("\n 1. type [%s] name [%s] attrib [%s]",arg->type,arg->name,arg->attrib);
876 // printf("\n 2. type [%s] name [%s] attrib [%s]",arg1->type,arg1->name,arg1->attrib);
878 if (equ==0) return mdef;
889 * returns the class title+ref
892 QCString VhdlDocGen::getClassTitle(const ClassDef *cd)
895 if (cd==0) return "";
896 pageTitle+=cd->displayName();
897 pageTitle=VhdlDocGen::getClassName(cd);
898 int ii=cd->protection();
900 pageTitle+=theTranslator_vhdlType(ii+2,TRUE);
905 /* returns the class name without their prefixes */
907 QCString VhdlDocGen::getClassName(const ClassDef* cd)
910 if (cd==0) return "";
912 if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS)
915 temp.stripPrefix("_");
918 //if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ARCHITECTURECLASS)
920 // QStringList qlist=QStringList::split("-",cd->className(),FALSE);
921 // if (qlist.count()>1)
922 // return (QCString)qlist[1];
925 return substitute(cd->className(),"::",".");
929 * writes an inline link form entity|package to architecture|package body and vice verca
932 void VhdlDocGen::writeInlineClassLink(const ClassDef* cd ,OutputList& ol)
935 ql.setAutoDelete(TRUE);
936 QCString nn=cd->className();
937 int ii=(int)cd->protection()+2;
940 if (ii==VhdlDocGen::ENTITY)
941 type+=theTranslator_vhdlType(VhdlDocGen::ARCHITECTURE,TRUE);
942 else if (ii==VhdlDocGen::ARCHITECTURE)
943 type+=theTranslator_vhdlType(VhdlDocGen::ENTITY,TRUE);
944 else if (ii==VhdlDocGen::PACKAGE_BODY)
945 type+=theTranslator_vhdlType(VhdlDocGen::PACKAGE,TRUE);
946 else if (ii==VhdlDocGen::PACKAGE)
947 type+=theTranslator_vhdlType(VhdlDocGen::PACKAGE_BODY,TRUE);
953 ol.disable(OutputGenerator::RTF);
954 ol.disable(OutputGenerator::Man);
956 if (ii==VhdlDocGen::PACKAGE_BODY)
959 cd=getClass(nn.data());
961 else if (ii==VhdlDocGen::PACKAGE)
964 cd=getClass(nn.data());
966 else if (ii==VhdlDocGen::ARCHITECTURE)
968 QStringList qlist=QStringList::split("-",nn,FALSE);
970 cd=VhdlDocGen::getClass(nn.data());
974 if (ii==VhdlDocGen::ENTITY)
976 VhdlDocGen::findAllArchitectures(ql,cd);
978 for (int i=0;i<j;i++)
980 QCString *temp=ql.at(i);
981 QStringList qlist=QStringList::split("-",*temp,FALSE);
982 QCString s1=qlist[0].utf8();
983 QCString s2=qlist[1].utf8();
985 if (j==1) s1.resize(0);
986 ClassDef*cc = getClass(temp->data());
989 VhdlDocGen::writeVhdlLink(cc,ol,type,s2,s1);
995 VhdlDocGen::writeVhdlLink(cd,ol,type,nn,opp);
998 ol.enable(OutputGenerator::Man);
999 ol.enable(OutputGenerator::RTF);
1004 * finds all architectures which belongs to an entiy
1006 void VhdlDocGen::findAllArchitectures(QList<QCString>& qll,const ClassDef *cd)
1009 ClassSDict::Iterator cli(*Doxygen::classSDict);
1010 for ( ; (citer=cli.current()) ; ++cli )
1012 QCString jj=citer->className();
1013 if (cd != citer && jj.contains('-')!=-1)
1015 QStringList ql=QStringList::split("-",jj,FALSE);
1016 QCString temp=ql[1].utf8();
1017 if (stricmp(cd->className().data(),temp.data())==0)
1019 QCString *cl=new QCString(jj.data());
1024 }//findAllArchitectures
1026 ClassDef* VhdlDocGen::findArchitecture(const ClassDef *cd)
1029 QCString nn=cd->name();
1030 ClassSDict::Iterator cli(*Doxygen::classSDict);
1032 for ( ; (citer=cli.current()) ; ++cli )
1034 QCString jj=citer->name();
1035 QStringList ql=QStringList::split(":",jj,FALSE);
1038 if (ql[0].utf8()==nn )
1047 * writes the link entity >> .... or architecture >> ...
1050 void VhdlDocGen::writeVhdlLink(const ClassDef* ccd ,OutputList& ol,QCString& type,QCString& nn,QCString& behav)
1053 QCString temp=ccd->getOutputFileBase();
1055 ol.docify(type.data());
1057 nn.stripPrefix("_");
1058 ol.writeObjectLink(ccd->getReference(),ccd->getOutputFileBase(),0,nn.data());
1060 if (!behav.isEmpty())
1064 ol.docify(behav.data());
1071 bool VhdlDocGen::compareString(const QCString& s1,const QCString& s2)
1073 QCString str1=s1.stripWhiteSpace();
1074 QCString str2=s2.stripWhiteSpace();
1076 return stricmp(str1.data(),str2.data());
1081 * strips the "--" prefixes of vhdl comments
1083 void VhdlDocGen::prepareComment(QCString& qcs)
1085 const char* s="--!";
1086 //const char *start="--!{";
1087 //const char *end="--!}";
1092 index=qcs.find(s,0,TRUE);
1094 qcs=qcs.remove(index,strlen(s));
1096 qcs=qcs.stripWhiteSpace();
1101 * parses a function proto
1102 * @param text function string
1103 * @param qlist stores the function types
1104 * @param name points to the function name
1105 * @param ret Stores the return type
1108 void VhdlDocGen::parseFuncProto(const char* text,QList<Argument>& qlist,
1109 QCString& name,QCString& ret,bool doc)
1111 (void)qlist; //unused
1117 end=s1.findRev(")");
1121 QCString tt=s1.mid(index,(end-index+1));
1122 temp=s1.mid(index+1,(end-index-1));
1123 //getFuncParams(qlist,temp);
1127 name=s1.left(index);
1128 name=name.stripWhiteSpace();
1138 s1=s1.stripWhiteSpace();
1139 int i=s1.find("(",0,FALSE);
1140 int s=s1.find(QRegExp("[ \\t]"));
1142 s1=VhdlDocGen::getIndexWord(s1.data(),1);
1143 else // s<i, s=start of name, i=end of name
1146 name=s1.stripWhiteSpace();
1148 index=s1.findRev("return",-1,FALSE);
1151 ret=s1.mid(index+6,s1.length());
1152 ret=ret.stripWhiteSpace();
1153 VhdlDocGen::deleteCharRev(ret,';');
1158 * returns the n'th word of a string
1161 QCString VhdlDocGen::getIndexWord(const char* c,int index)
1165 QRegExp reg("[\\s:|]");
1167 ql=QStringList::split(reg,temp,FALSE);
1169 if (ql.count() > (unsigned int)index)
1171 return ql[index].utf8();
1178 QCString VhdlDocGen::getProtectionName(int prot)
1180 if (prot==VhdlDocGen::ENTITYCLASS)
1182 else if (prot==VhdlDocGen::ARCHITECTURECLASS)
1183 return "architecture";
1184 else if (prot==VhdlDocGen::PACKAGECLASS)
1186 else if (prot==VhdlDocGen::PACKBODYCLASS)
1187 return "package body";
1192 QCString VhdlDocGen::trTypeString(int type)
1196 case VhdlDocGen::LIBRARY: return "Library";
1197 case VhdlDocGen::ENTITY: return "Entity";
1198 case VhdlDocGen::PACKAGE_BODY: return "Package Body";
1199 case VhdlDocGen::ATTRIBUTE: return "Attribute";
1200 case VhdlDocGen::PACKAGE: return "Package";
1201 case VhdlDocGen::SIGNAL: return "Signal";
1202 case VhdlDocGen::COMPONENT: return "Component";
1203 case VhdlDocGen::CONSTANT: return "Constant";
1204 case VhdlDocGen::TYPE: return "Type";
1205 case VhdlDocGen::SUBTYPE: return "Subtype";
1206 case VhdlDocGen::FUNCTION: return "Function";
1207 case VhdlDocGen::RECORD: return "Record";
1208 case VhdlDocGen::PROCEDURE: return "Procedure";
1209 case VhdlDocGen::ARCHITECTURE: return "Architecture";
1210 case VhdlDocGen::USE: return "Package";
1211 case VhdlDocGen::PROCESS: return "Process";
1212 case VhdlDocGen::PORT: return "Port";
1213 case VhdlDocGen::GENERIC: return "Generic";
1214 case VhdlDocGen::UNITS: return "Units";
1215 //case VhdlDocGen::PORTMAP: return "Port Map";
1216 case VhdlDocGen::SHAREDVARIABLE: return "Shared Variable";
1217 case VhdlDocGen::GROUP: return "Group";
1218 case VhdlDocGen::VFILE: return "File";
1219 case VhdlDocGen::INSTANTIATION: return "Instantiation";
1220 case VhdlDocGen::ALIAS: return "Alias";
1221 case VhdlDocGen::CONFIG: return "Configuration";
1222 case VhdlDocGen::MISCELLANEOUS: return "Miscellaneous";
1223 case VhdlDocGen::UCF_CONST: return "Constraints";
1229 * deletes a char backwards in a string
1232 bool VhdlDocGen::deleteCharRev(QCString &s,char c)
1234 int index=s.findRev(c,-1,FALSE);
1237 QCString qcs=s.remove(index,1);
1244 void VhdlDocGen::deleteAllChars(QCString &s,char c)
1246 int index=s.findRev(c,-1,FALSE);
1249 QCString qcs=s.remove(index,1);
1251 index=s.findRev(c,-1,FALSE);
1256 static int recordCounter=0;
1259 * returns the next number of a record|unit member
1262 QCString VhdlDocGen::getRecordNumber()
1265 sprintf(buf,"%d",recordCounter++);
1266 QCString qcs(&buf[0]);
1271 * returns the next number of an anonymous process
1274 QCString VhdlDocGen::getProcessNumber()
1276 static int stringCounter;
1278 QCString qcs("PROCESS_");
1279 sprintf(buf,"%d",stringCounter++);
1280 qcs.append(&buf[0]);
1285 * writes a colored and formatted string
1288 void VhdlDocGen::writeFormatString(const QCString& s,OutputList&ol,const MemberDef* mdef)
1290 QRegExp reg("[\\[\\]\\.\\/\\:\\<\\>\\:\\s\\,\\;\\'\\+\\-\\*\\|\\&\\=\\(\\)\"]");
1292 qcs+=QCString(" ");// parsing the last sign
1301 j = reg.match(temp.data(),0,&len);
1310 ss=VhdlDocGen::findKeyWord(find);
1311 bool k=VhdlDocGen::isNumber(find); // is this a number
1315 VhdlDocGen::startFonts(find,"vhdldigit",ol);
1318 else if (j != 0 && ss)
1320 VhdlDocGen::startFonts(find,ss->data(),ol);
1326 VhdlDocGen::writeStringLink(mdef,find,ol);
1329 VhdlDocGen::startFonts(&buf[0],"vhdlchar",ol);
1331 QCString st=temp.remove(0,j+1);
1333 if (!find.isEmpty() && find.at(0)=='"')
1335 int ii=find.find('"',2);
1338 QCString com=find.left(ii+1);
1339 VhdlDocGen::startFonts(com,"keyword",ol);
1340 temp=find.remove(0,ii+1);
1347 j = reg.match(temp.data(),0,&len);
1352 VhdlDocGen::startFonts(find,"vhdlchar",ol);
1355 }// writeFormatString
1358 * returns TRUE if this string is a number
1361 bool VhdlDocGen::isNumber(const QCString& s)
1363 static QRegExp regg("[0-9][0-9eEfFbBcCdDaA_.#-+?xXzZ]*");
1365 if (s.isEmpty()) return FALSE;
1367 j = regg.match(s.data(),0,&len);
1368 if ((j==0) && (len==(int)s.length())) return TRUE;
1373 void VhdlDocGen::startFonts(const QCString& q, const char *keyword,OutputList& ol)
1375 ol.startFontClass(keyword);
1376 ol.docify(q.data());
1381 * inserts white spaces for better readings
1382 * and writes a colored string to the output
1385 void VhdlDocGen::formatString(const QCString &s, OutputList& ol,const MemberDef* mdef)
1388 QCString temp(qcs.length());
1389 qcs.stripPrefix(":");
1390 qcs.stripPrefix("is");
1391 qcs.stripPrefix("IS");
1392 qcs.stripPrefix("of");
1393 qcs.stripPrefix("OF");
1395 // VhdlDocGen::deleteCharRev(qcs,';');
1397 int len = qcs.length();
1398 unsigned int index=1;//temp.length();
1400 for (int j=0;j<len;j++)
1404 if (j>0) b=qcs[j-1];
1405 if (c=='"' || c==',' || c=='\''|| c=='(' || c==')' || c==':' || c=='[' || c==']' ) // || (c==':' && b!='=')) // || (c=='=' && b!='>'))
1407 if (temp.at(index-1) != ' ')
1416 if (b==':') // := operator
1418 temp.replace(index-1,1,"=");
1433 index=temp.length();
1435 temp=temp.stripWhiteSpace();
1436 // printf("\n [%s]",qcs.data());
1437 VhdlDocGen::writeFormatString(temp,ol,mdef);
1441 * writes a procedure prototype to the output
1444 void VhdlDocGen::writeProcedureProto(OutputList& ol,const ArgumentList* al,const MemberDef* mdef)
1446 ArgumentListIterator ali(*al);
1449 int len=al->count();
1455 for (;(arg=ali.current());++ali)
1461 QCString nn=arg->name;
1464 QCString *str=VhdlDocGen::findKeyWord(arg->defval);
1468 VhdlDocGen::startFonts(arg->defval,str->data(),ol);
1472 VhdlDocGen::startFonts(arg->defval,"vhdlchar",ol); // write type (variable,constant etc.)
1475 VhdlDocGen::startFonts(nn,"vhdlchar",ol); // write name
1476 if (stricmp(arg->attrib.data(),arg->type.data()) != 0)
1477 VhdlDocGen::startFonts(arg->attrib.lower(),"stringliteral",ol); // write in|out
1479 VhdlDocGen::formatString(arg->type,ol,mdef);
1495 * writes a function prototype to the output
1498 void VhdlDocGen::writeFunctionProto(OutputList& ol,const ArgumentList* al,const MemberDef* mdef)
1501 ArgumentListIterator ali(*al);
1504 int len=al->count();
1512 for (;(arg=ali.current());++ali)
1515 QCString att=arg->defval;
1516 bool bGen=att.stripPrefix("gen!");
1524 VhdlDocGen::formatString(QCString("generic "),ol,mdef);
1528 QCString *str=VhdlDocGen::findKeyWord(att);
1531 VhdlDocGen::formatString(att,ol,mdef);
1533 VhdlDocGen::startFonts(att,"vhdlchar",ol);
1536 QCString nn=arg->name;
1538 QCString ss=arg->type.stripWhiteSpace(); //.lower();
1539 QCString w=ss.stripWhiteSpace();//.upper();
1540 VhdlDocGen::startFonts(nn,"vhdlchar",ol);
1541 VhdlDocGen::startFonts("in ","stringliteral",ol);
1542 QCString *str=VhdlDocGen::findKeyWord(ss);
1544 VhdlDocGen::formatString(w,ol,mdef);
1546 VhdlDocGen::startFonts(w,"vhdlchar",ol);
1549 VhdlDocGen::startFonts(arg->attrib,"vhdlchar",ol);
1561 const char *exp=mdef->excpString();
1564 ol.insertMemberAlign();
1575 * writes a process prototype to the output
1578 void VhdlDocGen::writeProcessProto(OutputList& ol,const ArgumentList* al,const MemberDef* mdef)
1581 ArgumentListIterator ali(*al);
1586 for (;(arg=ali.current());++ali)
1592 QCString nn=arg->name;
1593 // VhdlDocGen::startFonts(nn,"vhdlchar",ol);
1594 VhdlDocGen::writeFormatString(nn,ol,mdef);
1603 * writes a function|procedure documentation to the output
1606 void VhdlDocGen::writeFuncProcDocu(
1607 const MemberDef *md,
1609 const ArgumentList* al,
1616 ArgumentListIterator ali(*al);
1617 int index=ali.count();
1623 ol.startParameterList(TRUE);
1624 //ol.startParameterName(FALSE);
1627 for (;(arg=ali.current());++ali)
1629 ol.startParameterType(first,"");
1630 // if (first) ol.writeChar('(');
1631 QCString attl=arg->defval;
1632 bool bGen=attl.stripPrefix("gen!");
1634 VhdlDocGen::writeFormatString(QCString("generic "),ol,md);
1637 if (VhdlDocGen::isProcedure(md))
1639 startFonts(arg->defval,"keywordtype",ol);
1642 ol.endParameterType();
1644 ol.startParameterName(TRUE);
1645 VhdlDocGen::writeFormatString(arg->name,ol,md);
1648 if (VhdlDocGen::isProcedure(md))
1650 startFonts(arg->attrib,"stringliteral",ol);
1652 else if (VhdlDocGen::isVhdlFunction(md))
1654 startFonts(QCString("in"),"stringliteral",ol);
1658 ol.disable(OutputGenerator::Man);
1660 ol.enable(OutputGenerator::Man);
1661 if (!VhdlDocGen::isProcess(md))
1663 // startFonts(arg->type,"vhdlkeyword",ol);
1664 VhdlDocGen::writeFormatString(arg->type,ol,md);
1666 ol.disable(OutputGenerator::Man);
1668 ol.enable(OutputGenerator::Man);
1676 // ol.docify(" ) ");
1677 ol.endParameterName(TRUE,FALSE,TRUE);
1680 ol.endParameterName(FALSE,FALSE,FALSE);
1685 //ol.endParameterList();
1687 } // writeDocFunProc
1692 QCString VhdlDocGen::convertArgumentListToString(const ArgumentList* al,bool func)
1696 ArgumentListIterator ali(*al);
1699 for (;(arg=ali.current());++ali)
1701 if (sem) argString.append(", ");
1704 argString+=arg->name;
1706 argString+=arg->type;
1710 argString+=arg->defval+" ";
1711 argString+=arg->name+" :";
1712 argString+=arg->attrib+" ";
1713 argString+=arg->type;
1721 void VhdlDocGen::writeVhdlDeclarations(MemberList* ml,
1722 OutputList& ol,GroupDef* gd,ClassDef* cd,FileDef *fd,NamespaceDef* nd)
1724 static ClassDef *cdef;
1725 //static GroupDef* gdef;
1727 { // only one inline link
1728 VhdlDocGen::writeInlineClassLink(cd,ol);
1733 if (gd && gdef==gd) return;
1739 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::LIBRARY,FALSE),0,FALSE,VhdlDocGen::LIBRARY);
1740 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::USE,FALSE),0,FALSE,VhdlDocGen::USE);
1741 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::FUNCTION,FALSE),0,FALSE,VhdlDocGen::FUNCTION);
1742 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::COMPONENT,FALSE),0,FALSE,VhdlDocGen::COMPONENT);
1743 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::CONSTANT,FALSE),0,FALSE,VhdlDocGen::CONSTANT);
1744 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::TYPE,FALSE),0,FALSE,VhdlDocGen::TYPE);
1745 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::SUBTYPE,FALSE),0,FALSE,VhdlDocGen::SUBTYPE);
1746 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::GENERIC,FALSE),0,FALSE,VhdlDocGen::GENERIC);
1747 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::PORT,FALSE),0,FALSE,VhdlDocGen::PORT);
1748 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::PROCESS,FALSE),0,FALSE,VhdlDocGen::PROCESS);
1749 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::SIGNAL,FALSE),0,FALSE,VhdlDocGen::SIGNAL);
1750 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::ATTRIBUTE,FALSE),0,FALSE,VhdlDocGen::ATTRIBUTE);
1751 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::PROCEDURE,FALSE),0,FALSE,VhdlDocGen::PROCEDURE);
1752 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::RECORD,FALSE),0,FALSE,VhdlDocGen::RECORD);
1753 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::UNITS,FALSE),0,FALSE,VhdlDocGen::UNITS);
1754 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::SHAREDVARIABLE,FALSE),0,FALSE,VhdlDocGen::SHAREDVARIABLE);
1755 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::VFILE,FALSE),0,FALSE,VhdlDocGen::VFILE);
1756 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::GROUP,FALSE),0,FALSE,VhdlDocGen::GROUP);
1757 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::INSTANTIATION,FALSE),0,FALSE,VhdlDocGen::INSTANTIATION);
1758 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::ALIAS,FALSE),0,FALSE,VhdlDocGen::ALIAS);
1759 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::MISCELLANEOUS),0,FALSE,VhdlDocGen::MISCELLANEOUS);
1761 // configurations must be added to global file definitions.
1762 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::CONFIG,FALSE),0,FALSE,VhdlDocGen::CONFIG);
1763 VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::UCF_CONST,FALSE),0,FALSE,VhdlDocGen::UCF_CONST);
1767 static void setGlobalType(MemberList *ml)
1771 MemberListIterator mmli(*ml);
1772 for ( ; (mdd=mmli.current()); ++mmli )
1774 QCString l=mdd->typeString();
1776 if (strcmp(mdd->argsString(),"package")==0)
1778 mdd->setMemberSpecifiers(VhdlDocGen::INSTANTIATION);
1780 else if (strcmp(mdd->argsString(),"configuration")==0)
1782 mdd->setMemberSpecifiers(VhdlDocGen::CONFIG);
1784 else if (strcmp(mdd->typeString(),"library")==0)
1786 mdd->setMemberSpecifiers(VhdlDocGen::LIBRARY);
1788 else if (strcmp(mdd->typeString(),"use")==0)
1790 mdd->setMemberSpecifiers(VhdlDocGen::USE);
1792 else if (stricmp(mdd->typeString(),"misc")==0)
1794 mdd->setMemberSpecifiers(VhdlDocGen::MISCELLANEOUS);
1796 else if (stricmp(mdd->typeString(),"ucf_const")==0)
1798 mdd->setMemberSpecifiers(VhdlDocGen::UCF_CONST);
1803 /* writes a vhdl type documentation */
1804 void VhdlDocGen::writeVHDLTypeDocumentation(const MemberDef* mdef, const Definition *d, OutputList &ol)
1806 ClassDef *cd=(ClassDef*)d;
1810 QCString ttype=mdef->typeString();
1811 QCString largs=mdef->argsString();
1813 if ((VhdlDocGen::isVhdlFunction(mdef) || VhdlDocGen::isProcedure(mdef) || VhdlDocGen::isProcess(mdef)))
1815 QCString nn=mdef->typeString();
1816 nn=nn.stripWhiteSpace();
1817 QCString na=cd->name();
1818 MemberDef* memdef=VhdlDocGen::findMember(na,nn);
1819 if (memdef && memdef->isLinkable())
1824 writeLink(memdef,ol);
1831 VhdlDocGen::formatString(ttype,ol,mdef);
1834 ol.docify(mdef->name());
1835 VhdlDocGen::writeFuncProcDocu(mdef,ol, mdef->argumentList().pointer());
1839 if (mdef->isVariable())
1841 if (VhdlDocGen::isConstraint(mdef))
1846 largs=largs.replace(QRegExp("#")," ");
1847 VhdlDocGen::formatString(largs,ol,mdef);
1853 if (VhdlDocGen::isLibrary(mdef) || VhdlDocGen::isPackage(mdef))
1860 // QCString largs=mdef->argsString();
1862 bool c=largs=="context";
1863 bool brec=largs.stripPrefix("record") ;
1866 VhdlDocGen::formatString(ttype,ol,mdef);
1868 if (c || brec || largs.stripPrefix("units"))
1872 VhdlDocGen::writeRecUnitDocu(mdef,ol,largs);
1877 if (VhdlDocGen::isPort(mdef) || VhdlDocGen::isGeneric(mdef))
1879 // QCString largs=mdef->argsString();
1880 VhdlDocGen::formatString(largs,ol,mdef);
1886 /* writes a vhdl type declaration */
1888 void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
1889 ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
1892 static QRegExp reg("[%]");
1893 LockingPtr<MemberDef> lock(mdef,mdef);
1897 /* some vhdl files contain only a configuration description
1900 configuration cfg_tb_jtag_gotoBackup of tb_jtag_gotoBackup is
1903 end cfg_tb_jtag_gotoBackup;
1905 in this case library work does not belong to an entity, package ...
1909 ASSERT(cd!=0 || nd!=0 || fd!=0 || gd!=0 ||
1910 mdef->getMemberSpecifiers()==VhdlDocGen::LIBRARY ||
1911 mdef->getMemberSpecifiers()==VhdlDocGen::USE
1912 ); // member should belong to something
1917 else d=(Definition*)mdef;
1919 // write tag file information of this member
1920 if (!Config_getString("GENERATE_TAGFILE").isEmpty())
1922 Doxygen::tagFile << " <member kind=\"";
1923 if (VhdlDocGen::isGeneric(mdef)) Doxygen::tagFile << "generic";
1924 if (VhdlDocGen::isPort(mdef)) Doxygen::tagFile << "port";
1925 if (VhdlDocGen::isEntity(mdef)) Doxygen::tagFile << "entity";
1926 if (VhdlDocGen::isComponent(mdef)) Doxygen::tagFile << "component";
1927 if (VhdlDocGen::isVType(mdef)) Doxygen::tagFile << "type";
1928 if (VhdlDocGen::isConstant(mdef)) Doxygen::tagFile << "constant";
1929 if (VhdlDocGen::isSubType(mdef)) Doxygen::tagFile << "subtype";
1930 if (VhdlDocGen::isVhdlFunction(mdef)) Doxygen::tagFile << "function";
1931 if (VhdlDocGen::isProcedure(mdef)) Doxygen::tagFile << "procedure";
1932 if (VhdlDocGen::isProcess(mdef)) Doxygen::tagFile << "process";
1933 if (VhdlDocGen::isSignals(mdef)) Doxygen::tagFile << "signal";
1934 if (VhdlDocGen::isAttribute(mdef)) Doxygen::tagFile << "attribute";
1935 if (VhdlDocGen::isRecord(mdef)) Doxygen::tagFile << "record";
1936 if (VhdlDocGen::isLibrary(mdef)) Doxygen::tagFile << "library";
1937 if (VhdlDocGen::isPackage(mdef)) Doxygen::tagFile << "package";
1938 if (VhdlDocGen::isVariable(mdef)) Doxygen::tagFile << "shared variable";
1939 if (VhdlDocGen::isFile(mdef)) Doxygen::tagFile << "file";
1940 if (VhdlDocGen::isGroup(mdef)) Doxygen::tagFile << "group";
1941 if (VhdlDocGen::isCompInst(mdef)) Doxygen::tagFile << " instantiation";
1942 if (VhdlDocGen::isAlias(mdef)) Doxygen::tagFile << "alias";
1943 if (VhdlDocGen::isCompInst(mdef)) Doxygen::tagFile << "configuration";
1945 Doxygen::tagFile << "\">" << endl;
1946 Doxygen::tagFile << " <type>" << convertToXML(mdef->typeString()) << "</type>" << endl;
1947 Doxygen::tagFile << " <name>" << convertToXML(mdef->name()) << "</name>" << endl;
1948 Doxygen::tagFile << " <anchorfile>" << convertToXML(mdef->getOutputFileBase()+Doxygen::htmlFileExtension) << "</anchorfile>" << endl;
1949 Doxygen::tagFile << " <anchor>" << convertToXML(mdef->anchor()) << "</anchor>" << endl;
1951 if (VhdlDocGen::isVhdlFunction(mdef))
1952 Doxygen::tagFile << " <arglist>" << convertToXML(VhdlDocGen::convertArgumentListToString(mdef->argumentList().pointer(),TRUE)) << "</arglist>" << endl;
1953 else if (VhdlDocGen::isProcedure(mdef))
1954 Doxygen::tagFile << " <arglist>" << convertToXML(VhdlDocGen::convertArgumentListToString(mdef->argumentList().pointer(),FALSE)) << "</arglist>" << endl;
1956 Doxygen::tagFile << " <arglist>" << convertToXML(mdef->argsString()) << "</arglist>" << endl;
1958 mdef->writeDocAnchorsToTagFile();
1959 Doxygen::tagFile << " </member>" << endl;
1963 // write search index info
1964 if (Doxygen::searchIndex)
1966 Doxygen::searchIndex->setCurrentDoc(mdef,mdef->anchor(),FALSE);
1967 Doxygen::searchIndex->addWord(mdef->localName(),TRUE);
1968 Doxygen::searchIndex->addWord(mdef->qualifiedName(),FALSE);
1971 QCString cname = d->name();
1972 QCString cfname = d->getOutputFileBase();
1974 //HtmlHelp *htmlHelp=0;
1975 // bool hasHtmlHelp = Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP");
1976 // if (hasHtmlHelp) htmlHelp = HtmlHelp::getInstance();
1978 // search for the last anonymous scope in the member type
1979 ClassDef *annoClassDef=mdef->getClassDefOfAnonymousType();
1981 // start a new member declaration
1982 bool isAnonymous = annoClassDef; // || m_impl->annMemb || m_impl->annEnumType;
1983 ///printf("startMemberItem for %s\n",name().data());
1984 ol.startMemberItem( mdef->anchor(), isAnonymous ); //? 1 : m_impl->tArgList ? 3 : 0);
1986 // If there is no detailed description we need to write the anchor here.
1987 bool detailsVisible = mdef->isDetailedSectionLinkable();
1988 if (!detailsVisible) // && !m_impl->annMemb)
1990 QCString doxyName=mdef->name().copy();
1991 if (!cname.isEmpty()) doxyName.prepend(cname+"::");
1992 QCString doxyArgs=mdef->argsString();
1993 ol.startDoxyAnchor(cfname,cname,mdef->anchor(),doxyName,doxyArgs);
1995 ol.pushGeneratorState();
1996 ol.disable(OutputGenerator::Man);
1997 ol.disable(OutputGenerator::Latex);
1999 ol.popGeneratorState();
2005 QCString ltype(mdef->typeString());
2006 ltype=ltype.replace(reg," ");
2007 QCString largs(mdef->argsString());
2008 largs=largs.replace(reg," ");
2009 int mm=mdef->getMemberSpecifiers();
2010 mdef->setType(ltype.data());
2011 mdef->setArgsString(largs.data());
2012 //ClassDef * plo=mdef->getClassDef();
2014 LockingPtr<ArgumentList> alp = mdef->argumentList();
2016 //VhdlDocGen::adjustRecordMember(mdef);
2020 case VhdlDocGen::MISCELLANEOUS:
2021 VhdlDocGen::writeCodeFragment(mdef,ol);
2023 case VhdlDocGen::PROCEDURE:
2024 case VhdlDocGen::FUNCTION:
2026 VhdlDocGen::formatString(ltype,ol,mdef);
2028 ol.insertMemberAlign();
2032 if (alp!=0 && mm==VhdlDocGen::FUNCTION)
2033 VhdlDocGen::writeFunctionProto(ol,alp.pointer(),mdef);
2035 if (alp!=0 && mm==VhdlDocGen::PROCEDURE)
2036 VhdlDocGen::writeProcedureProto(ol,alp.pointer(),mdef);
2039 case VhdlDocGen::USE:
2040 kl=VhdlDocGen::getClass(mdef->name());
2041 if (kl && ((VhdlDocGen::VhdlClasses)kl->protection()==VhdlDocGen::ENTITYCLASS)) break;
2043 ol.insertMemberAlign();
2048 nn=kl->getOutputFileBase();
2049 ol.pushGeneratorState();
2050 ol.disableAllBut(OutputGenerator::Html);
2052 QCString name=theTranslator_vhdlType(VhdlDocGen::PACKAGE,TRUE);
2054 ol.docify(name.data());
2057 name+=" <"+mdef->name()+">";
2059 ol.writeObjectLink(kl->getReference(),kl->getOutputFileBase(),0,name.data());
2060 ol.popGeneratorState();
2063 case VhdlDocGen::LIBRARY:
2065 ol.insertMemberAlign();
2066 if (largs=="context")
2068 VhdlDocGen::writeRecorUnit(ltype,ol,mdef);
2073 case VhdlDocGen::GENERIC:
2074 case VhdlDocGen::PORT:
2075 case VhdlDocGen::ALIAS:
2079 ol.insertMemberAlign();
2080 if (mm==VhdlDocGen::GENERIC)
2083 VhdlDocGen::formatString(largs,ol,mdef);
2090 VhdlDocGen::formatString(ltype,ol,mdef);
2093 VhdlDocGen::formatString(largs,ol,mdef);
2096 case VhdlDocGen::PROCESS:
2098 ol.insertMemberAlign();
2099 VhdlDocGen::writeProcessProto(ol,alp.pointer(),mdef);
2101 case VhdlDocGen::PACKAGE:
2102 case VhdlDocGen::ENTITY:
2103 case VhdlDocGen::COMPONENT:
2104 case VhdlDocGen::INSTANTIATION:
2105 case VhdlDocGen::CONFIG:
2106 if (VhdlDocGen::isCompInst(mdef) )
2109 if(nn.stripPrefix("function") || nn.stripPrefix("package"))
2111 VhdlDocGen::formatString(largs,ol,mdef);
2112 ol.insertMemberAlign();
2115 VhdlDocGen::formatString(ltype,ol,mdef);
2119 largs.prepend("::");
2120 largs.prepend(mdef->name().data());
2121 ol.writeObjectLink(mdef->getReference(),
2129 ol.insertMemberAlign();
2136 if (VhdlDocGen::isComponent(mdef) ||
2137 VhdlDocGen::isConfig(mdef) ||
2138 VhdlDocGen::isCompInst(mdef))
2140 if (VhdlDocGen::isConfig(mdef) || VhdlDocGen::isCompInst(mdef))
2142 nn=mdef->getOutputFileBase();
2149 kl=getClass(nn.data());
2152 nn=kl->getOutputFileBase();
2153 ol.pushGeneratorState();
2154 ol.disableAllBut(OutputGenerator::Html);
2156 QCString name("<Entity ");
2157 if (VhdlDocGen::isConfig(mdef) || VhdlDocGen::isCompInst(mdef))
2163 name+=mdef->name()+"> ";
2165 ol.writeObjectLink(kl->getReference(),kl->getOutputFileBase(),0,name.data());
2167 ol.popGeneratorState();
2171 case VhdlDocGen::UCF_CONST:
2172 mm=mdef->name().findRev('_');
2175 mdef->setName(mdef->name().left(mm));
2177 writeUCFLink(mdef,ol);
2179 case VhdlDocGen::SIGNAL:
2180 case VhdlDocGen::ATTRIBUTE:
2181 case VhdlDocGen::SUBTYPE:
2182 case VhdlDocGen::CONSTANT:
2183 case VhdlDocGen::SHAREDVARIABLE:
2184 case VhdlDocGen::VFILE:
2185 case VhdlDocGen::GROUP:
2188 ol.insertMemberAlign();
2189 VhdlDocGen::formatString(ltype,ol,mdef);
2191 case VhdlDocGen::TYPE:
2192 bRec=largs.stripPrefix("record") ;
2193 bUnit=largs.stripPrefix("units") ;
2196 ol.docify("record: ");
2198 ol.docify("units: ");
2200 ol.insertMemberAlign();
2202 VhdlDocGen::formatString(ltype,ol,mdef);
2203 if (bUnit) ol.lineBreak();
2205 writeRecorUnit(largs,ol,mdef);
2212 bool htmlOn = ol.isEnabled(OutputGenerator::Html);
2213 if (htmlOn && /*Config_getBool("HTML_ALIGN_MEMBERS") &&*/ !ltype.isEmpty())
2215 ol.disable(OutputGenerator::Html);
2217 if (!ltype.isEmpty()) ol.docify(" ");
2221 ol.enable(OutputGenerator::Html);
2224 if (!detailsVisible)// && !m_impl->annMemb)
2226 ol.endDoxyAnchor(cfname,mdef->anchor());
2229 //printf("endMember %s annoClassDef=%p annEnumType=%p\n",
2230 // name().data(),annoClassDef,annEnumType);
2232 if (!mdef->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC") /* && !annMemb */)
2234 ol.startMemberDescription(mdef->anchor());
2235 ol.parseDoc(mdef->briefFile(),mdef->briefLine(),
2236 mdef->getOuterScope()?mdef->getOuterScope():d,
2237 mdef,mdef->briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
2240 ol.pushGeneratorState();
2241 ol.disableAllBut(OutputGenerator::Html);
2244 if (mdef->getGroupDef()!=0 && gd==0) // forward link to the group
2246 ol.startTextLink(mdef->getOutputFileBase(),mdef->anchor());
2250 ol.startTextLink(0,mdef->anchor());
2253 //ol.startEmphasis();
2254 ol.popGeneratorState();
2256 //ol.newParagraph();
2257 ol.endMemberDescription();
2259 mdef->warnIfUndocumented();
2261 }// end writeVhdlDeclaration
2264 void VhdlDocGen::writeLink(const MemberDef* mdef,OutputList &ol)
2266 ol.writeObjectLink(mdef->getReference(),
2267 mdef->getOutputFileBase(),
2272 void VhdlDocGen::writePlainVHDLDeclarations(
2273 MemberList* mlist,OutputList &ol,
2274 ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,int specifier)
2277 SDict<QCString> pack(1009);
2279 ol.pushGeneratorState();
2283 MemberListIterator mli(*mlist);
2284 for ( ; (md=mli.current()); ++mli )
2286 int mems=md->getMemberSpecifiers();
2287 if (md->isBriefSectionVisible() && (mems==specifier) && (mems!=VhdlDocGen::LIBRARY) )
2289 if (first) {ol.startMemberList();first=FALSE;}
2290 VhdlDocGen::writeVHDLDeclaration(md,ol,cd,nd,fd,gd,FALSE);
2292 else if (md->isBriefSectionVisible() && (mems==specifier))
2294 if (!pack.find(md->name().data()))
2296 if (first) ol.startMemberList(),first=FALSE;
2297 VhdlDocGen::writeVHDLDeclaration(md,ol,cd,nd,fd,gd,FALSE);
2298 pack.append(md->name().data(),new QCString(md->name().data()));
2302 if (!first) ol.endMemberList();
2306 bool VhdlDocGen::membersHaveSpecificType(MemberList *ml,int type)
2308 if (ml==0) return FALSE;
2310 MemberListIterator mmli(*ml);
2311 for ( ; (mdd=mmli.current()); ++mmli )
2313 if (mdd->getMemberSpecifiers()==type) //is type in class
2318 if (ml->getMemberGroupList())
2320 MemberGroupListIterator mgli(*ml->getMemberGroupList());
2322 while ((mg=mgli.current()))
2326 if (membersHaveSpecificType(mg->members(),type)) return TRUE;
2334 void VhdlDocGen::writeVHDLDeclarations(MemberList* ml,OutputList &ol,
2335 ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
2336 const char *title,const char *subtitle,bool /*showEnumValues*/,int type)
2339 if (!membersHaveSpecificType(ml,type)) return;
2343 ol.startMemberHeader(title);
2344 ol.parseText(title);
2345 ol.endMemberHeader();
2348 if (subtitle && subtitle[0]!=0)
2350 ol.startMemberSubtitle();
2351 ol.parseDoc("[generated]",-1,0,0,subtitle,FALSE,FALSE,0,TRUE,FALSE);
2352 ol.endMemberSubtitle();
2353 } //printf("memberGroupList=%p\n",memberGroupList);
2355 VhdlDocGen::writePlainVHDLDeclarations(ml,ol,cd,nd,fd,gd,type);
2357 if (ml->getMemberGroupList())
2359 MemberGroupListIterator mgli(*ml->getMemberGroupList());
2361 while ((mg=mgli.current()))
2363 if (membersHaveSpecificType(mg->members(),type))
2365 //printf("mg->header=%s\n",mg->header().data());
2366 bool hasHeader=mg->header()!="[NOHEADER]";
2367 ol.startMemberGroupHeader(hasHeader);
2370 ol.parseText(mg->header());
2372 ol.endMemberGroupHeader();
2373 if (!mg->documentation().isEmpty())
2375 //printf("Member group has docs!\n");
2376 ol.startMemberGroupDocs();
2377 ol.parseDoc("[generated]",-1,0,0,mg->documentation()+"\n",FALSE,FALSE);
2378 ol.endMemberGroupDocs();
2380 ol.startMemberGroup();
2381 //printf("--- mg->writePlainDeclarations ---\n");
2382 VhdlDocGen::writePlainVHDLDeclarations(mg->members(),ol,cd,nd,fd,gd,type);
2383 ol.endMemberGroup(hasHeader);
2388 }// writeVHDLDeclarations
2391 /* strips the prefix for record and unit members*/
2392 void VhdlDocGen::adjustRecordMember(MemberDef *mdef)
2393 { //,OutputList & ol) {
2394 QRegExp regg("[_a-zA-Z\"]");
2395 QCString nn=mdef->name();
2396 int j=nn.find(regg,0);
2399 nn=nn.mid(j,nn.length());
2400 mdef->setName(nn.data());
2402 }//adjustRecordMember
2404 /* strips the prefix for package and package body */
2406 bool VhdlDocGen::writeClassType( ClassDef *& cd,
2407 OutputList &ol ,QCString & cname)
2409 //static ClassDef *prev = 0;
2410 //if (prev == cd) return TRUE;
2411 //if (cd != prev) prev=cd;
2413 int id=cd->protection();
2414 QCString qcs = VhdlDocGen::trTypeString(id+2);
2415 cname=VhdlDocGen::getClassName(cd);
2417 ol.writeString(qcs.data());
2418 ol.writeString(" ");
2420 //ol.insertMemberAlign();
2424 QCString VhdlDocGen::trVhdlType(int type,bool sing)
2428 case VhdlDocGen::LIBRARY:
2429 if (sing) return "Library";
2430 else return "Libraries";
2431 case VhdlDocGen::PACKAGE:
2432 if (sing) return "Package";
2433 else return "Packages";
2434 case VhdlDocGen::SIGNAL:
2435 if (sing) return "Signal";
2436 else return "Signals";
2437 case VhdlDocGen::COMPONENT:
2438 if (sing) return "Component";
2439 else return "Components";
2440 case VhdlDocGen::CONSTANT:
2441 if (sing) return "Constant";
2442 else return "Constants";
2443 case VhdlDocGen::ENTITY:
2444 if (sing) return "Entity";
2445 else return "Entities";
2446 case VhdlDocGen::TYPE:
2447 if (sing) return "Type";
2448 else return "Types";
2449 case VhdlDocGen::SUBTYPE:
2450 if (sing) return "Subtype";
2451 else return "Subtypes";
2452 case VhdlDocGen::FUNCTION:
2453 if (sing) return "Function";
2454 else return "Functions";
2455 case VhdlDocGen::RECORD:
2456 if (sing) return "Record";
2457 else return "Records";
2458 case VhdlDocGen::PROCEDURE:
2459 if (sing) return "Procedure";
2460 else return "Procedures";
2461 case VhdlDocGen::ARCHITECTURE:
2462 if (sing) return "Architecture";
2463 else return "Architectures";
2464 case VhdlDocGen::ATTRIBUTE:
2465 if (sing) return "Attribute";
2466 else return "Attributes";
2467 case VhdlDocGen::PROCESS:
2468 if (sing) return "Process";
2469 else return "Processes";
2470 case VhdlDocGen::PORT:
2471 if (sing) return "Port";
2472 else return "Ports";
2473 case VhdlDocGen::USE:
2474 if (sing) return "use clause";
2475 else return "Use Clauses";
2476 case VhdlDocGen::GENERIC:
2477 if (sing) return "Generic";
2478 else return "Generics";
2479 case VhdlDocGen::PACKAGE_BODY:
2480 return "Package Body";
2481 case VhdlDocGen::UNITS:
2483 case VhdlDocGen::SHAREDVARIABLE:
2484 if (sing) return "Shared Variable";
2485 return "Shared Variables";
2486 case VhdlDocGen::VFILE:
2487 if (sing) return "File";
2489 case VhdlDocGen::GROUP:
2490 if (sing) return "Group";
2492 case VhdlDocGen::INSTANTIATION:
2493 if (sing) return "Instantiation";
2494 else return "Instantiations";
2495 case VhdlDocGen::ALIAS:
2496 if (sing) return "Alias";
2498 case VhdlDocGen::CONFIG:
2499 if (sing) return "Configuration";
2500 return "Configurations";
2501 case VhdlDocGen::MISCELLANEOUS:
2502 return "Miscellaneous";
2503 case VhdlDocGen::UCF_CONST:
2504 return "Constraints";
2510 QCString VhdlDocGen::trDesignUnitHierarchy()
2512 return "Design Unit Hierarchy";
2515 QCString VhdlDocGen::trDesignUnitList()
2517 return "Design Unit List";
2520 QCString VhdlDocGen::trDesignUnitMembers()
2522 return "Design Unit Members";
2525 QCString VhdlDocGen::trDesignUnitListDescription()
2527 return "Here is a list of all design unit members with links to "
2528 "the Entities they belong to:";
2531 QCString VhdlDocGen::trDesignUnitIndex()
2533 return "Design Unit Index";
2536 QCString VhdlDocGen::trDesignUnits()
2538 return "Design Units";
2541 QCString VhdlDocGen::trFunctionAndProc()
2543 return "Functions/Procedures/Processes";
2550 /* do not insert the same component twice */
2552 bool VhdlDocGen::foundInsertedComponent(const QCString & name,Entry* root)
2554 QListIterator<BaseInfo> bii(*root->extends);
2556 for (bii.toFirst();(bi=bii.current());++bii)
2567 /*! writes a link if the string is linkable else a formatted string */
2569 void VhdlDocGen::writeStringLink(const MemberDef *mdef,QCString mem, OutputList& ol)
2573 ClassDef *cd=mdef->getClassDef();
2576 QCString n=cd->name();
2577 MemberDef* memdef=VhdlDocGen::findMember(n,mem);
2578 if (memdef && memdef->isLinkable())
2581 writeLink(memdef,ol);
2588 VhdlDocGen::startFonts(mem,"vhdlchar",ol);
2591 void VhdlDocGen::writeCodeFragment( MemberDef *mdef,OutputList& ol)
2593 // Definition d=(Definition)mdef;
2594 // QCString fdd=mdef->getDefFileExtension();
2595 // QCString scope=mdef->getScopeString();
2596 QCString codeFragment=mdef->documentation();
2597 //FileDef *fd=mdef->getFileDef();
2599 //int start=mdef->getStartBodyLine();
2600 //int end=mdef->getEndBodyLine();
2601 QStringList qsl=QStringList::split("\n",codeFragment);
2604 ol.insertMemberAlign();
2605 int len= qsl.count();
2606 for(int j=0;j<len;j++)
2608 QCString q=qsl[j].utf8();
2609 VhdlDocGen::writeFormatString(q,ol,mdef);
2611 if (j==2) // only the first three lines are shown
2614 VhdlDocGen::writeFormatString(q,ol,mdef);
2620 void VhdlDocGen::writeSource(MemberDef *mdef,OutputList& ol,QCString & cname)
2622 QCString codeFragment=mdef->documentation();
2623 int start=mdef->getStartBodyLine();
2624 QStringList qsl=QStringList::split("\n",codeFragment);
2625 ol.startCodeFragment();
2626 int len = qsl.count();
2627 QCString lineNumber;
2631 lineNumber.sprintf("%05d",start++);
2634 ol.docify(lineNumber.data());
2636 ol.insertMemberAlign();
2637 QCString q=qsl[j].utf8();
2638 VhdlDocGen::writeFormatString(q,ol,mdef);
2641 ol.endCodeFragment();
2643 mdef->writeSourceDef(ol,cname);
2644 mdef->writeSourceRefs(ol,cname);
2645 mdef->writeSourceReffedBy(ol,cname);
2649 QCString VhdlDocGen::convertFileNameToClassName(QCString name)
2657 while((i=n.find("__"))>0)
2662 while((i=n.find("_1"))>0)
2664 n=n.replace(i,2,":");
2670 void VhdlDocGen::parseUCF(const char* input, Entry* entity,QCString fileName,bool altera)
2672 QCString ucFile(input);
2674 QCString newLine="\n";
2675 QCString comment("#!");
2678 while(!ucFile.isEmpty())
2680 int i=ucFile.find("\n");
2683 QCString temp=ucFile.left(i);
2684 temp=temp.stripWhiteSpace();
2685 bool bb=temp.stripPrefix("//");
2687 if (!temp.isEmpty())
2689 if (temp.stripPrefix(comment) )
2692 brief.append("\\n");
2694 else if (!temp.stripPrefix("#") && !bb)
2698 int i=temp.find("-name");
2700 temp=temp.remove(0,i+5);
2702 temp.stripPrefix("set_location_assignment");
2704 initUCF(entity,0,temp,lineNo,fileName,brief);
2708 QRegExp ee("[\\s=]");
2709 int i=temp.find(ee);
2710 QCString ff=temp.left(i);
2711 temp.stripPrefix(ff.data());
2713 if (!temp.isEmpty())
2715 initUCF(entity,ff.data(),temp,lineNo,fileName,brief);
2721 ucFile=ucFile.remove(0,i+1);
2725 static void initUCF(Entry* root,const char* type,QCString & qcs,int line,QCString & fileName,QCString & brief)
2727 if (qcs.isEmpty())return;
2729 QRegExp reg("[\\s=]");
2731 // bool bo=(stricmp(type,qcs.data())==0);
2733 VhdlDocGen::deleteAllChars(qcs,';');
2734 qcs=qcs.stripWhiteSpace();
2736 int i= qcs.find(reg);
2741 VhdlDocGen::deleteAllChars(n,'#');
2748 qcs=qcs.remove(0,i+1);
2749 // qcs.prepend("|");
2751 qcs.stripPrefix("=");
2753 Entry* current=new Entry;
2754 current->spec=VhdlDocGen::UCF_CONST;
2755 current->section=Entry::VARIABLE_SEC;
2756 current->bodyLine=line;
2757 current->fileName=fileName;
2758 current->type="ucf_const";
2760 //current->args=type;
2762 current->lang= SrcLangExt_VHDL ;
2764 // adding dummy name for constraints like VOLTAGE=5,TEMPERATURE=20 C
2768 n+=VhdlDocGen::getRecordNumber();
2771 current->name= n+"_";
2772 current->name.append(VhdlDocGen::getRecordNumber().data());
2774 if (!brief.isEmpty())
2776 current->brief=brief;
2777 current->briefLine=line;
2778 current->briefFile=fileName;
2782 root->addSubEntry(current);
2786 static void writeUCFLink(const MemberDef* mdef,OutputList &ol)
2789 QCString largs(mdef->argsString());
2790 QCString n= VhdlDocGen::splitString(largs, '#');
2791 // VhdlDocGen::adjustRecordMember(mdef);
2792 bool equ=(n.length()==largs.length());
2796 ol.writeString(n.data());
2798 ol.insertMemberAlign();
2801 if (mdef->name().contains("dummy")==0)
2802 VhdlDocGen::writeLink(mdef,ol);
2804 ol.insertMemberAlign();
2806 VhdlDocGen::formatString(largs,ol,mdef);
2809 QCString VhdlDocGen::splitString(QCString& str, char c)
2816 str=str.remove(0,i+1);
2821 bool VhdlDocGen::findConstraintFile(LayoutNavEntry *lne)
2823 FileName *fn=Doxygen::inputNameList->first();
2824 //LayoutNavEntry *cc = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Files);
2826 LayoutNavEntry *kk = lne->parent();// find(LayoutNavEntry::Files);
2827 // LayoutNavEntry *kks = kk->parent();// find(LayoutNavEntry::Files);
2829 QCString co("Constraints");
2831 if (Config_getBool("HAVE_DOT") && Config_getEnum("DOT_IMAGE_FORMAT")=="svg")
2833 QCString ov = theTranslator->trDesignOverview();
2834 QCString ofile("vhdl_design_overview");
2835 LayoutNavEntry *oo=new LayoutNavEntry( lne,LayoutNavEntry::MainPage,true,ofile,ov,"");
2841 FileDef *fd=fn->first();
2842 if (fd->name().contains(".ucf") || fd->name().contains(".qsf"))
2844 file = convertNameToFile(fd->name().data(),FALSE,FALSE);
2845 LayoutNavEntry *ucf=new LayoutNavEntry(lne,LayoutNavEntry::MainPage,TRUE,file,co,"");
2849 fn=Doxygen::inputNameList->next();
2854 void VhdlDocGen::writeAlphbeticalClass(OutputList& ol,const ClassDef* cd,const QCString & cname)
2856 if (cname.contains("::")==0)
2858 ClassDef*oo= VhdlDocGen::findArchitecture(cd);
2859 ol.writeObjectLink(cd->getReference(),
2860 cd->getOutputFileBase(),0,cname);
2864 ol.writeObjectLink(oo->getReference(),
2865 oo->getOutputFileBase(),0,"arch");
2874 // for cell_inst : [entity] work.proto [ (label|expr) ]
2875 QCString VhdlDocGen::parseForConfig(QCString & entity,QCString & arch)
2879 QCString ent("entity");
2880 if (!entity.contains(":")) return "";
2882 QRegExp exp("[:()\\s]");
2883 QStringList ql=QStringList::split(exp,entity,FALSE);
2884 //int ii=ql.findIndex(ent);
2885 assert(ql.count()>=2);
2886 label = ql[0].utf8();
2887 entity = ql[1].utf8();
2888 if ((index=entity.findRev("."))>=0)
2890 entity.remove(0,index+1);
2896 ql=QStringList::split(exp,arch,FALSE);
2897 if (ql.count()>1) // expression
2900 return label; // label
2904 // use (configuration|entity|open) work.test [(cellfor)];
2906 QCString VhdlDocGen::parseForBinding(QCString & entity,QCString & arch)
2909 QRegExp exp("[()\\s]");
2912 QStringList ql=QStringList::split(exp,entity,FALSE);
2914 if (ql.contains("open"))
2919 entity = ql[1].utf8();
2920 if ((index=entity.findRev("."))>=0)
2921 entity.remove(0,index+1);
2928 ClassDef* VhdlDocGen::findArchitecture(QCString identifier, QCString entity_name)
2930 QCString archName=entity_name+"::"+identifier;
2931 return Doxygen::classSDict->find(archName.data());
2935 //@param arch bit0:flipflop
2936 //@param binding e.g entity work.foo(bar)
2937 //@param label |label0|label1
2938 // label0:architecture name
2939 //@param confVhdl of configuration file (identifier::entity_name) or
2940 // the architecture if isInlineConf TRUE
2941 //@param isInlineConf
2942 //@param confN List of configurations
2944 void assignBinding(VhdlConfNode * conf,QCString label)
2946 QList<Entry> instList= getVhdlInstList();
2947 QListIterator<Entry> eli(instList);
2949 ClassDef *archClass;
2950 QCString archName,entityName;
2951 bool allOthers=FALSE;
2953 if (conf->isInlineConf)
2955 archClass=Doxygen::classSDict->find(conf->confVhdl.data());
2959 archName= VhdlDocGen::getIndexWord(label.data(),0);
2960 entityName= VhdlDocGen::getIndexWord(conf->confVhdl.data(),1);
2961 archClass=VhdlDocGen::findArchitecture(archName,entityName);
2966 fprintf(stderr,"\n architecture %s not found ! ",conf->confVhdl.data());
2970 archName=archClass->name();
2972 QCString allOt=VhdlDocGen::getIndexWord(conf->arch.data(),0);
2974 if (allOt=="all" || allOt=="others")
2977 for (;(cur=eli.current());++eli)
2979 if (conf->isInlineConf && (conf->confVhdl!=cur->args))
2982 if (!conf->isInlineConf && (archName!=cur->args))
2985 if (cur->exception==label || conf->isInlineConf)
2987 QCString sign,archy;
2989 if (allOthers==FALSE)
2992 sign=cur->name+":"+cur->type;
2997 archy=VhdlDocGen::getIndexWord(conf->arch.data(),1);
3001 if (archy==sign && !cur->stat)
3003 // fprintf(stderr," \n label [%s] [%s] [%s]",cur->exception.data(),cur->type.data(),cur->name.data());
3004 QCString ent1=conf->binding;
3006 QCString rr=VhdlDocGen::parseForBinding(ent1,arch1);
3007 arch1=ent1+"::"+arch1;
3008 //ClassDef *archBind=Doxygen::classSDict->find(arch1.data());
3009 ClassDef *ent=Doxygen::classSDict->find(ent1.data());
3010 QCString inst=VhdlDocGen::getIndexWord(cur->args.data(),0);
3011 ClassDef *cd=Doxygen::classSDict->find(inst.data());
3013 if (cd==0 || ent==0)
3016 addInstance(ent,archClass,cd,cur);
3024 void assignConfiguration(VhdlConfNode* rootNode,QCString label)
3026 if (rootNode==NULL) return;
3029 if (!rootNode->isBinding())
3031 // printf("\n ARCH %s BIND %s \n",rootNode->arch.data(),rootNode->binding.data());
3032 assignBinding(rootNode,label);
3036 label+="|"+rootNode->arch;
3039 for(iter=0;iter<rootNode->confN.count();iter++)
3041 VhdlConfNode* conf= (VhdlConfNode *)rootNode->confN.at(iter);
3042 assignConfiguration(conf,label);
3053 // file foo_arch.vhd
3054 // architecture xxx of foo is
3059 void VhdlDocGen::computeVhdlComponentRelations()
3062 QCString entity,inst,arch,vhd;
3064 QList<VhdlConfNode> confList = getVhdlConfiguration();
3065 for (uint iter=0;iter<confList.count(); iter++)
3067 VhdlConfNode* conf= (VhdlConfNode *)confList.at(iter);
3068 assignConfiguration(conf,"");
3071 QList<Entry> qsl= getVhdlInstList();
3072 QListIterator<Entry> eli(qsl);
3075 for (eli.toFirst();(cur=eli.current());++eli)
3077 if (cur->stat ) // was bind
3080 if (cur->includeName=="entity" || cur->includeName=="component" )
3082 entity=cur->includeName+" "+cur->type;
3083 QCString rr=VhdlDocGen::parseForBinding(entity,arch);
3085 else if (cur->includeName.isEmpty())
3089 ClassDef *classEntity=Doxygen::classSDict->find(entity);
3090 inst=VhdlDocGen::getIndexWord(cur->args.data(),0);
3091 ClassDef *cd=Doxygen::classSDict->find(inst);
3092 ClassDef *ar=Doxygen::classSDict->find(cur->args);
3094 if (cd==0 || classEntity==0 )
3097 addInstance(classEntity,ar,cd,cur);
3102 static void addInstance(ClassDef* classEntity, ClassDef* ar,
3103 ClassDef *cd , Entry *cur,ClassDef* /*archBind*/)
3105 if (classEntity==cd) return;
3107 QCString bName=classEntity->name();
3108 //printf("addInstance %s to %s\n", cd->name().data(), classEntity->name().data());
3109 QCString n1=cur->type;
3111 if (!cd->isBaseClass(classEntity, true, 0))
3113 cd->insertBaseClass(classEntity,n1,Public,Normal,0);
3117 VhdlDocGen::addBaseClass(cd,classEntity);
3120 if (!VhdlDocGen::isSubClass(classEntity,cd,true,0))
3122 classEntity->insertSubClass(cd,Public,Normal,0);
3127 QCString uu=cur->name;
3128 MemberDef *md=new MemberDef(
3129 ar->getDefFileName(), cur->startLine,
3131 Public, Normal, cur->stat,Member,
3132 MemberDef::Variable,
3136 if (ar->getOutputFileBase())
3140 tg.fileName = ar->getOutputFileBase();
3142 md->setTagInfo(&tg);
3145 //fprintf(stderr,"\n%s%s%s\n",md->name().data(),cur->brief.data(),cur->doc.data());
3147 md->setLanguage(SrcLangExt_VHDL);
3148 md->setMemberSpecifiers(VhdlDocGen::INSTANTIATION);
3149 md->setBriefDescription(cur->brief,cur->briefFile,cur->briefLine);
3150 md->setBodySegment(cur->startLine,-1) ;
3151 md->setDocumentation(cur->doc.data(),cur->docFile.data(),cur->docLine);
3152 FileDef *fd=ar->getFileDef();
3154 ar->insertMember(md);
3155 // printf("\nMemberreference [%p]",md);
3159 void VhdlDocGen::writeRecorUnit(QCString & largs,OutputList& ol ,const MemberDef *mdef)
3161 QStringList ql=QStringList::split("#",largs,FALSE);
3162 uint len=ql.count();
3163 for(uint i=0;i<len;i++)
3165 QCString n=ql[i].utf8();
3166 VhdlDocGen::formatString(n,ol,mdef);
3167 if ((len-i)>1) ol.lineBreak();
3172 void VhdlDocGen::writeRecUnitDocu(
3173 const MemberDef *md,
3179 QStringList ql=QStringList::split("#",largs,FALSE);
3180 uint len=ql.count();
3181 ol.startParameterList(TRUE);
3183 for(uint i=0;i<len;i++)
3185 QCString n=ql[i].utf8();
3186 ol.startParameterType(first,"");
3187 VhdlDocGen::formatString(n,ol,md);
3190 ol.endParameterName(FALSE,FALSE,FALSE);
3194 ol.endParameterName(TRUE,FALSE,TRUE);
3201 void VhdlDocGen::writeCodeFragment(OutputList& ol,int start, QCString & codeFragment,const MemberDef* mdef)
3203 QStringList qsl=QStringList::split("\n",codeFragment);
3204 ol.startCodeFragment();
3205 int len = qsl.count();
3206 QCString lineNumber;
3210 lineNumber.sprintf("%05d",start++);
3213 ol.docify(lineNumber.data());
3215 ol.insertMemberAlign();
3216 QCString q=qsl[j].utf8();
3217 VhdlDocGen::writeFormatString(q,ol,mdef);
3220 ol.endCodeFragment();
3223 bool VhdlDocGen::isSubClass(ClassDef* cd,ClassDef *scd, bool followInstances,int level)
3226 //printf("isBaseClass(cd=%s) looking for %s\n",name().data(),bcd->name().data());
3229 err("Possible recursive class relation while inside %s and looking for %s\n",qPrint(cd->name()),qPrint(scd->name()));
3234 if (cd->subClasses())
3236 // Beware: trying to optimise the iterator away using ->first() & ->next()
3237 // causes bug 625531
3238 BaseClassListIterator bcli(*cd->subClasses());
3239 for ( ; bcli.current() && !found ; ++bcli)
3241 ClassDef *ccd=bcli.current()->classDef;
3242 if (!followInstances && ccd->templateMaster()) ccd=ccd->templateMaster();
3243 //printf("isSubClass() subclass %s\n",ccd->name().data());
3252 found=ccd->isBaseClass(scd,followInstances,level+1);
3260 void VhdlDocGen::addBaseClass(ClassDef* cd,ClassDef *ent)
3262 if (cd->baseClasses())
3264 BaseClassListIterator bcli(*cd->baseClasses());
3265 for ( ; bcli.current() ; ++bcli)
3267 ClassDef *ccd=bcli.current()->classDef;
3270 QCString n = bcli.current()->usedName;
3271 int i = n.find('(');
3274 bcli.current()->usedName.append("(2)");
3277 static QRegExp reg("[0-9]+");
3278 QCString s=n.left(i);
3279 QCString r=n.right(n.length()-i);
3281 VhdlDocGen::deleteAllChars(r,')');
3282 VhdlDocGen::deleteAllChars(r,'(');
3283 r.setNum(r.toInt()+1);
3284 t.replace(reg,r.data());
3286 bcli.current()->usedName=s;
3287 bcli.current()->templSpecifiers=t;