loom

Форк
0
/
sv.fuze 
288 строк · 12.3 Кб
1
main программа;
2

3
include "include/expression-sv";
4

5
программа
6
    = список_модулей    { ast.addNode(ast.sbl.host, ast.sbl.op.CheckState, 0); }
7
    ;
8

9
список_модулей
10
    = модуль
11
    = список_модулей модуль
12
    ;
13

14
    
15
/* Модуль
16
******************************************************************************************************/    
17
модуль
18
    = начало_модуля тело_модуля "endmodule"
19
    ;
20

21
начало_модуля
22
    = "module" ID "(" список_сигналов ")" ";"
23
    = "module" ID ";"
24
    ;
25

26
список_сигналов
27
    = сигнал
28
    = список_сигналов "," сигнал
29
    ;
30

31
/* Сигнал
32
******************************************************************************************************/
33
сигнал
34
    = направление_сигнала тип_сигнала ID
35
                                { 
36
                                    ast.addNode(ast.sbl.host, ast.sbl.op.Declaration, 2);
37
                                    ast.addNode(ast.sbl.host, ast.sbl.op.Announcements_Completed, 0);
38
                                }
39
//    = направление_сигнала тип_сигнала размерности_упаковки ID
40
    ;
41

42
направление_сигнала
43
    = "input"
44
    = "output"
45
    ;
46

47
тип_сигнала
48
    = "logic"                   { 
49
                                    ast.addNode(ast.sbl.host, ast.sbl.op.PushVariable, "array");
50
                                    ast.addNode(ast.sbl.host, ast.sbl.op.ObjectElement, "int1");
51
                                    ast.addNode(ast.sbl.host, ast.sbl.op.FunctionCall, 0);
52
                                    ast.addNode(ast.sbl.host, ast.sbl.op.Announcement, 0);
53
                                }
54
    = "logic" начало_упаковки NUMBER ":" NUMBER "]"
55
                                { 
56
                                    ast.addNode(ast.sbl.host, ast.sbl.op.PushConstant, 2);
57
                                    ast.goParent(); 
58
                                    ast.addNode(ast.sbl.host, ast.sbl.op.Announcement, 0);
59
                                }
60
    ;
61
    
62
начало_упаковки
63
    = "["                       { 
64
                                    ast.addNode(ast.sbl.host, ast.sbl.op.PushVariable, "array");
65
                                    ast.addNode(ast.sbl.host, ast.sbl.op.ObjectElement, "int");
66
                                    ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.FunctionCall, 0);
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
    = "assign" список_непрерывных_присваиваний ";"
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
                                { ast.addNode(ast.sbl.host, ast.sbl.op.Announcements_Completed, 0); } 
127
    = объявление_переменной инициализация_переменной
128
                                { ast.addNode(ast.sbl.host, ast.sbl.op.Announcements_Completed, 0); } 
129
    ;
130

131
объявление_переменной
132
    = ID                        { ast.addNode(ast.sbl.host, ast.sbl.op.Declaration, 0); }
133
    ;
134
    
135
инициализация_переменной
136
    = знак_инициализации выражение
137
                                { ast.goParent(); ast.addNode(ast.sbl.host, ast.sbl.op.PostInitialize, 0); }
138
    ;
139

140
знак_инициализации
141
    = "="                       { ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.Initialize, 0); }
142
    ;
143

144

145
/* Комбинационный блок
146
******************************************************************************************************/
147
блок_комбинационный
148
    = начало_комбинационного_блока тело_блока
149
                        { 
150
                            ast.goParent(); 
151
                            ast.goParent(); 
152
                            ast.addNode(ast.sbl.host, ast.sbl.op.FunctionDefinitionEnd, 0);
153
                            ast.goParent(); 
154
                            ast.addNode(ast.sbl.host, ast.sbl.op.PostInitialize, 0);
155
                            ast.addNode(ast.sbl.host, ast.sbl.op.Announcements_Completed, 0);
156
                            ast.addNode(ast.sbl.host, ast.sbl.op.FunctionTethered, 0);
157
                        }
158
    ;
159
    
160
тело_блока 
161
    = оператор
162
                        { ast.addNode(ast.sbl.host, ast.sbl.op.None, 0); }
163
    = "begin" список_операторов "end"
164
                        { ast.addNode(ast.sbl.host, ast.sbl.op.None, 2); }
165
    ;
166
    
167
начало_комбинационного_блока
168
    = "always_comb"     { 
169
                            ast.addNode(ast.sbl.host, ast.sbl.op.AutoDeclaration, 0);
170
                            ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.Initialize, 0);
171
                            ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.FunctionDefinition, 0);
172
                            ast.addNode_StepInto(ast.sbl.host, ast.sbl1.op.Function_Body, 0);
173
                        }
174
    ;
175

176
список_операторов
177
    = оператор
178
    = список_операторов оператор
179
    ;
180

181
оператор
182
    = условный_оператор
183
    = оператор_неблокирующего_присваивания ";"
184
    = оператор_блокирующего_присваивания ";"
185
    ;
186

187
/* Триггерный блок
188
******************************************************************************************************/
189
блок_триггерный
190
    = начало_триггерного_блока блок_чувствительности тело_блока
191
                        { 
192
                            ast.goParent(); 
193
                            ast.goParent(); 
194
                            ast.addNode(ast.sbl.host, ast.sbl.op.FunctionDefinitionEnd, 0);
195
                            ast.goParent(); 
196
                            ast.addNode(ast.sbl.host, ast.sbl.op.PostInitialize, 0);
197
                            ast.addNode(ast.sbl.host, ast.sbl.op.Announcements_Completed, 0);
198
                            ast.addNode(ast.sbl.host, ast.sbl.op.FunctionTethered, 0);
199
                        }
200
//    = начало_триггерного_блока "@" "(" список_чувствительности ")" "begin" список_операторов_триггерных "end"
201
    ;
202
    
203
начало_триггерного_блока
204
    = "always_ff"       { 
205
                            ast.addNode(ast.sbl.host, ast.sbl.op.AutoDeclaration, 0);
206
                            ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.Initialize, 0);
207
                            ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.FunctionDefinition, 0);
208
                        }
209
    ;
210
    
211
блок_чувствительности
212
    = начало_блока_чувствительности список_чувствительности ")"
213
                        { 
214
                            //ast.goParent(); 
215
                            ast.addNode_StepInto(ast.sbl.host, ast.sbl1.op.Function_Body, 0);
216
                        }
217
    ;
218
    
219
начало_блока_чувствительности
220
    = "@" "("           //{ ast.addNode_StepInto(ast.sbl.host, ast.sbl1.op.Function_Params, 0); }
221
    ;
222

223
список_чувствительности
224
    = сигнал_чувствительности
225
    = список_чувствительности "," сигнал_чувствительности
226
    ;
227

228
сигнал_чувствительности
229
    = "posedge" ID
230
    = "negedge" ID
231
    ;
232

233
/*  Условный оператор
234
******************************************************************************/
235
условный_оператор
236
    = базовый_условный_оператор >
237
                            { ast.goParent(); ast.goParent(); }
238
    = базовый_условный_оператор условие_else_триггерное
239
                            { ast.goParent(); ast.goParent(); }
240
    ;
241

242
    базовый_условный_оператор
243
        = условие_if "begin" список_операторов "end"
244
        = условие_if оператор
245
        ;
246

247
    условие_if
248
        = "if" "(" выражение ")"   {
249
                                ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.If, 0);
250
                                ast.addNode_StepInto(ast.sbl.host, ast.sbl1.op.If_True_Body, 0);
251
                            }
252
        ;
253
    условие_else_триггерное
254
        = слово_else "begin" список_операторов "end"
255
        = слово_else оператор
256
        ;
257
        слово_else
258
            = "else"        { 
259
                                ast.goParent(); 
260
                                ast.addNode_StepInto(ast.sbl.host, ast.sbl1.op.If_Else_Body, 0); 
261
                            }
262
            ;
263

264
/*  Оператор присваивания
265
******************************************************************************************************/
266
оператор_блокирующего_присваивания
267
    = адрес знак_присваивания выражение
268
                            { ast.goParent(); }
269
    = адрес знак_присваивания_с_итерацией выражение
270
                            { ast.goParent(); }
271
    ;
272
знак_присваивания
273
    = "="                   { ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.Assignment, 0); }
274
    ;
275
знак_присваивания_с_итерацией
276
    = "+="                  { ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.AssignmentAddition, 0); }
277
    = "-="                  { ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.AssignmentSubtraction, 0); }
278
    = "*="                  { ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.AssignmentMultiplication, 0); }
279
    = "/="                  { ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.AssignmentDivision, 0); }
280
    = "%="                  { ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.AssignmentModulo, 0); }
281
    ;
282

283
/*  Оператор неблокирующего присваивания
284
******************************************************************************************************/
285
оператор_неблокирующего_присваивания
286
    = адрес "<=" выражение
287
                            { ast.addNode(ast.sv.host, ast.sv.op.Assign, 0); }
288
    ;
289

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.