Skip to content

Commit 77937fe

Browse files
authored
Merge pull request #646 from diffblue/verilog_package_itemt
Verilog: parse tree now is a list of generic compilation unit items
2 parents 0fc2ab6 + b76612a commit 77937fe

File tree

6 files changed

+38
-78
lines changed

6 files changed

+38
-78
lines changed

src/verilog/parser.y

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@ description:
616616
| package_declaration
617617
| attribute_instance_brace package_item
618618
{ add_attributes($2, $1);
619-
PARSER.parse_tree.create_package_item(stack_expr($2)); }
619+
PARSER.parse_tree.add_item(stack_expr($2)); }
620620
| attribute_instance_brace bind_directive
621621
| config_declaration
622622
;

src/verilog/verilog_expr.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1893,9 +1893,8 @@ to_verilog_assume_statement(verilog_statementt &statement)
18931893
class verilog_module_sourcet : public irept
18941894
{
18951895
public:
1896-
verilog_module_sourcet() = default;
1897-
18981896
explicit verilog_module_sourcet(irep_idt _base_name)
1897+
: irept(ID_verilog_module)
18991898
{
19001899
base_name(_base_name);
19011900
}

src/verilog/verilog_language.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ void verilog_languaget::dependencies(
136136
{
137137
// dependencies on other Verilog modules
138138

139-
const auto &module = (it->second)->verilog_module;
139+
const auto &module = *it->second;
140140

141141
for(auto &identifier : module.submodules())
142142
module_set.insert(id2string(identifier));

src/verilog/verilog_parse_tree.cpp

Lines changed: 24 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@ void verilog_parse_treet::create_module(
2929
exprt &ports,
3030
exprt &module_items)
3131
{
32-
items.push_back(itemt(itemt::MODULE));
33-
3432
if(ports.get_sub().size()==1 &&
3533
ports.get_sub().front().is_nil())
3634
ports.clear();
@@ -43,10 +41,10 @@ void verilog_parse_treet::create_module(
4341
((const exprt &)module_keyword).source_location();
4442
new_module.add(ID_module_items) = std::move(module_items);
4543

46-
items.back().verilog_module = std::move(new_module);
44+
auto &new_item = add_item(std::move(new_module));
4745

4846
// add to module map
49-
module_map[name.id()] = --items.end();
47+
module_map[name.id()] = &to_verilog_module_source(new_item);
5048
}
5149

5250
/*******************************************************************\
@@ -64,12 +62,12 @@ Function: verilog_parse_treet::modules_provided
6462
void verilog_parse_treet::modules_provided(
6563
std::set<std::string> &module_set) const
6664
{
67-
for(itemst::const_iterator it=items.begin();
68-
it!=items.end();
69-
it++)
70-
if(it->is_module())
71-
module_set.insert(
72-
id2string(verilog_module_symbol(it->verilog_module.base_name())));
65+
for(auto &item : items)
66+
{
67+
if(item.id() == ID_verilog_module)
68+
module_set.insert(id2string(
69+
verilog_module_symbol(to_verilog_module_source(item).base_name())));
70+
}
7371
}
7472

7573
/*******************************************************************\
@@ -88,11 +86,14 @@ void verilog_parse_treet::build_module_map()
8886
{
8987
module_map.clear();
9088

91-
for(itemst::iterator it=items.begin();
92-
it!=items.end();
93-
it++)
94-
if(it->is_module())
95-
module_map[it->verilog_module.base_name()] = it;
89+
for(const auto &item : items)
90+
{
91+
if(item.id() == ID_verilog_module)
92+
{
93+
auto &verilog_module = to_verilog_module_source(item);
94+
module_map[verilog_module.base_name()] = &verilog_module;
95+
}
96+
}
9697
}
9798

9899
/*******************************************************************\
@@ -109,15 +110,13 @@ Function: verilog_parse_treet::show
109110

110111
void verilog_parse_treet::show(std::ostream &out) const
111112
{
112-
for(itemst::const_iterator it=items.begin();
113-
it!=items.end();
114-
it++)
115-
it->show(out);
113+
for(const auto &item : items)
114+
show(item, out);
116115
}
117116

118117
/*******************************************************************\
119118
120-
Function: verilog_parse_treet::itemt::show
119+
Function: verilog_parse_treet::show
121120
122121
Inputs:
123122
@@ -127,20 +126,10 @@ Function: verilog_parse_treet::itemt::show
127126
128127
\*******************************************************************/
129128

130-
void verilog_parse_treet::itemt::show(std::ostream &out) const
129+
void verilog_parse_treet::show(const itemt &item, std::ostream &out) const
131130
{
132-
switch(type)
133-
{
134-
case itemt::MODULE:
135-
verilog_module.show(out);
136-
break;
137-
138-
case itemt::PACKAGE_ITEM:
139-
out << "Package item:\n";
140-
out << verilog_package_item.pretty() << '\n';
141-
break;
142-
143-
default:
144-
PRECONDITION(false);
145-
}
131+
if(item.id() == ID_verilog_module)
132+
to_verilog_module_source(item).show(out);
133+
else
134+
out << item.pretty() << '\n';
146135
}

src/verilog/verilog_parse_tree.h

Lines changed: 10 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -27,37 +27,10 @@ class verilog_parse_treet
2727

2828
verilog_standardt standard;
2929

30-
struct itemt
31-
{
32-
public:
33-
typedef enum
34-
{
35-
MODULE,
36-
PACKAGE_ITEM
37-
} item_typet;
38-
item_typet type;
39-
40-
explicit itemt(item_typet __type) : type(__type)
41-
{
42-
}
43-
44-
verilog_module_sourcet verilog_module;
45-
46-
exprt verilog_package_item;
47-
48-
bool is_module() const
49-
{
50-
return type==MODULE;
51-
}
52-
53-
bool is_package_item() const
54-
{
55-
return type == PACKAGE_ITEM;
56-
}
57-
58-
void show(std::ostream &out) const;
59-
};
60-
30+
using itemt = irept;
31+
32+
void show(const itemt &, std::ostream &) const;
33+
6134
typedef std::list<itemt> itemst;
6235
itemst items;
6336

@@ -83,10 +56,10 @@ class verilog_parse_treet
8356
exprt &ports,
8457
exprt &statements);
8558

86-
void create_package_item(exprt package_item)
59+
itemt &add_item(itemt item)
8760
{
88-
items.push_back(itemt(itemt::PACKAGE_ITEM));
89-
items.back().verilog_package_item = std::move(package_item);
61+
items.push_back(std::move(item));
62+
return items.back();
9063
}
9164

9265
void swap(verilog_parse_treet &parse_tree)
@@ -100,7 +73,9 @@ class verilog_parse_treet
10073
void modules_provided(
10174
std::set<std::string> &module_set) const;
10275

103-
typedef std::unordered_map<irep_idt, itemst::iterator, irep_id_hash> module_mapt;
76+
typedef std::
77+
unordered_map<irep_idt, const verilog_module_sourcet *, irep_id_hash>
78+
module_mapt;
10479
module_mapt module_map;
10580

10681
void build_module_map();

src/verilog/verilog_typecheck.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1847,10 +1847,7 @@ bool verilog_typecheck(
18471847
}
18481848

18491849
return verilog_typecheck(
1850-
symbol_table,
1851-
it->second->verilog_module,
1852-
parse_tree.standard,
1853-
message_handler);
1850+
symbol_table, *it->second, parse_tree.standard, message_handler);
18541851
}
18551852

18561853
/*******************************************************************\

0 commit comments

Comments
 (0)