start constructing class
[sv2nmigen.git] / parse_sv.py
1 # %{
2 # /*
3 #  * Copyright (c) 1998-2017 Stephen Williams (steve@icarus.com)
4 #  * Copyright CERN 2012-2013 / Stephen Williams (steve@icarus.com)
5 #  *
6 #  *    This source code is free software; you can redistribute it
7 #  *    and/or modify it in source code form under the terms of the GNU
8 #  *    General Public License as published by the Free Software
9 #  *    Foundation; either version 2 of the License, or (at your option)
10 #  *    any later version.
11 #  *
12 #  *    This program is distributed in the hope that it will be useful,
13 #  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
14 #  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 #  *    GNU General Public License for more details.
16 #  *
17 #  *    You should have received a copy of the GNU General Public License
18 #  *    along with this program; if not, write to the Free Software
19 #  *    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 #  */
21
22 from lib2to3.pytree import Node, Leaf
23 from lib2to3.pgen2 import token
24 from lib2to3.pygram import python_symbols as syms
25
26 from ply import yacc, lex
27
28 #from parse_tokens import tokens
29 import lexor
30 tokens = lexor.tokens # list(set(lexor.tokens).union(set(tokens)))
31 literals = lexor.literals
32
33 precedence = [\
34     ('right', 'K_PLUS_EQ', 'K_MINUS_EQ', 'K_MUL_EQ', 'K_DIV_EQ',
35               'K_MOD_EQ', 'K_AND_EQ', 'K_OR_EQ'),
36     ('right', 'K_XOR_EQ', 'K_LS_EQ', 'K_RS_EQ', 'K_RSS_EQ'),
37     ('right', '?', ':', 'K_inside'),
38     ('left', 'K_LOR'), 
39     ('left', 'K_LAND'), 
40     ('left', '|'), 
41     ('left', '^', 'K_NXOR', 'K_NOR'), 
42     ('left', '&', 'K_NAND'), 
43     ('left', 'K_EQ', 'K_NE', 'K_CEQ', 'K_CNE', 'K_WEQ', 'K_WNE'), 
44     ('left', 'K_GE', 'K_LE', '<', '>'), 
45     ('left', 'K_LS', 'K_RS', 'K_RSS'), 
46     ('left', '+', '-'), 
47     ('left', '*', '/', '%'), 
48     ('left', 'K_POW'), 
49     ('left', 'UNARY_PREC'), 
50     ('nonassoc', 'less_than_K_else'), 
51     ('nonassoc', 'K_else'), 
52     ('nonassoc', '('), 
53     ('nonassoc', 'K_exclude'), 
54     ('nonassoc', 'no_timeunits_declaration'), 
55     ('nonassoc', 'one_timeunits_declaration'), 
56     ('nonassoc', 'K_timeunit', 'K_timeprecision')
57     ]
58 ()
59 # -------------- RULES ----------------
60 ()
61 def p_source_text_1(p):
62     '''source_text : timeunits_declaration_opt _embed0_source_text description_list '''
63     print('source_text', list(p))
64 ()
65 def p_source_text_2(p):
66     '''source_text :  '''
67     print('source_text', list(p))
68 ()
69 def p__embed0_source_text(p):
70     '''_embed0_source_text : '''
71     # { pform_set_scope_timescale(yyloc); }
72 ()
73 def p_assertion_item_1(p):
74     '''assertion_item : concurrent_assertion_item '''
75     print('assertion_item_1', list(p))
76 ()
77 def p_assignment_pattern_1(p):
78     '''assignment_pattern : K_LP expression_list_proper '}' '''
79     print('assignment_pattern_1', list(p))
80     # { PEAssignPattern*tmp = new PEAssignPattern(*$2);
81     #   FILE_NAME(tmp, @1);
82     #   delete $2;
83     #   $$ = tmp;
84     #       }
85 ()
86 def p_assignment_pattern_2(p):
87     '''assignment_pattern : K_LP '}' '''
88     print('assignment_pattern_2', list(p))
89     # { PEAssignPattern*tmp = new PEAssignPattern;
90     #   FILE_NAME(tmp, @1);
91     #   $$ = tmp;
92     #       }
93 ()
94 def p_block_identifier_opt_1(p):
95     '''block_identifier_opt : IDENTIFIER ':' '''
96     print('block_identifier_opt_1', list(p))
97 ()
98 def p_block_identifier_opt_2(p):
99     '''block_identifier_opt :  '''
100     print('block_identifier_opt_2', list(p))
101 ()
102 def p_class_declaration_1(p):
103     '''class_declaration : K_virtual_opt K_class lifetime_opt class_identifier class_declaration_extends_opt ';' _embed0_class_declaration class_items_opt K_endclass _embed1_class_declaration class_declaration_endlabel_opt '''
104     print('class_declaration_1', list(p))
105     # { // Wrap up the class.
106     #   if ($11 && $4 && $4->name != $11) {
107     #         yyerror(@11, "error: Class end label doesn't match class name.");
108     #         delete[]$11;
109     #   }
110     #       }
111 ()
112 def p__embed0_class_declaration(p):
113     '''_embed0_class_declaration : '''
114     # { pform_start_class_declaration(@2, $4, $5.type, $5.exprs, $3); }
115 ()
116 def p__embed1_class_declaration(p):
117     '''_embed1_class_declaration : '''
118     # { // Process a class.
119     #   pform_end_class_declaration(@9);
120     #       }
121 ()
122 def p_class_constraint_1(p):
123     '''class_constraint : constraint_prototype '''
124     print('class_constraint_1', list(p))
125 ()
126 def p_class_constraint_2(p):
127     '''class_constraint : constraint_declaration '''
128     print('class_constraint_2', list(p))
129 ()
130 def p_class_identifier_1(p):
131     '''class_identifier : IDENTIFIER '''
132     print('class_identifier_1', list(p))
133     # { // Create a synthetic typedef for the class name so that the
134     #   // lexor detects the name as a type.
135     #   perm_string name = lex_strings.make($1);
136     #   class_type_t*tmp = new class_type_t(name);
137     #   FILE_NAME(tmp, @1);
138     #   pform_set_typedef(name, tmp, NULL);
139     #   delete[]$1;
140     #   $$ = tmp;
141     #       }
142 ()
143 def p_class_identifier_2(p):
144     '''class_identifier : TYPE_IDENTIFIER '''
145     print('class_identifier_2', list(p))
146     # { class_type_t*tmp = dynamic_cast<class_type_t*>($1.type);
147     #   if (tmp == 0) {
148     #         yyerror(@1, "Type name \"%s\"is not a predeclared class name.", $1.text);
149     #   }
150     #   delete[]$1.text;
151     #   $$ = tmp;
152     #       }
153 ()
154 def p_class_declaration_endlabel_opt_1(p):
155     '''class_declaration_endlabel_opt : ':' TYPE_IDENTIFIER '''
156     print('class_declaration_endlabel_opt_1', list(p))
157     # { class_type_t*tmp = dynamic_cast<class_type_t*> ($2.type);
158     #   if (tmp == 0) {
159     #         yyerror(@2, "error: class declaration endlabel \"%s\" is not a class name\n", $2.text);
160     #         $$ = 0;
161     #   } else {
162     #         $$ = strdupnew(tmp->name.str());
163     #   }
164     #   delete[]$2.text;
165     #       }
166 ()
167 def p_class_declaration_endlabel_opt_2(p):
168     '''class_declaration_endlabel_opt : ':' IDENTIFIER '''
169     print('class_declaration_endlabel_opt_2', list(p))
170     # { $$ = $2; }
171 ()
172 def p_class_declaration_endlabel_opt_3(p):
173     '''class_declaration_endlabel_opt :  '''
174     print('class_declaration_endlabel_opt_3', list(p))
175     # { $$ = 0; }
176 ()
177 def p_class_declaration_extends_opt_1(p):
178     '''class_declaration_extends_opt : K_extends TYPE_IDENTIFIER '''
179     print('class_declaration_extends_opt_1', list(p))
180     # { $$.type = $2.type;
181     #   $$.exprs= 0;
182     #   delete[]$2.text;
183     #       }
184 ()
185 def p_class_declaration_extends_opt_2(p):
186     '''class_declaration_extends_opt : K_extends TYPE_IDENTIFIER '(' expression_list_with_nuls ')' '''
187     print('class_declaration_extends_opt_2', list(p))
188     # { $$.type  = $2.type;
189     #   $$.exprs = $4;
190     #   delete[]$2.text;
191     #       }
192 ()
193 def p_class_declaration_extends_opt_3(p):
194     '''class_declaration_extends_opt :  '''
195     print('class_declaration_extends_opt_3', list(p))
196     # { $$.type = 0; $$.exprs = 0; }
197 ()
198 def p_class_items_opt_1(p):
199     '''class_items_opt : class_items '''
200     print('class_items_opt_1', list(p))
201 ()
202 def p_class_items_opt_2(p):
203     '''class_items_opt :  '''
204     print('class_items_opt_2', list(p))
205 ()
206 def p_class_items_1(p):
207     '''class_items : class_items class_item '''
208     print('class_items_1', list(p))
209 ()
210 def p_class_items_2(p):
211     '''class_items : class_item '''
212     print('class_items_2', list(p))
213 ()
214 def p_class_item_1(p):
215     '''class_item : method_qualifier_opt K_function K_new _embed0_class_item '(' tf_port_list_opt ')' ';' function_item_list_opt statement_or_null_list_opt K_endfunction endnew_opt '''
216     print('class_item_1', list(p))
217     # { current_function->set_ports($6);
218     #   pform_set_constructor_return(current_function);
219     #   pform_set_this_class(@3, current_function);
220     #   current_function_set_statement(@3, $10);
221     #   pform_pop_scope();
222     #   current_function = 0;
223     #       }
224 ()
225 def p_class_item_2(p):
226     '''class_item : property_qualifier_opt data_type list_of_variable_decl_assignments ';' '''
227     print('class_item_2', list(p))
228     # { pform_class_property(@2, $1, $2, $3); }
229 ()
230 def p_class_item_3(p):
231     '''class_item : K_const class_item_qualifier_opt data_type list_of_variable_decl_assignments ';' '''
232     print('class_item_3', list(p))
233     # { pform_class_property(@1, $2 | property_qualifier_t::make_const(), $3, $4); }
234 ()
235 def p_class_item_4(p):
236     '''class_item : method_qualifier_opt task_declaration '''
237     print('class_item_4', list(p))
238     # { /* The task_declaration rule puts this into the class */ }
239 ()
240 def p_class_item_5(p):
241     '''class_item : method_qualifier_opt function_declaration '''
242     print('class_item_5', list(p))
243     # { /* The function_declaration rule puts this into the class */ }
244 ()
245 def p_class_item_6(p):
246     '''class_item : K_extern method_qualifier_opt K_function K_new ';' '''
247     print('class_item_6', list(p))
248     # { yyerror(@1, "sorry: External constructors are not yet supported."); }
249 ()
250 def p_class_item_7(p):
251     '''class_item : K_extern method_qualifier_opt K_function K_new '(' tf_port_list_opt ')' ';' '''
252     print('class_item_7', list(p))
253     # { yyerror(@1, "sorry: External constructors are not yet supported."); }
254 ()
255 def p_class_item_8(p):
256     '''class_item : K_extern method_qualifier_opt K_function data_type_or_implicit_or_void IDENTIFIER ';' '''
257     print('class_item_8', list(p))
258     # { yyerror(@1, "sorry: External methods are not yet supported.");
259     #   delete[] $5;
260     #       }
261 ()
262 def p_class_item_9(p):
263     '''class_item : K_extern method_qualifier_opt K_function data_type_or_implicit_or_void IDENTIFIER '(' tf_port_list_opt ')' ';' '''
264     print('class_item_9', list(p))
265     # { yyerror(@1, "sorry: External methods are not yet supported.");
266     #   delete[] $5;
267     #       }
268 ()
269 def p_class_item_10(p):
270     '''class_item : K_extern method_qualifier_opt K_task IDENTIFIER ';' '''
271     print('class_item_10', list(p))
272     # { yyerror(@1, "sorry: External methods are not yet supported.");
273     #   delete[] $4;
274     #       }
275 ()
276 def p_class_item_11(p):
277     '''class_item : K_extern method_qualifier_opt K_task IDENTIFIER '(' tf_port_list_opt ')' ';' '''
278     print('class_item_11', list(p))
279     # { yyerror(@1, "sorry: External methods are not yet supported.");
280     #   delete[] $4;
281     #       }
282 ()
283 def p_class_item_12(p):
284     '''class_item : class_constraint '''
285     print('class_item_12', list(p))
286 ()
287 def p_class_item_13(p):
288     '''class_item : property_qualifier_opt data_type error ';' '''
289     print('class_item_13', list(p))
290     # { yyerror(@3, "error: Errors in variable names after data type.");
291     #   yyerrok;
292     #       }
293 ()
294 def p_class_item_14(p):
295     '''class_item : property_qualifier_opt IDENTIFIER error ';' '''
296     print('class_item_14', list(p))
297     # { yyerror(@3, "error: %s doesn't name a type.", $2);
298     #   yyerrok;
299     #       }
300 ()
301 def p_class_item_15(p):
302     '''class_item : method_qualifier_opt K_function K_new error K_endfunction endnew_opt '''
303     print('class_item_15', list(p))
304     # { yyerror(@1, "error: I give up on this class constructor declaration.");
305     #   yyerrok;
306     #       }
307 ()
308 def p_class_item_16(p):
309     '''class_item : error ';' '''
310     print('class_item_16', list(p))
311     # { yyerror(@2, "error: invalid class item.");
312     #   yyerrok;
313     #       }
314 ()
315 def p__embed0_class_item(p):
316     '''_embed0_class_item : '''
317     # { assert(current_function==0);
318     #   current_function = pform_push_constructor_scope(@3);
319     #       }
320 ()
321 def p_class_item_qualifier_1(p):
322     '''class_item_qualifier : K_static '''
323     print('class_item_qualifier_1', list(p))
324     # { $$ = property_qualifier_t::make_static(); }
325 ()
326 def p_class_item_qualifier_2(p):
327     '''class_item_qualifier : K_protected '''
328     print('class_item_qualifier_2', list(p))
329     # { $$ = property_qualifier_t::make_protected(); }
330 ()
331 def p_class_item_qualifier_3(p):
332     '''class_item_qualifier : K_local '''
333     print('class_item_qualifier_3', list(p))
334     # { $$ = property_qualifier_t::make_local(); }
335 ()
336 def p_class_item_qualifier_list_1(p):
337     '''class_item_qualifier_list : class_item_qualifier_list class_item_qualifier '''
338     print('class_item_qualifier_list_1', list(p))
339     # { $$ = $1 | $2; }
340 ()
341 def p_class_item_qualifier_list_2(p):
342     '''class_item_qualifier_list : class_item_qualifier '''
343     print('class_item_qualifier_list_2', list(p))
344     # { $$ = $1; }
345 ()
346 def p_class_item_qualifier_opt_1(p):
347     '''class_item_qualifier_opt : class_item_qualifier_list '''
348     print('class_item_qualifier_opt_1', list(p))
349     # { $$ = $1; }
350 ()
351 def p_class_item_qualifier_opt_2(p):
352     '''class_item_qualifier_opt :  '''
353     print('class_item_qualifier_opt_2', list(p))
354     # { $$ = property_qualifier_t::make_none(); }
355 ()
356 def p_class_new_1(p):
357     '''class_new : K_new '(' expression_list_with_nuls ')' '''
358     print('class_new_1', list(p))
359     # { list<PExpr*>*expr_list = $3;
360     #   strip_tail_items(expr_list);
361     #   PENewClass*tmp = new PENewClass(*expr_list);
362     #   FILE_NAME(tmp, @1);
363     #   delete $3;
364     #   $$ = tmp;
365     #       }
366 ()
367 def p_class_new_2(p):
368     '''class_new : K_new hierarchy_identifier '''
369     print('class_new_2', list(p))
370     # { PEIdent*tmpi = new PEIdent(*$2);
371     #   FILE_NAME(tmpi, @2);
372     #   PENewCopy*tmp = new PENewCopy(tmpi);
373     #   FILE_NAME(tmp, @1);
374     #   delete $2;
375     #   $$ = tmp;
376     #       }
377 ()
378 def p_class_new_3(p):
379     '''class_new : K_new '''
380     print('class_new_3', list(p))
381     # { PENewClass*tmp = new PENewClass;
382     #   FILE_NAME(tmp, @1);
383     #   $$ = tmp;
384     #       }
385 ()
386 def p_concurrent_assertion_item_1(p):
387     '''concurrent_assertion_item : block_identifier_opt K_assert K_property '(' property_spec ')' statement_or_null '''
388     print('concurrent_assertion_item_1', list(p))
389     # { /* */
390     #   if (gn_assertions_flag) {
391     #         yyerror(@2, "sorry: concurrent_assertion_item not supported."
392     #                 " Try -gno-assertion to turn this message off.");
393     #   }
394     #       }
395 ()
396 def p_concurrent_assertion_item_2(p):
397     '''concurrent_assertion_item : block_identifier_opt K_assert K_property '(' error ')' statement_or_null '''
398     print('concurrent_assertion_item_2', list(p))
399     # { yyerrok;
400     #         yyerror(@2, "error: Error in property_spec of concurrent assertion item.");
401     #       }
402 ()
403 def p_constraint_block_item_1(p):
404     '''constraint_block_item : constraint_expression '''
405     print('constraint_block_item_1', list(p))
406 ()
407 def p_constraint_block_item_list_1(p):
408     '''constraint_block_item_list : constraint_block_item_list constraint_block_item '''
409     print('constraint_block_item_list_1', list(p))
410 ()
411 def p_constraint_block_item_list_2(p):
412     '''constraint_block_item_list : constraint_block_item '''
413     print('constraint_block_item_list_2', list(p))
414 ()
415 def p_constraint_block_item_list_opt_1(p):
416     '''constraint_block_item_list_opt :  '''
417     print('constraint_block_item_list_opt_1', list(p))
418 ()
419 def p_constraint_block_item_list_opt_2(p):
420     '''constraint_block_item_list_opt : constraint_block_item_list '''
421     print('constraint_block_item_list_opt_2', list(p))
422 ()
423 def p_constraint_declaration_1(p):
424     '''constraint_declaration : K_static_opt K_constraint IDENTIFIER '{' constraint_block_item_list_opt '}' '''
425     print('constraint_declaration_1', list(p))
426     # { yyerror(@2, "sorry: Constraint declarations not supported."); }
427 ()
428 def p_constraint_declaration_2(p):
429     '''constraint_declaration : K_static_opt K_constraint IDENTIFIER '{' error '}' '''
430     print('constraint_declaration_2', list(p))
431     # { yyerror(@4, "error: Errors in the constraint block item list."); }
432 ()
433 def p_constraint_expression_1(p):
434     '''constraint_expression : expression ';' '''
435     print('constraint_expression_1', list(p))
436 ()
437 def p_constraint_expression_2(p):
438     '''constraint_expression : expression K_dist '{' '}' ';' '''
439     print('constraint_expression_2', list(p))
440 ()
441 def p_constraint_expression_3(p):
442     '''constraint_expression : expression K_TRIGGER constraint_set '''
443     print('constraint_expression_3', list(p))
444 ()
445 def p_constraint_expression_4(p):
446     '''constraint_expression : K_if '(' expression ')' constraint_set %prec less_than_K_else '''
447     print('constraint_expression_4', list(p))
448 ()
449 def p_constraint_expression_5(p):
450     '''constraint_expression : K_if '(' expression ')' constraint_set K_else constraint_set '''
451     print('constraint_expression_5', list(p))
452 ()
453 def p_constraint_expression_6(p):
454     '''constraint_expression : K_foreach '(' IDENTIFIER '[' loop_variables ']' ')' constraint_set '''
455     print('constraint_expression_6', list(p))
456 ()
457 def p_constraint_expression_list_1(p):
458     '''constraint_expression_list : constraint_expression_list constraint_expression '''
459     print('constraint_expression_list_1', list(p))
460 ()
461 def p_constraint_expression_list_2(p):
462     '''constraint_expression_list : constraint_expression '''
463     print('constraint_expression_list_2', list(p))
464 ()
465 def p_constraint_prototype_1(p):
466     '''constraint_prototype : K_static_opt K_constraint IDENTIFIER ';' '''
467     print('constraint_prototype_1', list(p))
468     # { yyerror(@2, "sorry: Constraint prototypes not supported."); }
469 ()
470 def p_constraint_set_1(p):
471     '''constraint_set : constraint_expression '''
472     print('constraint_set_1', list(p))
473 ()
474 def p_constraint_set_2(p):
475     '''constraint_set : '{' constraint_expression_list '}' '''
476     print('constraint_set_2', list(p))
477 ()
478 def p_data_declaration_1(p):
479     '''data_declaration : attribute_list_opt data_type_or_implicit list_of_variable_decl_assignments ';' '''
480     print('data_declaration_1', list(p))
481     # { data_type_t*data_type = $2;
482     #   if (data_type == 0) {
483     #         data_type = new vector_type_t(IVL_VT_LOGIC, false, 0);
484     #         FILE_NAME(data_type, @2);
485     #   }
486     #   pform_makewire(@2, 0, str_strength, $3, NetNet::IMPLICIT_REG, data_type);
487     #       }
488 ()
489 def p_data_type_1(p):
490     '''data_type : integer_vector_type unsigned_signed_opt dimensions_opt '''
491     print('data_type_1', list(p))
492     # { ivl_variable_type_t use_vtype = $1;
493     #   bool reg_flag = false;
494     #   if (use_vtype == IVL_VT_NO_TYPE) {
495     #         use_vtype = IVL_VT_LOGIC;
496     #         reg_flag = true;
497     #   }
498     #   vector_type_t*tmp = new vector_type_t(use_vtype, $2, $3);
499     #   tmp->reg_flag = reg_flag;
500     #   FILE_NAME(tmp, @1);
501     #   $$ = tmp;
502     #       }
503 ()
504 def p_data_type_2(p):
505     '''data_type : non_integer_type '''
506     print('data_type_2', list(p))
507     # { real_type_t*tmp = new real_type_t($1);
508     #   FILE_NAME(tmp, @1);
509     #   $$ = tmp;
510     #       }
511 ()
512 def p_data_type_3(p):
513     '''data_type : struct_data_type '''
514     print('data_type_3', list(p))
515     # { if (!$1->packed_flag) {
516     #         yyerror(@1, "sorry: Unpacked structs not supported.");
517     #   }
518     #   $$ = $1;
519     #       }
520 ()
521 def p_data_type_4(p):
522     '''data_type : enum_data_type '''
523     print('data_type_4', list(p))
524     # { $$ = $1; }
525 ()
526 def p_data_type_5(p):
527     '''data_type : atom2_type signed_unsigned_opt '''
528     print('data_type_5', list(p))
529     # { atom2_type_t*tmp = new atom2_type_t($1, $2);
530     #   FILE_NAME(tmp, @1);
531     #   $$ = tmp;
532     #       }
533 ()
534 def p_data_type_6(p):
535     '''data_type : K_integer signed_unsigned_opt '''
536     print('data_type_6', list(p))
537     # { list<pform_range_t>*pd = make_range_from_width(integer_width);
538     #   vector_type_t*tmp = new vector_type_t(IVL_VT_LOGIC, $2, pd);
539     #   tmp->reg_flag = true;
540     #   tmp->integer_flag = true;
541     #   $$ = tmp;
542     #       }
543 ()
544 def p_data_type_7(p):
545     '''data_type : K_time '''
546     print('data_type_7', list(p))
547     # { list<pform_range_t>*pd = make_range_from_width(64);
548     #   vector_type_t*tmp = new vector_type_t(IVL_VT_LOGIC, false, pd);
549     #   tmp->reg_flag = !gn_system_verilog();
550     #   $$ = tmp;
551     #       }
552 ()
553 def p_data_type_8(p):
554     '''data_type : TYPE_IDENTIFIER dimensions_opt '''
555     print('data_type_8', list(p))
556     # { if ($2) {
557     #         parray_type_t*tmp = new parray_type_t($1.type, $2);
558     #         FILE_NAME(tmp, @1);
559     #         $$ = tmp;
560     #   } else $$ = $1.type;
561     #   delete[]$1.text;
562     #       }
563 ()
564 def p_data_type_9(p):
565     '''data_type : PACKAGE_IDENTIFIER K_SCOPE_RES _embed0_data_type TYPE_IDENTIFIER '''
566     print('data_type_9', list(p))
567     # { lex_in_package_scope(0);
568     #   $$ = $4.type;
569     #   delete[]$4.text;
570     #       }
571 ()
572 def p_data_type_10(p):
573     '''data_type : K_string '''
574     print('data_type_10', list(p))
575     # { string_type_t*tmp = new string_type_t;
576     #   FILE_NAME(tmp, @1);
577     #   $$ = tmp;
578     #       }
579 ()
580 def p__embed0_data_type(p):
581     '''_embed0_data_type : '''
582     # { lex_in_package_scope($1); }
583 ()
584 def p_data_type_or_implicit_1(p):
585     '''data_type_or_implicit : data_type '''
586     print('data_type_or_implicit_1', list(p))
587     # { $$ = $1; }
588 ()
589 def p_data_type_or_implicit_2(p):
590     '''data_type_or_implicit : signing dimensions_opt '''
591     print('data_type_or_implicit_2', list(p))
592     # { vector_type_t*tmp = new vector_type_t(IVL_VT_LOGIC, $1, $2);
593     #   tmp->implicit_flag = true;
594     #   FILE_NAME(tmp, @1);
595     #   $$ = tmp;
596     #       }
597 ()
598 def p_data_type_or_implicit_3(p):
599     '''data_type_or_implicit : dimensions '''
600     print('data_type_or_implicit_3', list(p))
601     # { vector_type_t*tmp = new vector_type_t(IVL_VT_LOGIC, false, $1);
602     #   tmp->implicit_flag = true;
603     #   FILE_NAME(tmp, @1);
604     #   $$ = tmp;
605     #       }
606 ()
607 def p_data_type_or_implicit_4(p):
608     '''data_type_or_implicit :  '''
609     print('data_type_or_implicit_4', list(p))
610     # { $$ = 0; }
611 ()
612 def p_data_type_or_implicit_or_void_1(p):
613     '''data_type_or_implicit_or_void : data_type_or_implicit '''
614     print('data_type_or_implicit_or_void_1', list(p))
615     # { $$ = $1; }
616 ()
617 def p_data_type_or_implicit_or_void_2(p):
618     '''data_type_or_implicit_or_void : K_void '''
619     print('data_type_or_implicit_or_void_2', list(p))
620     # { void_type_t*tmp = new void_type_t;
621     #   FILE_NAME(tmp, @1);
622     #   $$ = tmp;
623     #       }
624 ()
625 def p_description_1(p):
626     '''description : module '''
627     print('description_1', list(p))
628 ()
629 def p_description_2(p):
630     '''description : udp_primitive '''
631     print('description_2', list(p))
632 ()
633 def p_description_3(p):
634     '''description : config_declaration '''
635     print('description_3', list(p))
636 ()
637 def p_description_4(p):
638     '''description : nature_declaration '''
639     print('description_4', list(p))
640 ()
641 def p_description_5(p):
642     '''description : package_declaration '''
643     print('description_5', list(p))
644 ()
645 def p_description_6(p):
646     '''description : discipline_declaration '''
647     print('description_6', list(p))
648 ()
649 def p_description_7(p):
650     '''description : package_item '''
651     print('description_7', list(p))
652 ()
653 def p_description_8(p):
654     '''description : KK_attribute '(' IDENTIFIER ',' STRING ',' STRING ')' '''
655     print('description_8', list(p))
656     # { perm_string tmp3 = lex_strings.make($3);
657     #   pform_set_type_attrib(tmp3, $5, $7);
658     #   delete[] $3;
659     #   delete[] $5;
660     #       }
661 ()
662 def p_description_list_1(p):
663     '''description_list : description '''
664     print('description_list_1', list(p))
665 ()
666 def p_description_list_2(p):
667     '''description_list : description_list description '''
668     print('description_list_2', list(p))
669 ()
670 def p_endnew_opt_1(p):
671     '''endnew_opt : ':' K_new '''
672     print('endnew_opt_1', list(p))
673 ()
674 def p_endnew_opt_2(p):
675     '''endnew_opt :  '''
676     print('endnew_opt_2', list(p))
677 ()
678 def p_dynamic_array_new_1(p):
679     '''dynamic_array_new : K_new '[' expression ']' '''
680     print('dynamic_array_new_1', list(p))
681     # { $$ = new PENewArray($3, 0);
682     #   FILE_NAME($$, @1);
683     #       }
684 ()
685 def p_dynamic_array_new_2(p):
686     '''dynamic_array_new : K_new '[' expression ']' '(' expression ')' '''
687     print('dynamic_array_new_2', list(p))
688     # { $$ = new PENewArray($3, $6);
689     #   FILE_NAME($$, @1);
690     #       }
691 ()
692 def p_for_step_1(p):
693     '''for_step : lpvalue '=' expression '''
694     print('for_step_1', list(p))
695     # { PAssign*tmp = new PAssign($1,$3);
696     #   FILE_NAME(tmp, @1);
697     #   $$ = tmp;
698     #       }
699 ()
700 def p_for_step_2(p):
701     '''for_step : inc_or_dec_expression '''
702     print('for_step_2', list(p))
703     # { $$ = pform_compressed_assign_from_inc_dec(@1, $1); }
704 ()
705 def p_for_step_3(p):
706     '''for_step : compressed_statement '''
707     print('for_step_3', list(p))
708     # { $$ = $1; }
709 ()
710 def p_function_declaration_1(p):
711     '''function_declaration : K_function lifetime_opt data_type_or_implicit_or_void IDENTIFIER ';' _embed0_function_declaration function_item_list statement_or_null_list_opt K_endfunction _embed1_function_declaration endlabel_opt '''
712     print('function_declaration_1', list(p))
713     # { // Last step: check any closing name.
714     #   if ($11) {
715     #         if (strcmp($4,$11) != 0) {
716     #               yyerror(@11, "error: End label doesn't match "
717     #                            "function name");
718     #         }
719     #         if (! gn_system_verilog()) {
720     #               yyerror(@11, "error: Function end labels require "
721     #                            "SystemVerilog.");
722     #         }
723     #         delete[]$11;
724     #   }
725     #   delete[]$4;
726     #       }
727 ()
728 def p_function_declaration_2(p):
729     '''function_declaration : K_function lifetime_opt data_type_or_implicit_or_void IDENTIFIER _embed2_function_declaration '(' tf_port_list_opt ')' ';' block_item_decls_opt statement_or_null_list_opt K_endfunction _embed3_function_declaration endlabel_opt '''
730     print('function_declaration_2', list(p))
731     # { // Last step: check any closing name.
732     #   if ($14) {
733     #         if (strcmp($4,$14) != 0) {
734     #               yyerror(@14, "error: End label doesn't match "
735     #                            "function name");
736     #         }
737     #         if (! gn_system_verilog()) {
738     #               yyerror(@14, "error: Function end labels require "
739     #                            "SystemVerilog.");
740     #         }
741     #         delete[]$14;
742     #   }
743     #   delete[]$4;
744     #       }
745 ()
746 def p_function_declaration_3(p):
747     '''function_declaration : K_function lifetime_opt data_type_or_implicit_or_void IDENTIFIER error K_endfunction _embed4_function_declaration endlabel_opt '''
748     print('function_declaration_3', list(p))
749     # { // Last step: check any closing name.
750     #   if ($8) {
751     #         if (strcmp($4,$8) != 0) {
752     #               yyerror(@8, "error: End label doesn't match function name");
753     #         }
754     #         if (! gn_system_verilog()) {
755     #               yyerror(@8, "error: Function end labels require "
756     #                            "SystemVerilog.");
757     #         }
758     #         delete[]$8;
759     #   }
760     #   delete[]$4;
761     #       }
762 ()
763 def p__embed0_function_declaration(p):
764     '''_embed0_function_declaration : '''
765     # { assert(current_function == 0);
766     #   current_function = pform_push_function_scope(@1, $4, $2);
767     #       }
768 ()
769 def p__embed1_function_declaration(p):
770     '''_embed1_function_declaration : '''
771     # { current_function->set_ports($7);
772     #   current_function->set_return($3);
773     #   current_function_set_statement($8? @8 : @4, $8);
774     #   pform_set_this_class(@4, current_function);
775     #   pform_pop_scope();
776     #   current_function = 0;
777     #       }
778 ()
779 def p__embed2_function_declaration(p):
780     '''_embed2_function_declaration : '''
781     # { assert(current_function == 0);
782     #   current_function = pform_push_function_scope(@1, $4, $2);
783     #       }
784 ()
785 def p__embed3_function_declaration(p):
786     '''_embed3_function_declaration : '''
787     # { current_function->set_ports($7);
788     #   current_function->set_return($3);
789     #   current_function_set_statement($11? @11 : @4, $11);
790     #   pform_set_this_class(@4, current_function);
791     #   pform_pop_scope();
792     #   current_function = 0;
793     #   if ($7==0 && !gn_system_verilog()) {
794     #         yyerror(@4, "error: Empty parenthesis syntax requires SystemVerilog.");
795     #   }
796     #       }
797 ()
798 def p__embed4_function_declaration(p):
799     '''_embed4_function_declaration : '''
800     # { /* */
801     #   if (current_function) {
802     #         pform_pop_scope();
803     #         current_function = 0;
804     #   }
805     #   assert(current_function == 0);
806     #   yyerror(@1, "error: Syntax error defining function.");
807     #   yyerrok;
808     #       }
809 ()
810 def p_import_export_1(p):
811     '''import_export : K_import '''
812     print('import_export_1', list(p))
813     # { $$ = true; }
814 ()
815 def p_import_export_2(p):
816     '''import_export : K_export '''
817     print('import_export_2', list(p))
818     # { $$ = false; }
819 ()
820 def p_implicit_class_handle_1(p):
821     '''implicit_class_handle : K_this '''
822     print('implicit_class_handle_1', list(p))
823     # { $$ = pform_create_this(); }
824 ()
825 def p_implicit_class_handle_2(p):
826     '''implicit_class_handle : K_super '''
827     print('implicit_class_handle_2', list(p))
828     # { $$ = pform_create_super(); }
829 ()
830 def p_inc_or_dec_expression_1(p):
831     '''inc_or_dec_expression : K_INCR lpvalue %prec UNARY_PREC '''
832     print('inc_or_dec_expression_1', list(p))
833     # { PEUnary*tmp = new PEUnary('I', $2);
834     #   FILE_NAME(tmp, @2);
835     #   $$ = tmp;
836     #       }
837 ()
838 def p_inc_or_dec_expression_2(p):
839     '''inc_or_dec_expression : lpvalue K_INCR %prec UNARY_PREC '''
840     print('inc_or_dec_expression_2', list(p))
841     # { PEUnary*tmp = new PEUnary('i', $1);
842     #   FILE_NAME(tmp, @1);
843     #   $$ = tmp;
844     #       }
845 ()
846 def p_inc_or_dec_expression_3(p):
847     '''inc_or_dec_expression : K_DECR lpvalue %prec UNARY_PREC '''
848     print('inc_or_dec_expression_3', list(p))
849     # { PEUnary*tmp = new PEUnary('D', $2);
850     #   FILE_NAME(tmp, @2);
851     #   $$ = tmp;
852     #       }
853 ()
854 def p_inc_or_dec_expression_4(p):
855     '''inc_or_dec_expression : lpvalue K_DECR %prec UNARY_PREC '''
856     print('inc_or_dec_expression_4', list(p))
857     # { PEUnary*tmp = new PEUnary('d', $1);
858     #   FILE_NAME(tmp, @1);
859     #   $$ = tmp;
860     #       }
861 ()
862 def p_inside_expression_1(p):
863     '''inside_expression : expression K_inside '{' open_range_list '}' '''
864     print('inside_expression_1', list(p))
865     # { yyerror(@2, "sorry: \"inside\" expressions not supported yet.");
866     #   $$ = 0;
867     #       }
868 ()
869 def p_integer_vector_type_1(p):
870     '''integer_vector_type : K_reg '''
871     print('integer_vector_type_1', list(p))
872     # { $$ = IVL_VT_NO_TYPE; }
873 ()
874 def p_integer_vector_type_2(p):
875     '''integer_vector_type : K_bit '''
876     print('integer_vector_type_2', list(p))
877     # { $$ = IVL_VT_BOOL; }
878 ()
879 def p_integer_vector_type_3(p):
880     '''integer_vector_type : K_logic '''
881     print('integer_vector_type_3', list(p))
882     # { $$ = IVL_VT_LOGIC; }
883 ()
884 def p_integer_vector_type_4(p):
885     '''integer_vector_type : K_bool '''
886     print('integer_vector_type_4', list(p))
887     # { $$ = IVL_VT_BOOL; }
888 ()
889 def p_join_keyword_1(p):
890     '''join_keyword : K_join '''
891     print('join_keyword_1', list(p))
892     # { $$ = PBlock::BL_PAR; }
893 ()
894 def p_join_keyword_2(p):
895     '''join_keyword : K_join_none '''
896     print('join_keyword_2', list(p))
897     # { $$ = PBlock::BL_JOIN_NONE; }
898 ()
899 def p_join_keyword_3(p):
900     '''join_keyword : K_join_any '''
901     print('join_keyword_3', list(p))
902     # { $$ = PBlock::BL_JOIN_ANY; }
903 ()
904 def p_jump_statement_1(p):
905     '''jump_statement : K_break ';' '''
906     print('jump_statement_1', list(p))
907     # { yyerror(@1, "sorry: break statements not supported.");
908     #   $$ = 0;
909     #       }
910 ()
911 def p_jump_statement_2(p):
912     '''jump_statement : K_return ';' '''
913     print('jump_statement_2', list(p))
914     # { PReturn*tmp = new PReturn(0);
915     #   FILE_NAME(tmp, @1);
916     #   $$ = tmp;
917     #       }
918 ()
919 def p_jump_statement_3(p):
920     '''jump_statement : K_return expression ';' '''
921     print('jump_statement_3', list(p))
922     # { PReturn*tmp = new PReturn($2);
923     #   FILE_NAME(tmp, @1);
924     #   $$ = tmp;
925     #       }
926 ()
927 def p_lifetime_1(p):
928     '''lifetime : K_automatic '''
929     print('lifetime_1', list(p))
930     # { $$ = LexicalScope::AUTOMATIC; }
931 ()
932 def p_lifetime_2(p):
933     '''lifetime : K_static '''
934     print('lifetime_2', list(p))
935     # { $$ = LexicalScope::STATIC; }
936 ()
937 def p_lifetime_opt_1(p):
938     '''lifetime_opt : lifetime '''
939     print('lifetime_opt_1', list(p))
940     # { $$ = $1; }
941 ()
942 def p_lifetime_opt_2(p):
943     '''lifetime_opt :  '''
944     print('lifetime_opt_2', list(p))
945     # { $$ = LexicalScope::INHERITED; }
946 ()
947 def p_loop_statement_1(p):
948     '''loop_statement : K_for '(' lpvalue '=' expression ';' expression ';' for_step ')' statement_or_null '''
949     print('loop_statement_1', list(p))
950     # { PForStatement*tmp = new PForStatement($3, $5, $7, $9, $11);
951     #   FILE_NAME(tmp, @1);
952     #   $$ = tmp;
953     #       }
954 ()
955 def p_loop_statement_2(p):
956     '''loop_statement : K_for '(' data_type IDENTIFIER '=' expression ';' expression ';' for_step ')' _embed0_loop_statement statement_or_null '''
957     print('loop_statement_2', list(p))
958     # { pform_name_t tmp_hident;
959     #   tmp_hident.push_back(name_component_t(lex_strings.make($4)));
960     # 
961     #   PEIdent*tmp_ident = pform_new_ident(tmp_hident);
962     #   FILE_NAME(tmp_ident, @4);
963     # 
964     #   PForStatement*tmp_for = new PForStatement(tmp_ident, $6, $8, $10, $13);
965     #   FILE_NAME(tmp_for, @1);
966     # 
967     #   pform_pop_scope();
968     #   vector<Statement*>tmp_for_list (1);
969     #   tmp_for_list[0] = tmp_for;
970     #   PBlock*tmp_blk = current_block_stack.top();
971     #   current_block_stack.pop();
972     #   tmp_blk->set_statement(tmp_for_list);
973     #   $$ = tmp_blk;
974     #   delete[]$4;
975     #       }
976 ()
977 def p_loop_statement_3(p):
978     '''loop_statement : K_forever statement_or_null '''
979     print('loop_statement_3', list(p))
980     # { PForever*tmp = new PForever($2);
981     #   FILE_NAME(tmp, @1);
982     #   $$ = tmp;
983     #       }
984 ()
985 def p_loop_statement_4(p):
986     '''loop_statement : K_repeat '(' expression ')' statement_or_null '''
987     print('loop_statement_4', list(p))
988     # { PRepeat*tmp = new PRepeat($3, $5);
989     #   FILE_NAME(tmp, @1);
990     #   $$ = tmp;
991     #       }
992 ()
993 def p_loop_statement_5(p):
994     '''loop_statement : K_while '(' expression ')' statement_or_null '''
995     print('loop_statement_5', list(p))
996     # { PWhile*tmp = new PWhile($3, $5);
997     #   FILE_NAME(tmp, @1);
998     #   $$ = tmp;
999     #       }
1000 ()
1001 def p_loop_statement_6(p):
1002     '''loop_statement : K_do statement_or_null K_while '(' expression ')' ';' '''
1003     print('loop_statement_6', list(p))
1004     # { PDoWhile*tmp = new PDoWhile($5, $2);
1005     #   FILE_NAME(tmp, @1);
1006     #   $$ = tmp;
1007     #       }
1008 ()
1009 def p_loop_statement_7(p):
1010     '''loop_statement : K_foreach '(' IDENTIFIER '[' loop_variables ']' ')' _embed1_loop_statement statement_or_null '''
1011     print('loop_statement_7', list(p))
1012     # { PForeach*tmp_for = pform_make_foreach(@1, $3, $5, $9);
1013     # 
1014     #   pform_pop_scope();
1015     #   vector<Statement*>tmp_for_list(1);
1016     #   tmp_for_list[0] = tmp_for;
1017     #   PBlock*tmp_blk = current_block_stack.top();
1018     #   current_block_stack.pop();
1019     #   tmp_blk->set_statement(tmp_for_list);
1020     #   $$ = tmp_blk;
1021     #       }
1022 ()
1023 def p_loop_statement_8(p):
1024     '''loop_statement : K_for '(' lpvalue '=' expression ';' expression ';' error ')' statement_or_null '''
1025     print('loop_statement_8', list(p))
1026     # { $$ = 0;
1027     #   yyerror(@1, "error: Error in for loop step assignment.");
1028     #       }
1029 ()
1030 def p_loop_statement_9(p):
1031     '''loop_statement : K_for '(' lpvalue '=' expression ';' error ';' for_step ')' statement_or_null '''
1032     print('loop_statement_9', list(p))
1033     # { $$ = 0;
1034     #   yyerror(@1, "error: Error in for loop condition expression.");
1035     #       }
1036 ()
1037 def p_loop_statement_10(p):
1038     '''loop_statement : K_for '(' error ')' statement_or_null '''
1039     print('loop_statement_10', list(p))
1040     # { $$ = 0;
1041     #   yyerror(@1, "error: Incomprehensible for loop.");
1042     #       }
1043 ()
1044 def p_loop_statement_11(p):
1045     '''loop_statement : K_while '(' error ')' statement_or_null '''
1046     print('loop_statement_11', list(p))
1047     # { $$ = 0;
1048     #   yyerror(@1, "error: Error in while loop condition.");
1049     #       }
1050 ()
1051 def p_loop_statement_12(p):
1052     '''loop_statement : K_do statement_or_null K_while '(' error ')' ';' '''
1053     print('loop_statement_12', list(p))
1054     # { $$ = 0;
1055     #   yyerror(@1, "error: Error in do/while loop condition.");
1056     #       }
1057 ()
1058 def p_loop_statement_13(p):
1059     '''loop_statement : K_foreach '(' IDENTIFIER '[' error ']' ')' statement_or_null '''
1060     print('loop_statement_13', list(p))
1061     # { $$ = 0;
1062     #         yyerror(@4, "error: Errors in foreach loop variables list.");
1063     #       }
1064 ()
1065 def p__embed0_loop_statement(p):
1066     '''_embed0_loop_statement : '''
1067     # { static unsigned for_counter = 0;
1068     #   char for_block_name [64];
1069     #   snprintf(for_block_name, sizeof for_block_name, "$ivl_for_loop%u", for_counter);
1070     #   for_counter += 1;
1071     #   PBlock*tmp = pform_push_block_scope(for_block_name, PBlock::BL_SEQ);
1072     #   FILE_NAME(tmp, @1);
1073     #   current_block_stack.push(tmp);
1074     # 
1075     #   list<decl_assignment_t*>assign_list;
1076     #   decl_assignment_t*tmp_assign = new decl_assignment_t;
1077     #   tmp_assign->name = lex_strings.make($4);
1078     #   assign_list.push_back(tmp_assign);
1079     #   pform_makewire(@4, 0, str_strength, &assign_list, NetNet::REG, $3);
1080     #       }
1081 ()
1082 def p__embed1_loop_statement(p):
1083     '''_embed1_loop_statement : '''
1084     # { static unsigned foreach_counter = 0;
1085     #   char for_block_name[64];
1086     #   snprintf(for_block_name, sizeof for_block_name, "$ivl_foreach%u", foreach_counter);
1087     #   foreach_counter += 1;
1088     # 
1089     #   PBlock*tmp = pform_push_block_scope(for_block_name, PBlock::BL_SEQ);
1090     #   FILE_NAME(tmp, @1);
1091     #   current_block_stack.push(tmp);
1092     # 
1093     #   pform_make_foreach_declarations(@1, $5);
1094     #       }
1095 ()
1096 def p_list_of_variable_decl_assignments_1(p):
1097     '''list_of_variable_decl_assignments : variable_decl_assignment '''
1098     print('list_of_variable_decl_assignments_1', list(p))
1099     # { list<decl_assignment_t*>*tmp = new list<decl_assignment_t*>;
1100     #   tmp->push_back($1);
1101     #   $$ = tmp;
1102     #       }
1103 ()
1104 def p_list_of_variable_decl_assignments_2(p):
1105     '''list_of_variable_decl_assignments : list_of_variable_decl_assignments ',' variable_decl_assignment '''
1106     print('list_of_variable_decl_assignments_2', list(p))
1107     # { list<decl_assignment_t*>*tmp = $1;
1108     #   tmp->push_back($3);
1109     #   $$ = tmp;
1110     #       }
1111 ()
1112 def p_variable_decl_assignment_1(p):
1113     '''variable_decl_assignment : IDENTIFIER dimensions_opt '''
1114     print('variable_decl_assignment_1', list(p))
1115     # { decl_assignment_t*tmp = new decl_assignment_t;
1116     #   tmp->name = lex_strings.make($1);
1117     #   if ($2) {
1118     #         tmp->index = *$2;
1119     #         delete $2;
1120     #   }
1121     #   delete[]$1;
1122     #   $$ = tmp;
1123     #       }
1124 ()
1125 def p_variable_decl_assignment_2(p):
1126     '''variable_decl_assignment : IDENTIFIER '=' expression '''
1127     print('variable_decl_assignment_2', list(p))
1128     # { decl_assignment_t*tmp = new decl_assignment_t;
1129     #   tmp->name = lex_strings.make($1);
1130     #   tmp->expr .reset($3);
1131     #   delete[]$1;
1132     #   $$ = tmp;
1133     #       }
1134 ()
1135 def p_variable_decl_assignment_3(p):
1136     '''variable_decl_assignment : IDENTIFIER '=' K_new '(' ')' '''
1137     print('variable_decl_assignment_3', list(p))
1138     # { decl_assignment_t*tmp = new decl_assignment_t;
1139     #   tmp->name = lex_strings.make($1);
1140     #   PENewClass*expr = new PENewClass;
1141     #   FILE_NAME(expr, @3);
1142     #   tmp->expr .reset(expr);
1143     #   delete[]$1;
1144     #   $$ = tmp;
1145     #       }
1146 ()
1147 def p_loop_variables_1(p):
1148     '''loop_variables : loop_variables ',' IDENTIFIER '''
1149     print('loop_variables_1', list(p))
1150     # { list<perm_string>*tmp = $1;
1151     #   tmp->push_back(lex_strings.make($3));
1152     #   delete[]$3;
1153     #   $$ = tmp;
1154     #       }
1155 ()
1156 def p_loop_variables_2(p):
1157     '''loop_variables : IDENTIFIER '''
1158     print('loop_variables_2', list(p))
1159     # { list<perm_string>*tmp = new list<perm_string>;
1160     #   tmp->push_back(lex_strings.make($1));
1161     #   delete[]$1;
1162     #   $$ = tmp;
1163     #       }
1164 ()
1165 def p_method_qualifier_1(p):
1166     '''method_qualifier : K_virtual '''
1167     print('method_qualifier_1', list(p))
1168 ()
1169 def p_method_qualifier_2(p):
1170     '''method_qualifier : class_item_qualifier '''
1171     print('method_qualifier_2', list(p))
1172 ()
1173 def p_method_qualifier_opt_1(p):
1174     '''method_qualifier_opt : method_qualifier '''
1175     print('method_qualifier_opt_1', list(p))
1176 ()
1177 def p_method_qualifier_opt_2(p):
1178     '''method_qualifier_opt :  '''
1179     print('method_qualifier_opt_2', list(p))
1180 ()
1181 def p_modport_declaration_1(p):
1182     '''modport_declaration : K_modport _embed0_modport_declaration modport_item_list ';' '''
1183     print('modport_declaration_1', list(p))
1184 ()
1185 def p__embed0_modport_declaration(p):
1186     '''_embed0_modport_declaration : '''
1187     # { if (!pform_in_interface())
1188     #         yyerror(@1, "error: modport declarations are only allowed "
1189     #                     "in interfaces.");
1190     #       }
1191 ()
1192 def p_modport_item_list_1(p):
1193     '''modport_item_list : modport_item '''
1194     print('modport_item_list_1', list(p))
1195 ()
1196 def p_modport_item_list_2(p):
1197     '''modport_item_list : modport_item_list ',' modport_item '''
1198     print('modport_item_list_2', list(p))
1199 ()
1200 def p_modport_item_1(p):
1201     '''modport_item : IDENTIFIER _embed0_modport_item '(' modport_ports_list ')' '''
1202     print('modport_item_1', list(p))
1203     # { pform_end_modport_item(@1); }
1204 ()
1205 def p__embed0_modport_item(p):
1206     '''_embed0_modport_item : '''
1207     # { pform_start_modport_item(@1, $1); }
1208 ()
1209 def p_modport_ports_list_1(p):
1210     '''modport_ports_list : modport_ports_declaration '''
1211     print('modport_ports_list_1', list(p))
1212 ()
1213 def p_modport_ports_list_2(p):
1214     '''modport_ports_list : modport_ports_list ',' modport_ports_declaration '''
1215     print('modport_ports_list_2', list(p))
1216 ()
1217 def p_modport_ports_list_3(p):
1218     '''modport_ports_list : modport_ports_list ',' modport_simple_port '''
1219     print('modport_ports_list_3', list(p))
1220     # { if (last_modport_port.type == MP_SIMPLE) {
1221     #         pform_add_modport_port(@3, last_modport_port.direction,
1222     #                                $3->name, $3->parm);
1223     #   } else {
1224     #         yyerror(@3, "error: modport expression not allowed here.");
1225     #   }
1226     #   delete $3;
1227     #       }
1228 ()
1229 def p_modport_ports_list_4(p):
1230     '''modport_ports_list : modport_ports_list ',' modport_tf_port '''
1231     print('modport_ports_list_4', list(p))
1232     # { if (last_modport_port.type != MP_TF)
1233     #         yyerror(@3, "error: task/function declaration not allowed here.");
1234     #       }
1235 ()
1236 def p_modport_ports_list_5(p):
1237     '''modport_ports_list : modport_ports_list ',' IDENTIFIER '''
1238     print('modport_ports_list_5', list(p))
1239     # { if (last_modport_port.type == MP_SIMPLE) {
1240     #         pform_add_modport_port(@3, last_modport_port.direction,
1241     #                                lex_strings.make($3), 0);
1242     #   } else if (last_modport_port.type != MP_TF) {
1243     #         yyerror(@3, "error: list of identifiers not allowed here.");
1244     #   }
1245     #   delete[] $3;
1246     #       }
1247 ()
1248 def p_modport_ports_list_6(p):
1249     '''modport_ports_list : modport_ports_list ',' '''
1250     print('modport_ports_list_6', list(p))
1251     # { yyerror(@2, "error: NULL port declarations are not allowed"); }
1252 ()
1253 def p_modport_ports_declaration_1(p):
1254     '''modport_ports_declaration : attribute_list_opt port_direction IDENTIFIER '''
1255     print('modport_ports_declaration_1', list(p))
1256     # { last_modport_port.type = MP_SIMPLE;
1257     #   last_modport_port.direction = $2;
1258     #   pform_add_modport_port(@3, $2, lex_strings.make($3), 0);
1259     #   delete[] $3;
1260     #   delete $1;
1261     #       }
1262 ()
1263 def p_modport_ports_declaration_2(p):
1264     '''modport_ports_declaration : attribute_list_opt port_direction modport_simple_port '''
1265     print('modport_ports_declaration_2', list(p))
1266     # { last_modport_port.type = MP_SIMPLE;
1267     #   last_modport_port.direction = $2;
1268     #   pform_add_modport_port(@3, $2, $3->name, $3->parm);
1269     #   delete $3;
1270     #   delete $1;
1271     #       }
1272 ()
1273 def p_modport_ports_declaration_3(p):
1274     '''modport_ports_declaration : attribute_list_opt import_export IDENTIFIER '''
1275     print('modport_ports_declaration_3', list(p))
1276     # { last_modport_port.type = MP_TF;
1277     #   last_modport_port.is_import = $2;
1278     #   yyerror(@3, "sorry: modport task/function ports are not yet supported.");
1279     #   delete[] $3;
1280     #   delete $1;
1281     #       }
1282 ()
1283 def p_modport_ports_declaration_4(p):
1284     '''modport_ports_declaration : attribute_list_opt import_export modport_tf_port '''
1285     print('modport_ports_declaration_4', list(p))
1286     # { last_modport_port.type = MP_TF;
1287     #   last_modport_port.is_import = $2;
1288     #   yyerror(@3, "sorry: modport task/function ports are not yet supported.");
1289     #   delete $1;
1290     #       }
1291 ()
1292 def p_modport_ports_declaration_5(p):
1293     '''modport_ports_declaration : attribute_list_opt K_clocking IDENTIFIER '''
1294     print('modport_ports_declaration_5', list(p))
1295     # { last_modport_port.type = MP_CLOCKING;
1296     #   last_modport_port.direction = NetNet::NOT_A_PORT;
1297     #   yyerror(@3, "sorry: modport clocking declaration is not yet supported.");
1298     #   delete[] $3;
1299     #   delete $1;
1300     #       }
1301 ()
1302 def p_modport_simple_port_1(p):
1303     '''modport_simple_port : '.' IDENTIFIER '(' expression ')' '''
1304     print('modport_simple_port_1', list(p))
1305     # { named_pexpr_t*tmp = new named_pexpr_t;
1306     #   tmp->name = lex_strings.make($2);
1307     #   tmp->parm = $4;
1308     #   delete[]$2;
1309     #   $$ = tmp;
1310     #       }
1311 ()
1312 def p_modport_tf_port_1(p):
1313     '''modport_tf_port : K_task IDENTIFIER '''
1314     print('modport_tf_port_1', list(p))
1315 ()
1316 def p_modport_tf_port_2(p):
1317     '''modport_tf_port : K_task IDENTIFIER '(' tf_port_list_opt ')' '''
1318     print('modport_tf_port_2', list(p))
1319 ()
1320 def p_modport_tf_port_3(p):
1321     '''modport_tf_port : K_function data_type_or_implicit_or_void IDENTIFIER '''
1322     print('modport_tf_port_3', list(p))
1323 ()
1324 def p_modport_tf_port_4(p):
1325     '''modport_tf_port : K_function data_type_or_implicit_or_void IDENTIFIER '(' tf_port_list_opt ')' '''
1326     print('modport_tf_port_4', list(p))
1327 ()
1328 def p_non_integer_type_1(p):
1329     '''non_integer_type : K_real '''
1330     print('non_integer_type_1', list(p))
1331     # { $$ = real_type_t::REAL; }
1332 ()
1333 def p_non_integer_type_2(p):
1334     '''non_integer_type : K_realtime '''
1335     print('non_integer_type_2', list(p))
1336     # { $$ = real_type_t::REAL; }
1337 ()
1338 def p_non_integer_type_3(p):
1339     '''non_integer_type : K_shortreal '''
1340     print('non_integer_type_3', list(p))
1341     # { $$ = real_type_t::SHORTREAL; }
1342 ()
1343 def p_number_1(p):
1344     '''number : BASED_NUMBER '''
1345     print('number_1', list(p))
1346     # { $$ = $1; based_size = 0;}
1347 ()
1348 def p_number_2(p):
1349     '''number : DEC_NUMBER '''
1350     print('number_2', list(p))
1351     # { $$ = $1; based_size = 0;}
1352 ()
1353 def p_number_3(p):
1354     '''number : DEC_NUMBER BASED_NUMBER '''
1355     print('number_3', list(p))
1356     num = Leaf(token.NUMBER, "%s:%s" % (p[1], p[2]))
1357     p[0] = num
1358     # { $$ = pform_verinum_with_size($1,$2, @2.text, @2.first_line);
1359     #          based_size = 0; }
1360 ()
1361 def p_number_4(p):
1362     '''number : UNBASED_NUMBER '''
1363     print('number_4', list(p))
1364     # { $$ = $1; based_size = 0;}
1365 ()
1366 def p_number_5(p):
1367     '''number : DEC_NUMBER UNBASED_NUMBER '''
1368     print('number_5', list(p))
1369     # { yyerror(@1, "error: Unbased SystemVerilog literal cannot have "
1370     #                      "a size.");
1371     #          $$ = $1; based_size = 0;}
1372 ()
1373 def p_open_range_list_1(p):
1374     '''open_range_list : open_range_list ',' value_range '''
1375     print('open_range_list_1', list(p))
1376 ()
1377 def p_open_range_list_2(p):
1378     '''open_range_list : value_range '''
1379     print('open_range_list_2', list(p))
1380 ()
1381 def p_package_declaration_1(p):
1382     '''package_declaration : K_package lifetime_opt IDENTIFIER ';' _embed0_package_declaration timeunits_declaration_opt _embed1_package_declaration package_item_list_opt K_endpackage endlabel_opt '''
1383     print('package_declaration_1', list(p))
1384     # { pform_end_package_declaration(@1);
1385     #   // If an end label is present make sure it match the package name.
1386     #   if ($10) {
1387     #         if (strcmp($3,$10) != 0) {
1388     #               yyerror(@10, "error: End label doesn't match package name");
1389     #         }
1390     #         delete[]$10;
1391     #   }
1392     #   delete[]$3;
1393     #       }
1394 ()
1395 def p__embed0_package_declaration(p):
1396     '''_embed0_package_declaration : '''
1397     # { pform_start_package_declaration(@1, $3, $2); }
1398 ()
1399 def p__embed1_package_declaration(p):
1400     '''_embed1_package_declaration : '''
1401     # { pform_set_scope_timescale(@1); }
1402 ()
1403 def p_module_package_import_list_opt_1(p):
1404     '''module_package_import_list_opt :  '''
1405     print('module_package_import_list_opt_1', list(p))
1406 ()
1407 def p_module_package_import_list_opt_2(p):
1408     '''module_package_import_list_opt : package_import_list '''
1409     print('module_package_import_list_opt_2', list(p))
1410 ()
1411 def p_package_import_list_1(p):
1412     '''package_import_list : package_import_declaration '''
1413     print('package_import_list_1', list(p))
1414 ()
1415 def p_package_import_list_2(p):
1416     '''package_import_list : package_import_list package_import_declaration '''
1417     print('package_import_list_2', list(p))
1418 ()
1419 def p_package_import_declaration_1(p):
1420     '''package_import_declaration : K_import package_import_item_list ';' '''
1421     print('package_import_declaration_1', list(p))
1422     # { }
1423 ()
1424 def p_package_import_item_1(p):
1425     '''package_import_item : PACKAGE_IDENTIFIER K_SCOPE_RES IDENTIFIER '''
1426     print('package_import_item_1', list(p))
1427     # { pform_package_import(@2, $1, $3);
1428     #   delete[]$3;
1429     #       }
1430 ()
1431 def p_package_import_item_2(p):
1432     '''package_import_item : PACKAGE_IDENTIFIER K_SCOPE_RES '*' '''
1433     print('package_import_item_2', list(p))
1434     # { pform_package_import(@2, $1, 0);
1435     #       }
1436 ()
1437 def p_package_import_item_list_1(p):
1438     '''package_import_item_list : package_import_item_list ',' package_import_item '''
1439     print('package_import_item_list_1', list(p))
1440 ()
1441 def p_package_import_item_list_2(p):
1442     '''package_import_item_list : package_import_item '''
1443     print('package_import_item_list_2', list(p))
1444 ()
1445 def p_package_item_1(p):
1446     '''package_item : timeunits_declaration '''
1447     print('package_item_1', list(p))
1448 ()
1449 def p_package_item_2(p):
1450     '''package_item : K_parameter param_type parameter_assign_list ';' '''
1451     print('package_item_2', list(p))
1452 ()
1453 def p_package_item_3(p):
1454     '''package_item : K_localparam param_type localparam_assign_list ';' '''
1455     print('package_item_3', list(p))
1456 ()
1457 def p_package_item_4(p):
1458     '''package_item : type_declaration '''
1459     print('package_item_4', list(p))
1460 ()
1461 def p_package_item_5(p):
1462     '''package_item : function_declaration '''
1463     print('package_item_5', list(p))
1464 ()
1465 def p_package_item_6(p):
1466     '''package_item : task_declaration '''
1467     print('package_item_6', list(p))
1468 ()
1469 def p_package_item_7(p):
1470     '''package_item : data_declaration '''
1471     print('package_item_7', list(p))
1472 ()
1473 def p_package_item_8(p):
1474     '''package_item : class_declaration '''
1475     print('package_item_8', list(p))
1476 ()
1477 def p_package_item_list_1(p):
1478     '''package_item_list : package_item_list package_item '''
1479     print('package_item_list_1', list(p))
1480 ()
1481 def p_package_item_list_2(p):
1482     '''package_item_list : package_item '''
1483     print('package_item_list_2', list(p))
1484 ()
1485 def p_package_item_list_opt_1(p):
1486     '''package_item_list_opt : package_item_list '''
1487     print('package_item_list_opt_1', list(p))
1488 ()
1489 def p_package_item_list_opt_2(p):
1490     '''package_item_list_opt :  '''
1491     print('package_item_list_opt_2', list(p))
1492 ()
1493 def p_port_direction_1(p):
1494     '''port_direction : K_input '''
1495     print('port_direction_1', list(p))
1496     # { $$ = NetNet::PINPUT; }
1497 ()
1498 def p_port_direction_2(p):
1499     '''port_direction : K_output '''
1500     print('port_direction_2', list(p))
1501     # { $$ = NetNet::POUTPUT; }
1502 ()
1503 def p_port_direction_3(p):
1504     '''port_direction : K_inout '''
1505     print('port_direction_3', list(p))
1506     # { $$ = NetNet::PINOUT; }
1507 ()
1508 def p_port_direction_4(p):
1509     '''port_direction : K_ref '''
1510     print('port_direction_4', list(p))
1511     # { $$ = NetNet::PREF;
1512     #         if (!gn_system_verilog()) {
1513     #         yyerror(@1, "error: Reference ports (ref) require SystemVerilog.");
1514     #         $$ = NetNet::PINPUT;
1515     #   }
1516     #       }
1517 ()
1518 def p_port_direction_opt_1(p):
1519     '''port_direction_opt : port_direction '''
1520     print('port_direction_opt_1', list(p))
1521     # { $$ = $1; }
1522 ()
1523 def p_port_direction_opt_2(p):
1524     '''port_direction_opt :  '''
1525     print('port_direction_opt_2', list(p))
1526     # { $$ = NetNet::PIMPLICIT; }
1527 ()
1528 def p_property_expr_1(p):
1529     '''property_expr : expression '''
1530     print('property_expr_1', list(p))
1531 ()
1532 def p_procedural_assertion_statement_1(p):
1533     '''procedural_assertion_statement : K_assert '(' expression ')' statement %prec less_than_K_else '''
1534     print('procedural_assertion_statement_1', list(p))
1535     # { yyerror(@1, "sorry: Simple immediate assertion statements not implemented.");
1536     #   $$ = 0;
1537     #       }
1538 ()
1539 def p_procedural_assertion_statement_2(p):
1540     '''procedural_assertion_statement : K_assert '(' expression ')' K_else statement '''
1541     print('procedural_assertion_statement_2', list(p))
1542     # { yyerror(@1, "sorry: Simple immediate assertion statements not implemented.");
1543     #   $$ = 0;
1544     #       }
1545 ()
1546 def p_procedural_assertion_statement_3(p):
1547     '''procedural_assertion_statement : K_assert '(' expression ')' statement K_else statement '''
1548     print('procedural_assertion_statement_3', list(p))
1549     # { yyerror(@1, "sorry: Simple immediate assertion statements not implemented.");
1550     #   $$ = 0;
1551     #       }
1552 ()
1553 def p_property_qualifier_1(p):
1554     '''property_qualifier : class_item_qualifier '''
1555     print('property_qualifier_1', list(p))
1556 ()
1557 def p_property_qualifier_2(p):
1558     '''property_qualifier : random_qualifier '''
1559     print('property_qualifier_2', list(p))
1560 ()
1561 def p_property_qualifier_opt_1(p):
1562     '''property_qualifier_opt : property_qualifier_list '''
1563     print('property_qualifier_opt_1', list(p))
1564     # { $$ = $1; }
1565 ()
1566 def p_property_qualifier_opt_2(p):
1567     '''property_qualifier_opt :  '''
1568     print('property_qualifier_opt_2', list(p))
1569     # { $$ = property_qualifier_t::make_none(); }
1570 ()
1571 def p_property_qualifier_list_1(p):
1572     '''property_qualifier_list : property_qualifier_list property_qualifier '''
1573     print('property_qualifier_list_1', list(p))
1574     # { $$ = $1 | $2; }
1575 ()
1576 def p_property_qualifier_list_2(p):
1577     '''property_qualifier_list : property_qualifier '''
1578     print('property_qualifier_list_2', list(p))
1579     # { $$ = $1; }
1580 ()
1581 def p_property_spec_1(p):
1582     '''property_spec : clocking_event_opt property_spec_disable_iff_opt property_expr '''
1583     print('property_spec_1', list(p))
1584 ()
1585 def p_property_spec_disable_iff_opt_1(p):
1586     '''property_spec_disable_iff_opt : K_disable K_iff '(' expression ')' '''
1587     print('property_spec_disable_iff_opt_1', list(p))
1588 ()
1589 def p_property_spec_disable_iff_opt_2(p):
1590     '''property_spec_disable_iff_opt :  '''
1591     print('property_spec_disable_iff_opt_2', list(p))
1592 ()
1593 def p_random_qualifier_1(p):
1594     '''random_qualifier : K_rand '''
1595     print('random_qualifier_1', list(p))
1596     # { $$ = property_qualifier_t::make_rand(); }
1597 ()
1598 def p_random_qualifier_2(p):
1599     '''random_qualifier : K_randc '''
1600     print('random_qualifier_2', list(p))
1601     # { $$ = property_qualifier_t::make_randc(); }
1602 ()
1603 def p_real_or_realtime_1(p):
1604     '''real_or_realtime : K_real '''
1605     print('real_or_realtime_1', list(p))
1606 ()
1607 def p_real_or_realtime_2(p):
1608     '''real_or_realtime : K_realtime '''
1609     print('real_or_realtime_2', list(p))
1610 ()
1611 def p_signing_1(p):
1612     '''signing : K_signed '''
1613     print('signing_1', list(p))
1614     # { $$ = true; }
1615 ()
1616 def p_signing_2(p):
1617     '''signing : K_unsigned '''
1618     print('signing_2', list(p))
1619     # { $$ = false; }
1620 ()
1621 def p_simple_type_or_string_1(p):
1622     '''simple_type_or_string : integer_vector_type '''
1623     print('simple_type_or_string_1', list(p))
1624     # { ivl_variable_type_t use_vtype = $1;
1625     #   bool reg_flag = false;
1626     #   if (use_vtype == IVL_VT_NO_TYPE) {
1627     #         use_vtype = IVL_VT_LOGIC;
1628     #         reg_flag = true;
1629     #   }
1630     #   vector_type_t*tmp = new vector_type_t(use_vtype, false, 0);
1631     #   tmp->reg_flag = reg_flag;
1632     #   FILE_NAME(tmp, @1);
1633     #   $$ = tmp;
1634     #       }
1635 ()
1636 def p_simple_type_or_string_2(p):
1637     '''simple_type_or_string : non_integer_type '''
1638     print('simple_type_or_string_2', list(p))
1639     # { real_type_t*tmp = new real_type_t($1);
1640     #   FILE_NAME(tmp, @1);
1641     #   $$ = tmp;
1642     #       }
1643 ()
1644 def p_simple_type_or_string_3(p):
1645     '''simple_type_or_string : atom2_type '''
1646     print('simple_type_or_string_3', list(p))
1647     # { atom2_type_t*tmp = new atom2_type_t($1, true);
1648     #   FILE_NAME(tmp, @1);
1649     #   $$ = tmp;
1650     #       }
1651 ()
1652 def p_simple_type_or_string_4(p):
1653     '''simple_type_or_string : K_integer '''
1654     print('simple_type_or_string_4', list(p))
1655     # { list<pform_range_t>*pd = make_range_from_width(integer_width);
1656     #   vector_type_t*tmp = new vector_type_t(IVL_VT_LOGIC, true, pd);
1657     #   tmp->reg_flag = true;
1658     #   tmp->integer_flag = true;
1659     #   $$ = tmp;
1660     #       }
1661 ()
1662 def p_simple_type_or_string_5(p):
1663     '''simple_type_or_string : K_time '''
1664     print('simple_type_or_string_5', list(p))
1665     # { list<pform_range_t>*pd = make_range_from_width(64);
1666     #   vector_type_t*tmp = new vector_type_t(IVL_VT_LOGIC, false, pd);
1667     #   tmp->reg_flag = !gn_system_verilog();
1668     #   $$ = tmp;
1669     #       }
1670 ()
1671 def p_simple_type_or_string_6(p):
1672     '''simple_type_or_string : TYPE_IDENTIFIER '''
1673     print('simple_type_or_string_6', list(p))
1674     # { $$ = $1.type;
1675     #   delete[]$1.text;
1676     #       }
1677 ()
1678 def p_simple_type_or_string_7(p):
1679     '''simple_type_or_string : PACKAGE_IDENTIFIER K_SCOPE_RES _embed0_simple_type_or_string TYPE_IDENTIFIER '''
1680     print('simple_type_or_string_7', list(p))
1681     # { lex_in_package_scope(0);
1682     #   $$ = $4.type;
1683     #   delete[]$4.text;
1684     #       }
1685 ()
1686 def p_simple_type_or_string_8(p):
1687     '''simple_type_or_string : K_string '''
1688     print('simple_type_or_string_8', list(p))
1689     # { string_type_t*tmp = new string_type_t;
1690     #   FILE_NAME(tmp, @1);
1691     #   $$ = tmp;
1692     #       }
1693 ()
1694 def p__embed0_simple_type_or_string(p):
1695     '''_embed0_simple_type_or_string : '''
1696     # { lex_in_package_scope($1); }
1697 ()
1698 def p_statement_1(p):
1699     '''statement : attribute_list_opt statement_item '''
1700     print('statement_1', list(p))
1701     # { pform_bind_attributes($2->attributes, $1);
1702     #   $$ = $2;
1703     #       }
1704 ()
1705 def p_statement_or_null_1(p):
1706     '''statement_or_null : statement '''
1707     print('statement_or_null_1', list(p))
1708     # { $$ = $1; }
1709 ()
1710 def p_statement_or_null_2(p):
1711     '''statement_or_null : attribute_list_opt ';' '''
1712     print('statement_or_null_2', list(p))
1713     # { $$ = 0; }
1714 ()
1715 def p_stream_expression_1(p):
1716     '''stream_expression : expression '''
1717     print('stream_expression_1', list(p))
1718 ()
1719 def p_stream_expression_list_1(p):
1720     '''stream_expression_list : stream_expression_list ',' stream_expression '''
1721     print('stream_expression_list_1', list(p))
1722 ()
1723 def p_stream_expression_list_2(p):
1724     '''stream_expression_list : stream_expression '''
1725     print('stream_expression_list_2', list(p))
1726 ()
1727 def p_stream_operator_1(p):
1728     '''stream_operator : K_LS '''
1729     print('stream_operator_1', list(p))
1730 ()
1731 def p_stream_operator_2(p):
1732     '''stream_operator : K_RS '''
1733     print('stream_operator_2', list(p))
1734 ()
1735 def p_streaming_concatenation_1(p):
1736     '''streaming_concatenation : '{' stream_operator '{' stream_expression_list '}' '}' '''
1737     print('streaming_concatenation_1', list(p))
1738     # { /* streaming concatenation is a SystemVerilog thing. */
1739     #   if (gn_system_verilog()) {
1740     #         yyerror(@2, "sorry: Streaming concatenation not supported.");
1741     #         $$ = 0;
1742     #   } else {
1743     #         yyerror(@2, "error: Streaming concatenation requires SystemVerilog");
1744     #         $$ = 0;
1745     #   }
1746     #       }
1747 ()
1748 def p_task_declaration_1(p):
1749     '''task_declaration : K_task lifetime_opt IDENTIFIER ';' _embed0_task_declaration task_item_list_opt statement_or_null_list_opt K_endtask _embed1_task_declaration endlabel_opt '''
1750     print('task_declaration_1', list(p))
1751     # { // Last step: check any closing name. This is done late so
1752     #   // that the parser can look ahead to detect the present
1753     #   // endlabel_opt but still have the pform_endmodule() called
1754     #   // early enough that the lexor can know we are outside the
1755     #   // module.
1756     #   if ($10) {
1757     #         if (strcmp($3,$10) != 0) {
1758     #               yyerror(@10, "error: End label doesn't match task name");
1759     #         }
1760     #         if (! gn_system_verilog()) {
1761     #               yyerror(@10, "error: Task end labels require "
1762     #                            "SystemVerilog.");
1763     #         }
1764     #         delete[]$10;
1765     #   }
1766     #   delete[]$3;
1767     #       }
1768 ()
1769 def p_task_declaration_2(p):
1770     '''task_declaration : K_task lifetime_opt IDENTIFIER '(' _embed2_task_declaration tf_port_list ')' ';' block_item_decls_opt statement_or_null_list_opt K_endtask _embed3_task_declaration endlabel_opt '''
1771     print('task_declaration_2', list(p))
1772     # { // Last step: check any closing name. This is done late so
1773     #   // that the parser can look ahead to detect the present
1774     #   // endlabel_opt but still have the pform_endmodule() called
1775     #   // early enough that the lexor can know we are outside the
1776     #   // module.
1777     #   if ($13) {
1778     #         if (strcmp($3,$13) != 0) {
1779     #               yyerror(@13, "error: End label doesn't match task name");
1780     #         }
1781     #         if (! gn_system_verilog()) {
1782     #               yyerror(@13, "error: Task end labels require "
1783     #                            "SystemVerilog.");
1784     #         }
1785     #         delete[]$13;
1786     #   }
1787     #   delete[]$3;
1788     #       }
1789 ()
1790 def p_task_declaration_3(p):
1791     '''task_declaration : K_task lifetime_opt IDENTIFIER '(' ')' ';' _embed4_task_declaration block_item_decls_opt statement_or_null_list K_endtask _embed5_task_declaration endlabel_opt '''
1792     print('task_declaration_3', list(p))
1793     # { // Last step: check any closing name. This is done late so
1794     #   // that the parser can look ahead to detect the present
1795     #   // endlabel_opt but still have the pform_endmodule() called
1796     #   // early enough that the lexor can know we are outside the
1797     #   // module.
1798     #   if ($12) {
1799     #         if (strcmp($3,$12) != 0) {
1800     #               yyerror(@12, "error: End label doesn't match task name");
1801     #         }
1802     #         if (! gn_system_verilog()) {
1803     #               yyerror(@12, "error: Task end labels require "
1804     #                            "SystemVerilog.");
1805     #         }
1806     #         delete[]$12;
1807     #   }
1808     #   delete[]$3;
1809     #       }
1810 ()
1811 def p_task_declaration_4(p):
1812     '''task_declaration : K_task lifetime_opt IDENTIFIER error K_endtask _embed6_task_declaration endlabel_opt '''
1813     print('task_declaration_4', list(p))
1814     # { // Last step: check any closing name. This is done late so
1815     #   // that the parser can look ahead to detect the present
1816     #   // endlabel_opt but still have the pform_endmodule() called
1817     #   // early enough that the lexor can know we are outside the
1818     #   // module.
1819     #   if ($7) {
1820     #         if (strcmp($3,$7) != 0) {
1821     #               yyerror(@7, "error: End label doesn't match task name");
1822     #         }
1823     #         if (! gn_system_verilog()) {
1824     #               yyerror(@7, "error: Task end labels require "
1825     #                            "SystemVerilog.");
1826     #         }
1827     #         delete[]$7;
1828     #   }
1829     #   delete[]$3;
1830     #       }
1831 ()
1832 def p__embed0_task_declaration(p):
1833     '''_embed0_task_declaration : '''
1834     # { assert(current_task == 0);
1835     #   current_task = pform_push_task_scope(@1, $3, $2);
1836     #       }
1837 ()
1838 def p__embed1_task_declaration(p):
1839     '''_embed1_task_declaration : '''
1840     # { current_task->set_ports($6);
1841     #   current_task_set_statement(@3, $7);
1842     #   pform_set_this_class(@3, current_task);
1843     #   pform_pop_scope();
1844     #   current_task = 0;
1845     #   if ($7 && $7->size() > 1 && !gn_system_verilog()) {
1846     #         yyerror(@7, "error: Task body with multiple statements requires SystemVerilog.");
1847     #   }
1848     #   delete $7;
1849     #       }
1850 ()
1851 def p__embed2_task_declaration(p):
1852     '''_embed2_task_declaration : '''
1853     # { assert(current_task == 0);
1854     #   current_task = pform_push_task_scope(@1, $3, $2);
1855     #       }
1856 ()
1857 def p__embed3_task_declaration(p):
1858     '''_embed3_task_declaration : '''
1859     # { current_task->set_ports($6);
1860     #   current_task_set_statement(@3, $10);
1861     #   pform_set_this_class(@3, current_task);
1862     #   pform_pop_scope();
1863     #   current_task = 0;
1864     #   if ($10) delete $10;
1865     #       }
1866 ()
1867 def p__embed4_task_declaration(p):
1868     '''_embed4_task_declaration : '''
1869     # { assert(current_task == 0);
1870     #   current_task = pform_push_task_scope(@1, $3, $2);
1871     #       }
1872 ()
1873 def p__embed5_task_declaration(p):
1874     '''_embed5_task_declaration : '''
1875     # { current_task->set_ports(0);
1876     #   current_task_set_statement(@3, $9);
1877     #   pform_set_this_class(@3, current_task);
1878     #   if (! current_task->method_of()) {
1879     #         cerr << @3 << ": warning: task definition for \"" << $3
1880     #              << "\" has an empty port declaration list!" << endl;
1881     #   }
1882     #   pform_pop_scope();
1883     #   current_task = 0;
1884     #   if ($9->size() > 1 && !gn_system_verilog()) {
1885     #         yyerror(@9, "error: Task body with multiple statements requires SystemVerilog.");
1886     #   }
1887     #   delete $9;
1888     #       }
1889 ()
1890 def p__embed6_task_declaration(p):
1891     '''_embed6_task_declaration : '''
1892     # {
1893     #   if (current_task) {
1894     #         pform_pop_scope();
1895     #         current_task = 0;
1896     #   }
1897     #       }
1898 ()
1899 def p_tf_port_declaration_1(p):
1900     '''tf_port_declaration : port_direction K_reg_opt unsigned_signed_opt dimensions_opt list_of_identifiers ';' '''
1901     print('tf_port_declaration_1', list(p))
1902     # { vector<pform_tf_port_t>*tmp = pform_make_task_ports(@1, $1,
1903     #                                           $2 ? IVL_VT_LOGIC :
1904     #                                                IVL_VT_NO_TYPE,
1905     #                                           $3, $4, $5);
1906     #   $$ = tmp;
1907     #       }
1908 ()
1909 def p_tf_port_declaration_2(p):
1910     '''tf_port_declaration : port_direction K_integer list_of_identifiers ';' '''
1911     print('tf_port_declaration_2', list(p))
1912     # { list<pform_range_t>*range_stub = make_range_from_width(integer_width);
1913     #   vector<pform_tf_port_t>*tmp = pform_make_task_ports(@1, $1, IVL_VT_LOGIC, true,
1914     #                                               range_stub, $3, true);
1915     #   $$ = tmp;
1916     #       }
1917 ()
1918 def p_tf_port_declaration_3(p):
1919     '''tf_port_declaration : port_direction K_time list_of_identifiers ';' '''
1920     print('tf_port_declaration_3', list(p))
1921     # { list<pform_range_t>*range_stub = make_range_from_width(64);
1922     #   vector<pform_tf_port_t>*tmp = pform_make_task_ports(@1, $1, IVL_VT_LOGIC, false,
1923     #                                              range_stub, $3);
1924     #   $$ = tmp;
1925     #       }
1926 ()
1927 def p_tf_port_declaration_4(p):
1928     '''tf_port_declaration : port_direction real_or_realtime list_of_identifiers ';' '''
1929     print('tf_port_declaration_4', list(p))
1930     # { vector<pform_tf_port_t>*tmp = pform_make_task_ports(@1, $1, IVL_VT_REAL, true,
1931     #                                              0, $3);
1932     #   $$ = tmp;
1933     #       }
1934 ()
1935 def p_tf_port_declaration_5(p):
1936     '''tf_port_declaration : port_direction K_string list_of_identifiers ';' '''
1937     print('tf_port_declaration_5', list(p))
1938     # { vector<pform_tf_port_t>*tmp = pform_make_task_ports(@1, $1, IVL_VT_STRING, true,
1939     #                                              0, $3);
1940     #   $$ = tmp;
1941     #       }
1942 ()
1943 def p_tf_port_item_1(p):
1944     '''tf_port_item : port_direction_opt data_type_or_implicit IDENTIFIER dimensions_opt tf_port_item_expr_opt '''
1945     print('tf_port_item_1', list(p))
1946     # { vector<pform_tf_port_t>*tmp;
1947     #   NetNet::PortType use_port_type = $1;
1948     #         if ((use_port_type == NetNet::PIMPLICIT) && (gn_system_verilog() || ($2 == 0)))
1949     #               use_port_type = port_declaration_context.port_type;
1950     #   perm_string name = lex_strings.make($3);
1951     #   list<perm_string>* ilist = list_from_identifier($3);
1952     # 
1953     #   if (use_port_type == NetNet::PIMPLICIT) {
1954     #         yyerror(@1, "error: missing task/function port direction.");
1955     #         use_port_type = NetNet::PINPUT; // for error recovery
1956     #   }
1957     #   if (($2 == 0) && ($1==NetNet::PIMPLICIT)) {
1958     #           // Detect special case this is an undecorated
1959     #           // identifier and we need to get the declaration from
1960     #           // left context.
1961     #         if ($4 != 0) {
1962     #               yyerror(@4, "internal error: How can there be an unpacked range here?\n");
1963     #         }
1964     #         tmp = pform_make_task_ports(@3, use_port_type,
1965     #                                     port_declaration_context.data_type,
1966     #                                     ilist);
1967     # 
1968     #   } else {
1969     #           // Otherwise, the decorations for this identifier
1970     #           // indicate the type. Save the type for any right
1971     #           // context that may come later.
1972     #         port_declaration_context.port_type = use_port_type;
1973     #         if ($2 == 0) {
1974     #               $2 = new vector_type_t(IVL_VT_LOGIC, false, 0);
1975     #               FILE_NAME($2, @3);
1976     #         }
1977     #         port_declaration_context.data_type = $2;
1978     #         tmp = pform_make_task_ports(@3, use_port_type, $2, ilist);
1979     #   }
1980     #   if ($4 != 0) {
1981     #         pform_set_reg_idx(name, $4);
1982     #   }
1983     # 
1984     #   $$ = tmp;
1985     #   if ($5) {
1986     #         assert(tmp->size()==1);
1987     #         tmp->front().defe = $5;
1988     #   }
1989     #       }
1990 ()
1991 def p_tf_port_item_2(p):
1992     '''tf_port_item : port_direction_opt data_type_or_implicit IDENTIFIER error '''
1993     print('tf_port_item_2', list(p))
1994     # { yyerror(@3, "error: Error in task/function port item after port name %s.", $3);
1995     #   yyerrok;
1996     #   $$ = 0;
1997     #       }
1998 ()
1999 def p_tf_port_item_expr_opt_1(p):
2000     '''tf_port_item_expr_opt : '=' expression '''
2001     print('tf_port_item_expr_opt_1', list(p))
2002     # { if (! gn_system_verilog()) {
2003     #         yyerror(@1, "error: Task/function default arguments require "
2004     #                     "SystemVerilog.");
2005     #   }
2006     #   $$ = $2;
2007     #       }
2008 ()
2009 def p_tf_port_item_expr_opt_2(p):
2010     '''tf_port_item_expr_opt :  '''
2011     print('tf_port_item_expr_opt_2', list(p))
2012     # { $$ = 0; }
2013 ()
2014 def p_tf_port_list_1(p):
2015     '''tf_port_list : _embed0_tf_port_list tf_port_item_list '''
2016     print('tf_port_list_1', list(p))
2017     # { $$ = $2; }
2018 ()
2019 def p__embed0_tf_port_list(p):
2020     '''_embed0_tf_port_list : '''
2021     # { port_declaration_context.port_type = gn_system_verilog() ? NetNet::PINPUT : NetNet::PIMPLICIT;
2022     #   port_declaration_context.data_type = 0;
2023     #       }
2024 ()
2025 def p_tf_port_item_list_1(p):
2026     '''tf_port_item_list : tf_port_item_list ',' tf_port_item '''
2027     print('tf_port_item_list_1', list(p))
2028     # { vector<pform_tf_port_t>*tmp;
2029     #   if ($1 && $3) {
2030     #         size_t s1 = $1->size();
2031     #         tmp = $1;
2032     #         tmp->resize(tmp->size()+$3->size());
2033     #         for (size_t idx = 0 ; idx < $3->size() ; idx += 1)
2034     #               tmp->at(s1+idx) = $3->at(idx);
2035     #         delete $3;
2036     #   } else if ($1) {
2037     #         tmp = $1;
2038     #   } else {
2039     #         tmp = $3;
2040     #   }
2041     #   $$ = tmp;
2042     #       }
2043 ()
2044 def p_tf_port_item_list_2(p):
2045     '''tf_port_item_list : tf_port_item '''
2046     print('tf_port_item_list_2', list(p))
2047     # { $$ = $1; }
2048 ()
2049 def p_tf_port_item_list_3(p):
2050     '''tf_port_item_list : error ',' tf_port_item '''
2051     print('tf_port_item_list_3', list(p))
2052     # { yyerror(@2, "error: Syntax error in task/function port declaration.");
2053     #   $$ = $3;
2054     #       }
2055 ()
2056 def p_tf_port_item_list_4(p):
2057     '''tf_port_item_list : tf_port_item_list ',' '''
2058     print('tf_port_item_list_4', list(p))
2059     # { yyerror(@2, "error: NULL port declarations are not allowed.");
2060     #   $$ = $1;
2061     #       }
2062 ()
2063 def p_tf_port_item_list_5(p):
2064     '''tf_port_item_list : tf_port_item_list ';' '''
2065     print('tf_port_item_list_5', list(p))
2066     # { yyerror(@2, "error: ';' is an invalid port declaration separator.");
2067     #   $$ = $1;
2068     #       }
2069 ()
2070 def p_timeunits_declaration_1(p):
2071     '''timeunits_declaration : K_timeunit TIME_LITERAL ';' '''
2072     print('timeunits_declaration_1', list(p))
2073     # { pform_set_timeunit($2, allow_timeunit_decl); }
2074 ()
2075 def p_timeunits_declaration_2(p):
2076     '''timeunits_declaration : K_timeunit TIME_LITERAL '/' TIME_LITERAL ';' '''
2077     print('timeunits_declaration_2', list(p))
2078     # { bool initial_decl = allow_timeunit_decl && allow_timeprec_decl;
2079     #         pform_set_timeunit($2, initial_decl);
2080     #         pform_set_timeprec($4, initial_decl);
2081     #       }
2082 ()
2083 def p_timeunits_declaration_3(p):
2084     '''timeunits_declaration : K_timeprecision TIME_LITERAL ';' '''
2085     print('timeunits_declaration_3', list(p))
2086     # { pform_set_timeprec($2, allow_timeprec_decl); }
2087 ()
2088 def p_timeunits_declaration_opt_1(p):
2089     '''timeunits_declaration_opt : %prec no_timeunits_declaration '''
2090     print('timeunits_declaration_opt_1', list(p))
2091 ()
2092 def p_timeunits_declaration_opt_2(p):
2093     '''timeunits_declaration_opt : timeunits_declaration %prec one_timeunits_declaration '''
2094     print('timeunits_declaration_opt_2', list(p))
2095 ()
2096 def p_timeunits_declaration_opt_3(p):
2097     '''timeunits_declaration_opt : timeunits_declaration timeunits_declaration '''
2098     print('timeunits_declaration_opt_3', list(p))
2099 ()
2100 def p_value_range_1(p):
2101     '''value_range : expression '''
2102     print('value_range_1', list(p))
2103     # { }
2104 ()
2105 def p_value_range_2(p):
2106     '''value_range : '[' expression ':' expression ']' '''
2107     print('value_range_2', list(p))
2108     # { }
2109 ()
2110 def p_variable_dimension_1(p):
2111     '''variable_dimension : '[' expression ':' expression ']' '''
2112     print('variable_dimension_1', list(p))
2113     # { list<pform_range_t> *tmp = new list<pform_range_t>;
2114     #   pform_range_t index ($2,$4);
2115     #   tmp->push_back(index);
2116     #   $$ = tmp;
2117     #       }
2118 ()
2119 def p_variable_dimension_2(p):
2120     '''variable_dimension : '[' expression ']' '''
2121     print('variable_dimension_2', list(p))
2122     # { // SystemVerilog canonical range
2123     #   if (!gn_system_verilog()) {
2124     #         warn_count += 1;
2125     #         cerr << @2 << ": warning: Use of SystemVerilog [size] dimension. "
2126     #              << "Use at least -g2005-sv to remove this warning." << endl;
2127     #   }
2128     #   list<pform_range_t> *tmp = new list<pform_range_t>;
2129     #   pform_range_t index;
2130     #   index.first = new PENumber(new verinum((uint64_t)0, integer_width));
2131     #   index.second = new PEBinary('-', $2, new PENumber(new verinum((uint64_t)1, integer_width)));
2132     #   tmp->push_back(index);
2133     #   $$ = tmp;
2134     #       }
2135 ()
2136 def p_variable_dimension_3(p):
2137     '''variable_dimension : '[' ']' '''
2138     print('variable_dimension_3', list(p))
2139     # { list<pform_range_t> *tmp = new list<pform_range_t>;
2140     #   pform_range_t index (0,0);
2141     #   tmp->push_back(index);
2142     #   $$ = tmp;
2143     #       }
2144 ()
2145 def p_variable_dimension_4(p):
2146     '''variable_dimension : '[' '$' ']' '''
2147     print('variable_dimension_4', list(p))
2148     # { // SystemVerilog queue
2149     #   list<pform_range_t> *tmp = new list<pform_range_t>;
2150     #   pform_range_t index (new PENull,0);
2151     #   if (!gn_system_verilog()) {
2152     #         yyerror("error: Queue declarations require SystemVerilog.");
2153     #   }
2154     #   tmp->push_back(index);
2155     #   $$ = tmp;
2156     #       }
2157 ()
2158 def p_variable_lifetime_1(p):
2159     '''variable_lifetime : lifetime '''
2160     print('variable_lifetime_1', list(p))
2161     # { if (!gn_system_verilog()) {
2162     #         yyerror(@1, "error: overriding the default variable lifetime "
2163     #                     "requires SystemVerilog.");
2164     #   } else if ($1 != pform_peek_scope()->default_lifetime) {
2165     #         yyerror(@1, "sorry: overriding the default variable lifetime "
2166     #                     "is not yet supported.");
2167     #   }
2168     #   var_lifetime = $1;
2169     #       }
2170 ()
2171 def p_attribute_list_opt_1(p):
2172     '''attribute_list_opt : attribute_instance_list '''
2173     print('attribute_list_opt_1', list(p))
2174     # { $$ = $1; }
2175 ()
2176 def p_attribute_list_opt_2(p):
2177     '''attribute_list_opt :  '''
2178     print('attribute_list_opt_2', list(p))
2179     # { $$ = 0; }
2180 ()
2181 def p_attribute_instance_list_1(p):
2182     '''attribute_instance_list : K_PSTAR K_STARP '''
2183     print('attribute_instance_list_1', list(p))
2184     # { $$ = 0; }
2185 ()
2186 def p_attribute_instance_list_2(p):
2187     '''attribute_instance_list : K_PSTAR attribute_list K_STARP '''
2188     print('attribute_instance_list_2', list(p))
2189     # { $$ = $2; }
2190 ()
2191 def p_attribute_instance_list_3(p):
2192     '''attribute_instance_list : attribute_instance_list K_PSTAR K_STARP '''
2193     print('attribute_instance_list_3', list(p))
2194     # { $$ = $1; }
2195 ()
2196 def p_attribute_instance_list_4(p):
2197     '''attribute_instance_list : attribute_instance_list K_PSTAR attribute_list K_STARP '''
2198     print('attribute_instance_list_4', list(p))
2199     # { list<named_pexpr_t>*tmp = $1;
2200     #   if (tmp) {
2201     #       tmp->splice(tmp->end(), *$3);
2202     #       delete $3;
2203     #       $$ = tmp;
2204     #   } else $$ = $3;
2205     #       }
2206 ()
2207 def p_attribute_list_1(p):
2208     '''attribute_list : attribute_list ',' attribute '''
2209     print('attribute_list_1', list(p))
2210     # { list<named_pexpr_t>*tmp = $1;
2211     #         tmp->push_back(*$3);
2212     #   delete $3;
2213     #   $$ = tmp;
2214     #       }
2215 ()
2216 def p_attribute_list_2(p):
2217     '''attribute_list : attribute '''
2218     print('attribute_list_2', list(p))
2219     # { list<named_pexpr_t>*tmp = new list<named_pexpr_t>;
2220     #         tmp->push_back(*$1);
2221     #   delete $1;
2222     #   $$ = tmp;
2223     #       }
2224 ()
2225 def p_attribute_1(p):
2226     '''attribute : IDENTIFIER '''
2227     print('attribute_1', list(p))
2228     # { named_pexpr_t*tmp = new named_pexpr_t;
2229     #             tmp->name = lex_strings.make($1);
2230     #             tmp->parm = 0;
2231     #             delete[]$1;
2232     #             $$ = tmp;
2233     #           }
2234 ()
2235 def p_attribute_2(p):
2236     '''attribute : IDENTIFIER '=' expression '''
2237     print('attribute_2', list(p))
2238     # { PExpr*tmp = $3;
2239     #             named_pexpr_t*tmp2 = new named_pexpr_t;
2240     #             tmp2->name = lex_strings.make($1);
2241     #             tmp2->parm = tmp;
2242     #             delete[]$1;
2243     #             $$ = tmp2;
2244     #           }
2245 ()
2246 def p_block_item_decl_1(p):
2247     '''block_item_decl : data_type register_variable_list ';' '''
2248     print('block_item_decl_1', list(p))
2249     # { if ($1) pform_set_data_type(@1, $1, $2, NetNet::REG, attributes_in_context);
2250     #       }
2251 ()
2252 def p_block_item_decl_2(p):
2253     '''block_item_decl : variable_lifetime data_type register_variable_list ';' '''
2254     print('block_item_decl_2', list(p))
2255     # { if ($2) pform_set_data_type(@2, $2, $3, NetNet::REG, attributes_in_context);
2256     #   var_lifetime = LexicalScope::INHERITED;
2257     #       }
2258 ()
2259 def p_block_item_decl_3(p):
2260     '''block_item_decl : K_reg data_type register_variable_list ';' '''
2261     print('block_item_decl_3', list(p))
2262     # { if ($2) pform_set_data_type(@2, $2, $3, NetNet::REG, attributes_in_context);
2263     #       }
2264 ()
2265 def p_block_item_decl_4(p):
2266     '''block_item_decl : variable_lifetime K_reg data_type register_variable_list ';' '''
2267     print('block_item_decl_4', list(p))
2268     # { if ($3) pform_set_data_type(@3, $3, $4, NetNet::REG, attributes_in_context);
2269     #   var_lifetime = LexicalScope::INHERITED;
2270     #       }
2271 ()
2272 def p_block_item_decl_5(p):
2273     '''block_item_decl : K_event event_variable_list ';' '''
2274     print('block_item_decl_5', list(p))
2275     # { if ($2) pform_make_events($2, @1.text, @1.first_line);
2276     #       }
2277 ()
2278 def p_block_item_decl_6(p):
2279     '''block_item_decl : K_parameter param_type parameter_assign_list ';' '''
2280     print('block_item_decl_6', list(p))
2281 ()
2282 def p_block_item_decl_7(p):
2283     '''block_item_decl : K_localparam param_type localparam_assign_list ';' '''
2284     print('block_item_decl_7', list(p))
2285 ()
2286 def p_block_item_decl_8(p):
2287     '''block_item_decl : type_declaration '''
2288     print('block_item_decl_8', list(p))
2289 ()
2290 def p_block_item_decl_9(p):
2291     '''block_item_decl : K_integer error ';' '''
2292     print('block_item_decl_9', list(p))
2293     # { yyerror(@1, "error: syntax error in integer variable list.");
2294     #   yyerrok;
2295     #       }
2296 ()
2297 def p_block_item_decl_10(p):
2298     '''block_item_decl : K_time error ';' '''
2299     print('block_item_decl_10', list(p))
2300     # { yyerror(@1, "error: syntax error in time variable list.");
2301     #   yyerrok;
2302     #       }
2303 ()
2304 def p_block_item_decl_11(p):
2305     '''block_item_decl : K_parameter error ';' '''
2306     print('block_item_decl_11', list(p))
2307     # { yyerror(@1, "error: syntax error in parameter list.");
2308     #   yyerrok;
2309     #       }
2310 ()
2311 def p_block_item_decl_12(p):
2312     '''block_item_decl : K_localparam error ';' '''
2313     print('block_item_decl_12', list(p))
2314     # { yyerror(@1, "error: syntax error localparam list.");
2315     #   yyerrok;
2316     #       }
2317 ()
2318 def p_block_item_decls_1(p):
2319     '''block_item_decls : block_item_decl '''
2320     print('block_item_decls_1', list(p))
2321 ()
2322 def p_block_item_decls_2(p):
2323     '''block_item_decls : block_item_decls block_item_decl '''
2324     print('block_item_decls_2', list(p))
2325 ()
2326 def p_block_item_decls_opt_1(p):
2327     '''block_item_decls_opt : block_item_decls '''
2328     print('block_item_decls_opt_1', list(p))
2329     # { $$ = true; }
2330 ()
2331 def p_block_item_decls_opt_2(p):
2332     '''block_item_decls_opt :  '''
2333     print('block_item_decls_opt_2', list(p))
2334     # { $$ = false; }
2335 ()
2336 def p_type_declaration_1(p):
2337     '''type_declaration : K_typedef data_type IDENTIFIER dimensions_opt ';' '''
2338     print('type_declaration_1', list(p))
2339     # { perm_string name = lex_strings.make($3);
2340     #   pform_set_typedef(name, $2, $4);
2341     #   delete[]$3;
2342     #       }
2343 ()
2344 def p_type_declaration_2(p):
2345     '''type_declaration : K_typedef data_type TYPE_IDENTIFIER ';' '''
2346     print('type_declaration_2', list(p))
2347     # { perm_string name = lex_strings.make($3.text);
2348     #   if (pform_test_type_identifier_local(name)) {
2349     #         yyerror(@3, "error: Typedef identifier \"%s\" is already a type name.", $3.text);
2350     # 
2351     #   } else {
2352     #         pform_set_typedef(name, $2, NULL);
2353     #   }
2354     #   delete[]$3.text;
2355     #       }
2356 ()
2357 def p_type_declaration_3(p):
2358     '''type_declaration : K_typedef K_class IDENTIFIER ';' '''
2359     print('type_declaration_3', list(p))
2360     # { // Create a synthetic typedef for the class name so that the
2361     #   // lexor detects the name as a type.
2362     #   perm_string name = lex_strings.make($3);
2363     #   class_type_t*tmp = new class_type_t(name);
2364     #   FILE_NAME(tmp, @3);
2365     #   pform_set_typedef(name, tmp, NULL);
2366     #   delete[]$3;
2367     #       }
2368 ()
2369 def p_type_declaration_4(p):
2370     '''type_declaration : K_typedef K_enum IDENTIFIER ';' '''
2371     print('type_declaration_4', list(p))
2372     # { yyerror(@1, "sorry: Enum forward declarations not supported yet."); }
2373 ()
2374 def p_type_declaration_5(p):
2375     '''type_declaration : K_typedef K_struct IDENTIFIER ';' '''
2376     print('type_declaration_5', list(p))
2377     # { yyerror(@1, "sorry: Struct forward declarations not supported yet."); }
2378 ()
2379 def p_type_declaration_6(p):
2380     '''type_declaration : K_typedef K_union IDENTIFIER ';' '''
2381     print('type_declaration_6', list(p))
2382     # { yyerror(@1, "sorry: Union forward declarations not supported yet."); }
2383 ()
2384 def p_type_declaration_7(p):
2385     '''type_declaration : K_typedef IDENTIFIER ';' '''
2386     print('type_declaration_7', list(p))
2387     # { // Create a synthetic typedef for the class name so that the
2388     #   // lexor detects the name as a type.
2389     #   perm_string name = lex_strings.make($2);
2390     #   class_type_t*tmp = new class_type_t(name);
2391     #   FILE_NAME(tmp, @2);
2392     #   pform_set_typedef(name, tmp, NULL);
2393     #   delete[]$2;
2394     #       }
2395 ()
2396 def p_type_declaration_8(p):
2397     '''type_declaration : K_typedef error ';' '''
2398     print('type_declaration_8', list(p))
2399     # { yyerror(@2, "error: Syntax error in typedef clause.");
2400     #   yyerrok;
2401     #       }
2402 ()
2403 def p_enum_data_type_1(p):
2404     '''enum_data_type : K_enum '{' enum_name_list '}' '''
2405     print('enum_data_type_1', list(p))
2406     # { enum_type_t*enum_type = new enum_type_t;
2407     #   FILE_NAME(enum_type, @1);
2408     #   enum_type->names .reset($3);
2409     #   enum_type->base_type = IVL_VT_BOOL;
2410     #   enum_type->signed_flag = true;
2411     #   enum_type->integer_flag = false;
2412     #   enum_type->range.reset(make_range_from_width(32));
2413     #   $$ = enum_type;
2414     #       }
2415 ()
2416 def p_enum_data_type_2(p):
2417     '''enum_data_type : K_enum atom2_type signed_unsigned_opt '{' enum_name_list '}' '''
2418     print('enum_data_type_2', list(p))
2419     # { enum_type_t*enum_type = new enum_type_t;
2420     #   FILE_NAME(enum_type, @1);
2421     #   enum_type->names .reset($5);
2422     #   enum_type->base_type = IVL_VT_BOOL;
2423     #   enum_type->signed_flag = $3;
2424     #   enum_type->integer_flag = false;
2425     #   enum_type->range.reset(make_range_from_width($2));
2426     #   $$ = enum_type;
2427     #       }
2428 ()
2429 def p_enum_data_type_3(p):
2430     '''enum_data_type : K_enum K_integer signed_unsigned_opt '{' enum_name_list '}' '''
2431     print('enum_data_type_3', list(p))
2432     # { enum_type_t*enum_type = new enum_type_t;
2433     #   FILE_NAME(enum_type, @1);
2434     #   enum_type->names .reset($5);
2435     #   enum_type->base_type = IVL_VT_LOGIC;
2436     #   enum_type->signed_flag = $3;
2437     #   enum_type->integer_flag = true;
2438     #   enum_type->range.reset(make_range_from_width(integer_width));
2439     #   $$ = enum_type;
2440     #       }
2441 ()
2442 def p_enum_data_type_4(p):
2443     '''enum_data_type : K_enum K_logic unsigned_signed_opt dimensions_opt '{' enum_name_list '}' '''
2444     print('enum_data_type_4', list(p))
2445     # { enum_type_t*enum_type = new enum_type_t;
2446     #   FILE_NAME(enum_type, @1);
2447     #   enum_type->names .reset($6);
2448     #   enum_type->base_type = IVL_VT_LOGIC;
2449     #   enum_type->signed_flag = $3;
2450     #   enum_type->integer_flag = false;
2451     #   enum_type->range.reset($4 ? $4 : make_range_from_width(1));
2452     #   $$ = enum_type;
2453     #       }
2454 ()
2455 def p_enum_data_type_5(p):
2456     '''enum_data_type : K_enum K_reg unsigned_signed_opt dimensions_opt '{' enum_name_list '}' '''
2457     print('enum_data_type_5', list(p))
2458     # { enum_type_t*enum_type = new enum_type_t;
2459     #   FILE_NAME(enum_type, @1);
2460     #   enum_type->names .reset($6);
2461     #   enum_type->base_type = IVL_VT_LOGIC;
2462     #   enum_type->signed_flag = $3;
2463     #   enum_type->integer_flag = false;
2464     #   enum_type->range.reset($4 ? $4 : make_range_from_width(1));
2465     #   $$ = enum_type;
2466     #       }
2467 ()
2468 def p_enum_data_type_6(p):
2469     '''enum_data_type : K_enum K_bit unsigned_signed_opt dimensions_opt '{' enum_name_list '}' '''
2470     print('enum_data_type_6', list(p))
2471     # { enum_type_t*enum_type = new enum_type_t;
2472     #   FILE_NAME(enum_type, @1);
2473     #   enum_type->names .reset($6);
2474     #   enum_type->base_type = IVL_VT_BOOL;
2475     #   enum_type->signed_flag = $3;
2476     #   enum_type->integer_flag = false;
2477     #   enum_type->range.reset($4 ? $4 : make_range_from_width(1));
2478     #   $$ = enum_type;
2479     #       }
2480 ()
2481 def p_enum_name_list_1(p):
2482     '''enum_name_list : enum_name '''
2483     print('enum_name_list_1', list(p))
2484     # { $$ = $1;
2485     #       }
2486 ()
2487 def p_enum_name_list_2(p):
2488     '''enum_name_list : enum_name_list ',' enum_name '''
2489     print('enum_name_list_2', list(p))
2490     # { list<named_pexpr_t>*lst = $1;
2491     #   lst->splice(lst->end(), *$3);
2492     #   delete $3;
2493     #   $$ = lst;
2494     #       }
2495 ()
2496 def p_pos_neg_number_1(p):
2497     '''pos_neg_number : number '''
2498     print('pos_neg_number_1', list(p))
2499     # { $$ = $1;
2500     #       }
2501 ()
2502 def p_pos_neg_number_2(p):
2503     '''pos_neg_number : '-' number '''
2504     print('pos_neg_number_2', list(p))
2505     # { verinum tmp = -(*($2));
2506     #   *($2) = tmp;
2507     #   $$ = $2;
2508     #       }
2509 ()
2510 def p_enum_name_1(p):
2511     '''enum_name : IDENTIFIER '''
2512     print('enum_name_1', list(p))
2513     # { perm_string name = lex_strings.make($1);
2514     #   delete[]$1;
2515     #   $$ = make_named_number(name);
2516     #       }
2517 ()
2518 def p_enum_name_2(p):
2519     '''enum_name : IDENTIFIER '[' pos_neg_number ']' '''
2520     print('enum_name_2', list(p))
2521     # { perm_string name = lex_strings.make($1);
2522     #   long count = check_enum_seq_value(@1, $3, false);
2523     #   delete[]$1;
2524     #   $$ = make_named_numbers(name, 0, count-1);
2525     #   delete $3;
2526     #       }
2527 ()
2528 def p_enum_name_3(p):
2529     '''enum_name : IDENTIFIER '[' pos_neg_number ':' pos_neg_number ']' '''
2530     print('enum_name_3', list(p))
2531     # { perm_string name = lex_strings.make($1);
2532     #   $$ = make_named_numbers(name, check_enum_seq_value(@1, $3, true),
2533     #                                 check_enum_seq_value(@1, $5, true));
2534     #   delete[]$1;
2535     #   delete $3;
2536     #   delete $5;
2537     #       }
2538 ()
2539 def p_enum_name_4(p):
2540     '''enum_name : IDENTIFIER '=' expression '''
2541     print('enum_name_4', list(p))
2542     # { perm_string name = lex_strings.make($1);
2543     #   delete[]$1;
2544     #   $$ = make_named_number(name, $3);
2545     #       }
2546 ()
2547 def p_enum_name_5(p):
2548     '''enum_name : IDENTIFIER '[' pos_neg_number ']' '=' expression '''
2549     print('enum_name_5', list(p))
2550     # { perm_string name = lex_strings.make($1);
2551     #   long count = check_enum_seq_value(@1, $3, false);
2552     #   $$ = make_named_numbers(name, 0, count-1, $6);
2553     #   delete[]$1;
2554     #   delete $3;
2555     #       }
2556 ()
2557 def p_enum_name_6(p):
2558     '''enum_name : IDENTIFIER '[' pos_neg_number ':' pos_neg_number ']' '=' expression '''
2559     print('enum_name_6', list(p))
2560     # { perm_string name = lex_strings.make($1);
2561     #   $$ = make_named_numbers(name, check_enum_seq_value(@1, $3, true),
2562     #                                 check_enum_seq_value(@1, $5, true), $8);
2563     #   delete[]$1;
2564     #   delete $3;
2565     #   delete $5;
2566     #       }
2567 ()
2568 def p_struct_data_type_1(p):
2569     '''struct_data_type : K_struct K_packed_opt '{' struct_union_member_list '}' '''
2570     print('struct_data_type_1', list(p))
2571     # { struct_type_t*tmp = new struct_type_t;
2572     #   FILE_NAME(tmp, @1);
2573     #   tmp->packed_flag = $2;
2574     #   tmp->union_flag = false;
2575     #   tmp->members .reset($4);
2576     #   $$ = tmp;
2577     #       }
2578 ()
2579 def p_struct_data_type_2(p):
2580     '''struct_data_type : K_union K_packed_opt '{' struct_union_member_list '}' '''
2581     print('struct_data_type_2', list(p))
2582     # { struct_type_t*tmp = new struct_type_t;
2583     #   FILE_NAME(tmp, @1);
2584     #   tmp->packed_flag = $2;
2585     #   tmp->union_flag = true;
2586     #   tmp->members .reset($4);
2587     #   $$ = tmp;
2588     #       }
2589 ()
2590 def p_struct_data_type_3(p):
2591     '''struct_data_type : K_struct K_packed_opt '{' error '}' '''
2592     print('struct_data_type_3', list(p))
2593     # { yyerror(@3, "error: Errors in struct member list.");
2594     #   yyerrok;
2595     #   struct_type_t*tmp = new struct_type_t;
2596     #   FILE_NAME(tmp, @1);
2597     #   tmp->packed_flag = $2;
2598     #   tmp->union_flag = false;
2599     #   $$ = tmp;
2600     #       }
2601 ()
2602 def p_struct_data_type_4(p):
2603     '''struct_data_type : K_union K_packed_opt '{' error '}' '''
2604     print('struct_data_type_4', list(p))
2605     # { yyerror(@3, "error: Errors in union member list.");
2606     #   yyerrok;
2607     #   struct_type_t*tmp = new struct_type_t;
2608     #   FILE_NAME(tmp, @1);
2609     #   tmp->packed_flag = $2;
2610     #   tmp->union_flag = true;
2611     #   $$ = tmp;
2612     #       }
2613 ()
2614 def p_struct_union_member_list_1(p):
2615     '''struct_union_member_list : struct_union_member_list struct_union_member '''
2616     print('struct_union_member_list_1', list(p))
2617     # { list<struct_member_t*>*tmp = $1;
2618     #   tmp->push_back($2);
2619     #   $$ = tmp;
2620     #       }
2621 ()
2622 def p_struct_union_member_list_2(p):
2623     '''struct_union_member_list : struct_union_member '''
2624     print('struct_union_member_list_2', list(p))
2625     # { list<struct_member_t*>*tmp = new list<struct_member_t*>;
2626     #   tmp->push_back($1);
2627     #   $$ = tmp;
2628     #       }
2629 ()
2630 def p_struct_union_member_1(p):
2631     '''struct_union_member : attribute_list_opt data_type list_of_variable_decl_assignments ';' '''
2632     print('struct_union_member_1', list(p))
2633     # { struct_member_t*tmp = new struct_member_t;
2634     #   FILE_NAME(tmp, @2);
2635     #   tmp->type  .reset($2);
2636     #   tmp->names .reset($3);
2637     #   $$ = tmp;
2638     #       }
2639 ()
2640 def p_struct_union_member_2(p):
2641     '''struct_union_member : error ';' '''
2642     print('struct_union_member_2', list(p))
2643     # { yyerror(@2, "Error in struct/union member.");
2644     #   yyerrok;
2645     #   $$ = 0;
2646     #       }
2647 ()
2648 def p_case_item_1(p):
2649     '''case_item : expression_list_proper ':' statement_or_null '''
2650     print('case_item_1', list(p))
2651     # { PCase::Item*tmp = new PCase::Item;
2652     #             tmp->expr = *$1;
2653     #             tmp->stat = $3;
2654     #             delete $1;
2655     #             $$ = tmp;
2656     #           }
2657 ()
2658 def p_case_item_2(p):
2659     '''case_item : K_default ':' statement_or_null '''
2660     print('case_item_2', list(p))
2661     # { PCase::Item*tmp = new PCase::Item;
2662     #             tmp->stat = $3;
2663     #             $$ = tmp;
2664     #           }
2665 ()
2666 def p_case_item_3(p):
2667     '''case_item : K_default statement_or_null '''
2668     print('case_item_3', list(p))
2669     # { PCase::Item*tmp = new PCase::Item;
2670     #             tmp->stat = $2;
2671     #             $$ = tmp;
2672     #           }
2673 ()
2674 def p_case_item_4(p):
2675     '''case_item : error ':' statement_or_null '''
2676     print('case_item_4', list(p))
2677     # { yyerror(@2, "error: Incomprehensible case expression.");
2678     #             yyerrok;
2679     #           }
2680 ()
2681 def p_case_items_1(p):
2682     '''case_items : case_items case_item '''
2683     print('case_items_1', list(p))
2684     # { svector<PCase::Item*>*tmp;
2685     #             tmp = new svector<PCase::Item*>(*$1, $2);
2686     #             delete $1;
2687     #             $$ = tmp;
2688     #           }
2689 ()
2690 def p_case_items_2(p):
2691     '''case_items : case_item '''
2692     print('case_items_2', list(p))
2693     # { svector<PCase::Item*>*tmp = new svector<PCase::Item*>(1);
2694     #             (*tmp)[0] = $1;
2695     #             $$ = tmp;
2696     #           }
2697 ()
2698 def p_charge_strength_1(p):
2699     '''charge_strength : '(' K_small ')' '''
2700     print('charge_strength_1', list(p))
2701 ()
2702 def p_charge_strength_2(p):
2703     '''charge_strength : '(' K_medium ')' '''
2704     print('charge_strength_2', list(p))
2705 ()
2706 def p_charge_strength_3(p):
2707     '''charge_strength : '(' K_large ')' '''
2708     print('charge_strength_3', list(p))
2709 ()
2710 def p_charge_strength_opt_1(p):
2711     '''charge_strength_opt : charge_strength '''
2712     print('charge_strength_opt_1', list(p))
2713 ()
2714 def p_charge_strength_opt_2(p):
2715     '''charge_strength_opt :  '''
2716     print('charge_strength_opt_2', list(p))
2717 ()
2718 def p_defparam_assign_1(p):
2719     '''defparam_assign : hierarchy_identifier '=' expression '''
2720     print('defparam_assign_1', list(p))
2721     # { pform_set_defparam(*$1, $3);
2722     #             delete $1;
2723     #           }
2724 ()
2725 def p_defparam_assign_list_1(p):
2726     '''defparam_assign_list : defparam_assign '''
2727     print('defparam_assign_list_1', list(p))
2728 ()
2729 def p_defparam_assign_list_2(p):
2730     '''defparam_assign_list : dimensions defparam_assign '''
2731     print('defparam_assign_list_2', list(p))
2732     # { yyerror(@1, "error: defparam may not include a range.");
2733     #   delete $1;
2734     #       }
2735 ()
2736 def p_defparam_assign_list_3(p):
2737     '''defparam_assign_list : defparam_assign_list ',' defparam_assign '''
2738     print('defparam_assign_list_3', list(p))
2739 ()
2740 def p_delay1_1(p):
2741     '''delay1 : '#' delay_value_simple '''
2742     print('delay1_1', list(p))
2743     # { list<PExpr*>*tmp = new list<PExpr*>;
2744     #             tmp->push_back($2);
2745     #             $$ = tmp;
2746     #           }
2747 ()
2748 def p_delay1_2(p):
2749     '''delay1 : '#' '(' delay_value ')' '''
2750     print('delay1_2', list(p))
2751     # { list<PExpr*>*tmp = new list<PExpr*>;
2752     #             tmp->push_back($3);
2753     #             $$ = tmp;
2754     #           }
2755 ()
2756 def p_delay3_1(p):
2757     '''delay3 : '#' delay_value_simple '''
2758     print('delay3_1', list(p))
2759     # { list<PExpr*>*tmp = new list<PExpr*>;
2760     #             tmp->push_back($2);
2761     #             $$ = tmp;
2762     #           }
2763 ()
2764 def p_delay3_2(p):
2765     '''delay3 : '#' '(' delay_value ')' '''
2766     print('delay3_2', list(p))
2767     # { list<PExpr*>*tmp = new list<PExpr*>;
2768     #             tmp->push_back($3);
2769     #             $$ = tmp;
2770     #           }
2771 ()
2772 def p_delay3_3(p):
2773     '''delay3 : '#' '(' delay_value ',' delay_value ')' '''
2774     print('delay3_3', list(p))
2775     # { list<PExpr*>*tmp = new list<PExpr*>;
2776     #             tmp->push_back($3);
2777     #             tmp->push_back($5);
2778     #             $$ = tmp;
2779     #           }
2780 ()
2781 def p_delay3_4(p):
2782     '''delay3 : '#' '(' delay_value ',' delay_value ',' delay_value ')' '''
2783     print('delay3_4', list(p))
2784     # { list<PExpr*>*tmp = new list<PExpr*>;
2785     #             tmp->push_back($3);
2786     #             tmp->push_back($5);
2787     #             tmp->push_back($7);
2788     #             $$ = tmp;
2789     #           }
2790 ()
2791 def p_delay3_opt_1(p):
2792     '''delay3_opt : delay3 '''
2793     print('delay3_opt_1', list(p))
2794     # { $$ = $1; }
2795 ()
2796 def p_delay3_opt_2(p):
2797     '''delay3_opt :  '''
2798     print('delay3_opt_2', list(p))
2799     # { $$ = 0; }
2800 ()
2801 def p_delay_value_list_1(p):
2802     '''delay_value_list : delay_value '''
2803     print('delay_value_list_1', list(p))
2804     # { list<PExpr*>*tmp = new list<PExpr*>;
2805     #   tmp->push_back($1);
2806     #   $$ = tmp;
2807     #       }
2808 ()
2809 def p_delay_value_list_2(p):
2810     '''delay_value_list : delay_value_list ',' delay_value '''
2811     print('delay_value_list_2', list(p))
2812     # { list<PExpr*>*tmp = $1;
2813     #   tmp->push_back($3);
2814     #   $$ = tmp;
2815     #       }
2816 ()
2817 def p_delay_value_1(p):
2818     '''delay_value : expression '''
2819     print('delay_value_1', list(p))
2820     # { PExpr*tmp = $1;
2821     #             $$ = tmp;
2822     #           }
2823 ()
2824 def p_delay_value_2(p):
2825     '''delay_value : expression ':' expression ':' expression '''
2826     print('delay_value_2', list(p))
2827     # { $$ = pform_select_mtm_expr($1, $3, $5); }
2828 ()
2829 def p_delay_value_simple_1(p):
2830     '''delay_value_simple : DEC_NUMBER '''
2831     print('delay_value_simple_1', list(p))
2832     # { verinum*tmp = $1;
2833     #             if (tmp == 0) {
2834     #                   yyerror(@1, "internal error: delay.");
2835     #                   $$ = 0;
2836     #             } else {
2837     #                   $$ = new PENumber(tmp);
2838     #                   FILE_NAME($$, @1);
2839     #             }
2840     #             based_size = 0;
2841     #           }
2842 ()
2843 def p_delay_value_simple_2(p):
2844     '''delay_value_simple : REALTIME '''
2845     print('delay_value_simple_2', list(p))
2846     # { verireal*tmp = $1;
2847     #             if (tmp == 0) {
2848     #                   yyerror(@1, "internal error: delay.");
2849     #                   $$ = 0;
2850     #             } else {
2851     #                   $$ = new PEFNumber(tmp);
2852     #                   FILE_NAME($$, @1);
2853     #             }
2854     #           }
2855 ()
2856 def p_delay_value_simple_3(p):
2857     '''delay_value_simple : IDENTIFIER '''
2858     print('delay_value_simple_3', list(p))
2859     # { PEIdent*tmp = new PEIdent(lex_strings.make($1));
2860     #             FILE_NAME(tmp, @1);
2861     #             $$ = tmp;
2862     #             delete[]$1;
2863     #           }
2864 ()
2865 def p_delay_value_simple_4(p):
2866     '''delay_value_simple : TIME_LITERAL '''
2867     print('delay_value_simple_4', list(p))
2868     # { int unit;
2869     # 
2870     #             based_size = 0;
2871     #             $$         = 0;
2872     #             if ($1 == 0 || !get_time_unit($1, unit))
2873     #                   yyerror(@1, "internal error: delay.");
2874     #             else {
2875     #                   double p = pow(10.0,
2876     #                                  (double)(unit - pform_get_timeunit()));
2877     #                   double time = atof($1) * p;
2878     # 
2879     #                   verireal *v = new verireal(time);
2880     #                   $$ = new PEFNumber(v);
2881     #                   FILE_NAME($$, @1);
2882     #             }
2883     #           }
2884 ()
2885 def p_optional_semicolon_1(p):
2886     '''optional_semicolon : ';' '''
2887     print('optional_semicolon_1', list(p))
2888 ()
2889 def p_optional_semicolon_2(p):
2890     '''optional_semicolon :  '''
2891     print('optional_semicolon_2', list(p))
2892 ()
2893 def p_discipline_declaration_1(p):
2894     '''discipline_declaration : K_discipline IDENTIFIER optional_semicolon _embed0_discipline_declaration discipline_items K_enddiscipline '''
2895     print('discipline_declaration_1', list(p))
2896     # { pform_end_discipline(@1); delete[] $2; }
2897 ()
2898 def p__embed0_discipline_declaration(p):
2899     '''_embed0_discipline_declaration : '''
2900     # { pform_start_discipline($2); }
2901 ()
2902 def p_discipline_items_1(p):
2903     '''discipline_items : discipline_items discipline_item '''
2904     print('discipline_items_1', list(p))
2905 ()
2906 def p_discipline_items_2(p):
2907     '''discipline_items : discipline_item '''
2908     print('discipline_items_2', list(p))
2909 ()
2910 def p_discipline_item_1(p):
2911     '''discipline_item : K_domain K_discrete ';' '''
2912     print('discipline_item_1', list(p))
2913     # { pform_discipline_domain(@1, IVL_DIS_DISCRETE); }
2914 ()
2915 def p_discipline_item_2(p):
2916     '''discipline_item : K_domain K_continuous ';' '''
2917     print('discipline_item_2', list(p))
2918     # { pform_discipline_domain(@1, IVL_DIS_CONTINUOUS); }
2919 ()
2920 def p_discipline_item_3(p):
2921     '''discipline_item : K_potential IDENTIFIER ';' '''
2922     print('discipline_item_3', list(p))
2923     # { pform_discipline_potential(@1, $2); delete[] $2; }
2924 ()
2925 def p_discipline_item_4(p):
2926     '''discipline_item : K_flow IDENTIFIER ';' '''
2927     print('discipline_item_4', list(p))
2928     # { pform_discipline_flow(@1, $2); delete[] $2; }
2929 ()
2930 def p_nature_declaration_1(p):
2931     '''nature_declaration : K_nature IDENTIFIER optional_semicolon _embed0_nature_declaration nature_items K_endnature '''
2932     print('nature_declaration_1', list(p))
2933     # { pform_end_nature(@1); delete[] $2; }
2934 ()
2935 def p__embed0_nature_declaration(p):
2936     '''_embed0_nature_declaration : '''
2937     # { pform_start_nature($2); }
2938 ()
2939 def p_nature_items_1(p):
2940     '''nature_items : nature_items nature_item '''
2941     print('nature_items_1', list(p))
2942 ()
2943 def p_nature_items_2(p):
2944     '''nature_items : nature_item '''
2945     print('nature_items_2', list(p))
2946 ()
2947 def p_nature_item_1(p):
2948     '''nature_item : K_units '=' STRING ';' '''
2949     print('nature_item_1', list(p))
2950     # { delete[] $3; }
2951 ()
2952 def p_nature_item_2(p):
2953     '''nature_item : K_abstol '=' expression ';' '''
2954     print('nature_item_2', list(p))
2955 ()
2956 def p_nature_item_3(p):
2957     '''nature_item : K_access '=' IDENTIFIER ';' '''
2958     print('nature_item_3', list(p))
2959     # { pform_nature_access(@1, $3); delete[] $3; }
2960 ()
2961 def p_nature_item_4(p):
2962     '''nature_item : K_idt_nature '=' IDENTIFIER ';' '''
2963     print('nature_item_4', list(p))
2964     # { delete[] $3; }
2965 ()
2966 def p_nature_item_5(p):
2967     '''nature_item : K_ddt_nature '=' IDENTIFIER ';' '''
2968     print('nature_item_5', list(p))
2969     # { delete[] $3; }
2970 ()
2971 def p_config_declaration_1(p):
2972     '''config_declaration : K_config IDENTIFIER ';' K_design lib_cell_identifiers ';' list_of_config_rule_statements K_endconfig '''
2973     print('config_declaration_1', list(p))
2974     # { cerr << @1 << ": sorry: config declarations are not supported and "
2975     #                 "will be skipped." << endl;
2976     #   delete[] $2;
2977     #       }
2978 ()
2979 def p_lib_cell_identifiers_1(p):
2980     '''lib_cell_identifiers :  '''
2981     print('lib_cell_identifiers_1', list(p))
2982 ()
2983 def p_lib_cell_identifiers_2(p):
2984     '''lib_cell_identifiers : lib_cell_identifiers lib_cell_id '''
2985     print('lib_cell_identifiers_2', list(p))
2986 ()
2987 def p_list_of_config_rule_statements_1(p):
2988     '''list_of_config_rule_statements :  '''
2989     print('list_of_config_rule_statements_1', list(p))
2990 ()
2991 def p_list_of_config_rule_statements_2(p):
2992     '''list_of_config_rule_statements : list_of_config_rule_statements config_rule_statement '''
2993     print('list_of_config_rule_statements_2', list(p))
2994 ()
2995 def p_config_rule_statement_1(p):
2996     '''config_rule_statement : K_default K_liblist list_of_libraries ';' '''
2997     print('config_rule_statement_1', list(p))
2998 ()
2999 def p_config_rule_statement_2(p):
3000     '''config_rule_statement : K_instance hierarchy_identifier K_liblist list_of_libraries ';' '''
3001     print('config_rule_statement_2', list(p))
3002     # { delete $2; }
3003 ()
3004 def p_config_rule_statement_3(p):
3005     '''config_rule_statement : K_instance hierarchy_identifier K_use lib_cell_id opt_config ';' '''
3006     print('config_rule_statement_3', list(p))
3007     # { delete $2; }
3008 ()
3009 def p_config_rule_statement_4(p):
3010     '''config_rule_statement : K_cell lib_cell_id K_liblist list_of_libraries ';' '''
3011     print('config_rule_statement_4', list(p))
3012 ()
3013 def p_config_rule_statement_5(p):
3014     '''config_rule_statement : K_cell lib_cell_id K_use lib_cell_id opt_config ';' '''
3015     print('config_rule_statement_5', list(p))
3016 ()
3017 def p_opt_config_1(p):
3018     '''opt_config :  '''
3019     print('opt_config_1', list(p))
3020 ()
3021 def p_opt_config_2(p):
3022     '''opt_config : ':' K_config '''
3023     print('opt_config_2', list(p))
3024 ()
3025 def p_lib_cell_id_1(p):
3026     '''lib_cell_id : IDENTIFIER '''
3027     print('lib_cell_id_1', list(p))
3028     # { delete[] $1; }
3029 ()
3030 def p_lib_cell_id_2(p):
3031     '''lib_cell_id : IDENTIFIER '.' IDENTIFIER '''
3032     print('lib_cell_id_2', list(p))
3033     # { delete[] $1; delete[] $3; }
3034 ()
3035 def p_list_of_libraries_1(p):
3036     '''list_of_libraries :  '''
3037     print('list_of_libraries_1', list(p))
3038 ()
3039 def p_list_of_libraries_2(p):
3040     '''list_of_libraries : list_of_libraries IDENTIFIER '''
3041     print('list_of_libraries_2', list(p))
3042     # { delete[] $2; }
3043 ()
3044 def p_drive_strength_1(p):
3045     '''drive_strength : '(' dr_strength0 ',' dr_strength1 ')' '''
3046     print('drive_strength_1', list(p))
3047     # { $$.str0 = $2.str0;
3048     #             $$.str1 = $4.str1;
3049     #           }
3050 ()
3051 def p_drive_strength_2(p):
3052     '''drive_strength : '(' dr_strength1 ',' dr_strength0 ')' '''
3053     print('drive_strength_2', list(p))
3054     # { $$.str0 = $4.str0;
3055     #             $$.str1 = $2.str1;
3056     #           }
3057 ()
3058 def p_drive_strength_3(p):
3059     '''drive_strength : '(' dr_strength0 ',' K_highz1 ')' '''
3060     print('drive_strength_3', list(p))
3061     # { $$.str0 = $2.str0;
3062     #             $$.str1 = IVL_DR_HiZ;
3063     #           }
3064 ()
3065 def p_drive_strength_4(p):
3066     '''drive_strength : '(' dr_strength1 ',' K_highz0 ')' '''
3067     print('drive_strength_4', list(p))
3068     # { $$.str0 = IVL_DR_HiZ;
3069     #             $$.str1 = $2.str1;
3070     #           }
3071 ()
3072 def p_drive_strength_5(p):
3073     '''drive_strength : '(' K_highz1 ',' dr_strength0 ')' '''
3074     print('drive_strength_5', list(p))
3075     # { $$.str0 = $4.str0;
3076     #             $$.str1 = IVL_DR_HiZ;
3077     #           }
3078 ()
3079 def p_drive_strength_6(p):
3080     '''drive_strength : '(' K_highz0 ',' dr_strength1 ')' '''
3081     print('drive_strength_6', list(p))
3082     # { $$.str0 = IVL_DR_HiZ;
3083     #             $$.str1 = $4.str1;
3084     #           }
3085 ()
3086 def p_drive_strength_opt_1(p):
3087     '''drive_strength_opt : drive_strength '''
3088     print('drive_strength_opt_1', list(p))
3089     # { $$ = $1; }
3090 ()
3091 def p_drive_strength_opt_2(p):
3092     '''drive_strength_opt :  '''
3093     print('drive_strength_opt_2', list(p))
3094     # { $$.str0 = IVL_DR_STRONG; $$.str1 = IVL_DR_STRONG; }
3095 ()
3096 def p_dr_strength0_1(p):
3097     '''dr_strength0 : K_supply0 '''
3098     print('dr_strength0_1', list(p))
3099     # { $$.str0 = IVL_DR_SUPPLY; }
3100 ()
3101 def p_dr_strength0_2(p):
3102     '''dr_strength0 : K_strong0 '''
3103     print('dr_strength0_2', list(p))
3104     # { $$.str0 = IVL_DR_STRONG; }
3105 ()
3106 def p_dr_strength0_3(p):
3107     '''dr_strength0 : K_pull0 '''
3108     print('dr_strength0_3', list(p))
3109     # { $$.str0 = IVL_DR_PULL; }
3110 ()
3111 def p_dr_strength0_4(p):
3112     '''dr_strength0 : K_weak0 '''
3113     print('dr_strength0_4', list(p))
3114     # { $$.str0 = IVL_DR_WEAK; }
3115 ()
3116 def p_dr_strength1_1(p):
3117     '''dr_strength1 : K_supply1 '''
3118     print('dr_strength1_1', list(p))
3119     # { $$.str1 = IVL_DR_SUPPLY; }
3120 ()
3121 def p_dr_strength1_2(p):
3122     '''dr_strength1 : K_strong1 '''
3123     print('dr_strength1_2', list(p))
3124     # { $$.str1 = IVL_DR_STRONG; }
3125 ()
3126 def p_dr_strength1_3(p):
3127     '''dr_strength1 : K_pull1 '''
3128     print('dr_strength1_3', list(p))
3129     # { $$.str1 = IVL_DR_PULL; }
3130 ()
3131 def p_dr_strength1_4(p):
3132     '''dr_strength1 : K_weak1 '''
3133     print('dr_strength1_4', list(p))
3134     # { $$.str1 = IVL_DR_WEAK; }
3135 ()
3136 def p_clocking_event_opt_1(p):
3137     '''clocking_event_opt : event_control '''
3138     print('clocking_event_opt_1', list(p))
3139 ()
3140 def p_clocking_event_opt_2(p):
3141     '''clocking_event_opt :  '''
3142     print('clocking_event_opt_2', list(p))
3143 ()
3144 def p_event_control_1(p):
3145     '''event_control : '@' hierarchy_identifier '''
3146     print('event_control_1', list(p))
3147     # { PEIdent*tmpi = new PEIdent(*$2);
3148     #             PEEvent*tmpe = new PEEvent(PEEvent::ANYEDGE, tmpi);
3149     #             PEventStatement*tmps = new PEventStatement(tmpe);
3150     #             FILE_NAME(tmps, @1);
3151     #             $$ = tmps;
3152     #             delete $2;
3153     #           }
3154 ()
3155 def p_event_control_2(p):
3156     '''event_control : '@' '(' event_expression_list ')' '''
3157     print('event_control_2', list(p))
3158     # { PEventStatement*tmp = new PEventStatement(*$3);
3159     #             FILE_NAME(tmp, @1);
3160     #             delete $3;
3161     #             $$ = tmp;
3162     #           }
3163 ()
3164 def p_event_control_3(p):
3165     '''event_control : '@' '(' error ')' '''
3166     print('event_control_3', list(p))
3167     # { yyerror(@1, "error: Malformed event control expression.");
3168     #             $$ = 0;
3169     #           }
3170 ()
3171 def p_event_expression_list_1(p):
3172     '''event_expression_list : event_expression '''
3173     print('event_expression_list_1', list(p))
3174     # { $$ = $1; }
3175 ()
3176 def p_event_expression_list_2(p):
3177     '''event_expression_list : event_expression_list K_or event_expression '''
3178     print('event_expression_list_2', list(p))
3179     # { svector<PEEvent*>*tmp = new svector<PEEvent*>(*$1, *$3);
3180     #             delete $1;
3181     #             delete $3;
3182     #             $$ = tmp;
3183     #           }
3184 ()
3185 def p_event_expression_list_3(p):
3186     '''event_expression_list : event_expression_list ',' event_expression '''
3187     print('event_expression_list_3', list(p))
3188     # { svector<PEEvent*>*tmp = new svector<PEEvent*>(*$1, *$3);
3189     #             delete $1;
3190     #             delete $3;
3191     #             $$ = tmp;
3192     #           }
3193 ()
3194 def p_event_expression_1(p):
3195     '''event_expression : K_posedge expression '''
3196     print('event_expression_1', list(p))
3197     # { PEEvent*tmp = new PEEvent(PEEvent::POSEDGE, $2);
3198     #             FILE_NAME(tmp, @1);
3199     #             svector<PEEvent*>*tl = new svector<PEEvent*>(1);
3200     #             (*tl)[0] = tmp;
3201     #             $$ = tl;
3202     #           }
3203 ()
3204 def p_event_expression_2(p):
3205     '''event_expression : K_negedge expression '''
3206     print('event_expression_2', list(p))
3207     # { PEEvent*tmp = new PEEvent(PEEvent::NEGEDGE, $2);
3208     #             FILE_NAME(tmp, @1);
3209     #             svector<PEEvent*>*tl = new svector<PEEvent*>(1);
3210     #             (*tl)[0] = tmp;
3211     #             $$ = tl;
3212     #           }
3213 ()
3214 def p_event_expression_3(p):
3215     '''event_expression : expression '''
3216     print('event_expression_3', list(p))
3217     # { PEEvent*tmp = new PEEvent(PEEvent::ANYEDGE, $1);
3218     #             FILE_NAME(tmp, @1);
3219     #             svector<PEEvent*>*tl = new svector<PEEvent*>(1);
3220     #             (*tl)[0] = tmp;
3221     #             $$ = tl;
3222     #           }
3223 ()
3224 def p_branch_probe_expression_1(p):
3225     '''branch_probe_expression : IDENTIFIER '(' IDENTIFIER ',' IDENTIFIER ')' '''
3226     print('branch_probe_expression_1', list(p))
3227     # { $$ = pform_make_branch_probe_expression(@1, $1, $3, $5); }
3228 ()
3229 def p_branch_probe_expression_2(p):
3230     '''branch_probe_expression : IDENTIFIER '(' IDENTIFIER ')' '''
3231     print('branch_probe_expression_2', list(p))
3232     # { $$ = pform_make_branch_probe_expression(@1, $1, $3); }
3233 ()
3234 def p_expression_1(p):
3235     '''expression : expr_primary_or_typename '''
3236     print('expression_1', list(p))
3237     p[0] = p[1]
3238     # { $$ = $1; }
3239 ()
3240 def p_expression_2(p):
3241     '''expression : inc_or_dec_expression '''
3242     print('expression_2', list(p))
3243     # { $$ = $1; }
3244 ()
3245 def p_expression_3(p):
3246     '''expression : inside_expression '''
3247     print('expression_3', list(p))
3248     # { $$ = $1; }
3249 ()
3250 def p_expression_4(p):
3251     '''expression : '+' attribute_list_opt expr_primary %prec UNARY_PREC '''
3252     print('expression_4', list(p))
3253     # { $$ = $3; }
3254 ()
3255 def p_expression_5(p):
3256     '''expression : '-' attribute_list_opt expr_primary %prec UNARY_PREC '''
3257     print('expression_5', list(p))
3258     # { PEUnary*tmp = new PEUnary('-', $3);
3259     #   FILE_NAME(tmp, @3);
3260     #   $$ = tmp;
3261     #       }
3262 ()
3263 def p_expression_6(p):
3264     '''expression : '~' attribute_list_opt expr_primary %prec UNARY_PREC '''
3265     print('expression_6', list(p))
3266     # { PEUnary*tmp = new PEUnary('~', $3);
3267     #   FILE_NAME(tmp, @3);
3268     #   $$ = tmp;
3269     #       }
3270 ()
3271 def p_expression_7(p):
3272     '''expression : '&' attribute_list_opt expr_primary %prec UNARY_PREC '''
3273     print('expression_7', list(p))
3274     # { PEUnary*tmp = new PEUnary('&', $3);
3275     #   FILE_NAME(tmp, @3);
3276     #   $$ = tmp;
3277     #       }
3278 ()
3279 def p_expression_8(p):
3280     '''expression : '!' attribute_list_opt expr_primary %prec UNARY_PREC '''
3281     print('expression_8', list(p))
3282     # { PEUnary*tmp = new PEUnary('!', $3);
3283     #   FILE_NAME(tmp, @3);
3284     #   $$ = tmp;
3285     #       }
3286 ()
3287 def p_expression_9(p):
3288     '''expression : '|' attribute_list_opt expr_primary %prec UNARY_PREC '''
3289     print('expression_9', list(p))
3290     # { PEUnary*tmp = new PEUnary('|', $3);
3291     #   FILE_NAME(tmp, @3);
3292     #   $$ = tmp;
3293     #       }
3294 ()
3295 def p_expression_10(p):
3296     '''expression : '^' attribute_list_opt expr_primary %prec UNARY_PREC '''
3297     print('expression_10', list(p))
3298     # { PEUnary*tmp = new PEUnary('^', $3);
3299     #   FILE_NAME(tmp, @3);
3300     #   $$ = tmp;
3301     #       }
3302 ()
3303 def p_expression_11(p):
3304     '''expression : '~' '&' attribute_list_opt expr_primary %prec UNARY_PREC '''
3305     print('expression_11', list(p))
3306     # { yyerror(@1, "error: '~' '&'  is not a valid expression. "
3307     #           "Please use operator '~&' instead.");
3308     #   $$ = 0;
3309     #       }
3310 ()
3311 def p_expression_12(p):
3312     '''expression : '~' '|' attribute_list_opt expr_primary %prec UNARY_PREC '''
3313     print('expression_12', list(p))
3314     # { yyerror(@1, "error: '~' '|'  is not a valid expression. "
3315     #           "Please use operator '~|' instead.");
3316     #   $$ = 0;
3317     #       }
3318 ()
3319 def p_expression_13(p):
3320     '''expression : '~' '^' attribute_list_opt expr_primary %prec UNARY_PREC '''
3321     print('expression_13', list(p))
3322     # { yyerror(@1, "error: '~' '^'  is not a valid expression. "
3323     #           "Please use operator '~^' instead.");
3324     #   $$ = 0;
3325     #       }
3326 ()
3327 def p_expression_14(p):
3328     '''expression : K_NAND attribute_list_opt expr_primary %prec UNARY_PREC '''
3329     print('expression_14', list(p))
3330     # { PEUnary*tmp = new PEUnary('A', $3);
3331     #   FILE_NAME(tmp, @3);
3332     #   $$ = tmp;
3333     #       }
3334 ()
3335 def p_expression_15(p):
3336     '''expression : K_NOR attribute_list_opt expr_primary %prec UNARY_PREC '''
3337     print('expression_15', list(p))
3338     # { PEUnary*tmp = new PEUnary('N', $3);
3339     #   FILE_NAME(tmp, @3);
3340     #   $$ = tmp;
3341     #       }
3342 ()
3343 def p_expression_16(p):
3344     '''expression : K_NXOR attribute_list_opt expr_primary %prec UNARY_PREC '''
3345     print('expression_16', list(p))
3346     # { PEUnary*tmp = new PEUnary('X', $3);
3347     #   FILE_NAME(tmp, @3);
3348     #   $$ = tmp;
3349     #       }
3350 ()
3351 def p_expression_17(p):
3352     '''expression : '!' error %prec UNARY_PREC '''
3353     print('expression_17', list(p))
3354     # { yyerror(@1, "error: Operand of unary ! "
3355     #           "is not a primary expression.");
3356     #   $$ = 0;
3357     #       }
3358 ()
3359 def p_expression_18(p):
3360     '''expression : '^' error %prec UNARY_PREC '''
3361     print('expression_18', list(p))
3362     # { yyerror(@1, "error: Operand of reduction ^ "
3363     #           "is not a primary expression.");
3364     #   $$ = 0;
3365     #       }
3366 ()
3367 def p_expression_19(p):
3368     '''expression : expression '^' attribute_list_opt expression '''
3369     print('expression_19', list(p))
3370     # { PEBinary*tmp = new PEBinary('^', $1, $4);
3371     #   FILE_NAME(tmp, @2);
3372     #   $$ = tmp;
3373     #       }
3374 ()
3375 def p_expression_20(p):
3376     '''expression : expression K_POW attribute_list_opt expression '''
3377     print('expression_20', list(p))
3378     # { PEBinary*tmp = new PEBPower('p', $1, $4);
3379     #   FILE_NAME(tmp, @2);
3380     #   $$ = tmp;
3381     #       }
3382 ()
3383 def p_expression_21(p):
3384     '''expression : expression '*' attribute_list_opt expression '''
3385     print('expression_21', list(p))
3386     # { PEBinary*tmp = new PEBinary('*', $1, $4);
3387     #   FILE_NAME(tmp, @2);
3388     #   $$ = tmp;
3389     #       }
3390 ()
3391 def p_expression_22(p):
3392     '''expression : expression '/' attribute_list_opt expression '''
3393     print('expression_22', list(p))
3394     # { PEBinary*tmp = new PEBinary('/', $1, $4);
3395     #   FILE_NAME(tmp, @2);
3396     #   $$ = tmp;
3397     #       }
3398 ()
3399 def p_expression_23(p):
3400     '''expression : expression '%' attribute_list_opt expression '''
3401     print('expression_23', list(p))
3402     # { PEBinary*tmp = new PEBinary('%', $1, $4);
3403     #   FILE_NAME(tmp, @2);
3404     #   $$ = tmp;
3405     #       }
3406 ()
3407 def p_expression_24(p):
3408     '''expression : expression '+' attribute_list_opt expression '''
3409     print('expression_24', list(p))
3410     # { PEBinary*tmp = new PEBinary('+', $1, $4);
3411     #   FILE_NAME(tmp, @2);
3412     #   $$ = tmp;
3413     #       }
3414 ()
3415 def p_expression_25(p):
3416     '''expression : expression '-' attribute_list_opt expression '''
3417     print('expression_25', list(p))
3418     # { PEBinary*tmp = new PEBinary('-', $1, $4);
3419     #   FILE_NAME(tmp, @2);
3420     #   $$ = tmp;
3421     #       }
3422 ()
3423 def p_expression_26(p):
3424     '''expression : expression '&' attribute_list_opt expression '''
3425     print('expression_26', list(p))
3426     # { PEBinary*tmp = new PEBinary('&', $1, $4);
3427     #   FILE_NAME(tmp, @2);
3428     #   $$ = tmp;
3429     #       }
3430 ()
3431 def p_expression_27(p):
3432     '''expression : expression '|' attribute_list_opt expression '''
3433     print('expression_27', list(p))
3434     # { PEBinary*tmp = new PEBinary('|', $1, $4);
3435     #   FILE_NAME(tmp, @2);
3436     #   $$ = tmp;
3437     #       }
3438 ()
3439 def p_expression_28(p):
3440     '''expression : expression K_NAND attribute_list_opt expression '''
3441     print('expression_28', list(p))
3442     # { PEBinary*tmp = new PEBinary('A', $1, $4);
3443     #   FILE_NAME(tmp, @2);
3444     #   $$ = tmp;
3445     #       }
3446 ()
3447 def p_expression_29(p):
3448     '''expression : expression K_NOR attribute_list_opt expression '''
3449     print('expression_29', list(p))
3450     # { PEBinary*tmp = new PEBinary('O', $1, $4);
3451     #   FILE_NAME(tmp, @2);
3452     #   $$ = tmp;
3453     #       }
3454 ()
3455 def p_expression_30(p):
3456     '''expression : expression K_NXOR attribute_list_opt expression '''
3457     print('expression_30', list(p))
3458     # { PEBinary*tmp = new PEBinary('X', $1, $4);
3459     #   FILE_NAME(tmp, @2);
3460     #   $$ = tmp;
3461     #       }
3462 ()
3463 def p_expression_31(p):
3464     '''expression : expression '<' attribute_list_opt expression '''
3465     print('expression_31', list(p))
3466     # { PEBinary*tmp = new PEBComp('<', $1, $4);
3467     #   FILE_NAME(tmp, @2);
3468     #   $$ = tmp;
3469     #       }
3470 ()
3471 def p_expression_32(p):
3472     '''expression : expression '>' attribute_list_opt expression '''
3473     print('expression_32', list(p))
3474     # { PEBinary*tmp = new PEBComp('>', $1, $4);
3475     #   FILE_NAME(tmp, @2);
3476     #   $$ = tmp;
3477     #       }
3478 ()
3479 def p_expression_33(p):
3480     '''expression : expression K_LS attribute_list_opt expression '''
3481     print('expression_33', list(p))
3482     # { PEBinary*tmp = new PEBShift('l', $1, $4);
3483     #   FILE_NAME(tmp, @2);
3484     #   $$ = tmp;
3485     #       }
3486 ()
3487 def p_expression_34(p):
3488     '''expression : expression K_RS attribute_list_opt expression '''
3489     print('expression_34', list(p))
3490     # { PEBinary*tmp = new PEBShift('r', $1, $4);
3491     #   FILE_NAME(tmp, @2);
3492     #   $$ = tmp;
3493     #       }
3494 ()
3495 def p_expression_35(p):
3496     '''expression : expression K_RSS attribute_list_opt expression '''
3497     print('expression_35', list(p))
3498     # { PEBinary*tmp = new PEBShift('R', $1, $4);
3499     #   FILE_NAME(tmp, @2);
3500     #   $$ = tmp;
3501     #       }
3502 ()
3503 def p_expression_36(p):
3504     '''expression : expression K_EQ attribute_list_opt expression '''
3505     print('expression_36', list(p))
3506     # { PEBinary*tmp = new PEBComp('e', $1, $4);
3507     #   FILE_NAME(tmp, @2);
3508     #   $$ = tmp;
3509     #       }
3510 ()
3511 def p_expression_37(p):
3512     '''expression : expression K_CEQ attribute_list_opt expression '''
3513     print('expression_37', list(p))
3514     # { PEBinary*tmp = new PEBComp('E', $1, $4);
3515     #   FILE_NAME(tmp, @2);
3516     #   $$ = tmp;
3517     #       }
3518 ()
3519 def p_expression_38(p):
3520     '''expression : expression K_WEQ attribute_list_opt expression '''
3521     print('expression_38', list(p))
3522     # { PEBinary*tmp = new PEBComp('w', $1, $4);
3523     #   FILE_NAME(tmp, @2);
3524     #   $$ = tmp;
3525     #       }
3526 ()
3527 def p_expression_39(p):
3528     '''expression : expression K_LE attribute_list_opt expression '''
3529     print('expression_39', list(p))
3530     # { PEBinary*tmp = new PEBComp('L', $1, $4);
3531     #   FILE_NAME(tmp, @2);
3532     #   $$ = tmp;
3533     #       }
3534 ()
3535 def p_expression_40(p):
3536     '''expression : expression K_GE attribute_list_opt expression '''
3537     print('expression_40', list(p))
3538     # { PEBinary*tmp = new PEBComp('G', $1, $4);
3539     #   FILE_NAME(tmp, @2);
3540     #   $$ = tmp;
3541     #       }
3542 ()
3543 def p_expression_41(p):
3544     '''expression : expression K_NE attribute_list_opt expression '''
3545     print('expression_41', list(p))
3546     # { PEBinary*tmp = new PEBComp('n', $1, $4);
3547     #   FILE_NAME(tmp, @2);
3548     #   $$ = tmp;
3549     #       }
3550 ()
3551 def p_expression_42(p):
3552     '''expression : expression K_CNE attribute_list_opt expression '''
3553     print('expression_42', list(p))
3554     # { PEBinary*tmp = new PEBComp('N', $1, $4);
3555     #   FILE_NAME(tmp, @2);
3556     #   $$ = tmp;
3557     #       }
3558 ()
3559 def p_expression_43(p):
3560     '''expression : expression K_WNE attribute_list_opt expression '''
3561     print('expression_43', list(p))
3562     # { PEBinary*tmp = new PEBComp('W', $1, $4);
3563     #   FILE_NAME(tmp, @2);
3564     #   $$ = tmp;
3565     #       }
3566 ()
3567 def p_expression_44(p):
3568     '''expression : expression K_LOR attribute_list_opt expression '''
3569     print('expression_44', list(p))
3570     # { PEBinary*tmp = new PEBLogic('o', $1, $4);
3571     #   FILE_NAME(tmp, @2);
3572     #   $$ = tmp;
3573     #       }
3574 ()
3575 def p_expression_45(p):
3576     '''expression : expression K_LAND attribute_list_opt expression '''
3577     print('expression_45', list(p))
3578     # { PEBinary*tmp = new PEBLogic('a', $1, $4);
3579     #   FILE_NAME(tmp, @2);
3580     #   $$ = tmp;
3581     #       }
3582 ()
3583 def p_expression_46(p):
3584     '''expression : expression '?' attribute_list_opt expression ':' expression '''
3585     print('expression_46', list(p))
3586     # { PETernary*tmp = new PETernary($1, $4, $6);
3587     #   FILE_NAME(tmp, @2);
3588     #   $$ = tmp;
3589     #       }
3590 ()
3591 def p_expr_mintypmax_1(p):
3592     '''expr_mintypmax : expression '''
3593     print('expr_mintypmax_1', list(p))
3594     # { $$ = $1; }
3595 ()
3596 def p_expr_mintypmax_2(p):
3597     '''expr_mintypmax : expression ':' expression ':' expression '''
3598     print('expr_mintypmax_2', list(p))
3599     # { switch (min_typ_max_flag) {
3600     #                 case MIN:
3601     #                   $$ = $1;
3602     #                   delete $3;
3603     #                   delete $5;
3604     #                   break;
3605     #                 case TYP:
3606     #                   delete $1;
3607     #                   $$ = $3;
3608     #                   delete $5;
3609     #                   break;
3610     #                 case MAX:
3611     #                   delete $1;
3612     #                   delete $3;
3613     #                   $$ = $5;
3614     #                   break;
3615     #             }
3616     #             if (min_typ_max_warn > 0) {
3617     #                   cerr << $$->get_fileline() << ": warning: choosing ";
3618     #                   switch (min_typ_max_flag) {
3619     #                       case MIN:
3620     #                         cerr << "min";
3621     #                         break;
3622     #                       case TYP:
3623     #                         cerr << "typ";
3624     #                         break;
3625     #                       case MAX:
3626     #                         cerr << "max";
3627     #                         break;
3628     #                   }
3629     #                   cerr << " expression." << endl;
3630     #                   min_typ_max_warn -= 1;
3631     #             }
3632     #           }
3633 ()
3634 def p_expression_list_with_nuls_1(p):
3635     '''expression_list_with_nuls : expression_list_with_nuls ',' expression '''
3636     print('expression_list_with_nuls_1', list(p))
3637     # { list<PExpr*>*tmp = $1;
3638     #   tmp->push_back($3);
3639     #   $$ = tmp;
3640     #       }
3641 ()
3642 def p_expression_list_with_nuls_2(p):
3643     '''expression_list_with_nuls : expression '''
3644     print('expression_list_with_nuls_2', list(p))
3645     # { list<PExpr*>*tmp = new list<PExpr*>;
3646     #   tmp->push_back($1);
3647     #   $$ = tmp;
3648     #       }
3649 ()
3650 def p_expression_list_with_nuls_3(p):
3651     '''expression_list_with_nuls :  '''
3652     print('expression_list_with_nuls_3', list(p))
3653     # { list<PExpr*>*tmp = new list<PExpr*>;
3654     #         tmp->push_back(0);
3655     #   $$ = tmp;
3656     #       }
3657 ()
3658 def p_expression_list_with_nuls_4(p):
3659     '''expression_list_with_nuls : expression_list_with_nuls ',' '''
3660     print('expression_list_with_nuls_4', list(p))
3661     # { list<PExpr*>*tmp = $1;
3662     #   tmp->push_back(0);
3663     #   $$ = tmp;
3664     #       }
3665 ()
3666 def p_expression_list_proper_1(p):
3667     '''expression_list_proper : expression_list_proper ',' expression '''
3668     print('expression_list_proper_1', list(p))
3669     # { list<PExpr*>*tmp = $1;
3670     #         tmp->push_back($3);
3671     #         $$ = tmp;
3672     #       }
3673 ()
3674 def p_expression_list_proper_2(p):
3675     '''expression_list_proper : expression '''
3676     print('expression_list_proper_2', list(p))
3677     # { list<PExpr*>*tmp = new list<PExpr*>;
3678     #   tmp->push_back($1);
3679     #   $$ = tmp;
3680     #       }
3681 ()
3682 def p_expr_primary_or_typename_1(p):
3683     '''expr_primary_or_typename : expr_primary '''
3684     print('expr_primary_or_typename_1', list(p))
3685     p[0] = p[1]
3686 ()
3687 def p_expr_primary_or_typename_2(p):
3688     '''expr_primary_or_typename : TYPE_IDENTIFIER '''
3689     print('expr_primary_or_typename_2', list(p))
3690     p[0] = p[1]
3691     # { PETypename*tmp = new PETypename($1.type);
3692     #   FILE_NAME(tmp,@1);
3693     #   $$ = tmp;
3694     #   delete[]$1.text;
3695     #       }
3696 ()
3697 def p_expr_primary_1(p):
3698     '''expr_primary : number '''
3699     print('expr_primary_1', list(p))
3700     p[0] = p[1]
3701     # { assert($1);
3702     #   PENumber*tmp = new PENumber($1);
3703     #   FILE_NAME(tmp, @1);
3704     #   $$ = tmp;
3705     #       }
3706 ()
3707 def p_expr_primary_2(p):
3708     '''expr_primary : REALTIME '''
3709     print('expr_primary_2', list(p))
3710     # { PEFNumber*tmp = new PEFNumber($1);
3711     #   FILE_NAME(tmp, @1);
3712     #   $$ = tmp;
3713     #       }
3714 ()
3715 def p_expr_primary_3(p):
3716     '''expr_primary : STRING '''
3717     print('expr_primary_3', list(p))
3718     # { PEString*tmp = new PEString($1);
3719     #   FILE_NAME(tmp, @1);
3720     #   $$ = tmp;
3721     #       }
3722 ()
3723 def p_expr_primary_4(p):
3724     '''expr_primary : TIME_LITERAL '''
3725     print('expr_primary_4', list(p))
3726     # { int unit;
3727     # 
3728     #           based_size = 0;
3729     #           $$         = 0;
3730     #           if ($1 == 0 || !get_time_unit($1, unit))
3731     #               yyerror(@1, "internal error: delay.");
3732     #           else {
3733     #               double p = pow(10.0, (double)(unit - pform_get_timeunit()));
3734     #               double time = atof($1) * p;
3735     # 
3736     #               verireal *v = new verireal(time);
3737     #               $$ = new PEFNumber(v);
3738     #               FILE_NAME($$, @1);
3739     #           }
3740     #       }
3741 ()
3742 def p_expr_primary_5(p):
3743     '''expr_primary : SYSTEM_IDENTIFIER '''
3744     print('expr_primary_5', list(p))
3745     # { perm_string tn = lex_strings.make($1);
3746     #   PECallFunction*tmp = new PECallFunction(tn);
3747     #   FILE_NAME(tmp, @1);
3748     #   $$ = tmp;
3749     #   delete[]$1;
3750     #       }
3751 ()
3752 def p_expr_primary_6(p):
3753     '''expr_primary : hierarchy_identifier '''
3754     print('expr_primary_6', list(p))
3755     p[0] = p[1]
3756     # { PEIdent*tmp = pform_new_ident(*$1);
3757     #   FILE_NAME(tmp, @1);
3758     #   $$ = tmp;
3759     #   delete $1;
3760     #       }
3761 ()
3762 def p_expr_primary_7(p):
3763     '''expr_primary : PACKAGE_IDENTIFIER K_SCOPE_RES hierarchy_identifier '''
3764     print('expr_primary_7', list(p))
3765     # { $$ = pform_package_ident(@2, $1, $3);
3766     #   delete $3;
3767     #       }
3768 ()
3769 def p_expr_primary_8(p):
3770     '''expr_primary : hierarchy_identifier '(' expression_list_with_nuls ')' '''
3771     print('expr_primary_8', list(p))
3772     # { list<PExpr*>*expr_list = $3;
3773     #   strip_tail_items(expr_list);
3774     #   PECallFunction*tmp = pform_make_call_function(@1, *$1, *expr_list);
3775     #   delete $1;
3776     #   $$ = tmp;
3777     #       }
3778 ()
3779 def p_expr_primary_9(p):
3780     '''expr_primary : implicit_class_handle '.' hierarchy_identifier '(' expression_list_with_nuls ')' '''
3781     print('expr_primary_9', list(p))
3782     # { pform_name_t*t_name = $1;
3783     #   while (! $3->empty()) {
3784     #         t_name->push_back($3->front());
3785     #         $3->pop_front();