Parse select modules only and ignore the rest

From Verific Design Automation FAQ
Revision as of 16:23, 5 June 2023 by Hoa (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

There is no API to parse only a subset of modules of a design that contains many modules. However, this can be accomplished in 2 ways:

(1) Using uses call back hook (veri_file::RegisterIgnoreParsedModuleName())

C++:

 
#include <iostream>
#include "veri_file.h"
#include "VeriModule.h"
#include "VeriLibrary.h"

#include "Message.h"
#include "Array.h"
#include "Map.h"

#ifdef VERIFIC_NAMESPACE
using namespace Verific ;
#endif

static unsigned
ignore_mod_call_back(const char *module_name, unsigned /*module_keyword*/)
{
    // Do not ignore module named 'test2' or 'test3'
    if (Strings::compare(module_name, "test2")) return 0 ;
    if (Strings::compare(module_name, "test3")) return 0 ;

    // Ignore all other design units:
    Message::Msg(VERIFIC_INFO, 0, 0, "-----> Ignoring design unit '%s'", module_name) ;

    return 1 ;
}

int main()
{
    // Register callback to selectively ignore modules:
    veri_file::RegisterIgnoreParsedModuleName(ignore_mod_call_back) ;

    Array files(1) ;
    files.Insert("testa.v") ;
    files.Insert("testb.v") ;
    if (!veri_file::AnalyzeMultipleFiles(&files, veri_file::SYSTEM_VERILOG)) return 1 ;

    MapIter mi ;
    VeriModule *mod ;
    FOREACH_VERILOG_MODULE(mi, mod) {
        std::cout << "*** Module '" << mod->Name() << "' in library '" << mod->GetLibrary()->GetName() << "'" << std::endl ;
    }
    veri_file::PrettyPrint("pp_out.v", 0) ;

    return 0 ;
}
  

(2) Through Verific's processing of v-files.

Below is an outline of the steps involved:

- Register all the input source files as v-files for processing.
- Move all of the modules to the 'work' library.
- Analyze a 'dummy' file that contains only the modules of interest.
- Process the v-files.
- Delete the 'dummy' module itself

C++:

#include <iostream>
#include "veri_file.h"
#include "VeriModule.h"
#include "VeriLibrary.h"
#include "Map.h"

#ifdef VERIFIC_NAMESPACE
using namespace Verific ;
#endif

int main()
{
    // Add the 'real' input file(s) to be analyzed as -v file:
    veri_file::AddVFile("testa.v") ;
    veri_file::AddVFile("testb.v") ;
    // Move -v modules into 'work'
    RuntimeFlags::SetVar("veri_move_yv_modules_into_work_library", 1) ;

    // Analyze dummy file
    if (!veri_file::Analyze("dummy.v", veri_file::SYSTEM_VERILOG)) return 1 ;
    // Need this to process -v file
    veri_file::ProcessUserLibraries() ;

    VeriModule *dummy = veri_file::GetModule ("dummy") ;
    delete dummy ; // no longer needed

    MapIter mi;
    VeriModule *module;
    FOREACH_VERILOG_MODULE (mi, module) {
        std::cout << "*** Module '" << module->Name() << "' in library '" << module->GetLibrary()->GetName() << "'" << s
td::endl ;
    }
    veri_file::PrettyPrint("pp_out.v", 0) ;
    return 0 ;
}
 

Source file testa.v:

module test1 ;
    wire ina, inb, inc;
    wire outd;
    mod1 I0(ina, inb, inc, outd);
endmodule

module test2 ;
    wire ina, inb, inc;
    wire outd;
    mod2 I0(ina, inb, inc, outd);
endmodule
 

Source file testb.v:

module test3 ;
    wire ina, inb, inc;
    wire outd;
    mod3 I0(ina, inb, inc, outd);
endmodule

module test4 ;
    wire ina, inb, inc;
    wire outd;
    mod4 I0(ina, inb, inc, outd);
endmodule

module test5 ;
    wire ina, inb, inc;
    wire outd;
    mod5 I0(ina, inb, inc, outd);
endmodule
 

Source file dummy.v -- this contains the modules we want to parse:

module dummy ();
  test2 i2 ();
  test3 i3 ();
endmodule
 

Result of running the application:

-- Analyzing Verilog file 'dummy.v' (VERI-1482)
-- Analyzing Verilog file 'testa.v' (VERI-1482)
--       Resolving module 'test2' (VERI-1489)
-- Analyzing Verilog file 'testb.v' (VERI-1482)
--       Resolving module 'test3' (VERI-1489)
-- Analyzing Verilog file 'testa.v' (VERI-1482)
-- Analyzing Verilog file 'testb.v' (VERI-1482)
*** Module 'test2' in library 'work'
*** Module 'test3' in library 'work'
-- Printing all libraries to file 'pp_out.v' (VERI-1492)
 

Output file pp_out.v:

module test2 ;
    wire ina, inb, inc ; 
    wire outd ; 
    mod2 I0 (ina, inb, inc, outd) ; 
endmodule



module test3 ;
    wire ina, inb, inc ; 
    wire outd ; 
    mod3 I0 (ina, inb, inc, outd) ; 
endmodule