Skip to content

Commit ca68c2a

Browse files
committed
ebmc language interface implementation for Verilog
This adds an implementation of the ebmc_languaget interface for Verilog.
1 parent f47fe86 commit ca68c2a

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*******************************************************************\
2+
3+
Module: Verilog Language Interface
4+
5+
Author: Daniel Kroening, dkr@amazon.com
6+
7+
\*******************************************************************/
8+
9+
/// \file
10+
/// Verilog Language Interface
11+
12+
#include "verilog_ebmc_language.h"
13+
14+
#include <util/cmdline.h>
15+
#include <util/get_module.h>
16+
#include <util/unicode.h>
17+
18+
#include <ebmc/ebmc_error.h>
19+
#include <ebmc/transition_system.h>
20+
21+
#include "verilog_parser.h"
22+
#include "verilog_typecheck.h"
23+
24+
#include <fstream>
25+
26+
verilog_parse_treet verilog_ebmc_languaget::parse()
27+
{
28+
verilog_standardt standard;
29+
30+
verilog_parsert verilog_parser{standard, message_handler};
31+
32+
auto file_name = verilog_file_name(cmdline);
33+
34+
std::ifstream infile{widen_if_needed(file_name)};
35+
36+
if(!infile)
37+
throw ebmc_errort{} << "failed to open " << file_name;
38+
39+
verilog_parser.set_file(file_name);
40+
verilog_parser.in = &infile;
41+
42+
if(verilog_parser.parse())
43+
throw ebmc_errort{} << "parsing has failed";
44+
45+
return std::move(verilog_parser.parse_tree);
46+
}
47+
48+
std::optional<transition_systemt> verilog_ebmc_languaget::transition_system()
49+
{
50+
auto parse_tree = parse();
51+
52+
transition_systemt result;
53+
54+
if(verilog_typecheck(parse_tree, result.symbol_table, "main", message_handler))
55+
throw ebmc_errort{} << "typechecking has failed";
56+
57+
result.main_symbol =
58+
&get_module(result.symbol_table, "main", message_handler);
59+
60+
result.trans_expr =
61+
to_trans_expr(result.main_symbol->value);
62+
63+
return result;
64+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*******************************************************************\
2+
3+
Module: Verilog Language Interface
4+
5+
Author: Daniel Kroening, dkr@amazon.com
6+
7+
\*******************************************************************/
8+
9+
/// \file
10+
/// SMV Language Interface
11+
12+
#ifndef EBMC_VERILOG_LANGUAGE_H
13+
#define EBMC_VERILOG_LANGUAGE_H
14+
15+
#include <ebmc/ebmc_language.h>
16+
17+
class verilog_parse_treet;
18+
19+
class verilog_ebmc_languaget : public ebmc_languaget
20+
{
21+
public:
22+
verilog_ebmc_languaget(cmdlinet &_cmdline, message_handlert &_message_handler)
23+
: ebmc_languaget(_cmdline, _message_handler)
24+
{
25+
}
26+
27+
// produce the transition system, and return it
28+
std::optional<transition_systemt> transition_system() override;
29+
30+
protected:
31+
verilog_parse_treet parse();
32+
};
33+
34+
#endif // EBMC_VERILOG_LANGUAGE_H

0 commit comments

Comments
 (0)