Skip to content

Commit e518c08

Browse files
authored
Merge pull request #1442 from diffblue/verilog_sequence_property_declaration_baset
Introduce verilog_sequence_property_declaration_baset
2 parents c5ef5a1 + 79dc900 commit e518c08

File tree

2 files changed

+70
-13
lines changed

2 files changed

+70
-13
lines changed

src/verilog/verilog_expr.h

Lines changed: 68 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,12 @@ class verilog_module_itemt:public exprt
393393
inline verilog_module_itemt()
394394
{
395395
}
396+
397+
static void
398+
check(const exprt &expr, validation_modet vm = validation_modet::INVARIANT)
399+
{
400+
exprt::check(expr, vm);
401+
}
396402
};
397403

398404
inline const verilog_module_itemt &to_verilog_module_item(const irept &irep)
@@ -2882,9 +2888,16 @@ to_verilog_indexed_part_select_plus_or_minus_expr(exprt &expr)
28822888
return static_cast<verilog_indexed_part_select_plus_or_minus_exprt &>(expr);
28832889
}
28842890

2885-
class verilog_property_declarationt : public verilog_module_itemt
2891+
/// a base class for both sequence and property declarations
2892+
class verilog_sequence_property_declaration_baset : public verilog_module_itemt
28862893
{
28872894
public:
2895+
verilog_sequence_property_declaration_baset(irep_idt _id, exprt _cond)
2896+
: verilog_module_itemt{_id}
2897+
{
2898+
add_to_operands(std::move(_cond));
2899+
}
2900+
28882901
const irep_idt &base_name() const
28892902
{
28902903
return get(ID_base_name);
@@ -2901,55 +2914,99 @@ class verilog_property_declarationt : public verilog_module_itemt
29012914
}
29022915
};
29032916

2917+
inline const verilog_sequence_property_declaration_baset &
2918+
to_verilog_sequence_property_declaration_base(const exprt &expr)
2919+
{
2920+
PRECONDITION(
2921+
expr.id() == ID_verilog_sequence_declaration ||
2922+
expr.id() == ID_verilog_property_declaration);
2923+
verilog_sequence_property_declaration_baset::check(expr);
2924+
return static_cast<const verilog_sequence_property_declaration_baset &>(expr);
2925+
}
2926+
2927+
inline verilog_sequence_property_declaration_baset &
2928+
to_verilog_sequence_property_declaration_base(exprt &expr)
2929+
{
2930+
PRECONDITION(
2931+
expr.id() == ID_verilog_sequence_declaration ||
2932+
expr.id() == ID_verilog_property_declaration);
2933+
verilog_sequence_property_declaration_baset::check(expr);
2934+
return static_cast<verilog_sequence_property_declaration_baset &>(expr);
2935+
}
2936+
2937+
class verilog_property_declarationt
2938+
: public verilog_sequence_property_declaration_baset
2939+
{
2940+
public:
2941+
explicit verilog_property_declarationt(exprt property)
2942+
: verilog_sequence_property_declaration_baset{
2943+
ID_verilog_property_declaration,
2944+
std::move(property)}
2945+
{
2946+
}
2947+
2948+
const exprt &property() const
2949+
{
2950+
return cond();
2951+
}
2952+
2953+
exprt &property()
2954+
{
2955+
return cond();
2956+
}
2957+
};
2958+
29042959
inline const verilog_property_declarationt &
29052960
to_verilog_property_declaration(const exprt &expr)
29062961
{
29072962
PRECONDITION(expr.id() == ID_verilog_property_declaration);
2963+
verilog_property_declarationt::check(expr);
29082964
return static_cast<const verilog_property_declarationt &>(expr);
29092965
}
29102966

29112967
inline verilog_property_declarationt &
29122968
to_verilog_property_declaration(exprt &expr)
29132969
{
29142970
PRECONDITION(expr.id() == ID_verilog_property_declaration);
2971+
verilog_property_declarationt::check(expr);
29152972
return static_cast<verilog_property_declarationt &>(expr);
29162973
}
29172974

2918-
class verilog_sequence_declarationt : public verilog_module_itemt
2975+
class verilog_sequence_declarationt
2976+
: public verilog_sequence_property_declaration_baset
29192977
{
29202978
public:
2921-
explicit verilog_sequence_declarationt(exprt sequence)
2922-
{
2923-
add_to_operands(std::move(sequence));
2924-
}
2925-
2926-
const irep_idt &base_name() const
2979+
explicit verilog_sequence_declarationt(exprt _sequence)
2980+
: verilog_sequence_property_declaration_baset{
2981+
ID_verilog_sequence_declaration,
2982+
std::move(_sequence)}
29272983
{
2928-
return get(ID_base_name);
29292984
}
29302985

29312986
const exprt &sequence() const
29322987
{
2933-
return op0();
2988+
return cond();
29342989
}
29352990

29362991
exprt &sequence()
29372992
{
2938-
return op0();
2993+
return cond();
29392994
}
29402995
};
29412996

29422997
inline const verilog_sequence_declarationt &
29432998
to_verilog_sequence_declaration(const exprt &expr)
29442999
{
29453000
PRECONDITION(expr.id() == ID_verilog_sequence_declaration);
3001+
verilog_sequence_declarationt::check(expr);
29463002
return static_cast<const verilog_sequence_declarationt &>(expr);
29473003
}
29483004

29493005
inline verilog_sequence_declarationt &
29503006
to_verilog_sequence_declaration(exprt &expr)
29513007
{
29523008
PRECONDITION(expr.id() == ID_verilog_sequence_declaration);
3009+
verilog_sequence_declarationt::check(expr);
29533010
return static_cast<verilog_sequence_declarationt &>(expr);
29543011
}
29553012

src/verilog/verilog_typecheck.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1802,8 +1802,8 @@ void verilog_typecheckt::convert_property_declaration(
18021802
auto base_name = declaration.base_name();
18031803
auto full_identifier = hierarchical_identifier(base_name);
18041804

1805-
convert_sva(declaration.cond());
1806-
require_sva_property(declaration.cond());
1805+
convert_sva(declaration.property());
1806+
require_sva_property(declaration.property());
18071807

18081808
auto type = verilog_sva_property_typet{};
18091809
symbolt symbol{full_identifier, type, mode};

0 commit comments

Comments
 (0)