Skip to content

Commit 113faf9

Browse files
committed
ebmc language interface implementation for Verilog
This adds an implementation of the ebmc_languaget interface for Verilog.
1 parent 1a1b633 commit 113faf9

File tree

4 files changed

+127
-2
lines changed

4 files changed

+127
-2
lines changed

src/ebmc/build_transition_system.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ Author: Daniel Kroening, [email protected]
2121
#include <smvlang/smv_ebmc_language.h>
2222
#include <trans-word-level/show_module_hierarchy.h>
2323
#include <trans-word-level/show_modules.h>
24+
#include <verilog/verilog_ebmc_language.h>
2425

2526
#include "ebmc_error.h"
2627
#include "ebmc_language_file.h"
@@ -372,7 +373,7 @@ std::optional<transition_systemt> ebmc_languagest::transition_system()
372373
{
373374
return smv_ebmc_languaget{cmdline, message_handler}.transition_system();
374375
}
375-
else
376+
else if(have_verilog)
376377
{
377378
if(cmdline.isset("preprocess"))
378379
{
@@ -406,6 +407,10 @@ std::optional<transition_systemt> ebmc_languagest::transition_system()
406407
return {};
407408
}
408409

409-
return get_transition_system(cmdline, message_handler);
410+
return verilog_ebmc_languaget{cmdline, message_handler}.transition_system();
411+
}
412+
else
413+
{
414+
throw ebmc_errort{} << "no support for given input file extensions";
410415
}
411416
}

src/verilog/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ SRC = aval_bval_encoding.cpp \
44
sva_expr.cpp \
55
typename.cpp \
66
verilog_bits.cpp \
7+
verilog_ebmc_language.cpp \
78
verilog_elaborate.cpp \
89
verilog_elaborate_type.cpp \
910
verilog_expr.cpp \
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/*******************************************************************\
2+
3+
Module: Verilog Language Interface
4+
5+
Author: Daniel Kroening, [email protected]
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/suffix.h>
17+
#include <util/unicode.h>
18+
19+
#include <ebmc/ebmc_error.h>
20+
#include <ebmc/transition_system.h>
21+
22+
#include "verilog_parser.h"
23+
#include "verilog_typecheck.h"
24+
25+
#include <fstream>
26+
27+
std::string verilog_file_name(const cmdlinet &cmdline)
28+
{
29+
if(cmdline.args.size() == 0)
30+
throw ebmc_errort{} << "no file name given";
31+
32+
if(cmdline.args.size() >= 2)
33+
throw ebmc_errort{}.with_exit_code(1) << "give a single file only";
34+
35+
return cmdline.args.front();
36+
}
37+
38+
verilog_parse_treet verilog_ebmc_languaget::parse()
39+
{
40+
auto file_name = verilog_file_name(cmdline);
41+
42+
verilog_standardt standard;
43+
44+
if(has_suffix(file_name, ".sv") || cmdline.isset("systemverilog"))
45+
standard = verilog_standardt::SV2023;
46+
else if(cmdline.isset("vl2smv-extensions"))
47+
standard = verilog_standardt::V2005_SMV;
48+
else
49+
standard = verilog_standardt::V2005_SMV;
50+
51+
verilog_parsert verilog_parser{standard, message_handler};
52+
53+
std::ifstream infile{widen_if_needed(file_name)};
54+
55+
if(!infile)
56+
throw ebmc_errort{} << "failed to open " << file_name;
57+
58+
verilog_parser.set_file(file_name);
59+
verilog_parser.in = &infile;
60+
61+
if(verilog_parser.parse())
62+
throw ebmc_errort{} << "parsing has failed";
63+
64+
return std::move(verilog_parser.parse_tree);
65+
}
66+
67+
std::optional<transition_systemt> verilog_ebmc_languaget::transition_system()
68+
{
69+
auto parse_tree = parse();
70+
71+
transition_systemt result;
72+
73+
if(verilog_typecheck(
74+
parse_tree, result.symbol_table, "main", message_handler))
75+
{
76+
throw ebmc_errort{} << "typechecking has failed";
77+
}
78+
79+
result.main_symbol =
80+
&get_module(result.symbol_table, "main", message_handler);
81+
82+
result.trans_expr = to_trans_expr(result.main_symbol->value);
83+
84+
return result;
85+
}
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, [email protected]
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)