Difference between revisions of "Retrieve package name for user-defined variable types"

From Verific Design Automation FAQ
Jump to: navigation, search
(Created page with "C++ source: <nowiki> #include <iostream> #include "veri_file.h" #include "VeriModule.h" #include "VeriVisitor.h" #include "VeriExpression.h" #include "VeriId.h" using name...")
 
 
Line 59: Line 59:
 
     return 0 ;
 
     return 0 ;
 
}
 
}
 +
</nowiki>
 +
 +
Python script:
 +
 +
<nowiki>
 +
#! /usr/bin/python
 +
import sys
 +
sys.path.append('../../../pythonmain/install')
 +
import Verific
 +
 +
class ExampleVisitor(Verific.VeriPythonVisitor):
 +
    def __init__(obj):
 +
        if not obj:
 +
            return
 +
 +
    def VisitVeriAnsiPortDecl(self, node):
 +
        data_type = node.GetDataType()
 +
        ids = Verific.VeriIdDefArrayIter(node.GetIds())
 +
        id = ids.First()
 +
        while (id):
 +
            if (not id.IsPort()):
 +
                continue
 +
            if (data_type and data_type.IsTypeRef()):
 +
                type_name = data_type.GetTypeName()
 +
                if (not type_name):
 +
                    continue
 +
                # method 1:
 +
                print ("%s" % type_name.GetPrettyPrintedString())
 +
                # method 2:
 +
                prefix = 0
 +
                if type_name.IsScopeName:
 +
                    prefix = type_name.GetPrefix()
 +
                if prefix:
 +
                    print ("%s::%s" % (prefix.GetName(),type_name.GetName()))
 +
                else:
 +
                    print ("%s" % type_name.GetName())
 +
            id = ids.Next()
 +
 +
 +
# main
 +
reader = Verific.veri_file()
 +
file = "test.v"
 +
if (not reader.Analyze(file, reader.SYSTEM_VERILOG)):
 +
    sys.exit(1)
 +
 +
reader.PrettyPrint("test_pp.v.golden.new", "test")
 +
 +
test = reader.GetModule("test") ;
 +
if (not test):
 +
    sys.exit(2)
 +
 +
visitor = ExampleVisitor()
 +
visitor.Visit(test)
 +
 +
sys.exit(0)
 
  </nowiki>
 
  </nowiki>
  

Latest revision as of 12:03, 9 April 2019

C++ source:

#include <iostream>

#include "veri_file.h"
#include "VeriModule.h"
#include "VeriVisitor.h"
#include "VeriExpression.h"
#include "VeriId.h"

using namespace std ;

#ifdef VERIFIC_NAMESPACE
using namespace Verific ;
#endif

class VdpVisitor : public VeriVisitor
{
public:
    VdpVisitor() : VeriVisitor() { }
    virtual ~VdpVisitor() { }

    void VERI_VISIT(VeriAnsiPortDecl, node)
    {
        VeriDataType *dt = node.GetDataType() ;

        VeriIdDef *id;
        unsigned i;
        FOREACH_ARRAY_ITEM(node.GetIds(), i, id) {
            if (!id || !id->IsPort()) continue ;
            if (dt && dt->IsTypeRef()) {
                VeriName *tn = dt->GetTypeName() ;
                if (!tn) continue ;
                // Method 1:
                cout << tn->GetPrettyPrintedString() << endl ;
                // Method 2:
                VeriName *prefix = (tn->IsScopeName()) ? tn->GetPrefix() : 0 ;
                if (prefix) cout << prefix->GetName() << "::" ;
                cout << tn->GetName() << endl ;
            }
        }
    }
} ; // class VdpVisitor

int main(int argc, const char **argv)
{
    const char *file = (argc > 1) ? argv[1] : "test.v" ;
    if (!veri_file::Analyze(file, veri_file::SYSTEM_VERILOG)) return 1 ;

    veri_file::PrettyPrint("test_pp.v.golden.new", 0) ;

    VeriModule *test = veri_file::GetModule("test") ;
    if (!test) return 2 ;

    VdpVisitor mv ;
    test->Accept(mv) ;

    return 0 ;
}
 

Python script:

#! /usr/bin/python
import sys
sys.path.append('../../../pythonmain/install')
import Verific

class ExampleVisitor(Verific.VeriPythonVisitor):
    def __init__(obj):
        if not obj:
            return

    def VisitVeriAnsiPortDecl(self, node):
        data_type = node.GetDataType()
        ids = Verific.VeriIdDefArrayIter(node.GetIds())
        id = ids.First()
        while (id):
            if (not id.IsPort()): 
                continue
            if (data_type and data_type.IsTypeRef()):
                type_name = data_type.GetTypeName()
                if (not type_name):
                    continue
                # method 1:
                print ("%s" % type_name.GetPrettyPrintedString()) 
                # method 2:
                prefix = 0
                if type_name.IsScopeName:
                    prefix = type_name.GetPrefix()
                if prefix:
                    print ("%s::%s" % (prefix.GetName(),type_name.GetName()))
                else:
                    print ("%s" % type_name.GetName()) 
            id = ids.Next()


# main
reader = Verific.veri_file()
file = "test.v"
if (not reader.Analyze(file, reader.SYSTEM_VERILOG)):
    sys.exit(1)

reader.PrettyPrint("test_pp.v.golden.new", "test")

test = reader.GetModule("test") ;
if (not test):
    sys.exit(2)

visitor = ExampleVisitor()
visitor.Visit(test)

sys.exit(0)
 

Verilog test design:

package answer;
    typedef struct {
        logic [3:0] who;
        logic [3:0] what;
        logic [3:0] where;
    } s;
endpackage: answer
 
package question;
    typedef struct {
        logic [3:0] who;
        logic [3:0] what;
        logic [3:0] where;
    } s;
endpackage: question
 
module test (
    input  question::s  q,
    output answer::s    a
);
endmodule: test

Run:

[hoa@awing0 test]$ ./test-linux 
-- Analyzing Verilog file 'test.v' (VERI-1482)
-- Pretty printing all design elements in all libraries to file 'test_pp.v.golden.new' (VERI-1492)
question::s
question::s
answer::s
answer::s
[hoa@awing0 test]$