Difference between revisions of "Pretty-print a module and the packages imported by the module"
From Verific Design Automation FAQ
(Created page with "C++: <nowiki> #include <iostream> #include <fstream> #include "veri_file.h" #include "VeriModule.h" #include "VeriId.h" #include "VeriScope.h" #include "Set.h" using names...") |
|||
Line 19: | Line 19: | ||
int main(int argc, const char **argv) | int main(int argc, const char **argv) | ||
{ | { | ||
− | const char *file = (argc > 1) ? argv[1] : "test. | + | const char *file = (argc > 1) ? argv[1] : "test.sv" ; |
// Analyze the files (AnalyzeMultipleFiles API is the recommended one): | // Analyze the files (AnalyzeMultipleFiles API is the recommended one): | ||
Line 26: | Line 26: | ||
if (!veri_file::AnalyzeMultipleFiles(&files, veri_file::SYSTEM_VERILOG)) return 1 ; | if (!veri_file::AnalyzeMultipleFiles(&files, veri_file::SYSTEM_VERILOG)) return 1 ; | ||
− | + | MapIter mi ; | |
− | VeriModule * | + | VeriModule *module ; |
− | if (! | + | FOREACH_VERILOG_MODULE(mi, module){ |
+ | if (!module) continue ; | ||
+ | if (module->IsPackage()) continue ; // no need to dive into package | ||
− | + | // Get the scope of the module: | |
− | + | VeriScope *scope = module->GetScope() ; | |
− | + | char *outputfilename = Strings::save(module->Name(), "_pp_out.v"); | |
+ | std::ofstream f(outputfilename, std::ios::out) ; | ||
− | + | // Get the scope that this module/scope is using: | |
− | + | // This also includes the compilation unit in the list, if any/required: | |
− | + | Set *using_scopes = (scope) ? scope->GetUsing() : 0 ; | |
− | + | // Print all those scopes/modules before printing the module itself: | |
− | + | SetIter si ; | |
− | + | VeriScope *using_scope ; | |
− | + | FOREACH_SET_ITEM(using_scopes, si, &using_scope) { | |
− | + | VeriIdDef *mod_id = using_scope->GetContainingModule() ; | |
− | + | VeriModule *mod = (mod_id) ? mod_id->GetModule() : 0 ; | |
− | + | if (!mod) continue ; | |
− | + | if (mod->IsPackage()) { | |
− | + | std::cout << ">>> Module '" << module->Name() << "' uses package '" << mod->Name() << "' <<<\n"; | |
− | + | } | |
+ | f << "// Printing package " << mod->Name() << endl ; | ||
+ | mod->PrettyPrint(f, 0) ; | ||
+ | } | ||
− | + | // Now print the module: | |
− | + | f << "// Printing module " << module->Name() << endl ; | |
− | + | module->PrettyPrint(f, 0) ; | |
− | + | f.close() ; | |
+ | } | ||
return 0 ; | return 0 ; | ||
Line 76: | Line 83: | ||
Pretty-printed output: | Pretty-printed output: | ||
<nowiki> | <nowiki> | ||
− | // Printing | + | // Printing package PKG1 |
package PKG1 ; | package PKG1 ; | ||
− | typedef int my_int ; | + | typedef int my_int ; |
endpackage | endpackage | ||
− | // Printing | + | // Printing package $unit_test_sv |
− | typedef byte my_byte ; | + | typedef byte my_byte ; |
Line 92: | Line 99: | ||
module test ; | module test ; | ||
import PKG1:: * ; | import PKG1:: * ; | ||
− | my_int int1 ; | + | my_int int1 ; |
− | my_byte byte1 ; | + | my_byte byte1 ; |
endmodule | endmodule | ||
</nowiki> | </nowiki> |
Revision as of 15:26, 20 April 2021
C++:
#include <iostream> #include <fstream> #include "veri_file.h" #include "VeriModule.h" #include "VeriId.h" #include "VeriScope.h" #include "Set.h" using namespace std ; #ifdef VERIFIC_NAMESPACE using namespace Verific ; #endif int main(int argc, const char **argv) { const char *file = (argc > 1) ? argv[1] : "test.sv" ; // Analyze the files (AnalyzeMultipleFiles API is the recommended one): Array files(1) ; files.InsertLast(file) ; if (!veri_file::AnalyzeMultipleFiles(&files, veri_file::SYSTEM_VERILOG)) return 1 ; MapIter mi ; VeriModule *module ; FOREACH_VERILOG_MODULE(mi, module){ if (!module) continue ; if (module->IsPackage()) continue ; // no need to dive into package // Get the scope of the module: VeriScope *scope = module->GetScope() ; char *outputfilename = Strings::save(module->Name(), "_pp_out.v"); std::ofstream f(outputfilename, std::ios::out) ; // Get the scope that this module/scope is using: // This also includes the compilation unit in the list, if any/required: Set *using_scopes = (scope) ? scope->GetUsing() : 0 ; // Print all those scopes/modules before printing the module itself: SetIter si ; VeriScope *using_scope ; FOREACH_SET_ITEM(using_scopes, si, &using_scope) { VeriIdDef *mod_id = using_scope->GetContainingModule() ; VeriModule *mod = (mod_id) ? mod_id->GetModule() : 0 ; if (!mod) continue ; if (mod->IsPackage()) { std::cout << ">>> Module '" << module->Name() << "' uses package '" << mod->Name() << "' <<<\n"; } f << "// Printing package " << mod->Name() << endl ; mod->PrettyPrint(f, 0) ; } // Now print the module: f << "// Printing module " << module->Name() << endl ; module->PrettyPrint(f, 0) ; f.close() ; } return 0 ; }
Input Verilog:
package PKG1 ; typedef int my_int ; endpackage typedef byte my_byte ; module test ; import PKG1::* ; my_int int1 ; my_byte byte1 ; endmodule
Pretty-printed output:
// Printing package PKG1 package PKG1 ; typedef int my_int ; endpackage // Printing package $unit_test_sv typedef byte my_byte ; // Printing module test module test ; import PKG1:: * ; my_int int1 ; my_byte byte1 ; endmodule