blob: 6cb5d3f69e73f80db83681076f50a634cec74462 (
plain)
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
|
package body Iirs_Walk is
function Walk_Chain (Chain : Iir; Cb : Walk_Cb) return Walk_Status
is
El : Iir;
Status : Walk_Status := Walk_Continue;
begin
El := Chain;
while El /= Null_Iir loop
Status := Cb.all (El);
exit when Status /= Walk_Continue;
El := Get_Chain (El);
end loop;
return Status;
end Walk_Chain;
function Walk_Sequential_Stmt (Stmt : Iir; Cb : Walk_Cb) return Walk_Status;
function Walk_Sequential_Stmt_Chain (Chain : Iir; Cb : Walk_Cb)
return Walk_Status
is
El : Iir;
Status : Walk_Status := Walk_Continue;
begin
El := Chain;
while El /= Null_Iir loop
Status := Cb.all (El);
exit when Status /= Walk_Continue;
Status := Walk_Sequential_Stmt (El, Cb);
exit when Status /= Walk_Continue;
El := Get_Chain (El);
end loop;
return Status;
end Walk_Sequential_Stmt_Chain;
function Walk_Sequential_Stmt (Stmt : Iir; Cb : Walk_Cb) return Walk_Status
is
Status : Walk_Status := Walk_Continue;
Chain : Iir;
begin
case Iir_Kinds_Sequential_Statement (Get_Kind (Stmt)) is
when Iir_Kind_Signal_Assignment_Statement
| Iir_Kind_Null_Statement
| Iir_Kind_Assertion_Statement
| Iir_Kind_Report_Statement
| Iir_Kind_Wait_Statement
| Iir_Kind_Return_Statement
| Iir_Kind_Procedure_Call_Statement
| Iir_Kind_Next_Statement
| Iir_Kind_Exit_Statement
| Iir_Kind_Variable_Assignment_Statement =>
null;
when Iir_Kind_For_Loop_Statement
| Iir_Kind_While_Loop_Statement =>
Status := Walk_Sequential_Stmt_Chain
(Get_Sequential_Statement_Chain (Stmt), Cb);
when Iir_Kind_Case_Statement =>
Chain := Get_Case_Statement_Alternative_Chain (Stmt);
while Chain /= Null_Iir loop
Status := Walk_Sequential_Stmt_Chain
(Get_Associated (Chain), Cb);
exit when Status /= Walk_Continue;
Chain := Get_Chain (Chain);
end loop;
when Iir_Kind_If_Statement =>
Chain := Stmt;
while Chain /= Null_Iir loop
Status := Walk_Sequential_Stmt_Chain
(Get_Sequential_Statement_Chain (Chain), Cb);
exit when Status /= Walk_Continue;
Chain := Get_Else_Clause (Chain);
end loop;
end case;
return Status;
end Walk_Sequential_Stmt;
function Walk_Assignment_Target (Target : Iir; Cb : Walk_Cb)
return Walk_Status
is
Chain : Iir;
Status : Walk_Status := Walk_Continue;
begin
case Get_Kind (Target) is
when Iir_Kind_Aggregate =>
Chain := Get_Association_Choices_Chain (Target);
while Chain /= Null_Iir loop
Status := Walk_Assignment_Target (Get_Associated (Chain), Cb);
exit when Status /= Walk_Continue;
Chain := Get_Chain (Chain);
end loop;
when others =>
Status := Cb.all (Target);
end case;
return Status;
end Walk_Assignment_Target;
end Iirs_Walk;
|