Blame src/vhdldocgen.h

Packit 1c1d7e
/******************************************************************************
Packit 1c1d7e
 *
Packit 1c1d7e
 * Copyright (C) 1997-2015 by Dimitri van Heesch.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Permission to use, copy, modify, and distribute this software and its
Packit 1c1d7e
 * documentation under the terms of the GNU General Public License is hereby 
Packit 1c1d7e
 * granted. No representations are made about the suitability of this software 
Packit 1c1d7e
 * for any purpose. It is provided "as is" without express or implied warranty.
Packit 1c1d7e
 * See the GNU General Public License for more details.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Documents produced by Doxygen are derivative works derived from the
Packit 1c1d7e
 * input used in their production; they are not affected by this license.
Packit 1c1d7e
 *
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
#ifndef VHDLDOCGEN_H
Packit 1c1d7e
#define VHDLDOCGEN_H
Packit 1c1d7e
Packit 1c1d7e
/** 
Packit 1c1d7e
 * This class implements functions for parsing and generating 
Packit 1c1d7e
 * vhdl documents
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
#include <qdict.h>
Packit 1c1d7e
#include <qcstring.h>
Packit 1c1d7e
#include "layout.h"
Packit 1c1d7e
#include "arguments.h"
Packit 1c1d7e
#include "entry.h"
Packit 1c1d7e
Packit 1c1d7e
class Entry;
Packit 1c1d7e
class ClassDef;
Packit 1c1d7e
class MemberList;
Packit 1c1d7e
class MemberDef;
Packit 1c1d7e
class FTextStream;
Packit 1c1d7e
class OutputList;
Packit 1c1d7e
class Definition;
Packit 1c1d7e
class GroupDef;
Packit 1c1d7e
class FileDef;
Packit 1c1d7e
class NamespaceDef;
Packit 1c1d7e
struct Argument;
Packit 1c1d7e
Packit 1c1d7e
/** Class for generating documentation specific for VHDL */
Packit 1c1d7e
class VhdlDocGen  
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
Packit 1c1d7e
    enum VhdlClasses       // Overlays: Protection
Packit 1c1d7e
    {
Packit 1c1d7e
      ENTITYCLASS,         // Overlays: Public
Packit 1c1d7e
      PACKBODYCLASS,       // Overlays: Protected
Packit 1c1d7e
      ARCHITECTURECLASS,   // Overlays: Private
Packit 1c1d7e
      PACKAGECLASS         // Overlays: Package
Packit 1c1d7e
    };
Packit 1c1d7e
Packit 1c1d7e
    enum VhdlKeyWords
Packit 1c1d7e
    {
Packit 1c1d7e
      LIBRARY=1,
Packit 1c1d7e
      ENTITY,
Packit 1c1d7e
      PACKAGE_BODY,
Packit 1c1d7e
      ARCHITECTURE,
Packit 1c1d7e
      PACKAGE,
Packit 1c1d7e
      ATTRIBUTE,
Packit 1c1d7e
      SIGNAL,
Packit 1c1d7e
      COMPONENT,
Packit 1c1d7e
      CONSTANT,
Packit 1c1d7e
      TYPE,
Packit 1c1d7e
      SUBTYPE,
Packit 1c1d7e
      FUNCTION,
Packit 1c1d7e
      RECORD,
Packit 1c1d7e
      PROCEDURE,
Packit 1c1d7e
      USE,
Packit 1c1d7e
      PROCESS,
Packit 1c1d7e
      PORT,
Packit 1c1d7e
      UNITS,	  
Packit 1c1d7e
      GENERIC,
Packit 1c1d7e
      INSTANTIATION,
Packit 1c1d7e
      GROUP,
Packit 1c1d7e
      VFILE,   
Packit 1c1d7e
      SHAREDVARIABLE,
Packit 1c1d7e
      CONFIG,
Packit 1c1d7e
      ALIAS,
Packit 1c1d7e
      MISCELLANEOUS,
Packit 1c1d7e
      UCF_CONST
Packit 1c1d7e
    };
Packit 1c1d7e
Packit 1c1d7e
    VhdlDocGen();
Packit 1c1d7e
    virtual ~VhdlDocGen();
Packit 1c1d7e
    static void init();
Packit 1c1d7e
    static QCString convertFileNameToClassName(QCString name);
Packit 1c1d7e
    // --- used by vhdlscanner.l -----------
Packit 1c1d7e
    
Packit 1c1d7e
    static bool isSubClass(ClassDef* cd,ClassDef *scd, bool followInstances,int level);
Packit 1c1d7e
Packit 1c1d7e
    static QCString getIndexWord(const char* ,int index);
Packit 1c1d7e
    static bool     deleteCharRev(QCString &s,char c);
Packit 1c1d7e
    static void     deleteAllChars(QCString &s,char c);
Packit 1c1d7e
    static void     parseFuncProto(const char* text,
Packit 1c1d7e
                                   QList<Argument>& , 
Packit 1c1d7e
                                   QCString& name,
Packit 1c1d7e
                                   QCString& ret,
Packit 1c1d7e
                                   bool doc=false);
Packit 1c1d7e
    // -----------------------------------
Packit 1c1d7e
Packit 1c1d7e
    static void computeVhdlComponentRelations();
Packit 1c1d7e
Packit 1c1d7e
    static QCString* findKeyWord(const QCString& word);
Packit 1c1d7e
Packit 1c1d7e
    static ClassDef* getPackageName(const QCString& name);
Packit 1c1d7e
    static MemberDef* findMember(const QCString& className, 
Packit 1c1d7e
                                 const QCString& memName);
Packit 1c1d7e
    static void findAllPackages(ClassDef*);
Packit 1c1d7e
    static MemberDef* findMemberDef(ClassDef* cd,
Packit 1c1d7e
                                const QCString& key,
Packit 1c1d7e
                                MemberListType type);
Packit 1c1d7e
    static ClassDef *getClass(const char *name);
Packit 1c1d7e
    static MemberDef* findFunction(const QList<Argument> &ql,
Packit 1c1d7e
                                   const QCString& name,
Packit 1c1d7e
                                   const QCString& package, bool type);
Packit 1c1d7e
    static QCString getClassTitle(const ClassDef*);
Packit 1c1d7e
    static void writeInlineClassLink(const ClassDef*,
Packit 1c1d7e
                                     OutputList &ol);
Packit 1c1d7e
    static void writeTagFile(MemberDef *mdef,FTextStream &tagFile);
Packit 1c1d7e
Packit 1c1d7e
    static bool isConstraint(const MemberDef *mdef);
Packit 1c1d7e
    static bool isConfig(const MemberDef *mdef);
Packit 1c1d7e
    static bool isAlias(const MemberDef *mdef);
Packit 1c1d7e
    static bool isLibrary(const MemberDef *mdef);
Packit 1c1d7e
    static bool isGeneric(const MemberDef *mdef);
Packit 1c1d7e
    static bool isPort(const MemberDef *mdef);
Packit 1c1d7e
    static bool isComponent(const MemberDef *mdef);
Packit 1c1d7e
    static bool isPackage(const MemberDef *mdef);
Packit 1c1d7e
    static bool isEntity(const MemberDef *mdef);
Packit 1c1d7e
    static bool isConstant(const MemberDef *mdef);
Packit 1c1d7e
    static bool isVType(const MemberDef *mdef);
Packit 1c1d7e
    static bool isSubType(const MemberDef *mdef);
Packit 1c1d7e
    static bool isVhdlFunction(const MemberDef *mdef);
Packit 1c1d7e
    static bool isProcess(const MemberDef *mdef);
Packit 1c1d7e
    static bool isSignal(const MemberDef *mdef);
Packit 1c1d7e
    static bool isAttribute(const MemberDef *mdef);
Packit 1c1d7e
    static bool isSignals(const MemberDef *mdef);
Packit 1c1d7e
    static bool isProcedure(const MemberDef *mdef);
Packit 1c1d7e
    static bool isRecord(const MemberDef *mdef);
Packit 1c1d7e
    static bool isArchitecture(const MemberDef *mdef);
Packit 1c1d7e
    static bool isUnit(const MemberDef *mdef);
Packit 1c1d7e
    static bool isPackageBody(const MemberDef *mdef);
Packit 1c1d7e
    static bool isVariable(const MemberDef *mdef);
Packit 1c1d7e
    static bool isFile(const MemberDef *mdef);
Packit 1c1d7e
    static bool isGroup(const MemberDef *mdef);
Packit 1c1d7e
    static bool isCompInst(const MemberDef *mdef);
Packit 1c1d7e
    static bool isMisc(const MemberDef *mdef);
Packit 1c1d7e
Packit 1c1d7e
    //-----------------------------------------------------
Packit 1c1d7e
    // translatable items
Packit 1c1d7e
    
Packit 1c1d7e
    static QCString trTypeString(uint64 type);
Packit 1c1d7e
    static QCString trVhdlType(uint64 type,bool sing=true);
Packit 1c1d7e
Packit 1c1d7e
    // trClassHierarchy.
Packit 1c1d7e
    static QCString trDesignUnitHierarchy();
Packit 1c1d7e
Packit 1c1d7e
    // trCompoundList
Packit 1c1d7e
    static QCString trDesignUnitList();
Packit 1c1d7e
Packit 1c1d7e
    // trCompoundMembers.
Packit 1c1d7e
    static QCString trDesignUnitMembers();
Packit 1c1d7e
Packit 1c1d7e
    // trCompoundListDescription
Packit 1c1d7e
    static QCString trDesignUnitListDescription();
Packit 1c1d7e
Packit 1c1d7e
    // trCompounds
Packit 1c1d7e
    static QCString trDesignUnits();
Packit 1c1d7e
Packit 1c1d7e
    // trCompoundIndex
Packit 1c1d7e
    static QCString trDesignUnitIndex();
Packit 1c1d7e
Packit 1c1d7e
    // trFunctions
Packit 1c1d7e
    static QCString trFunctionAndProc();
Packit 1c1d7e
Packit 1c1d7e
    //-----------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
    static void prepareComment(QCString&);
Packit 1c1d7e
    static void formatString(const QCString&,OutputList& ol,const MemberDef*);
Packit 1c1d7e
Packit 1c1d7e
    static void writeFormatString(const QCString&,OutputList& ol,const MemberDef*);
Packit 1c1d7e
    static void writeFunctionProto(OutputList& ol,const ArgumentList *al,const MemberDef*);
Packit 1c1d7e
    static void writeProcessProto(OutputList& ol,const ArgumentList *al,const MemberDef*);
Packit 1c1d7e
    static void writeProcedureProto(OutputList& ol, const ArgumentList *al,const MemberDef*);
Packit 1c1d7e
    static bool writeFuncProcDocu(const MemberDef *mdef, OutputList& ol,const ArgumentList* al,bool type=false);
Packit 1c1d7e
    static void writeRecordProto(const MemberDef *mdef, OutputList& ol,const ArgumentList *al);
Packit 1c1d7e
Packit 1c1d7e
    static bool writeVHDLTypeDocumentation(const MemberDef* mdef, const Definition* d, OutputList &ol);
Packit 1c1d7e
Packit 1c1d7e
    static void writeVhdlDeclarations(MemberList*,OutputList&,GroupDef*,ClassDef*,FileDef*,NamespaceDef*);
Packit 1c1d7e
Packit 1c1d7e
    static void writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
Packit 1c1d7e
        ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
Packit 1c1d7e
        bool inGroup);
Packit 1c1d7e
Packit 1c1d7e
    static void writePlainVHDLDeclarations(MemberList* ml,OutputList &ol,
Packit 1c1d7e
        ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,int specifier);
Packit 1c1d7e
Packit 1c1d7e
    static void writeVHDLDeclarations(MemberList* ml,OutputList &ol,
Packit 1c1d7e
        ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
Packit 1c1d7e
        const char *title,const char *subtitle,bool showEnumValues,int type);
Packit 1c1d7e
Packit 1c1d7e
    static bool writeClassType(ClassDef *&,OutputList &ol ,QCString & cname);
Packit 1c1d7e
Packit 1c1d7e
    static QCString convertArgumentListToString(const ArgumentList* al,bool f);
Packit 1c1d7e
    static QCString getProcessNumber();
Packit 1c1d7e
    static QCString getRecordNumber();
Packit 1c1d7e
   
Packit 1c1d7e
    static QCString getClassName(const ClassDef*);
Packit 1c1d7e
    static bool isNumber(const QCString& s);
Packit 1c1d7e
    static QCString getProtectionName(int prot);
Packit 1c1d7e
Packit 1c1d7e
    static void parseUCF(const char*  input,Entry* entity,QCString f,bool vendor);
Packit 1c1d7e
    static bool findConstraintFile( LayoutNavEntry *lne);
Packit 1c1d7e
Packit 1c1d7e
    static ClassDef*  findArchitecture(const ClassDef *cd);
Packit 1c1d7e
    static ClassDef*  findArchitecture(QCString identifier, QCString entity_name);
Packit 1c1d7e
Packit 1c1d7e
    
Packit 1c1d7e
    static void writeSource(MemberDef *mdef,OutputList& ol,QCString & cname);
Packit 1c1d7e
    static void writeAlphbeticalClass(OutputList& ol,const ClassDef* cd,const QCString &);
Packit 1c1d7e
Packit 1c1d7e
    static QCString  parseForConfig(QCString & entity,QCString & arch);
Packit 1c1d7e
    static QCString  parseForBinding(QCString & entity,QCString & arch);
Packit 1c1d7e
    static void addBaseClass(ClassDef* cd,ClassDef *ent);
Packit 1c1d7e
    static ClassDef* findVhdlClass(const char *className );
Packit 1c1d7e
Packit 1c1d7e
    static void writeOverview(OutputList &ol);
Packit 1c1d7e
    static void writeOverview();
Packit 1c1d7e
 
Packit 1c1d7e
 // flowcharts
Packit 1c1d7e
    static void createFlowChart(const MemberDef*);
Packit 1c1d7e
    //static void addFlowImage(const FTextStream &,const QCString &);
Packit 1c1d7e
    
Packit 1c1d7e
    static void setFlowMember( const MemberDef *flowMember);
Packit 1c1d7e
    static const MemberDef *getFlowMember();
Packit 1c1d7e
Packit 1c1d7e
    static  bool isVhdlClass (const Entry *cu) 
Packit 1c1d7e
    {
Packit 1c1d7e
      return cu->spec==VhdlDocGen::ENTITY       ||
Packit 1c1d7e
             cu->spec==VhdlDocGen::PACKAGE      ||
Packit 1c1d7e
             cu->spec==VhdlDocGen::ARCHITECTURE ||
Packit 1c1d7e
             cu->spec==VhdlDocGen::PACKAGE_BODY;
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
  static void resetCodeVhdlParserState();
Packit 1c1d7e
Packit 1c1d7e
  private:
Packit 1c1d7e
    static void findAllArchitectures(QList<QCString>& ql,const ClassDef *cd);
Packit 1c1d7e
    static bool compareArgList(ArgumentList*,ArgumentList*);
Packit 1c1d7e
    static void writeVhdlLink(const ClassDef* cdd ,OutputList& ol,QCString& type,QCString& name,QCString& beh);
Packit 1c1d7e
    static void writeStringLink(const MemberDef *mdef,QCString mem,OutputList& ol);
Packit 1c1d7e
    static void writeRecUnitDocu( const MemberDef *md, OutputList& ol,QCString largs);
Packit 1c1d7e
    static void  writeRecorUnit(QCString & largs,OutputList& ol ,const MemberDef *mdef);
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
//-------------------------------------------------------------------------------------------------------------------
Packit 1c1d7e
//-------------- VHDL Flowcharts -------------------------------------------------------------------------------
Packit 1c1d7e
//-------------------------------------------------------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
//#define DEBUGFLOW
Packit 1c1d7e
Packit 1c1d7e
class FlowChart
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
    enum nodeTypes {
Packit 1c1d7e
      IF_NO        = 1<<1,
Packit 1c1d7e
      ELSIF_NO     = 1<<2,
Packit 1c1d7e
      ELSE_NO      = 1<<3,
Packit 1c1d7e
      CASE_NO      = 1<<4,
Packit 1c1d7e
      WHEN_NO      = 1<<5,
Packit 1c1d7e
      EXIT_NO      = 1<<6,
Packit 1c1d7e
      END_NO       = 1<<7,
Packit 1c1d7e
      TEXT_NO      = 1<<8,
Packit 1c1d7e
      START_NO     = 1<<9,
Packit 1c1d7e
      ENDIF_NO     = 1<<10,
Packit 1c1d7e
      FOR_NO       = 1<<11,
Packit 1c1d7e
      WHILE_NO     = 1<<12,
Packit 1c1d7e
      END_LOOP     = 1<<13,
Packit 1c1d7e
      END_CASE     = 1<<14,
Packit 1c1d7e
      VARIABLE_NO  = 1<<15,
Packit 1c1d7e
      RETURN_NO    = 1<<16,
Packit 1c1d7e
      LOOP_NO      = 1<<17,
Packit 1c1d7e
      NEXT_NO      = 1<<18,
Packit 1c1d7e
      EMPTY_NO     = 1<<19,
Packit 1c1d7e
      COMMENT_NO   = 1<<20,
Packit 1c1d7e
      BEGIN_NO     = 1<<21
Packit 1c1d7e
    };
Packit 1c1d7e
Packit 1c1d7e
    //---------- create svg ------------------------------------------------------------- 
Packit 1c1d7e
    static void createSVG();
Packit 1c1d7e
    static void startDot(FTextStream &t);
Packit 1c1d7e
    static void endDot(FTextStream &t);
Packit 1c1d7e
    static void codify(FTextStream &t,const char *str);
Packit 1c1d7e
    static void writeShape(FTextStream &t,const FlowChart* fl);
Packit 1c1d7e
    static void writeEdge(FTextStream &t,int fl_from,int fl_to,int i,bool bFrom=FALSE,bool bTo=FALSE);
Packit 1c1d7e
    static void writeEdge(FTextStream &t,const FlowChart* fl_from,const FlowChart* fl_to,int i);
Packit 1c1d7e
    static void writeFlowLinks(FTextStream &t);
Packit 1c1d7e
Packit 1c1d7e
    static QCString getNodeName(int n);
Packit 1c1d7e
    static void colTextNodes();
Packit 1c1d7e
Packit 1c1d7e
    static int getNextTextLink(const FlowChart* fl,uint index);
Packit 1c1d7e
    static int getNextIfLink(const FlowChart*,uint);
Packit 1c1d7e
    static int getNextNode(int,int);
Packit 1c1d7e
    static int findNode(int index,int stamp,int type);
Packit 1c1d7e
    static int findNode(int index,int type);
Packit 1c1d7e
    static int findNextLoop(int j,int stamp);
Packit 1c1d7e
    static int findPrevLoop(int j,int stamp,bool endif=FALSE);
Packit 1c1d7e
    static int findLabel(int j,QCString &);
Packit 1c1d7e
    static void delFlowList();
Packit 1c1d7e
    static const char* getNodeType(int c);
Packit 1c1d7e
Packit 1c1d7e
    static void addFlowChart(int type,const char* text,const char* exp,const char * label=0);
Packit 1c1d7e
    static void moveToPrevLevel();
Packit 1c1d7e
    static int getTimeStamp();
Packit 1c1d7e
    static void writeFlowChart();
Packit 1c1d7e
    static void alignFuncProc(QCString & q,const ArgumentList*  al,bool isFunc);
Packit 1c1d7e
    static QCString convertNameToFileName();
Packit 1c1d7e
    static void printNode(const FlowChart* n);
Packit 1c1d7e
    static void printFlowTree();
Packit 1c1d7e
    static void buildCommentNodes(FTextStream &t);
Packit 1c1d7e
    static void alignCommentNode(FTextStream &t,QCString com);
Packit 1c1d7e
Packit 1c1d7e
    static void  printUmlTree();
Packit 1c1d7e
    static QCString printPlantUmlNode(const FlowChart *flo,bool,bool);
Packit 1c1d7e
Packit 1c1d7e
    static QList<FlowChart> flowList;
Packit 1c1d7e
Packit 1c1d7e
    FlowChart(int typ,const char*  t,const char* ex,const char* label=0);
Packit 1c1d7e
    ~FlowChart();
Packit 1c1d7e
Packit 1c1d7e
private:
Packit 1c1d7e
    int id;
Packit 1c1d7e
    int stamp;
Packit 1c1d7e
    int type;
Packit 1c1d7e
Packit 1c1d7e
    int line;
Packit 1c1d7e
Packit 1c1d7e
    QCString label;
Packit 1c1d7e
    QCString text;
Packit 1c1d7e
    QCString exp;
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
#endif