|
14 | 14 |
|
15 | 15 | #include <verilog/sva_expr.h>
|
16 | 16 |
|
| 17 | +#include "nnf.h" |
17 | 18 | #include "temporal_expr.h"
|
18 | 19 | #include "temporal_logic.h"
|
19 | 20 | #include "trivial_sva.h"
|
20 | 21 |
|
21 |
| -exprt normalize_pre_not(not_exprt expr) |
22 |
| -{ |
23 |
| - const auto &op = expr.op(); |
24 |
| - |
25 |
| - if(op.id() == ID_and) |
26 |
| - { |
27 |
| - auto operands = op.operands(); |
28 |
| - for(auto &op : operands) |
29 |
| - op = not_exprt{op}; |
30 |
| - return or_exprt{std::move(operands)}; |
31 |
| - } |
32 |
| - else if(op.id() == ID_or) |
33 |
| - { |
34 |
| - auto operands = op.operands(); |
35 |
| - for(auto &op : operands) |
36 |
| - op = not_exprt{op}; |
37 |
| - return and_exprt{std::move(operands)}; |
38 |
| - } |
39 |
| - else if(op.id() == ID_not) |
40 |
| - { |
41 |
| - return to_not_expr(op).op(); |
42 |
| - } |
43 |
| - else if(op.id() == ID_G) |
44 |
| - { |
45 |
| - // ¬Gφ --> F¬φ |
46 |
| - return F_exprt{not_exprt{to_G_expr(op).op()}}; |
47 |
| - } |
48 |
| - else if(op.id() == ID_F) |
49 |
| - { |
50 |
| - // ¬Fφ --> G¬φ |
51 |
| - return G_exprt{not_exprt{to_F_expr(op).op()}}; |
52 |
| - } |
53 |
| - else if(op.id() == ID_X) |
54 |
| - { |
55 |
| - // ¬Xφ --> X¬φ |
56 |
| - return X_exprt{not_exprt{to_X_expr(op).op()}}; |
57 |
| - } |
58 |
| - else if(op.id() == ID_sva_always) |
59 |
| - { |
60 |
| - // ¬ sva_always φ --> sva_s_eventually ¬φ |
61 |
| - return sva_s_eventually_exprt{not_exprt{to_sva_always_expr(op).op()}}; |
62 |
| - } |
63 |
| - else if(op.id() == ID_sva_s_eventually) |
64 |
| - { |
65 |
| - // ¬ sva_s_eventually φ --> sva_always ¬φ |
66 |
| - return sva_always_exprt{not_exprt{to_sva_s_eventually_expr(op).op()}}; |
67 |
| - } |
68 |
| - |
69 |
| - return std::move(expr); |
70 |
| -} |
71 |
| - |
72 |
| -exprt normalize_pre_implies(implies_exprt expr) |
73 |
| -{ |
74 |
| - return or_exprt{not_exprt{expr.lhs()}, expr.rhs()}; |
75 |
| -} |
76 |
| - |
77 | 22 | exprt normalize_pre_sva_non_overlapped_implication(
|
78 | 23 | sva_non_overlapped_implication_exprt expr)
|
79 | 24 | {
|
@@ -113,13 +58,11 @@ exprt normalize_pre_sva_cycle_delay(sva_cycle_delay_exprt expr)
|
113 | 58 | exprt normalize_property_rec(exprt expr)
|
114 | 59 | {
|
115 | 60 | // pre-traversal
|
116 |
| - if(expr.id() == ID_not) |
117 |
| - expr = normalize_pre_not(to_not_expr(expr)); |
118 |
| - else if(expr.id() == ID_implies) |
119 |
| - expr = normalize_pre_implies(to_implies_expr(expr)); |
120 |
| - else if(expr.id() == ID_sva_non_overlapped_implication) |
| 61 | + if(expr.id() == ID_sva_non_overlapped_implication) |
| 62 | + { |
121 | 63 | expr = normalize_pre_sva_non_overlapped_implication(
|
122 | 64 | to_sva_non_overlapped_implication_expr(expr));
|
| 65 | + } |
123 | 66 | else if(expr.id() == ID_sva_nexttime)
|
124 | 67 | {
|
125 | 68 | auto one = natural_typet{}.one_expr();
|
@@ -184,5 +127,8 @@ exprt normalize_property(exprt expr)
|
184 | 127 | // now do recursion
|
185 | 128 | expr = normalize_property_rec(expr);
|
186 | 129 |
|
| 130 | + // NNF |
| 131 | + expr = property_nnf(expr); |
| 132 | + |
187 | 133 | return expr;
|
188 | 134 | }
|
0 commit comments