Sophie

Sophie

distrib > Fedora > 14 > x86_64 > media > updates > by-pkgid > ffa1e6f5ad04360808fe8840fe3ba036 > files > 284

vrq-devel-1.0.88-1.fc14.i686.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>vrq: Example Plugin</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
  <table border="0" cellspacing="0" cellpadding="0" width="100%">
   <tr>
    <td width="180"><a href="index.html"><img src="vrq.png" width="150" height="100" border="0" alt="vrq"></a></td>
    <td background="top_bg.png" align="right" width="100%">
      <img src="glyth.png" width="500" height="100" border="0" alt="">
    </td>
   </tr>
   <tr>
    <td background="#FFFFFF" align="right" width="50" height="4"></td>
   </tr>
  </table>
</head><body>
<!-- Generated by Doxygen 1.7.1 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
      <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
</div>
<div class="header">
  <div class="headertitle">
<h1>Example Plugin </h1>  </div>
</div>
<div class="contents">
<p>This example plugin searches the parsed code and finds register and net declarations and references.</p>
<p>A report of whether the variables are declared and how many times they are referenced is printed. It also issues warnings for any variables that are declared but not referenced.</p>
<p>The makefile for building the plugin (for linux based systems) follows (Makefile-example1): </p>
<div class="fragment"><pre class="fragment">#/*-----------------------------------------------------------------------------
# * 	Copyright (c) 1997-2009 Mark Hummel DBA Raquette Software.
# *		All rights reserved
# *
# *    This file contains source code written by Raquette Software, 
# *    68 Stewart Street, Franklin MA 02038. It may not be used without 
# *    express written permission. The expression of the information 
# *    contained herein is protected under federal copyright laws and 
# *    all copying without permission is prohibited and may be subject 
# *    to criminal penalties. The Author assumes no responsibility for 
# *    errors, omissions, or damages caused by the use of these programs 
# *    or from use of the information contained herein.
# *
# *-----------------------------------------------------------------------------
# */

#
# Extract installation flags and paths for vrq
#
VRQ_VERSION = $(shell vrq --version|head -n 1|cut -c 5-|cut -d , -f1)
PLUGIN_DIR = $(shell vrq --pkglibdir)
INCLUDE_DIR = $(shell vrq --includedir)
CXXFLAGS = $(shell vrq --cflags)
LDFLAGS = $(shell vrq --ldflags)

#
# name of plugin
#
PLUGIN=example1

#
# Build object file
#
all:	$(PLUGIN).so

$(PLUGIN).o: $(PLUGIN).cc $(PLUGIN).h
	$(CXX) -I . -I $(INCLUDE_DIR) $(CXXFLAGS) \
		-DVRQ_VERSION=\"$(VRQ_VERSION)\" -c $&lt;  -fPIC -DPIC -o $@ 

#
# Build DLL
#
$(PLUGIN).so: $(PLUGIN).o
	$(CXX) $(LDFLAGS) -shared $&lt; -Wl,-soname -Wl,$@ -o $@

#
# Install plugin
#
install: $(PLUGIN).so
	install -c '$&lt;' $(PLUGIN_DIR)

#
# Print installation flags and paths
#
env:
	echo "VRQ_VERSION: $(VRQ_VERSION)"
	echo "PLUGIN_DIR: $(PLUGIN_DIR)"
	echo "INCLUDE_DIR: $(INCLUDE_DIR)"
	echo "CXXFLAGS: $(CXXFLAGS)"
	echo "LDFLAGS: $(LDFLAGS)"

#
# remove built files
#
clean:
	-rm $(PLUGIN).o $(PLUGIN).so


</pre></div><p>The header file for the plugin is below (example1.h): </p>
<div class="fragment"><pre class="fragment">/*-----------------------------------------------------------------------------
 * 	Copyright (c) 1997-2009 Mark Hummel DBA Raquette Software.
 *		All rights reserved
 *
 *    This file contains source code written by Raquette Software, 
 *    68 Stewart Street, Franklin MA 02038. It may not be used without 
 *    express written permission. The expression of the information 
 *    contained herein is protected under federal copyright laws and 
 *    all copying without permission is prohibited and may be subject 
 *    to criminal penalties. The Author assumes no responsibility for 
 *    errors, omissions, or damages caused by the use of these programs 
 *    or from use of the information contained herein.
 *
 *-----------------------------------------------------------------------------
 */
/******************************************************************************
 *
 *
 *	   example1.h
 *	   - example plugin
 *		- 
 *
 ******************************************************************************
 */

#ifndef EXAMPLE1_H 
#define EXAMPLE1_H 

/*
 * include vrq headers
 */
#include "plugin.h"
#include &lt;map&gt;

/*
 * Plugin tools implement a subclass of CBackend.
 */
class CExample1 : public CBackend 
{
private:
    Message* mVIDNR;	// error message object
    int listNets;	// non-zero if +example-list-nets has
			// been specified
    int listRegs;	// non-zero if +example-list-regs has 
			// been specified
public:
    /*
     * data structure used to record variable info
     */
    struct DeclRecord {
	CDecl*   decl;	    // declaration object
	CModule* module;    // containing module
	int      refCount;  // number of references to declaration
	int      declared;  // variable has been explicitly declared
    };
private:
	map&lt;CDecl*,DeclRecord&gt; decl2Record; // map of variable to 
					    // info data structure.
public:
	/*
 	 * Methods
 	 */
	CExample1( void );
	virtual char* GetToolName( void );
	virtual char* GetToolDescription( void );
        virtual int AcceptAllPlusArgs( void );
        virtual int HideTool();
        virtual int IgnoreVrqComments();
	virtual int ResolveModules();
	virtual int ResolveInstance( CModule*, CInstance* );
	virtual void Activate();
	virtual void Process( list&lt;CElement&gt;&amp; inputList,
			      list&lt;CElement&gt;&amp; outputList );
};

#endif // EXAMPLE1_H
</pre></div><p>The source for the plugin follows (example1.cc): </p>
<div class="fragment"><pre class="fragment">/*-----------------------------------------------------------------------------
 * 	Copyright (c) 1997-2009 Mark Hummel DBA Raquette Software.
 *		All rights reserved
 *
 *    This file contains source code written by Raquette Software, 
 *    68 Stewart Street, Franklin MA 02038. It may not be used without 
 *    express written permission. The expression of the information 
 *    contained herein is protected under federal copyright laws and 
 *    all copying without permission is prohibited and may be subject 
 *    to criminal penalties. The Author assumes no responsibility for 
 *    errors, omissions, or damages caused by the use of these programs 
 *    or from use of the information contained herein.
 *
 *-----------------------------------------------------------------------------
 */
/******************************************************************************
 *
 *
 *	   example1.cc
 *	   - methods for example plugin
 *
 ******************************************************************************
 */
						

#include "example1.h"

/************************************************
 	CreateToolInstance
	- entry point for dll. Vrq will 
	  call this entry point (must be C code)
	  to create and initialize the tool.
	  If tool creation fails, return NULL and
	  vrq will ignore DLL.
 ************************************************/
extern "C" {
    CBackend* CreateToolInstance()
    {
	/*
 	 * Only initialize the tool if it was built for
 	 * the running version of vrq.
 	 */
        if( strcmp( VRQ_VERSION, VrqVersionString() ) ) {
    	    return NULL;
        }
	/*
 	 * Create tool and return it.
 	 */
        return new CExample1();
    }
}

/************************************************
 	Constructor
	- Initialize tool
 ************************************************/
CExample1::CExample1( ) 
{
     /*
      * Initialize local variables
      */
     listNets = 0;
     listRegs = 0;

     /*
      * Register switches (plus args) for use in the vrq help system
      */
     RegisterSwitch("+example1-list-nets", "print list of declared nets");
     RegisterSwitch("+example1-list-regs", "print list of declared regs");

     /*
      * Predeclare all the warning and error messages for later use.
      */
     mVIDNR = Message::RegisterWarning( this, Message::eWARNING,
	 	"VIDNR", "variable '%s::%s' is declared but not referenced\n",
		 "&lt;module&gt;", "&lt;variable&gt;" );
}

/************************************************
	AcceptAllPlusArgs
 	- return TRUE if tool accepts arbitrary
	  plusargs.
 ************************************************/
int CExample1::AcceptAllPlusArgs( void ) 
{ 
    /*
     * Tool does not support arbitary plusargs
     */
    return FALSE; 
}

/************************************************
	HideTool
	- return TRUE if tool should be hidden
	  from help system. This allows a tool
	  to be functional and hidden.
 ***********************************************/
int CExample1::HideTool() 
{ 
    return FALSE;
}

/************************************************
	IgnoreVrqComments
	- return TRUE if tool requires lexer to
	  treat vrq translate_on/off pragmas
	  as pure comments.
 ***********************************************/
int CExample1::IgnoreVrqComments() 
{ 
    return FALSE; 
}

/************************************************
	ResolveModules
	- return TRUE if tool requires all
	  module references to be resolved.
	  This is done by search specified
	  library search paths.
 ***********************************************/
int CExample1::ResolveModules() 
{ 
    return FALSE;
}

/************************************************
	ResolveInstance
	- return TRUE if tool requires the
	  given module reference to be resolved.
	  This is allows a tool to implement a
	  fine grain filter on what must be resolved.
	  Note this only called if ResolvedModules
	  returns TRUE.
 ***********************************************/
int CExample1::ResolveInstance( CModule*, CInstance* ) 
{
    return FALSE;
}

/************************************************
	Activate
	- This routine is called before a tool
	  is invoked. It is only called once
	  and will only be called if the tool
	  will be used in a pipeline.
 ***********************************************/
void CExample1::Activate() 
{
}


/************************************************
	GetToolName
 	- return name of tool
 ************************************************/
char* CExample1::GetToolName( void )
{
    static char	toolName[] = "example1";

    return toolName;
}

/************************************************
	GetToolDescription
 	- return description of tool. This
	  text is used in vrq help text, man pages, etc.
 ************************************************/
char* CExample1::GetToolDescription( void )
{
    static char	toolDescription[] = "Example plugin that dumps a"
				    " list of declare registers or nets";

    return toolDescription;
}

/************************************************
	FindDecls
	- callback routine used to gather a list of 
	  variable statistics. 	
 ***********************************************/
static CModule* currentModule = NULL;
int FindDecls( CNode* n, void* arg )
{
    map&lt;CDecl*,CExample1::DeclRecord&gt;* d2r = 
			(map&lt;CDecl*,CExample1::DeclRecord&gt;*)arg;
    CDecl* decl;

    switch( n-&gt;GetOp() ) {
    case eMODULE_DEF:
	currentModule = n-&gt;Arg&lt;CModule*&gt;(0);
	break;
    case ePORT_DECL:
	decl = n-&gt;Arg&lt;CPortDir*&gt;(0)-&gt;GetDecl();
	if( decl ) {
	    if( d2r-&gt;find(decl) == d2r-&gt;end() ) {
	        (*d2r)[decl].decl     = decl;
	        (*d2r)[decl].module   = NULL;
	        (*d2r)[decl].declared = 0;
	        (*d2r)[decl].refCount = 0;
	        (*d2r)[decl].module   = currentModule;
	    }
	    (*d2r)[decl].declared = 1;
	    (*d2r)[decl].refCount++;
	    (*d2r)[decl].module = currentModule;
	}
	break;
    case eREG_DECL: 
	decl = n-&gt;Arg&lt;CReg*&gt;(0);
	if( d2r-&gt;find(decl) == d2r-&gt;end() ) {
	    (*d2r)[decl].decl     = decl;
	    (*d2r)[decl].module   = NULL;
	    (*d2r)[decl].declared = 0;
	    (*d2r)[decl].refCount = 0;
	    (*d2r)[decl].module   = currentModule;
	}
	(*d2r)[decl].declared = 1;
	break;
    case eNET_DECL:
	decl = n-&gt;Arg&lt;CNet*&gt;(0);
	if( d2r-&gt;find(decl) == d2r-&gt;end() ) {
	    (*d2r)[decl].decl     = decl;
	    (*d2r)[decl].module   = NULL;
	    (*d2r)[decl].declared = 0;
	    (*d2r)[decl].refCount = 0;
	    (*d2r)[decl].module   = currentModule;
	}
	(*d2r)[decl].declared = 1;
	break;
    case eREG_REF:
	decl = n-&gt;Arg&lt;CReg*&gt;(0);
	if( d2r-&gt;find(decl) == d2r-&gt;end() ) {
	    (*d2r)[decl].decl     = decl;
	    (*d2r)[decl].module   = NULL;
	    (*d2r)[decl].declared = 0;
	    (*d2r)[decl].refCount = 0;
	    (*d2r)[decl].module   = currentModule;
	}
	(*d2r)[decl].refCount++;
	break;
    case eNET_REF:
	decl = n-&gt;Arg&lt;CNet*&gt;(0);
	if( d2r-&gt;find(decl) == d2r-&gt;end() ) {
	    (*d2r)[decl].decl     = decl;
	    (*d2r)[decl].module   = NULL;
	    (*d2r)[decl].declared = 0;
	    (*d2r)[decl].refCount = 0;
	    (*d2r)[decl].module   = currentModule;
	}
	(*d2r)[decl].refCount++;
	break;
    }

    /*
     * Don't terminate search
     */
    return 1;
}


/************************************************
	Process
	- process a compilation unit 
 ************************************************/
void CExample1::Process( list&lt;CElement&gt;&amp; inputList,
		       list&lt;CElement&gt;&amp; outputList )
{
    /*
     * check whether switches have been specified.
     */
    listNets = GetPlusArg( "example1-list-nets" ) != NULL;
    listRegs = GetPlusArg( "example1-list-regs" ) != NULL;

    /*
     * process each compilation unit
     */
    list&lt;CElement&gt;::iterator ptr;
    for( ptr = inputList.begin(); ptr != inputList.end(); ++ptr ) {
	/*
 	 * Transverse the entire code tree for the given compilation
 	 * unit. For each node FindDecls will be called to 
 	 * accumulate variable statistics.
 	 */
        CNode* code = ptr-&gt;Code(); 
	code-&gt;PreVisit1( FindDecls, &amp;decl2Record );
    }


    /*
     * iterate through the list of variables and flag
     * any that are declared but not referenced.
     */
    map&lt;CDecl*,DeclRecord&gt;::iterator mptr;
    for( mptr = decl2Record.begin(); mptr != decl2Record.end(); ++mptr ) {
	int declared = mptr-&gt;second.declared;
	int refCount = mptr-&gt;second.refCount;
	CModule* module = mptr-&gt;second.module;
	CDecl* decl = mptr-&gt;second.decl;
	if( declared &amp;&amp; refCount == 0 ) {
    	    message( decl-&gt;GetCoord(), mVIDNR, module-&gt;GetName(), decl-&gt;GetName() );
	}
    }

    /*
     * iterate through the list of variables and dump the
     * statistics that have been collected.
     */
    for( mptr = decl2Record.begin(); mptr != decl2Record.end(); ++mptr ) {
	int declared = mptr-&gt;second.declared;
	int refCount = mptr-&gt;second.refCount;
	CModule* module = mptr-&gt;second.module;
	CDecl* decl = mptr-&gt;second.decl;
	if( decl-&gt;GetClass() == eNET &amp;&amp; !listNets ) {
	    continue;
	}
	if( decl-&gt;GetClass() == eREG &amp;&amp; !listRegs ) {
	    continue;
	}
	logprintf( "decl %s::%s: declared=%d reference count=%d\n",
		   module-&gt;GetName(), decl-&gt;GetName(), declared, refCount );
    }

}


</pre></div> </div>
<hr class="footer"/><address class="footer"><small>Generated by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
</body>
</html>