Source file v_change.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
module Change_base = Diffast_core.Change_base
module Triple = Diffast_core.Triple
module Info = Diffast_core.Info
module Edit = Diffast_core.Edit
module V_label = Verilog_base.V_label
module UID = Diffast_misc.UID
module F (L : V_label.T) = struct
module I = Info
module E = Edit
include Change_base
module CB = F(L)
let getlab = L.getlab
let is_always_construct nd = L.is_always_construct (getlab nd)
let is_timing_control nd = L.is_timing_control (getlab nd)
let is_continuous_assign nd = L.is_continuous_assign (getlab nd)
let is_blocking_assign nd = L.is_blocking_assign (getlab nd)
let is_non_blocking_assign nd = L.is_non_blocking_assign (getlab nd)
let is_if nd = L.is_if (getlab nd)
let is_case nd = L.is_case (getlab nd)
let is_case_item nd = L.is_case_item (getlab nd)
let is_case_cond nd = L.is_case_cond (getlab nd)
let is_ports nd = L.is_ports (getlab nd)
let is_port nd = L.is_port (getlab nd)
let is_port_dir nd = L.is_port_dir (getlab nd)
let is_net_type nd = L.is_net_type (getlab nd)
let is_data_type nd = L.is_data_type (getlab nd)
let is_var_data_type nd = L.is_var_data_type (getlab nd)
let is_signing nd = L.is_signing (getlab nd)
let is_ranges nd = L.is_ranges (getlab nd)
let is_variable_dims nd = L.is_variable_dims (getlab nd)
let is_inst nd = L.is_inst (getlab nd)
let is_initial_construct nd = L.is_initial_construct (getlab nd)
let is_final_construct nd = L.is_final_construct (getlab nd)
let is_generate_region nd = L.is_generate_region (getlab nd)
let is_param_port_decl nd = L.is_param_port_decl (getlab nd)
let is_param_assign nd = L.is_param_assign (getlab nd)
let is_reg nd = L.is_reg (getlab nd)
let is_data_decl_var nd = L.is_data_decl_var (getlab nd)
let is_net_decl nd = L.is_net_decl (getlab nd)
let is_wire nd = L.is_wire (getlab nd)
let is_expr nd = L.is_expr (getlab nd)
let is_stmt nd = L.is_stmt (getlab nd)
let is_pp_define nd = L.is_pp_define (getlab nd)
let is_pp_include nd = L.is_pp_include (getlab nd)
let is_if_cond nd =
try
let pnd = nd#initial_parent in
is_if pnd && is_expr nd
with _ -> false
let is_branch nd n =
try
let pnd = nd#initial_parent in
if is_if pnd && is_stmt nd then
let stmts = List.filter is_stmt (Array.to_list pnd#children) in
try
List.nth stmts n == nd
with _ ->
raise (Invalid_argument "Verilog.Change.F.is_branch")
else
false
with _ -> false
let is_then_branch nd = is_branch nd 0
let is_else_branch nd = is_branch nd 1
let is_port_value nd =
try
let pnd = nd#initial_parent in
is_port pnd && is_expr nd
with _ -> false
let is_reg_decl nd =
if is_data_decl_var nd then
try
let head = nd#initial_children.(0) in
let x = head#initial_children.(head#initial_nchildren-1) in
is_reg x
with _ -> false
else
false
let is_wire_decl nd =
if is_net_decl nd then
try
is_wire nd#initial_children.(0)
with _ -> false
else
false
let get_unit tree nd =
try
let u = tree#get_nearest_containing_unit nd in
u#data#label
with Not_found -> ""
let ids_to_str ids =
if ids = [] then "" else sprintf "{%s}" (String.concat "," ids)
let subtree_to_str tree nd =
sprintf "[%s]" (tree#subtree_to_simple_string nd#gindex)
let get_desc1 _ tree nd =
let ids = tree#get_ident_use_list nd#gindex in
let =
if true then
subtree_to_str tree nd
else
""
in
nd#data#label^(ids_to_str ids)^extra2
let get_desc2 tree1 tree2 nd1 nd2 =
let ids1 = tree1#get_ident_use_list nd1#gindex in
let ids2 = tree2#get_ident_use_list nd2#gindex in
sprintf "%s%s%s -> %s%s%s"
nd1#data#label (ids_to_str ids1) (subtree_to_str tree1 nd1)
nd2#data#label (ids_to_str ids2) (subtree_to_str tree2 nd2)
class c options tree1 tree2 uidmapping edits get_unit get_desc1 get_desc2 = object(self)
inherit CB.c options tree1 tree2 uidmapping edits get_unit get_desc1 get_desc2
method! make_changes_list () =
let mkt_del = self#mkt_deleted ~category:Triple.ghost in
let mkt_ins = self#mkt_inserted ~category:Triple.ghost in
let mkt_mod = self#mkt_modified ~category:Triple.ghost in
let mkt_chgcard _ = [] in
[
"always-construct removed", Smedium, (self#make_delete_st is_always_construct), mkt_del;
"always-construct added", Smedium, (self#make_insert_st is_always_construct), mkt_ins;
"timing control modified", Smedium, (self#aggregate_changes is_timing_control), mkt_mod;
"continuous-assignment removed", Smedium, (self#make_delete_st is_continuous_assign), mkt_del;
"continuous-assignment added", Smedium, (self#make_insert_st is_continuous_assign), mkt_ins;
"continuous-assignment modified", Smedium, (self#aggregate_changes is_continuous_assign), mkt_mod;
"blocking-assignment removed", Smedium, (self#make_delete_st is_blocking_assign), mkt_del;
"blocking-assignment added", Smedium, (self#make_insert_st is_blocking_assign), mkt_ins;
"blocking-assignment modified", Smedium, (self#aggregate_changes is_blocking_assign), mkt_mod;
"non-blocking-assignment removed", Smedium, (self#make_delete_st is_non_blocking_assign), mkt_del;
"non-blocking-assignment added", Smedium, (self#make_insert_st is_non_blocking_assign), mkt_ins;
"non-blocking-assignment modified", Smedium, (self#aggregate_changes is_non_blocking_assign), mkt_mod;
"if-condition modified", Smedium, (self#aggregate_changes is_if_cond), mkt_mod;
"then-branch deleted", Smedium, (self#make_delete is_then_branch), mkt_del;
"then-branch inserted", Smedium, (self#make_insert is_then_branch), mkt_ins;
"then-branch removed", Smedium, (self#make_delete_st is_then_branch), mkt_del;
"then-branch added", Smedium, (self#make_insert_st is_then_branch), mkt_ins;
"else-branch deleted", Smedium, (self#make_delete is_else_branch), mkt_del;
"else-branch inserted", Smedium, (self#make_insert is_else_branch), mkt_ins;
"else-branch removed", Smedium, (self#make_delete_st is_else_branch), mkt_del;
"else-branch added", Smedium, (self#make_insert_st is_else_branch), mkt_ins;
"case statement modified", Smedium, (self#aggregate_changes is_case), mkt_mod;
"case-branch removed", Smedium, (self#make_delete_st is_case_item), mkt_del;
"case-branch added", Smedium, (self#make_insert_st is_case_item), mkt_ins;
"case-condition modified", Smedium, (self#aggregate_changes is_case_cond), mkt_mod;
"port direction removed", Smedium, (self#make_delete_st is_port_dir), mkt_del;
"port direction added", Smedium, (self#make_insert_st is_port_dir), mkt_ins;
"port direction modified", Smedium, (self#aggregate_changes is_port_dir), mkt_mod;
"net type removed", Smedium, (self#make_delete_st is_net_type), mkt_del;
"net type added", Smedium, (self#make_insert_st is_net_type), mkt_ins;
"net type modified", Smedium, (self#aggregate_changes is_net_type), mkt_mod;
"data type removed", Smedium, (self#make_delete_st is_data_type), mkt_del;
"data type added", Smedium, (self#make_insert_st is_data_type), mkt_ins;
"data type modified", Smedium, (self#aggregate_changes is_data_type), mkt_mod;
"var data type removed", Smedium, (self#make_delete_st is_var_data_type), mkt_del;
"var data type added", Smedium, (self#make_insert_st is_var_data_type), mkt_ins;
"var data type modified", Smedium, (self#aggregate_changes is_var_data_type), mkt_mod;
"signing removed", Smedium, (self#make_delete_st is_signing), mkt_del;
"signing added", Smedium, (self#make_insert_st is_signing), mkt_ins;
"signing modified", Smedium, (self#aggregate_changes is_signing), mkt_mod;
"ranges removed", Smedium, (self#make_delete_st is_ranges), mkt_del;
"ranges added", Smedium, (self#make_insert_st is_ranges), mkt_ins;
"ranges modified", Smedium, (self#aggregate_changes is_ranges), mkt_mod;
"variable dimensions removed", Smedium, (self#make_delete_st is_variable_dims), mkt_del;
"variable dimensions added", Smedium, (self#make_insert_st is_variable_dims), mkt_ins;
"variable dimensions modified", Smedium, (self#aggregate_changes is_variable_dims), mkt_mod;
"number of ports changed", Smedium, (self#make_cardinality_change is_port), mkt_chgcard;
"instantiation removed", Smedium, (self#make_delete_st is_inst), mkt_del;
"instantiation added", Smedium, (self#make_insert_st is_inst), mkt_ins;
"instantiation modified", Smedium, (self#aggregate_changes is_inst), mkt_mod;
"initial-construct removed", Smedium, (self#make_delete_st is_initial_construct), mkt_del;
"initial-construct added", Smedium, (self#make_insert_st is_initial_construct), mkt_ins;
"initial-construct modified", Smedium, (self#aggregate_changes is_initial_construct), mkt_mod;
"final-construct removed", Smedium, (self#make_delete_st is_final_construct), mkt_del;
"final-construct added", Smedium, (self#make_insert_st is_final_construct), mkt_ins;
"final-construct modified", Smedium, (self#aggregate_changes is_final_construct), mkt_mod;
"generate-region removed", Smedium, (self#make_delete_st is_generate_region), mkt_del;
"generate-region added", Smedium, (self#make_insert_st is_generate_region), mkt_ins;
"generate-region modified", Smedium, (self#aggregate_changes is_generate_region), mkt_mod;
"parameter port declaration removed", Smedium, (self#make_delete_st is_param_port_decl), mkt_del;
"parameter port declaration added", Smedium, (self#make_insert_st is_param_port_decl), mkt_ins;
"parameter port declaration modified", Smedium, (self#aggregate_changes is_param_port_decl), mkt_mod;
"parameter assignment removed", Smedium, (self#make_delete_st is_param_assign), mkt_del;
"parameter assignment added", Smedium, (self#make_insert_st is_param_assign), mkt_ins;
"parameter assignment modified", Smedium, (self#aggregate_changes is_param_assign), mkt_mod;
"register removed", Smedium, (self#make_delete_st is_reg_decl), mkt_del;
"register added", Smedium, (self#make_insert_st is_reg_decl), mkt_ins;
"register modified", Smedium, (self#aggregate_changes is_reg_decl), mkt_mod;
"wire removed", Smedium, (self#make_delete_st is_wire_decl), mkt_del;
"wire added", Smedium, (self#make_insert_st is_wire_decl), mkt_ins;
"wire modified", Smedium, (self#aggregate_changes is_wire_decl), mkt_mod;
"define-directive removed", Smedium, (self#make_delete_st is_pp_define), mkt_del;
"define-directive added", Smedium, (self#make_insert_st is_pp_define), mkt_ins;
"define-directive modified", Smedium, (self#aggregate_changes is_pp_define), mkt_mod;
"include-directive removed", Smedium, (self#make_delete_st is_pp_include), mkt_del;
"include-directive added", Smedium, (self#make_insert_st is_pp_include), mkt_ins;
"include-directive modified", Smedium, (self#aggregate_changes is_pp_include), mkt_mod;
]
end
let options tree1 tree2 uidmapping edits =
let chg = new c options tree1 tree2 uidmapping edits get_unit get_desc1 get_desc2 in
let res = chg#extract in
chg#recover_edits;
res
end