Difference between revisions of "How to use MessageCallBackHandler Class"
From Verific Design Automation FAQ
(Created page with "This is a small example showing how to use MessageCallBackHandler Class: In C++: <nowiki> #include <iostream> #include "veri_file.h" #include "Message.h" #include "Strings...") |
|||
| Line 53: | Line 53: | ||
const char *msg_str = mmcb.GetMessageString() ; | const char *msg_str = mmcb.GetMessageString() ; | ||
| − | std::cout << " | + | std::cout << "\nAccumulated messages: \n" << msg_str << std::endl ; |
return 0 ; | return 0 ; | ||
| Line 72: | Line 72: | ||
-- Analyzing Verilog file 'test.v' (VERI-1482) | -- Analyzing Verilog file 'test.v' (VERI-1482) | ||
test.v(2): WARNING: concatenation with an unsized literal will be treated as 32 bits (VERI-1320) | test.v(2): WARNING: concatenation with an unsized literal will be treated as 32 bits (VERI-1320) | ||
| − | Accumulated messages: Analyzing Verilog file 'test.v' | + | |
| + | Accumulated messages: | ||
| + | Analyzing Verilog file 'test.v' | ||
concatenation with an unsized literal will be treated as 32 bits | concatenation with an unsized literal will be treated as 32 bits | ||
[moh@awing0 15065]$ | [moh@awing0 15065]$ | ||
Revision as of 12:41, 5 December 2023
This is a small example showing how to use MessageCallBackHandler Class:
In C++:
#include <iostream>
#include "veri_file.h"
#include "Message.h"
#include "Strings.h"
#ifdef VERIFIC_NAMESPACE
using namespace Verific ;
#endif
class MyMsgCallBack : public MessageCallBackHandler
{
public:
MyMsgCallBack() : MessageCallBackHandler(), _msg_string(0) { }
virtual ~MyMsgCallBack() { Strings::free(_msg_string) ; _msg_string = 0 ; }
private:
MyMsgCallBack(const MyMsgCallBack &) ;
MyMsgCallBack& operator=(const MyMsgCallBack &) ;
public:
virtual void Msg(msg_type_t msg_type, const char *message_id, linefile_type linefile, const char *msg_str) ;
const char * GetMessageString() const { return _msg_string ; }
private:
char *_msg_string ;
} ; // class MyMsgCallBack
void MyMsgCallBack::Msg(msg_type_t /*msg_type*/, const char * /*message_id*/, linefile_type /*linefile*/, const char *msg_str)
{
if (!_msg_string) {
_msg_string = Strings::save(msg_str) ;
} else {
char *tmp = _msg_string ;
_msg_string = Strings::save(_msg_string, "\n", msg_str) ;
Strings::free(tmp) ;
}
}
int main(int argc, const char **argv)
{
MyMsgCallBack mmcb ;
Message::RegisterCallBackMsg(&mmcb) ;
const char *in_file = (argc > 1) ? argv[1] : "test.v" ;
if (!veri_file::Analyze(in_file)) return 1 ;
const char *msg_str = mmcb.GetMessageString() ;
std::cout << "\nAccumulated messages: \n" << msg_str << std::endl ;
return 0 ;
}
test.v:
module test (output [3:0] out) ;
assign out = {1} ;
endmodule
Run:
[moh@awing0 15065]$ ./test-linux -- Analyzing Verilog file 'test.v' (VERI-1482) test.v(2): WARNING: concatenation with an unsized literal will be treated as 32 bits (VERI-1320) Accumulated messages: Analyzing Verilog file 'test.v' concatenation with an unsized literal will be treated as 32 bits [moh@awing0 15065]$
In Python:
#!/usr/bin/python
import sys
sys.path.append('../py')
import Verific
class MyMessageCallBack(Verific.MessageCallBackHandler,object):
_msg_string = "\nAccumulated message:\n"
def __init__(obj):
if not obj:
return
super(MyMessageCallBack,obj).__init__()
def Msg(self, msg_type, message_id, linefile, msg_str):
self._msg_string = self._msg_string + "\t" + self.GetLinefile(linefile) + self.GetMsgType(msg_type) + msg_str + " (" + message_id + ")\n"
def GetLinefile(self, linefile):
if not linefile:
return ""
return Verific.LineFile_GetFileName(linefile) + "(" + str(Verific.LineFile_GetLineNo(linefile)) + "): "
def GetMsgType(self, msg_type):
if (msg_type==Verific.VERIFIC_INFO):
return "INFO: "
elif (msg_type==Verific.VERIFIC_WARNING):
return "WARNING: "
elif (msg_type==Verific.VERIFIC_ERROR):
return "ERROR: "
return "-- "
def GetMessageString(self):
return self._msg_string
mc = MyMessageCallBack()
Verific.Message_RegisterCallBackMsg(mc)
if (not Verific.veri_file_Analyze("test.v")):
print("Error during analysis. Exiting.")
sys.exit(1)
print mc.GetMessageString()
sys.exit(0)
Run:
[moh@awing0 15065]$ ./test.py -- Analyzing Verilog file 'test.v' (VERI-1482) test.v(2): WARNING: concatenation with an unsized literal will be treated as 32 bits (VERI-1320) Accumulated message: -- Analyzing Verilog file 'test.v' (VERI-1482) test.v(2): WARNING: concatenation with an unsized literal will be treated as 32 bits (VERI-1320) [moh@awing0 15065]$
In Perl:
#!/usr/bin/perl -w
use strict ;
use warnings ;
use lib "../pm" ;
require "Verific.pm" ;
use Verific ;
{
package MyMessageCallBack ;
use base 'Verific::MessageCallBackHandler' ;
my $msg_string = "\nAccumulated message:\n" ;
sub Msg
{
my ($class, $msg_type, $message_id, $linefile, $msg_str) = (@_) ;
$msg_string .= "\t" . GetLinefile($linefile) . GetMsgType($msg_type) . "$msg_str ($message_id)\n" ;
}
sub GetLinefile
{
my ($linefile) = (@_) ;
if (!$linefile) { return "" ; } ;
return Verific::LineFile::GetFileName($linefile) . "(" . Verific::LineFile::GetLineNo($linefile) . "): " ;
}
sub GetMsgType
{
my ($msg_type) = (@_) ;
if ($msg_type == $Verific::VERIFIC_INFO) {
return "INFO: ";
}
elsif ($msg_type == $Verific::VERIFIC_WARNING) {
return "WARNING: ";
}
elsif ($msg_type == $Verific::VERIFIC_ERROR) {
return "ERROR: ";
}
return "-- ";
}
sub GetMessageString
{
return "$msg_string" ;
}
}
my $mc = MyMessageCallBack->new() ;
Verific::Message::RegisterCallBackMsg($mc) ;
if (!Verific::veri_file::Analyze("test.v")) {
print "Error during analysis. Exiting.\n" ;
exit(1) ;
}
print $mc->GetMessageString() ;
exit(0) ;
Run:
-- Analyzing Verilog file 'test.v' (VERI-1482) test.v(2): WARNING: concatenation with an unsized literal will be treated as 32 bits (VERI-1320) Accumulated message: -- Analyzing Verilog file 'test.v' (VERI-1482) test.v(2): WARNING: concatenation with an unsized literal will be treated as 32 bits (VERI-1320) [moh@awing0 15065]$