@@ -126,6 +126,7 @@ static naja::verilog::Number generateNumber(
126
126
%token SUPPLY1_KW
127
127
%token WIRE_KW
128
128
%token ASSIGN_KW
129
+ %token DEFPARAM_KW
129
130
%token END 0 " end of file"
130
131
131
132
%token <std::string> IDENTIFIER_TK
@@ -136,7 +137,6 @@ static naja::verilog::Number generateNumber(
136
137
137
138
%type <naja::verilog::Identifier> identifier ;
138
139
// no support for XMRs for the moment
139
- %type <naja::verilog::Identifier> hierarchical_identifier ;
140
140
%type <naja::verilog::Identifier> hierarchical_net_identifier ;
141
141
%type <naja::verilog::Identifier> module_identifier ;
142
142
%type <naja::verilog::Identifier> name_of_module_instance ;
@@ -151,16 +151,19 @@ static naja::verilog::Number generateNumber(
151
151
%type <naja::verilog::Range> constant_range_expression .opt ;
152
152
%type <naja::verilog::Identifier> net_identifier ;
153
153
%type <naja::verilog::Identifiers> list_of_identifiers ;
154
+ %type <naja::verilog::Identifiers> hierarchical_identifier ;
155
+ %type <naja::verilog::Identifiers> hierarchical_parameter_identifier ;
154
156
%type <naja::verilog::RangeIdentifiers> net_lvalue ;
155
157
%type <naja::verilog::RangeIdentifiers> list_of_net_lvalues ;
156
158
%type <naja::verilog::Identifier> module_instance ;
157
159
%type <naja::verilog::Identifier> port_identifier ;
158
160
159
161
%type <naja::verilog::Number> number ;
160
- %type <naja::verilog::Number> constant_primary ;
161
- %type <naja::verilog::Number> constant_expression ;
162
+ %type <naja::verilog::Expression> constant_mintypmax_expression ;
162
163
%type <std::string> unary_operator ;
163
164
%type <naja::verilog::Expression> primary ;
165
+ %type <naja::verilog::Expression> constant_primary ;
166
+ %type <naja::verilog::Expression> constant_expression ;
164
167
%type <naja::verilog::Expression> expression ;
165
168
%type <naja::verilog::Expression> expression .opt ;
166
169
%type <naja::verilog::Expression> mintypmax_expression ;
@@ -186,20 +189,48 @@ identifier
186
189
$$ = naja::verilog::Identifier(escaped, true);
187
190
}
188
191
189
- constant_primary : number
192
+ primary
193
+ : number {
194
+ $$.valid_ = true; $$.value_ = $1; }
195
+ //no support for XMRs for the moment: should be hierarchical_identifier below
196
+ | identifier constant_range_expression.opt {
197
+ $$.valid_ = true; $$.value_ = naja::verilog::RangeIdentifier($1, $2); }
198
+ | STRING_TK { $$.valid_ = true; $$.value_ = $1.substr(1, $1.size()-2); }
199
+ | concatenation { $$.valid_ = true; $$.value_ = naja::verilog::Concatenation($1); }
200
+ ;
201
+
202
+ constant_primary
203
+ : number {
204
+ $$.valid_ = true; $$.value_ = $1; }
205
+ | STRING_TK { $$.valid_ = true; $$.value_ = $1.substr(1, $1.size()-2); }
206
+ ;
190
207
191
208
unary_operator : SIGN_TK ;
192
209
193
210
constant_expression : constant_primary {
194
211
$$ = $1 ;
195
212
}
196
213
| unary_operator constant_primary {
197
- $$ = $2 ;
198
- if ($1 == " -" ) { $$ .sign_ = false ; }
214
+ auto expression = $2 ;
215
+ if (expression.value_.index() == naja::verilog::Expression::NUMBER) {
216
+ auto number = std::get<naja::verilog::Number>(expression.value_);
217
+ if ($1 == " -" ) { number.sign_ = false ; }
218
+ $$ .valid_ = true ;
219
+ $$ .value_ = number;
220
+ } else {
221
+ throw VerilogException (" Only constant number expression are supported" ); // LCOV_EXCL_LINE
222
+ }
199
223
}
200
224
201
225
range : ' [' constant_expression ' :' constant_expression ' ]' {
202
- $$ = Range($2 .getInt(), $4 .getInt());
226
+ if ($2 .value_.index() == naja::verilog::Expression::NUMBER and
227
+ $4 .value_.index() == naja::verilog::Expression::NUMBER) {
228
+ auto number1 = std::get<naja::verilog::Number>($2 .value_);
229
+ auto number2 = std::get<naja::verilog::Number>($4 .value_);
230
+ $$ = Range(number1.getInt(), number2.getInt());
231
+ } else {
232
+ throw VerilogException (" Only constant number expression are supported" ); // LCOV_EXCL_LINE
233
+ }
203
234
}
204
235
205
236
range.opt : %empty { $$ .valid_ = false ; } | range { $$ = $1 ; }
@@ -221,7 +252,20 @@ port_type_io
221
252
| OUTPUT_KW { $$ = naja::verilog::Port::Direction::Output; }
222
253
;
223
254
224
- non_port_module_item : module_or_generate_item ;
255
+ non_port_module_item : module_or_generate_item ;
256
+
257
+ hierarchical_parameter_identifier : hierarchical_identifier ;
258
+
259
+ constant_mintypmax_expression : constant_expression ;
260
+
261
+ defparam_assignment : hierarchical_parameter_identifier ' =' constant_mintypmax_expression {
262
+ constructor->setCurrentLocation (@$.begin.line, @$.begin.column);
263
+ constructor->addDefParameterAssignment ($1 , $3 );
264
+ }
265
+
266
+ list_of_defparam_assignments : defparam_assignment | list_of_defparam_assignments defparam_assignment ;
267
+
268
+ parameter_override : DEFPARAM_KW list_of_defparam_assignments ' ;'
225
269
226
270
hierarchical_net_identifier : identifier ;
227
271
@@ -253,6 +297,7 @@ continuous_assign: ASSIGN_KW list_of_net_assignments ';'
253
297
module_or_generate_item :
254
298
module_or_generate_item_declaration
255
299
| module_instantiation
300
+ | parameter_override
256
301
| continuous_assign
257
302
;
258
303
@@ -298,13 +343,26 @@ number
298
343
$$ = Number($1);
299
344
}
300
345
301
- //no support for XMRs for the moment
302
- hierarchical_identifier : identifier ;
346
+ //hierarchical_identifier ::=
347
+ //{ identifier [ [ constant_expression ] ] . } identifier
348
+ hierarchical_identifier
349
+ : identifier {
350
+ $$ = { $1 };
351
+ }
352
+ | hierarchical_identifier '.' identifier {
353
+ $1.push_back($3);
354
+ $$ = $1;
355
+ }
303
356
304
357
//only numeric values (one bit) [4] or [4:5] are supported
305
358
constant_range_expression.opt : %empty { $$ .valid_ = false ; }
306
359
| ' [' constant_expression ' ]' {
307
- $$ = Range($2 .getInt());
360
+ if ($2 .value_.index() == naja::verilog::Expression::NUMBER) {
361
+ auto number = std::get<naja::verilog::Number>($2 .value_);
362
+ $$ = Range(number.getInt());
363
+ } else {
364
+ throw VerilogException (" Only constant number expression are supported" ); // LCOV_EXCL_LINE
365
+ }
308
366
}
309
367
| range {
310
368
$$ = $1 ;
@@ -321,15 +379,6 @@ expression {
321
379
322
380
concatenation : ' {' list_of_expressions ' }' { $$ = $2 ; }
323
381
324
- primary
325
- : number {
326
- $$ .valid_ = true ; $$ .value_ = $1 ; }
327
- | hierarchical_identifier constant_range_expression.opt {
328
- $$ .valid_ = true ; $$ .value_ = naja::verilog::RangeIdentifier($1 , $2 ); }
329
- | STRING_TK { $$ .valid_ = true ; $$ .value_ = $1 .substr(1 , $1 .size()-2 ); }
330
- | concatenation { $$ .valid_ = true ; $$ .value_ = naja::verilog::Concatenation($1 ); }
331
- ;
332
-
333
382
expression : primary { $$ = $1 ; }
334
383
335
384
expression.opt : %empty { $$ .valid_ = false ; } | expression { $$ = $1 ; }
0 commit comments