// A Bison parser, made by GNU Bison 3.8.2.

// Skeleton implementation for Bison LALR(1) parsers in C++

// Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc.

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.

// As a special exception, you may create a larger work that contains
// part or all of the Bison parser skeleton and distribute that work
// under terms of your choice, so long as that work isn't itself a
// parser generator using the skeleton or a modified version thereof
// as a parser skeleton.  Alternatively, if you modify or redistribute
// the parser skeleton itself, you may (at your option) remove this
// special exception, which will cause the skeleton and the resulting
// Bison output files to be licensed under the GNU General Public
// License without this special exception.

// This special exception was added by the Free Software Foundation in
// version 2.2 of Bison.

// DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
// especially those whose name start with YY_ or yy_.  They are
// private implementation details that can be changed or removed.


// Take the name prefix into account.
#define yylex   frontend_verilog_yylex



#include "verilog_parser.tab.hh"


// Unqualified %code blocks.
#line 127 "frontends/verilog/verilog_parser.y"

	#include <list>
	#include <stack>
	#include <memory>
	#include <string.h>
	#include "kernel/log.h"
	#include "frontends/verilog/verilog_lexer.h"

	USING_YOSYS_NAMESPACE
	using namespace AST;
	using namespace VERILOG_FRONTEND;

	// Silly little C adapter between C++ bison and C++ flex
	auto frontend_verilog_yylex(YOSYS_NAMESPACE_PREFIX VERILOG_FRONTEND::VerilogLexer* lexer) {
		return lexer->nextToken();
	}

	#define SET_AST_NODE_LOC(WHICH, BEGIN, END) (WHICH)->location = location_range(BEGIN, END)

	#define SET_RULE_LOC(LHS, BEGIN, END) \
		do { (LHS).begin = BEGIN.begin; \
		(LHS).end = (END).end; } while(0)

	YOSYS_NAMESPACE_BEGIN
	namespace VERILOG_FRONTEND {

		static Location location_range(Location begin, Location end) {
			return Location(begin.begin, end.end);
		}

		static void append_attr(AstNode *ast, std::unique_ptr<dict<IdString, std::unique_ptr<AstNode>>> al)
		{
			for (auto &it : *al) {
				ast->attributes[it.first] = std::move(it.second);
			}
		}

		static void append_attr_clone(AstNode *ast, std::unique_ptr<dict<IdString, std::unique_ptr<AstNode>>> &al)
		{
			for (auto &it : *al) {
				ast->attributes[it.first] = it.second->clone();
			}
		}

		static std::unique_ptr<AstNode> makeRange(parser::location_type loc, int msb = 31, int lsb = 0, bool isSigned = true)
		{
			auto range = std::make_unique<AstNode>(loc, AST_RANGE);
			range->children.push_back(AstNode::mkconst_int(loc, msb, true));
			range->children.push_back(AstNode::mkconst_int(loc, lsb, true));
			range->is_signed = isSigned;
			return range;
		}

		static void addRange(AstNode *parent, int msb = 31, int lsb = 0, bool isSigned = true)
		{
			auto range = makeRange(parent->location, msb, lsb, isSigned);
			parent->children.push_back(std::move(range));
		}

		static std::unique_ptr<AstNode> checkRange(AstNode *type_node, std::unique_ptr<AstNode> range_node)
		{
			if (type_node->range_left >= 0 && type_node->range_right >= 0) {
				// type already restricts the range
				if (range_node) {
					err_at_loc(type_node->location, "integer/genvar types cannot have packed dimensions.");
				}
				else {
					range_node = makeRange(type_node->location, type_node->range_left, type_node->range_right, false);
				}
			}

			if (range_node) {
				bool valid = true;
				if (range_node->type == AST_RANGE) {
					valid = range_node->children.size() == 2;
				} else {  // AST_MULTIRANGE
					for (auto& child : range_node->children) {
						valid = valid && child->children.size() == 2;
					}
				}
				if (!valid)
					err_at_loc(type_node->location, "wire/reg/logic packed dimension must be of the form [<expr>:<expr>]");
			}

			return range_node;
		}

		static void rewriteRange(AstNode *rangeNode)
		{
			if (rangeNode->type == AST_RANGE && rangeNode->children.size() == 1) {
				// SV array size [n], rewrite as [0:n-1]
				rangeNode->children.push_back(std::make_unique<AstNode>(rangeNode->location, AST_SUB, std::move(rangeNode->children[0]), AstNode::mkconst_int(rangeNode->location, 1, true)));
				rangeNode->children[0] = AstNode::mkconst_int(rangeNode->location, 0, false);
			}
		}

		static void rewriteAsMemoryNode(AstNode *node, std::unique_ptr<AstNode> rangeNode)
		{
			node->type = AST_MEMORY;
			if (rangeNode->type == AST_MULTIRANGE) {
				for (auto& child : rangeNode->children)
					rewriteRange(child.get());
			} else
				rewriteRange(rangeNode.get());
			node->children.push_back(std::move(rangeNode));
		}

		static void checkLabelsMatch(const frontend_verilog_yy::parser::location_type& loc, const char *element, const std::string* before, const std::string *after)
		{
			if (!before && after)
				err_at_loc(loc, "%s missing where end label (%s) was given.",
					element, after->c_str() + 1);
			if (before && after && *before != *after)
				err_at_loc(loc, "%s (%s) and end label (%s) don't match.",
					element, before->c_str() + 1, after->c_str() + 1);
		}

		AstNode* ParseState::saveChild(std::unique_ptr<AstNode> child) {
			auto* child_leaky = child.get();
			ast_stack.back()->children.push_back(std::move(child));
			return child_leaky;
		}
		AstNode* ParseState::pushChild(std::unique_ptr<AstNode> child) {
			auto* child_leaky = saveChild(std::move(child));
			ast_stack.push_back(child_leaky);
			return child_leaky;
		}

		void ParseState::addWiretypeNode(std::string *name, AstNode* node)
		{
			log_assert(node);
			node->is_custom_type = true;
			node->children.push_back(std::make_unique<AstNode>(node->location, AST_WIRETYPE));
			node->children.back()->str = *name;
		}

		void ParseState::addTypedefNode(std::string *name, std::unique_ptr<AstNode> node)
		{
			log_assert((bool)node);
			AstNode* tnode = saveChild(std::make_unique<AstNode>(node->location, AST_TYPEDEF, std::move(node)));
			log_assert((bool)name);
			tnode->str = *name;
			auto &user_types = user_type_stack.back();
			user_types[*name] = tnode;
			if (current_ast_mod && current_ast_mod->type == AST_PACKAGE) {
				// typedef inside a package so we need the qualified name
				auto qname = current_ast_mod->str + "::" + (*name).substr(1);
				pkg_user_types[qname] = tnode;
			}
		}

		void ParseState::enterTypeScope()
		{
			user_type_stack.push_back(UserTypeMap());
		}

		void ParseState::exitTypeScope()
		{
			user_type_stack.pop_back();
		}

		bool ParseState::isInLocalScope(const std::string *name)
		{
			// tests if a name was declared in the current block scope
			auto &user_types = user_type_stack.back();
			return (user_types.count(*name) > 0);
		}

		// This transforms a loop like
		//   for (genvar i = 0; i < 10; i++) begin : blk
		// to
		//   genvar _i;
		//   for (_i = 0; _i < 10; _i++) begin : blk
		//     localparam i = _i;
		// where `_i` is actually some auto-generated name.
		void ParseState::rewriteGenForDeclInit(AstNode *loop)
		{
			// check if this generate for loop contains an inline declaration
			log_assert(loop->type == AST_GENFOR);
			auto& decl = loop->children[0];
			if (decl->type == AST_ASSIGN_EQ)
				return;

			log_assert(decl->type == AST_GENVAR);
			log_assert(loop->children.size() == 5);

			// identify each component of the loop
			AstNode *init = loop->children[1].get();
			AstNode *cond = loop->children[2].get();
			AstNode *incr = loop->children[3].get();
			AstNode *body = loop->children[4].get();
			log_assert(init->type == AST_ASSIGN_EQ);
			log_assert(incr->type == AST_ASSIGN_EQ);
			log_assert(body->type == AST_GENBLOCK);

			// create a unique name for the genvar
			std::string old_str = decl->str;
			std::string new_str = stringf("$genfordecl$%d$%s", autoidx++, old_str);

			// rename and move the genvar declaration to the containing description
			decl->str = new_str;
			log_assert(current_ast_mod != nullptr);
			current_ast_mod->children.push_back(std::move(decl));

			// create a new localparam with old name so that the items in the loop
			// can simply use the old name and shadow it as necessary
			auto indirect = std::make_unique<AstNode>(loop->location, AST_LOCALPARAM);
			indirect->str = old_str;
			auto ident = std::make_unique<AstNode>(loop->location, AST_IDENTIFIER);
			ident->str = new_str;
			indirect->children.push_back(std::move(ident));

			body->children.insert(body->children.begin(), std::move(indirect));

			// only perform the renaming for the initialization, guard, and
			// incrementation to enable proper shadowing of the synthetic localparam
			std::function<void(AstNode*)> substitute = [&](AstNode *node) {
				if (node->type == AST_IDENTIFIER && node->str == old_str)
					node->str = new_str;
				for (auto& child : node->children)
					substitute(child.get());
			};
			substitute(init);
			substitute(cond);
			substitute(incr);
			loop->children.erase(loop->children.begin());
		}

		void ParseState::ensureAsgnExprAllowed(const parser::location_type loc, bool sv_mode)
		{
			if (!sv_mode)
				err_at_loc(loc, "Assignments within expressions are only supported in SystemVerilog mode.");
			if (ast_stack.back()->type != AST_BLOCK)
				err_at_loc(loc, "Assignments within expressions are only permitted within procedures.");
		}

		// add a pre/post-increment/decrement statement
		const AstNode *ParseState::addIncOrDecStmt(std::unique_ptr<dict<IdString, std::unique_ptr<AstNode>>> stmt_attr,
							std::unique_ptr<AstNode> lhs,
							std::unique_ptr<dict<IdString, std::unique_ptr<AstNode>>> op_attr, AST::AstNodeType op,
							Location loc)
		{
			auto one = AstNode::mkconst_int(loc, 1, true);
			auto rhs = std::make_unique<AstNode>(loc, op, lhs->clone(), std::move(one));
			if (op_attr)
				append_attr(rhs.get(), std::move(op_attr));
			auto stmt_owned = std::make_unique<AstNode>(loc, AST_ASSIGN_EQ, std::move(lhs), std::move(rhs));
			auto* stmt = stmt_owned.get();
			ast_stack.back()->children.push_back(std::move(stmt_owned));
			if (stmt_attr)
				append_attr(stmt, std::move(stmt_attr));
			return stmt;
		}

		// create a pre/post-increment/decrement expression, and add the corresponding statement
		std::unique_ptr<AstNode> ParseState::addIncOrDecExpr(std::unique_ptr<AstNode> lhs,
								     std::unique_ptr<dict<IdString,
								     std::unique_ptr<AstNode>>> attr,
								     AST::AstNodeType op, Location loc, bool undo, bool sv_mode)
		{
			ensureAsgnExprAllowed(loc, sv_mode);
			const AstNode *stmt = addIncOrDecStmt(nullptr, std::move(lhs), std::move(attr), op, loc);
			log_assert(stmt->type == AST_ASSIGN_EQ);
			auto expr = stmt->children[0]->clone();
			if (undo) {
				auto one = AstNode::mkconst_int(loc, 1, false, 1);
				auto minus_one = std::make_unique<AstNode>(loc, AST_NEG, std::move(one));
				expr = std::make_unique<AstNode>(loc, op, std::move(expr), std::move(minus_one));
			}
			return expr;
		}

		// add a binary operator assignment statement, e.g., a += b
		std::unique_ptr<AstNode> ParseState::addAsgnBinopStmt(std::unique_ptr<dict<IdString, std::unique_ptr<AstNode>>> attr,
								      std::unique_ptr<AstNode> eq_lhs, AST::AstNodeType op, std::unique_ptr<AstNode> rhs)
		{
			Location loc = location_range(eq_lhs->location, rhs->location);
			if (op == AST_SHIFT_LEFT || op == AST_SHIFT_RIGHT ||
				op == AST_SHIFT_SLEFT || op == AST_SHIFT_SRIGHT) {
				rhs = std::make_unique<AstNode>(rhs->location, AST_TO_UNSIGNED, std::move(rhs));
			}
			auto binop_lhs = eq_lhs->clone();
			auto eq_rhs_owned = std::make_unique<AstNode>(loc, op, std::move(binop_lhs), std::move(rhs));
			auto ret_lhs = eq_lhs->clone();
			auto stmt_owned = std::make_unique<AstNode>(loc, AST_ASSIGN_EQ, std::move(eq_lhs), std::move(eq_rhs_owned));
			auto* stmt = stmt_owned.get();
			ast_stack.back()->children.push_back(std::move(stmt_owned));
			if (attr)
				append_attr(stmt, std::move(attr));
			return ret_lhs;
		}
	};
	YOSYS_NAMESPACE_END

	void frontend_verilog_yy::parser::error(const frontend_verilog_yy::parser::location_type& loc, const std::string& msg)
	{
		err_at_loc(loc, "%s", msg);
	}

#line 348 "frontends/verilog/verilog_parser.tab.cc"


#ifndef YY_
# if defined YYENABLE_NLS && YYENABLE_NLS
#  if ENABLE_NLS
#   include <libintl.h> // FIXME: INFRINGES ON USER NAME SPACE.
#   define YY_(msgid) dgettext ("bison-runtime", msgid)
#  endif
# endif
# ifndef YY_
#  define YY_(msgid) msgid
# endif
#endif


// Whether we are compiled with exception support.
#ifndef YY_EXCEPTIONS
# if defined __GNUC__ && !defined __EXCEPTIONS
#  define YY_EXCEPTIONS 0
# else
#  define YY_EXCEPTIONS 1
# endif
#endif

#define YYRHSLOC(Rhs, K) ((Rhs)[K].location)
/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
   If N is 0, then set CURRENT to the empty location which ends
   the previous symbol: RHS[0] (always defined).  */

# ifndef YYLLOC_DEFAULT
#  define YYLLOC_DEFAULT(Current, Rhs, N)                               \
    do                                                                  \
      if (N)                                                            \
        {                                                               \
          (Current).begin  = YYRHSLOC (Rhs, 1).begin;                   \
          (Current).end    = YYRHSLOC (Rhs, N).end;                     \
        }                                                               \
      else                                                              \
        {                                                               \
          (Current).begin = (Current).end = YYRHSLOC (Rhs, 0).end;      \
        }                                                               \
    while (false)
# endif


// Enable debugging if requested.
#if FRONTEND_VERILOG_YYDEBUG

// A pseudo ostream that takes yydebug_ into account.
# define YYCDEBUG if (yydebug_) (*yycdebug_)

# define YY_SYMBOL_PRINT(Title, Symbol)         \
  do {                                          \
    if (yydebug_)                               \
    {                                           \
      *yycdebug_ << Title << ' ';               \
      yy_print_ (*yycdebug_, Symbol);           \
      *yycdebug_ << '\n';                       \
    }                                           \
  } while (false)

# define YY_REDUCE_PRINT(Rule)          \
  do {                                  \
    if (yydebug_)                       \
      yy_reduce_print_ (Rule);          \
  } while (false)

# define YY_STACK_PRINT()               \
  do {                                  \
    if (yydebug_)                       \
      yy_stack_print_ ();                \
  } while (false)

#else // !FRONTEND_VERILOG_YYDEBUG

# define YYCDEBUG if (false) std::cerr
# define YY_SYMBOL_PRINT(Title, Symbol)  YY_USE (Symbol)
# define YY_REDUCE_PRINT(Rule)           static_cast<void> (0)
# define YY_STACK_PRINT()                static_cast<void> (0)

#endif // !FRONTEND_VERILOG_YYDEBUG

#define yyerrok         (yyerrstatus_ = 0)
#define yyclearin       (yyla.clear ())

#define YYACCEPT        goto yyacceptlab
#define YYABORT         goto yyabortlab
#define YYERROR         goto yyerrorlab
#define YYRECOVERING()  (!!yyerrstatus_)

namespace frontend_verilog_yy {
#line 440 "frontends/verilog/verilog_parser.tab.cc"

  /// Build a parser object.
  parser::parser (YOSYS_NAMESPACE_PREFIX VERILOG_FRONTEND::VerilogLexer* lexer_yyarg, YOSYS_NAMESPACE_PREFIX VERILOG_FRONTEND::ParseState* extra_yyarg, YOSYS_NAMESPACE_PREFIX VERILOG_FRONTEND::ParseMode* mode_yyarg)
#if FRONTEND_VERILOG_YYDEBUG
    : yydebug_ (false),
      yycdebug_ (&std::cerr),
#else
    :
#endif
      yy_lac_established_ (false),
      lexer (lexer_yyarg),
      extra (extra_yyarg),
      mode (mode_yyarg)
  {}

  parser::~parser ()
  {}

  parser::syntax_error::~syntax_error () YY_NOEXCEPT YY_NOTHROW
  {}

  /*---------.
  | symbol.  |
  `---------*/



  // by_state.
  parser::by_state::by_state () YY_NOEXCEPT
    : state (empty_state)
  {}

  parser::by_state::by_state (const by_state& that) YY_NOEXCEPT
    : state (that.state)
  {}

  void
  parser::by_state::clear () YY_NOEXCEPT
  {
    state = empty_state;
  }

  void
  parser::by_state::move (by_state& that)
  {
    state = that.state;
    that.clear ();
  }

  parser::by_state::by_state (state_type s) YY_NOEXCEPT
    : state (s)
  {}

  parser::symbol_kind_type
  parser::by_state::kind () const YY_NOEXCEPT
  {
    if (state == empty_state)
      return symbol_kind::S_YYEMPTY;
    else
      return YY_CAST (symbol_kind_type, yystos_[+state]);
  }

  parser::stack_symbol_type::stack_symbol_type ()
  {}

  parser::stack_symbol_type::stack_symbol_type (YY_RVREF (stack_symbol_type) that)
    : super_type (YY_MOVE (that.state), YY_MOVE (that.location))
  {
    switch (that.kind ())
    {
      case symbol_kind::S_al_t: // al_t
      case symbol_kind::S_attr: // attr
      case symbol_kind::S_if_attr: // if_attr
      case symbol_kind::S_case_attr: // case_attr
        value.YY_MOVE_OR_COPY< al_t > (YY_MOVE (that.value));
        break;

      case symbol_kind::S_ast_node_type_t: // ast_node_type_t
      case symbol_kind::S_asgn_binop: // asgn_binop
      case symbol_kind::S_inc_or_dec_op: // inc_or_dec_op
        value.YY_MOVE_OR_COPY< ast_node_type_t > (YY_MOVE (that.value));
        break;

      case symbol_kind::S_ast_t: // ast_t
      case symbol_kind::S_io_wire_type: // io_wire_type
      case symbol_kind::S_non_io_wire_type: // non_io_wire_type
      case symbol_kind::S_wire_type: // wire_type
      case symbol_kind::S_non_opt_range: // non_opt_range
      case symbol_kind::S_non_opt_multirange: // non_opt_multirange
      case symbol_kind::S_range: // range
      case symbol_kind::S_range_or_multirange: // range_or_multirange
      case symbol_kind::S_func_return_type: // func_return_type
      case symbol_kind::S_specify_if: // specify_if
      case symbol_kind::S_specify_condition: // specify_condition
      case symbol_kind::S_enum_type: // enum_type
      case symbol_kind::S_opt_enum_init: // opt_enum_init
      case symbol_kind::S_struct_type: // struct_type
      case symbol_kind::S_struct_union: // struct_union
      case symbol_kind::S_typedef_base_type: // typedef_base_type
      case symbol_kind::S_enum_struct_type: // enum_struct_type
      case symbol_kind::S_rvalue: // rvalue
      case symbol_kind::S_lvalue: // lvalue
      case symbol_kind::S_lvalue_concat_list: // lvalue_concat_list
      case symbol_kind::S_genvar_identifier: // genvar_identifier
      case symbol_kind::S_expr: // expr
      case symbol_kind::S_basic_expr: // basic_expr
      case symbol_kind::S_504_84: // @84
      case symbol_kind::S_concat_list: // concat_list
        value.YY_MOVE_OR_COPY< ast_t > (YY_MOVE (that.value));
        break;

      case symbol_kind::S_boolean_t: // "boolean"
      case symbol_kind::S_opt_signedness_default_signed: // opt_signedness_default_signed
      case symbol_kind::S_opt_signedness_default_unsigned: // opt_signedness_default_unsigned
      case symbol_kind::S_always_comb_or_latch: // always_comb_or_latch
      case symbol_kind::S_always_or_always_ff: // always_or_always_ff
      case symbol_kind::S_opt_property: // opt_property
        value.YY_MOVE_OR_COPY< boolean_t > (YY_MOVE (that.value));
        break;

      case symbol_kind::S_ch_t: // "invalid token"
      case symbol_kind::S_specify_edge: // specify_edge
        value.YY_MOVE_OR_COPY< ch_t > (YY_MOVE (that.value));
        break;

      case symbol_kind::S_integer_t: // "integer"
      case symbol_kind::S_integer_atom_type: // integer_atom_type
      case symbol_kind::S_integer_vector_type: // integer_vector_type
        value.YY_MOVE_OR_COPY< integer_t > (YY_MOVE (that.value));
        break;

      case symbol_kind::S_specify_rise_fall_ptr_t: // "specify rise and fall"
      case symbol_kind::S_specify_rise_fall: // specify_rise_fall
        value.YY_MOVE_OR_COPY< specify_rise_fall_ptr_t > (YY_MOVE (that.value));
        break;

      case symbol_kind::S_specify_target_ptr_t: // "specify target"
      case symbol_kind::S_specify_target: // specify_target
        value.YY_MOVE_OR_COPY< specify_target_ptr_t > (YY_MOVE (that.value));
        break;

      case symbol_kind::S_specify_triple_ptr_t: // "specify triple"
      case symbol_kind::S_specify_opt_triple: // specify_opt_triple
      case symbol_kind::S_specify_triple: // specify_triple
        value.YY_MOVE_OR_COPY< specify_triple_ptr_t > (YY_MOVE (that.value));
        break;

      case symbol_kind::S_string_t: // "string"
      case symbol_kind::S_TOK_STRING: // TOK_STRING
      case symbol_kind::S_TOK_ID: // TOK_ID
      case symbol_kind::S_TOK_CONSTVAL: // TOK_CONSTVAL
      case symbol_kind::S_TOK_REALVAL: // TOK_REALVAL
      case symbol_kind::S_TOK_PRIMITIVE: // TOK_PRIMITIVE
      case symbol_kind::S_TOK_SVA_LABEL: // TOK_SVA_LABEL
      case symbol_kind::S_TOK_SPECIFY_OPER: // TOK_SPECIFY_OPER
      case symbol_kind::S_TOK_MSG_TASKS: // TOK_MSG_TASKS
      case symbol_kind::S_TOK_BASE: // TOK_BASE
      case symbol_kind::S_TOK_BASED_CONSTVAL: // TOK_BASED_CONSTVAL
      case symbol_kind::S_TOK_UNBASED_UNSIZED_CONSTVAL: // TOK_UNBASED_UNSIZED_CONSTVAL
      case symbol_kind::S_TOK_USER_TYPE: // TOK_USER_TYPE
      case symbol_kind::S_TOK_PKG_USER_TYPE: // TOK_PKG_USER_TYPE
      case symbol_kind::S_hierarchical_id: // hierarchical_id
      case symbol_kind::S_hierarchical_type_id: // hierarchical_type_id
      case symbol_kind::S_type_name: // type_name
      case symbol_kind::S_tok_prim_wrapper: // tok_prim_wrapper
      case symbol_kind::S_opt_label: // opt_label
      case symbol_kind::S_opt_sva_label: // opt_sva_label
      case symbol_kind::S_integral_number: // integral_number
        value.YY_MOVE_OR_COPY< string_t > (YY_MOVE (that.value));
        break;

      default:
        break;
    }

#if 201103L <= YY_CPLUSPLUS
    // that is emptied.
    that.state = empty_state;
#endif
  }

  parser::stack_symbol_type::stack_symbol_type (state_type s, YY_MOVE_REF (symbol_type) that)
    : super_type (s, YY_MOVE (that.location))
  {
    switch (that.kind ())
    {
      case symbol_kind::S_al_t: // al_t
      case symbol_kind::S_attr: // attr
      case symbol_kind::S_if_attr: // if_attr
      case symbol_kind::S_case_attr: // case_attr
        value.move< al_t > (YY_MOVE (that.value));
        break;

      case symbol_kind::S_ast_node_type_t: // ast_node_type_t
      case symbol_kind::S_asgn_binop: // asgn_binop
      case symbol_kind::S_inc_or_dec_op: // inc_or_dec_op
        value.move< ast_node_type_t > (YY_MOVE (that.value));
        break;

      case symbol_kind::S_ast_t: // ast_t
      case symbol_kind::S_io_wire_type: // io_wire_type
      case symbol_kind::S_non_io_wire_type: // non_io_wire_type
      case symbol_kind::S_wire_type: // wire_type
      case symbol_kind::S_non_opt_range: // non_opt_range
      case symbol_kind::S_non_opt_multirange: // non_opt_multirange
      case symbol_kind::S_range: // range
      case symbol_kind::S_range_or_multirange: // range_or_multirange
      case symbol_kind::S_func_return_type: // func_return_type
      case symbol_kind::S_specify_if: // specify_if
      case symbol_kind::S_specify_condition: // specify_condition
      case symbol_kind::S_enum_type: // enum_type
      case symbol_kind::S_opt_enum_init: // opt_enum_init
      case symbol_kind::S_struct_type: // struct_type
      case symbol_kind::S_struct_union: // struct_union
      case symbol_kind::S_typedef_base_type: // typedef_base_type
      case symbol_kind::S_enum_struct_type: // enum_struct_type
      case symbol_kind::S_rvalue: // rvalue
      case symbol_kind::S_lvalue: // lvalue
      case symbol_kind::S_lvalue_concat_list: // lvalue_concat_list
      case symbol_kind::S_genvar_identifier: // genvar_identifier
      case symbol_kind::S_expr: // expr
      case symbol_kind::S_basic_expr: // basic_expr
      case symbol_kind::S_504_84: // @84
      case symbol_kind::S_concat_list: // concat_list
        value.move< ast_t > (YY_MOVE (that.value));
        break;

      case symbol_kind::S_boolean_t: // "boolean"
      case symbol_kind::S_opt_signedness_default_signed: // opt_signedness_default_signed
      case symbol_kind::S_opt_signedness_default_unsigned: // opt_signedness_default_unsigned
      case symbol_kind::S_always_comb_or_latch: // always_comb_or_latch
      case symbol_kind::S_always_or_always_ff: // always_or_always_ff
      case symbol_kind::S_opt_property: // opt_property
        value.move< boolean_t > (YY_MOVE (that.value));
        break;

      case symbol_kind::S_ch_t: // "invalid token"
      case symbol_kind::S_specify_edge: // specify_edge
        value.move< ch_t > (YY_MOVE (that.value));
        break;

      case symbol_kind::S_integer_t: // "integer"
      case symbol_kind::S_integer_atom_type: // integer_atom_type
      case symbol_kind::S_integer_vector_type: // integer_vector_type
        value.move< integer_t > (YY_MOVE (that.value));
        break;

      case symbol_kind::S_specify_rise_fall_ptr_t: // "specify rise and fall"
      case symbol_kind::S_specify_rise_fall: // specify_rise_fall
        value.move< specify_rise_fall_ptr_t > (YY_MOVE (that.value));
        break;

      case symbol_kind::S_specify_target_ptr_t: // "specify target"
      case symbol_kind::S_specify_target: // specify_target
        value.move< specify_target_ptr_t > (YY_MOVE (that.value));
        break;

      case symbol_kind::S_specify_triple_ptr_t: // "specify triple"
      case symbol_kind::S_specify_opt_triple: // specify_opt_triple
      case symbol_kind::S_specify_triple: // specify_triple
        value.move< specify_triple_ptr_t > (YY_MOVE (that.value));
        break;

      case symbol_kind::S_string_t: // "string"
      case symbol_kind::S_TOK_STRING: // TOK_STRING
      case symbol_kind::S_TOK_ID: // TOK_ID
      case symbol_kind::S_TOK_CONSTVAL: // TOK_CONSTVAL
      case symbol_kind::S_TOK_REALVAL: // TOK_REALVAL
      case symbol_kind::S_TOK_PRIMITIVE: // TOK_PRIMITIVE
      case symbol_kind::S_TOK_SVA_LABEL: // TOK_SVA_LABEL
      case symbol_kind::S_TOK_SPECIFY_OPER: // TOK_SPECIFY_OPER
      case symbol_kind::S_TOK_MSG_TASKS: // TOK_MSG_TASKS
      case symbol_kind::S_TOK_BASE: // TOK_BASE
      case symbol_kind::S_TOK_BASED_CONSTVAL: // TOK_BASED_CONSTVAL
      case symbol_kind::S_TOK_UNBASED_UNSIZED_CONSTVAL: // TOK_UNBASED_UNSIZED_CONSTVAL
      case symbol_kind::S_TOK_USER_TYPE: // TOK_USER_TYPE
      case symbol_kind::S_TOK_PKG_USER_TYPE: // TOK_PKG_USER_TYPE
      case symbol_kind::S_hierarchical_id: // hierarchical_id
      case symbol_kind::S_hierarchical_type_id: // hierarchical_type_id
      case symbol_kind::S_type_name: // type_name
      case symbol_kind::S_tok_prim_wrapper: // tok_prim_wrapper
      case symbol_kind::S_opt_label: // opt_label
      case symbol_kind::S_opt_sva_label: // opt_sva_label
      case symbol_kind::S_integral_number: // integral_number
        value.move< string_t > (YY_MOVE (that.value));
        break;

      default:
        break;
    }

    // that is emptied.
    that.kind_ = symbol_kind::S_YYEMPTY;
  }

#if YY_CPLUSPLUS < 201103L
  parser::stack_symbol_type&
  parser::stack_symbol_type::operator= (const stack_symbol_type& that)
  {
    state = that.state;
    switch (that.kind ())
    {
      case symbol_kind::S_al_t: // al_t
      case symbol_kind::S_attr: // attr
      case symbol_kind::S_if_attr: // if_attr
      case symbol_kind::S_case_attr: // case_attr
        value.copy< al_t > (that.value);
        break;

      case symbol_kind::S_ast_node_type_t: // ast_node_type_t
      case symbol_kind::S_asgn_binop: // asgn_binop
      case symbol_kind::S_inc_or_dec_op: // inc_or_dec_op
        value.copy< ast_node_type_t > (that.value);
        break;

      case symbol_kind::S_ast_t: // ast_t
      case symbol_kind::S_io_wire_type: // io_wire_type
      case symbol_kind::S_non_io_wire_type: // non_io_wire_type
      case symbol_kind::S_wire_type: // wire_type
      case symbol_kind::S_non_opt_range: // non_opt_range
      case symbol_kind::S_non_opt_multirange: // non_opt_multirange
      case symbol_kind::S_range: // range
      case symbol_kind::S_range_or_multirange: // range_or_multirange
      case symbol_kind::S_func_return_type: // func_return_type
      case symbol_kind::S_specify_if: // specify_if
      case symbol_kind::S_specify_condition: // specify_condition
      case symbol_kind::S_enum_type: // enum_type
      case symbol_kind::S_opt_enum_init: // opt_enum_init
      case symbol_kind::S_struct_type: // struct_type
      case symbol_kind::S_struct_union: // struct_union
      case symbol_kind::S_typedef_base_type: // typedef_base_type
      case symbol_kind::S_enum_struct_type: // enum_struct_type
      case symbol_kind::S_rvalue: // rvalue
      case symbol_kind::S_lvalue: // lvalue
      case symbol_kind::S_lvalue_concat_list: // lvalue_concat_list
      case symbol_kind::S_genvar_identifier: // genvar_identifier
      case symbol_kind::S_expr: // expr
      case symbol_kind::S_basic_expr: // basic_expr
      case symbol_kind::S_504_84: // @84
      case symbol_kind::S_concat_list: // concat_list
        value.copy< ast_t > (that.value);
        break;

      case symbol_kind::S_boolean_t: // "boolean"
      case symbol_kind::S_opt_signedness_default_signed: // opt_signedness_default_signed
      case symbol_kind::S_opt_signedness_default_unsigned: // opt_signedness_default_unsigned
      case symbol_kind::S_always_comb_or_latch: // always_comb_or_latch
      case symbol_kind::S_always_or_always_ff: // always_or_always_ff
      case symbol_kind::S_opt_property: // opt_property
        value.copy< boolean_t > (that.value);
        break;

      case symbol_kind::S_ch_t: // "invalid token"
      case symbol_kind::S_specify_edge: // specify_edge
        value.copy< ch_t > (that.value);
        break;

      case symbol_kind::S_integer_t: // "integer"
      case symbol_kind::S_integer_atom_type: // integer_atom_type
      case symbol_kind::S_integer_vector_type: // integer_vector_type
        value.copy< integer_t > (that.value);
        break;

      case symbol_kind::S_specify_rise_fall_ptr_t: // "specify rise and fall"
      case symbol_kind::S_specify_rise_fall: // specify_rise_fall
        value.copy< specify_rise_fall_ptr_t > (that.value);
        break;

      case symbol_kind::S_specify_target_ptr_t: // "specify target"
      case symbol_kind::S_specify_target: // specify_target
        value.copy< specify_target_ptr_t > (that.value);
        break;

      case symbol_kind::S_specify_triple_ptr_t: // "specify triple"
      case symbol_kind::S_specify_opt_triple: // specify_opt_triple
      case symbol_kind::S_specify_triple: // specify_triple
        value.copy< specify_triple_ptr_t > (that.value);
        break;

      case symbol_kind::S_string_t: // "string"
      case symbol_kind::S_TOK_STRING: // TOK_STRING
      case symbol_kind::S_TOK_ID: // TOK_ID
      case symbol_kind::S_TOK_CONSTVAL: // TOK_CONSTVAL
      case symbol_kind::S_TOK_REALVAL: // TOK_REALVAL
      case symbol_kind::S_TOK_PRIMITIVE: // TOK_PRIMITIVE
      case symbol_kind::S_TOK_SVA_LABEL: // TOK_SVA_LABEL
      case symbol_kind::S_TOK_SPECIFY_OPER: // TOK_SPECIFY_OPER
      case symbol_kind::S_TOK_MSG_TASKS: // TOK_MSG_TASKS
      case symbol_kind::S_TOK_BASE: // TOK_BASE
      case symbol_kind::S_TOK_BASED_CONSTVAL: // TOK_BASED_CONSTVAL
      case symbol_kind::S_TOK_UNBASED_UNSIZED_CONSTVAL: // TOK_UNBASED_UNSIZED_CONSTVAL
      case symbol_kind::S_TOK_USER_TYPE: // TOK_USER_TYPE
      case symbol_kind::S_TOK_PKG_USER_TYPE: // TOK_PKG_USER_TYPE
      case symbol_kind::S_hierarchical_id: // hierarchical_id
      case symbol_kind::S_hierarchical_type_id: // hierarchical_type_id
      case symbol_kind::S_type_name: // type_name
      case symbol_kind::S_tok_prim_wrapper: // tok_prim_wrapper
      case symbol_kind::S_opt_label: // opt_label
      case symbol_kind::S_opt_sva_label: // opt_sva_label
      case symbol_kind::S_integral_number: // integral_number
        value.copy< string_t > (that.value);
        break;

      default:
        break;
    }

    location = that.location;
    return *this;
  }

  parser::stack_symbol_type&
  parser::stack_symbol_type::operator= (stack_symbol_type& that)
  {
    state = that.state;
    switch (that.kind ())
    {
      case symbol_kind::S_al_t: // al_t
      case symbol_kind::S_attr: // attr
      case symbol_kind::S_if_attr: // if_attr
      case symbol_kind::S_case_attr: // case_attr
        value.move< al_t > (that.value);
        break;

      case symbol_kind::S_ast_node_type_t: // ast_node_type_t
      case symbol_kind::S_asgn_binop: // asgn_binop
      case symbol_kind::S_inc_or_dec_op: // inc_or_dec_op
        value.move< ast_node_type_t > (that.value);
        break;

      case symbol_kind::S_ast_t: // ast_t
      case symbol_kind::S_io_wire_type: // io_wire_type
      case symbol_kind::S_non_io_wire_type: // non_io_wire_type
      case symbol_kind::S_wire_type: // wire_type
      case symbol_kind::S_non_opt_range: // non_opt_range
      case symbol_kind::S_non_opt_multirange: // non_opt_multirange
      case symbol_kind::S_range: // range
      case symbol_kind::S_range_or_multirange: // range_or_multirange
      case symbol_kind::S_func_return_type: // func_return_type
      case symbol_kind::S_specify_if: // specify_if
      case symbol_kind::S_specify_condition: // specify_condition
      case symbol_kind::S_enum_type: // enum_type
      case symbol_kind::S_opt_enum_init: // opt_enum_init
      case symbol_kind::S_struct_type: // struct_type
      case symbol_kind::S_struct_union: // struct_union
      case symbol_kind::S_typedef_base_type: // typedef_base_type
      case symbol_kind::S_enum_struct_type: // enum_struct_type
      case symbol_kind::S_rvalue: // rvalue
      case symbol_kind::S_lvalue: // lvalue
      case symbol_kind::S_lvalue_concat_list: // lvalue_concat_list
      case symbol_kind::S_genvar_identifier: // genvar_identifier
      case symbol_kind::S_expr: // expr
      case symbol_kind::S_basic_expr: // basic_expr
      case symbol_kind::S_504_84: // @84
      case symbol_kind::S_concat_list: // concat_list
        value.move< ast_t > (that.value);
        break;

      case symbol_kind::S_boolean_t: // "boolean"
      case symbol_kind::S_opt_signedness_default_signed: // opt_signedness_default_signed
      case symbol_kind::S_opt_signedness_default_unsigned: // opt_signedness_default_unsigned
      case symbol_kind::S_always_comb_or_latch: // always_comb_or_latch
      case symbol_kind::S_always_or_always_ff: // always_or_always_ff
      case symbol_kind::S_opt_property: // opt_property
        value.move< boolean_t > (that.value);
        break;

      case symbol_kind::S_ch_t: // "invalid token"
      case symbol_kind::S_specify_edge: // specify_edge
        value.move< ch_t > (that.value);
        break;

      case symbol_kind::S_integer_t: // "integer"
      case symbol_kind::S_integer_atom_type: // integer_atom_type
      case symbol_kind::S_integer_vector_type: // integer_vector_type
        value.move< integer_t > (that.value);
        break;

      case symbol_kind::S_specify_rise_fall_ptr_t: // "specify rise and fall"
      case symbol_kind::S_specify_rise_fall: // specify_rise_fall
        value.move< specify_rise_fall_ptr_t > (that.value);
        break;

      case symbol_kind::S_specify_target_ptr_t: // "specify target"
      case symbol_kind::S_specify_target: // specify_target
        value.move< specify_target_ptr_t > (that.value);
        break;

      case symbol_kind::S_specify_triple_ptr_t: // "specify triple"
      case symbol_kind::S_specify_opt_triple: // specify_opt_triple
      case symbol_kind::S_specify_triple: // specify_triple
        value.move< specify_triple_ptr_t > (that.value);
        break;

      case symbol_kind::S_string_t: // "string"
      case symbol_kind::S_TOK_STRING: // TOK_STRING
      case symbol_kind::S_TOK_ID: // TOK_ID
      case symbol_kind::S_TOK_CONSTVAL: // TOK_CONSTVAL
      case symbol_kind::S_TOK_REALVAL: // TOK_REALVAL
      case symbol_kind::S_TOK_PRIMITIVE: // TOK_PRIMITIVE
      case symbol_kind::S_TOK_SVA_LABEL: // TOK_SVA_LABEL
      case symbol_kind::S_TOK_SPECIFY_OPER: // TOK_SPECIFY_OPER
      case symbol_kind::S_TOK_MSG_TASKS: // TOK_MSG_TASKS
      case symbol_kind::S_TOK_BASE: // TOK_BASE
      case symbol_kind::S_TOK_BASED_CONSTVAL: // TOK_BASED_CONSTVAL
      case symbol_kind::S_TOK_UNBASED_UNSIZED_CONSTVAL: // TOK_UNBASED_UNSIZED_CONSTVAL
      case symbol_kind::S_TOK_USER_TYPE: // TOK_USER_TYPE
      case symbol_kind::S_TOK_PKG_USER_TYPE: // TOK_PKG_USER_TYPE
      case symbol_kind::S_hierarchical_id: // hierarchical_id
      case symbol_kind::S_hierarchical_type_id: // hierarchical_type_id
      case symbol_kind::S_type_name: // type_name
      case symbol_kind::S_tok_prim_wrapper: // tok_prim_wrapper
      case symbol_kind::S_opt_label: // opt_label
      case symbol_kind::S_opt_sva_label: // opt_sva_label
      case symbol_kind::S_integral_number: // integral_number
        value.move< string_t > (that.value);
        break;

      default:
        break;
    }

    location = that.location;
    // that is emptied.
    that.state = empty_state;
    return *this;
  }
#endif

  template <typename Base>
  void
  parser::yy_destroy_ (const char* yymsg, basic_symbol<Base>& yysym) const
  {
    if (yymsg)
      YY_SYMBOL_PRINT (yymsg, yysym);
  }

#if FRONTEND_VERILOG_YYDEBUG
  template <typename Base>
  void
  parser::yy_print_ (std::ostream& yyo, const basic_symbol<Base>& yysym) const
  {
    std::ostream& yyoutput = yyo;
    YY_USE (yyoutput);
    if (yysym.empty ())
      yyo << "empty symbol";
    else
      {
        symbol_kind_type yykind = yysym.kind ();
        yyo << (yykind < YYNTOKENS ? "token" : "nterm")
            << ' ' << yysym.name () << " ("
            << yysym.location << ": ";
        YY_USE (yykind);
        yyo << ')';
      }
  }
#endif

  void
  parser::yypush_ (const char* m, YY_MOVE_REF (stack_symbol_type) sym)
  {
    if (m)
      YY_SYMBOL_PRINT (m, sym);
    yystack_.push (YY_MOVE (sym));
  }

  void
  parser::yypush_ (const char* m, state_type s, YY_MOVE_REF (symbol_type) sym)
  {
#if 201103L <= YY_CPLUSPLUS
    yypush_ (m, stack_symbol_type (s, std::move (sym)));
#else
    stack_symbol_type ss (s, sym);
    yypush_ (m, ss);
#endif
  }

  void
  parser::yypop_ (int n) YY_NOEXCEPT
  {
    yystack_.pop (n);
  }

#if FRONTEND_VERILOG_YYDEBUG
  std::ostream&
  parser::debug_stream () const
  {
    return *yycdebug_;
  }

  void
  parser::set_debug_stream (std::ostream& o)
  {
    yycdebug_ = &o;
  }


  parser::debug_level_type
  parser::debug_level () const
  {
    return yydebug_;
  }

  void
  parser::set_debug_level (debug_level_type l)
  {
    yydebug_ = l;
  }
#endif // FRONTEND_VERILOG_YYDEBUG

  parser::state_type
  parser::yy_lr_goto_state_ (state_type yystate, int yysym)
  {
    int yyr = yypgoto_[yysym - YYNTOKENS] + yystate;
    if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate)
      return yytable_[yyr];
    else
      return yydefgoto_[yysym - YYNTOKENS];
  }

  bool
  parser::yy_pact_value_is_default_ (int yyvalue) YY_NOEXCEPT
  {
    return yyvalue == yypact_ninf_;
  }

  bool
  parser::yy_table_value_is_error_ (int yyvalue) YY_NOEXCEPT
  {
    return yyvalue == yytable_ninf_;
  }

  int
  parser::operator() ()
  {
    return parse ();
  }

  int
  parser::parse ()
  {
    int yyn;
    /// Length of the RHS of the rule being reduced.
    int yylen = 0;

    // Error handling.
    int yynerrs_ = 0;
    int yyerrstatus_ = 0;

    /// The lookahead symbol.
    symbol_type yyla;

    /// The locations where the error started and ended.
    stack_symbol_type yyerror_range[3];

    /// The return value of parse ().
    int yyresult;

    // Discard the LAC context in case there still is one left from a
    // previous invocation.
    yy_lac_discard_ ("init");

#if YY_EXCEPTIONS
    try
#endif // YY_EXCEPTIONS
      {
    YYCDEBUG << "Starting parse\n";


    /* Initialize the stack.  The initial state will be set in
       yynewstate, since the latter expects the semantical and the
       location values to have been already stored, initialize these
       stacks with a primary value.  */
    yystack_.clear ();
    yypush_ (YY_NULLPTR, 0, YY_MOVE (yyla));

  /*-----------------------------------------------.
  | yynewstate -- push a new symbol on the stack.  |
  `-----------------------------------------------*/
  yynewstate:
    YYCDEBUG << "Entering state " << int (yystack_[0].state) << '\n';
    YY_STACK_PRINT ();

    // Accept?
    if (yystack_[0].state == yyfinal_)
      YYACCEPT;

    goto yybackup;


  /*-----------.
  | yybackup.  |
  `-----------*/
  yybackup:
    // Try to take a decision without lookahead.
    yyn = yypact_[+yystack_[0].state];
    if (yy_pact_value_is_default_ (yyn))
      goto yydefault;

    // Read a lookahead token.
    if (yyla.empty ())
      {
        YYCDEBUG << "Reading a token\n";
#if YY_EXCEPTIONS
        try
#endif // YY_EXCEPTIONS
          {
            symbol_type yylookahead (yylex (lexer));
            yyla.move (yylookahead);
          }
#if YY_EXCEPTIONS
        catch (const syntax_error& yyexc)
          {
            YYCDEBUG << "Caught exception: " << yyexc.what() << '\n';
            error (yyexc);
            goto yyerrlab1;
          }
#endif // YY_EXCEPTIONS
      }
    YY_SYMBOL_PRINT ("Next token is", yyla);

    if (yyla.kind () == symbol_kind::S_YYerror)
    {
      // The scanner already issued an error message, process directly
      // to error recovery.  But do not keep the error token as
      // lookahead, it is too special and may lead us to an endless
      // loop in error recovery. */
      yyla.kind_ = symbol_kind::S_YYUNDEF;
      goto yyerrlab1;
    }

    /* If the proper action on seeing token YYLA.TYPE is to reduce or
       to detect an error, take that action.  */
    yyn += yyla.kind ();
    if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.kind ())
      {
        if (!yy_lac_establish_ (yyla.kind ()))
          goto yyerrlab;
        goto yydefault;
      }

    // Reduce or error.
    yyn = yytable_[yyn];
    if (yyn <= 0)
      {
        if (yy_table_value_is_error_ (yyn))
          goto yyerrlab;
        if (!yy_lac_establish_ (yyla.kind ()))
          goto yyerrlab;

        yyn = -yyn;
        goto yyreduce;
      }

    // Count tokens shifted since error; after three, turn off error status.
    if (yyerrstatus_)
      --yyerrstatus_;

    // Shift the lookahead token.
    yypush_ ("Shifting", state_type (yyn), YY_MOVE (yyla));
    yy_lac_discard_ ("shift");
    goto yynewstate;


  /*-----------------------------------------------------------.
  | yydefault -- do the default action for the current state.  |
  `-----------------------------------------------------------*/
  yydefault:
    yyn = yydefact_[+yystack_[0].state];
    if (yyn == 0)
      goto yyerrlab;
    goto yyreduce;


  /*-----------------------------.
  | yyreduce -- do a reduction.  |
  `-----------------------------*/
  yyreduce:
    yylen = yyr2_[yyn];
    {
      stack_symbol_type yylhs;
      yylhs.state = yy_lr_goto_state_ (yystack_[yylen].state, yyr1_[yyn]);
      /* Variants are always initialized to an empty instance of the
         correct type. The default '$$ = $1' action is NOT applied
         when using variants.  */
      switch (yyr1_[yyn])
    {
      case symbol_kind::S_al_t: // al_t
      case symbol_kind::S_attr: // attr
      case symbol_kind::S_if_attr: // if_attr
      case symbol_kind::S_case_attr: // case_attr
        yylhs.value.emplace< al_t > ();
        break;

      case symbol_kind::S_ast_node_type_t: // ast_node_type_t
      case symbol_kind::S_asgn_binop: // asgn_binop
      case symbol_kind::S_inc_or_dec_op: // inc_or_dec_op
        yylhs.value.emplace< ast_node_type_t > ();
        break;

      case symbol_kind::S_ast_t: // ast_t
      case symbol_kind::S_io_wire_type: // io_wire_type
      case symbol_kind::S_non_io_wire_type: // non_io_wire_type
      case symbol_kind::S_wire_type: // wire_type
      case symbol_kind::S_non_opt_range: // non_opt_range
      case symbol_kind::S_non_opt_multirange: // non_opt_multirange
      case symbol_kind::S_range: // range
      case symbol_kind::S_range_or_multirange: // range_or_multirange
      case symbol_kind::S_func_return_type: // func_return_type
      case symbol_kind::S_specify_if: // specify_if
      case symbol_kind::S_specify_condition: // specify_condition
      case symbol_kind::S_enum_type: // enum_type
      case symbol_kind::S_opt_enum_init: // opt_enum_init
      case symbol_kind::S_struct_type: // struct_type
      case symbol_kind::S_struct_union: // struct_union
      case symbol_kind::S_typedef_base_type: // typedef_base_type
      case symbol_kind::S_enum_struct_type: // enum_struct_type
      case symbol_kind::S_rvalue: // rvalue
      case symbol_kind::S_lvalue: // lvalue
      case symbol_kind::S_lvalue_concat_list: // lvalue_concat_list
      case symbol_kind::S_genvar_identifier: // genvar_identifier
      case symbol_kind::S_expr: // expr
      case symbol_kind::S_basic_expr: // basic_expr
      case symbol_kind::S_504_84: // @84
      case symbol_kind::S_concat_list: // concat_list
        yylhs.value.emplace< ast_t > ();
        break;

      case symbol_kind::S_boolean_t: // "boolean"
      case symbol_kind::S_opt_signedness_default_signed: // opt_signedness_default_signed
      case symbol_kind::S_opt_signedness_default_unsigned: // opt_signedness_default_unsigned
      case symbol_kind::S_always_comb_or_latch: // always_comb_or_latch
      case symbol_kind::S_always_or_always_ff: // always_or_always_ff
      case symbol_kind::S_opt_property: // opt_property
        yylhs.value.emplace< boolean_t > ();
        break;

      case symbol_kind::S_ch_t: // "invalid token"
      case symbol_kind::S_specify_edge: // specify_edge
        yylhs.value.emplace< ch_t > ();
        break;

      case symbol_kind::S_integer_t: // "integer"
      case symbol_kind::S_integer_atom_type: // integer_atom_type
      case symbol_kind::S_integer_vector_type: // integer_vector_type
        yylhs.value.emplace< integer_t > ();
        break;

      case symbol_kind::S_specify_rise_fall_ptr_t: // "specify rise and fall"
      case symbol_kind::S_specify_rise_fall: // specify_rise_fall
        yylhs.value.emplace< specify_rise_fall_ptr_t > ();
        break;

      case symbol_kind::S_specify_target_ptr_t: // "specify target"
      case symbol_kind::S_specify_target: // specify_target
        yylhs.value.emplace< specify_target_ptr_t > ();
        break;

      case symbol_kind::S_specify_triple_ptr_t: // "specify triple"
      case symbol_kind::S_specify_opt_triple: // specify_opt_triple
      case symbol_kind::S_specify_triple: // specify_triple
        yylhs.value.emplace< specify_triple_ptr_t > ();
        break;

      case symbol_kind::S_string_t: // "string"
      case symbol_kind::S_TOK_STRING: // TOK_STRING
      case symbol_kind::S_TOK_ID: // TOK_ID
      case symbol_kind::S_TOK_CONSTVAL: // TOK_CONSTVAL
      case symbol_kind::S_TOK_REALVAL: // TOK_REALVAL
      case symbol_kind::S_TOK_PRIMITIVE: // TOK_PRIMITIVE
      case symbol_kind::S_TOK_SVA_LABEL: // TOK_SVA_LABEL
      case symbol_kind::S_TOK_SPECIFY_OPER: // TOK_SPECIFY_OPER
      case symbol_kind::S_TOK_MSG_TASKS: // TOK_MSG_TASKS
      case symbol_kind::S_TOK_BASE: // TOK_BASE
      case symbol_kind::S_TOK_BASED_CONSTVAL: // TOK_BASED_CONSTVAL
      case symbol_kind::S_TOK_UNBASED_UNSIZED_CONSTVAL: // TOK_UNBASED_UNSIZED_CONSTVAL
      case symbol_kind::S_TOK_USER_TYPE: // TOK_USER_TYPE
      case symbol_kind::S_TOK_PKG_USER_TYPE: // TOK_PKG_USER_TYPE
      case symbol_kind::S_hierarchical_id: // hierarchical_id
      case symbol_kind::S_hierarchical_type_id: // hierarchical_type_id
      case symbol_kind::S_type_name: // type_name
      case symbol_kind::S_tok_prim_wrapper: // tok_prim_wrapper
      case symbol_kind::S_opt_label: // opt_label
      case symbol_kind::S_opt_sva_label: // opt_sva_label
      case symbol_kind::S_integral_number: // integral_number
        yylhs.value.emplace< string_t > ();
        break;

      default:
        break;
    }


      // Default location.
      {
        stack_type::slice range (yystack_, yylen);
        YYLLOC_DEFAULT (yylhs.location, range, yylen);
        yyerror_range[1].location = yylhs.location;
      }

      // Perform the reduction.
      YY_REDUCE_PRINT (yyn);
#if YY_EXCEPTIONS
      try
#endif // YY_EXCEPTIONS
        {
          switch (yyn)
            {
  case 2: // $@1: %empty
#line 593 "frontends/verilog/verilog_parser.y"
       {
	(void)yynerrs_;
	extra->ast_stack.clear();
	extra->ast_stack.push_back(extra->current_ast);
}
#line 1356 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 3: // input: $@1 design
#line 597 "frontends/verilog/verilog_parser.y"
         {
	extra->ast_stack.pop_back();
	log_assert(GetSize(extra->ast_stack) == 0);
	extra->default_attr_list.clear();
}
#line 1366 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 15: // $@2: %empty
#line 617 "frontends/verilog/verilog_parser.y"
        {
		if (extra->attr_list)
			extra->attr_list_stack.push(std::move(extra->attr_list));
		extra->attr_list = std::make_unique<dict<IdString, std::unique_ptr<AstNode>>>();
		for (auto &it : extra->default_attr_list)
			(*extra->attr_list)[it.first] = it.second->clone();
	}
#line 1378 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 16: // attr: $@2 attr_opt
#line 623 "frontends/verilog/verilog_parser.y"
                   {
		yylhs.value.as < al_t > () = std::move(extra->attr_list);
		if (!extra->attr_list_stack.empty()) {
			extra->attr_list = std::move(extra->attr_list_stack.top());
			extra->attr_list_stack.pop();
		} else
			extra->attr_list = nullptr;
	}
#line 1391 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 17: // attr_opt: attr_opt ATTR_BEGIN opt_attr_list ATTR_END
#line 633 "frontends/verilog/verilog_parser.y"
                                                   {
		SET_RULE_LOC(yylhs.location, yystack_[2].location, yylhs.location);
	}
#line 1399 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 19: // $@3: %empty
#line 639 "frontends/verilog/verilog_parser.y"
                      {
		if (extra->attr_list != nullptr)
			extra->attr_list_stack.push(std::move(extra->attr_list));
		extra->attr_list = std::make_unique<dict<IdString, std::unique_ptr<AstNode>>>();
		extra->default_attr_list.clear();
	}
#line 1410 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 20: // $@4: %empty
#line 644 "frontends/verilog/verilog_parser.y"
                        {
		extra->attr_list->swap(extra->default_attr_list);
		extra->attr_list.reset();
		if (!extra->attr_list_stack.empty()) {
			extra->attr_list = std::move(extra->attr_list_stack.top());
			extra->attr_list_stack.pop();
		} else
			extra->attr_list = nullptr;
	}
#line 1424 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 26: // attr_assign: hierarchical_id
#line 662 "frontends/verilog/verilog_parser.y"
                        {
		(*extra->attr_list)[*yystack_[0].value.as < string_t > ()] = AstNode::mkconst_int(yystack_[0].location, 1, false);
	}
#line 1432 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 27: // attr_assign: hierarchical_id "'='" expr
#line 665 "frontends/verilog/verilog_parser.y"
                                    {
		(*extra->attr_list)[*yystack_[2].value.as < string_t > ()] = std::move(yystack_[0].value.as < ast_t > ());
	}
#line 1440 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 28: // hierarchical_id: TOK_ID
#line 670 "frontends/verilog/verilog_parser.y"
               {
		yylhs.value.as < string_t > () = std::move(yystack_[0].value.as < string_t > ());
	}
#line 1448 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 29: // hierarchical_id: hierarchical_id TOK_PACKAGESEP TOK_ID
#line 673 "frontends/verilog/verilog_parser.y"
                                              {
		if (yystack_[0].value.as < string_t > ()->compare(0, 1, "\\") == 0)
			*yystack_[2].value.as < string_t > () += "::" + yystack_[0].value.as < string_t > ()->substr(1);
		else
			*yystack_[2].value.as < string_t > () += "::" + *yystack_[0].value.as < string_t > ();
		yylhs.value.as < string_t > () = std::move(yystack_[2].value.as < string_t > ());
	}
#line 1460 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 30: // hierarchical_id: hierarchical_id "'.'" TOK_ID
#line 680 "frontends/verilog/verilog_parser.y"
                                       {
		if (yystack_[0].value.as < string_t > ()->compare(0, 1, "\\") == 0)
			*yystack_[2].value.as < string_t > () += "." + yystack_[0].value.as < string_t > ()->substr(1);
		else
			*yystack_[2].value.as < string_t > () += "." + *yystack_[0].value.as < string_t > ();
		yylhs.value.as < string_t > () = std::move(yystack_[2].value.as < string_t > ());
	}
#line 1472 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 31: // hierarchical_type_id: TOK_USER_TYPE
#line 689 "frontends/verilog/verilog_parser.y"
                      {yylhs.value.as < string_t > () = std::move(yystack_[0].value.as < string_t > ()); }
#line 1478 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 32: // hierarchical_type_id: TOK_PKG_USER_TYPE
#line 690 "frontends/verilog/verilog_parser.y"
                            {yylhs.value.as < string_t > () = std::move(yystack_[0].value.as < string_t > ()); }
#line 1484 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 33: // hierarchical_type_id: "'('" TOK_USER_TYPE "')'"
#line 691 "frontends/verilog/verilog_parser.y"
                                                { yylhs.value.as < string_t > () = std::move(yystack_[1].value.as < string_t > ()); }
#line 1490 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 34: // $@5: %empty
#line 695 "frontends/verilog/verilog_parser.y"
                        {
		extra->enterTypeScope();
	}
#line 1498 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 35: // $@6: %empty
#line 697 "frontends/verilog/verilog_parser.y"
                 {
		extra->do_not_require_port_stubs = false;
		AstNode* mod = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_MODULE));
		extra->current_ast_mod = mod;
		extra->port_stubs.clear();
		extra->port_counter = 0;
		mod->str = *yystack_[0].value.as < string_t > ();
		append_attr(mod, std::move(yystack_[3].value.as < al_t > ()));
	}
#line 1512 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 36: // module: attr TOK_MODULE $@5 TOK_ID $@6 module_para_opt module_args_opt "';'" module_body TOK_ENDMODULE opt_label
#line 705 "frontends/verilog/verilog_parser.y"
                                                                                          {
		if (extra->port_stubs.size() != 0)
			err_at_loc(yystack_[4].location, "Missing details for module port `%s'.",
					extra->port_stubs.begin()->first.c_str());
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[9].location, yylhs.location);
		extra->ast_stack.pop_back();
		log_assert(extra->ast_stack.size() == 1);
		checkLabelsMatch(yystack_[0].location, "Module name", yystack_[7].value.as < string_t > ().get(), yystack_[0].value.as < string_t > ().get());
		extra->current_ast_mod = nullptr;
		extra->exitTypeScope();
	}
#line 1528 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 42: // $@7: %empty
#line 725 "frontends/verilog/verilog_parser.y"
                           {
		extra->astbuf1 = std::make_unique<AstNode>(yylhs.location, AST_PARAMETER);
		extra->astbuf1->children.push_back(AstNode::mkconst_int(yystack_[0].location, 0, true));
		append_attr(extra->astbuf1.get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 1538 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 44: // $@8: %empty
#line 730 "frontends/verilog/verilog_parser.y"
                            {
		extra->astbuf1 = std::make_unique<AstNode>(yylhs.location, AST_LOCALPARAM);
		extra->astbuf1->children.push_back(AstNode::mkconst_int(yystack_[0].location, 0, true));
		append_attr(extra->astbuf1.get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 1548 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 54: // module_arg_opt_assignment: "'='" expr
#line 747 "frontends/verilog/verilog_parser.y"
                    {
		if (extra->ast_stack.back()->children.size() > 0 && extra->ast_stack.back()->children.back()->type == AST_WIRE) {
			if (extra->ast_stack.back()->children.back()->is_input) {
				auto& n = extra->ast_stack.back()->children.back();
				n->attributes[ID::defaultvalue] = std::move(yystack_[0].value.as < ast_t > ());
			} else {
				auto wire = std::make_unique<AstNode>(yylhs.location, AST_IDENTIFIER);
				wire->str = extra->ast_stack.back()->children.back()->str;
				if (extra->ast_stack.back()->children.back()->is_reg || extra->ast_stack.back()->children.back()->is_logic)
					extra->ast_stack.back()->children.push_back(std::make_unique<AstNode>(yylhs.location, AST_INITIAL, std::make_unique<AstNode>(yylhs.location, AST_BLOCK, std::make_unique<AstNode>(yylhs.location, AST_ASSIGN_LE, std::move(wire), std::move(yystack_[0].value.as < ast_t > ())))));
				else
					extra->ast_stack.back()->children.push_back(std::make_unique<AstNode>(yylhs.location, AST_ASSIGN, std::move(wire), std::move(yystack_[0].value.as < ast_t > ())));
			}
		} else
			err_at_loc(yystack_[0].location, "SystemVerilog interface in module port list cannot have a default value.");
	}
#line 1569 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 56: // $@9: %empty
#line 766 "frontends/verilog/verilog_parser.y"
               {
		if (extra->ast_stack.back()->children.size() > 0 && extra->ast_stack.back()->children.back()->type == AST_WIRE) {
			auto node = extra->ast_stack.back()->children.back()->clone();
			node->str = *yystack_[0].value.as < string_t > ();
			node->port_id = ++extra->port_counter;
			SET_AST_NODE_LOC(node.get(), yystack_[0].location, yystack_[0].location);
			extra->ast_stack.back()->children.push_back(std::move(node));
		} else {
			if (extra->port_stubs.count(*yystack_[0].value.as < string_t > ()) != 0)
				err_at_loc(yystack_[0].location, "Duplicate module port `%s'.", *yystack_[0].value.as < string_t > ());
			extra->port_stubs[*yystack_[0].value.as < string_t > ()] = ++extra->port_counter;
		}
	}
#line 1587 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 58: // $@10: %empty
#line 779 "frontends/verilog/verilog_parser.y"
               {
		extra->astbuf1 = std::make_unique<AstNode>(yylhs.location, AST_INTERFACEPORT);
		extra->astbuf1->children.push_back(std::make_unique<AstNode>(yylhs.location, AST_INTERFACEPORTTYPE));
		extra->astbuf1->children[0]->str = *yystack_[0].value.as < string_t > ();
	}
#line 1597 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 59: // $@11: %empty
#line 783 "frontends/verilog/verilog_parser.y"
                 {  /* SV interfaces */
		if (!mode->sv)
			err_at_loc(yystack_[0].location, "Interface found in port list (%s). This is not supported unless read_verilog is called with -sv!", *yystack_[0].value.as < string_t > ());
		extra->astbuf2 = extra->astbuf1->clone(); // really only needed if multiple instances of same type.
		extra->astbuf2->str = *yystack_[0].value.as < string_t > ();
		extra->astbuf2->port_id = ++extra->port_counter;
		extra->ast_stack.back()->children.push_back(std::move(extra->astbuf2));
	}
#line 1610 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 61: // $@12: %empty
#line 791 "frontends/verilog/verilog_parser.y"
                                                  {
		auto node = std::move(yystack_[2].value.as < ast_t > ());
		node->str = *yystack_[0].value.as < string_t > ();
		SET_AST_NODE_LOC(node.get(), yystack_[0].location, yystack_[0].location);
		node->port_id = ++extra->port_counter;
		auto range = checkRange(node.get(), std::move(yystack_[1].value.as < ast_t > ()));
		if (range != nullptr)
			node->children.push_back(std::move(range));
		if (!node->is_input && !node->is_output)
			err_at_loc(yystack_[0].location, "Module port `%s' is neither input nor output.", *yystack_[0].value.as < string_t > ());
		if (node->is_reg && node->is_input && !node->is_output && !mode->sv)
			err_at_loc(yystack_[0].location, "Input port `%s' is declared as register.", *yystack_[0].value.as < string_t > ());
		append_attr(node.get(), std::move(yystack_[3].value.as < al_t > ()));
		extra->ast_stack.back()->children.push_back(std::move(node));
	}
#line 1630 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 63: // module_arg: "'.'" "'.'" "'.'"
#line 806 "frontends/verilog/verilog_parser.y"
                                {
		extra->do_not_require_port_stubs = true;
	}
#line 1638 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 64: // $@13: %empty
#line 811 "frontends/verilog/verilog_parser.y"
                         {
		extra->enterTypeScope();
	}
#line 1646 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 65: // $@14: %empty
#line 813 "frontends/verilog/verilog_parser.y"
                 {
		AstNode* mod = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_PACKAGE));
		extra->current_ast_mod = mod;
		mod->str = *yystack_[0].value.as < string_t > ();
		append_attr(mod, std::move(yystack_[3].value.as < al_t > ()));
	}
#line 1657 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 66: // package: attr TOK_PACKAGE $@13 TOK_ID $@14 "';'" package_body TOK_ENDPACKAGE opt_label
#line 818 "frontends/verilog/verilog_parser.y"
                                                            {
		extra->ast_stack.pop_back();
		checkLabelsMatch(yystack_[0].location, "Package name", yystack_[5].value.as < string_t > ().get(), yystack_[0].value.as < string_t > ().get());
		extra->current_ast_mod = nullptr;
		extra->exitTypeScope();
	}
#line 1668 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 73: // import_stmt: TOK_IMPORT TOK_ID TOK_PACKAGESEP "'*'" "';'"
#line 832 "frontends/verilog/verilog_parser.y"
                                                               {
		// Create an import node to track wildcard package imports
		auto import_node = std::make_unique<AstNode>(yylhs.location, AST_IMPORT);
		import_node->str = *yystack_[3].value.as < string_t > ();
		extra->ast_stack.back()->children.push_back(std::move(import_node));
	}
#line 1679 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 74: // $@15: %empty
#line 838 "frontends/verilog/verilog_parser.y"
                                         {
		// Start a specific import: create and push the AST_IMPORT node
		AstNode* import_node = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_IMPORT));
		import_node->str = *yystack_[1].value.as < string_t > ();
	}
#line 1689 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 75: // import_stmt: TOK_IMPORT TOK_ID TOK_PACKAGESEP $@15 import_item_list "';'"
#line 842 "frontends/verilog/verilog_parser.y"
                                       {
		// Done collecting specific items, pop the AST_IMPORT node
		extra->ast_stack.pop_back();
	}
#line 1698 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 78: // import_item: TOK_ID
#line 852 "frontends/verilog/verilog_parser.y"
               {
		// Append this specific import name under the current AST_IMPORT
		auto item_node = std::make_unique<AstNode>(yylhs.location, AST_NONE);
		item_node->str = *yystack_[0].value.as < string_t > ();
		extra->ast_stack.back()->children.push_back(std::move(item_node));
	}
#line 1709 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 79: // $@16: %empty
#line 860 "frontends/verilog/verilog_parser.y"
                      {
		extra->enterTypeScope();
	}
#line 1717 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 80: // $@17: %empty
#line 862 "frontends/verilog/verilog_parser.y"
                 {
		extra->do_not_require_port_stubs = false;
		AstNode* intf = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_INTERFACE));
		extra->current_ast_mod = intf;
		extra->port_stubs.clear();
		extra->port_counter = 0;
		intf->str = *yystack_[0].value.as < string_t > ();
	}
#line 1730 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 81: // interface: TOK_INTERFACE $@16 TOK_ID $@17 module_para_opt module_args_opt "';'" interface_body TOK_ENDINTERFACE
#line 869 "frontends/verilog/verilog_parser.y"
                                                                                      {
		if (extra->port_stubs.size() != 0)
			err_at_loc(yystack_[3].location, "Missing details for module port `%s'.",
				extra->port_stubs.begin()->first.c_str());
		extra->ast_stack.pop_back();
		log_assert(extra->ast_stack.size() == 1);
		extra->current_ast_mod = nullptr;
		extra->exitTypeScope();
	}
#line 1744 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 93: // $@18: %empty
#line 887 "frontends/verilog/verilog_parser.y"
                 {
		(void)extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_BIND));
	}
#line 1752 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 94: // $@19: %empty
#line 890 "frontends/verilog/verilog_parser.y"
                    {
		// bind_target should have added at least one child
		log_assert(extra->ast_stack.back()->children.size() >= 1);
	}
#line 1761 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 95: // $@20: %empty
#line 894 "frontends/verilog/verilog_parser.y"
               {
		// The single_cell parser in cell_list_no_array uses extra->astbuf1 as
		// a sort of template for constructing cells.
		extra->astbuf1 = std::make_unique<AstNode>(yylhs.location, AST_CELL);
		extra->astbuf1->children.push_back(std::make_unique<AstNode>(yylhs.location, AST_CELLTYPE));
		extra->astbuf1->children[0]->str = *yystack_[0].value.as < string_t > ();
	}
#line 1773 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 96: // bind_directive: TOK_BIND $@18 bind_target $@19 TOK_ID $@20 cell_parameter_list_opt cell_list_no_array "';'"
#line 901 "frontends/verilog/verilog_parser.y"
                                                               {
		// cell_list should have added at least one more child
		log_assert(extra->ast_stack.back()->children.size() >= 2);
		(void)extra->astbuf1.reset();
		extra->ast_stack.pop_back();
	}
#line 1784 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 102: // bind_target_instance: hierarchical_id
#line 936 "frontends/verilog/verilog_parser.y"
                        {
		auto node = std::make_unique<AstNode>(yylhs.location, AST_IDENTIFIER);
		node->str = *yystack_[0].value.as < string_t > ();
		extra->ast_stack.back()->children.push_back(std::move(node));
	}
#line 1794 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 103: // mintypmax_expr: expr
#line 943 "frontends/verilog/verilog_parser.y"
             { }
#line 1800 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 104: // mintypmax_expr: expr "':'" expr "':'" expr
#line 944 "frontends/verilog/verilog_parser.y"
                                       { }
#line 1806 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 105: // non_opt_delay: "'#'" TOK_ID
#line 947 "frontends/verilog/verilog_parser.y"
                        { }
#line 1812 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 106: // non_opt_delay: "'#'" TOK_CONSTVAL
#line 948 "frontends/verilog/verilog_parser.y"
                              { }
#line 1818 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 107: // non_opt_delay: "'#'" TOK_REALVAL
#line 949 "frontends/verilog/verilog_parser.y"
                             { }
#line 1824 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 115: // $@21: %empty
#line 961 "frontends/verilog/verilog_parser.y"
        { extra->astbuf3 = std::make_unique<AstNode>(yylhs.location, AST_WIRE); extra->current_wire_rand = false; extra->current_wire_const = false; extra->current_wire_automatic = false; }
#line 1830 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 116: // io_wire_type: $@21 wire_type_token_io wire_type_const_rand opt_wire_type_token wire_type_signedness
#line 963 "frontends/verilog/verilog_parser.y"
        { yylhs.value.as < ast_t > () = std::move(extra->astbuf3); SET_RULE_LOC(yylhs.location, yystack_[3].location, yylhs.location); }
#line 1836 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 117: // $@22: %empty
#line 966 "frontends/verilog/verilog_parser.y"
        { extra->astbuf3 = std::make_unique<AstNode>(yylhs.location, AST_WIRE); extra->current_wire_rand = false; extra->current_wire_const = false; extra->current_wire_automatic = false; }
#line 1842 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 118: // non_io_wire_type: $@22 opt_lifetime wire_type_const_rand wire_type_token wire_type_signedness
#line 968 "frontends/verilog/verilog_parser.y"
        {
		if (extra->current_wire_automatic)
			extra->astbuf3->set_attribute(ID::nosync, AstNode::mkconst_int(extra->astbuf3->location, 1, false));
		yylhs.value.as < ast_t > () = std::move(extra->astbuf3); SET_RULE_LOC(yylhs.location, yystack_[3].location, yylhs.location);
	}
#line 1852 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 119: // wire_type: io_wire_type
#line 975 "frontends/verilog/verilog_parser.y"
                     { yylhs.value.as < ast_t > () = std::move(yystack_[0].value.as < ast_t > ()); }
#line 1858 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 120: // wire_type: non_io_wire_type
#line 976 "frontends/verilog/verilog_parser.y"
                         { yylhs.value.as < ast_t > () = std::move(yystack_[0].value.as < ast_t > ()); }
#line 1864 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 121: // wire_type_token_io: TOK_INPUT
#line 979 "frontends/verilog/verilog_parser.y"
                  {
		extra->astbuf3->is_input = true;
	}
#line 1872 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 122: // wire_type_token_io: TOK_OUTPUT
#line 982 "frontends/verilog/verilog_parser.y"
                   {
		extra->astbuf3->is_output = true;
	}
#line 1880 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 123: // wire_type_token_io: TOK_INOUT
#line 985 "frontends/verilog/verilog_parser.y"
                  {
		extra->astbuf3->is_input = true;
		extra->astbuf3->is_output = true;
	}
#line 1889 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 124: // wire_type_signedness: TOK_SIGNED
#line 991 "frontends/verilog/verilog_parser.y"
                     { extra->astbuf3->is_signed = true;  }
#line 1895 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 125: // wire_type_signedness: TOK_UNSIGNED
#line 992 "frontends/verilog/verilog_parser.y"
                     { extra->astbuf3->is_signed = false; }
#line 1901 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 127: // wire_type_const_rand: TOK_RAND TOK_CONST
#line 996 "frontends/verilog/verilog_parser.y"
                           {
	    extra->current_wire_rand = true;
	    extra->current_wire_const = true;
	}
#line 1910 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 128: // wire_type_const_rand: TOK_CONST
#line 1000 "frontends/verilog/verilog_parser.y"
                  {
	    extra->current_wire_const = true;
	}
#line 1918 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 129: // wire_type_const_rand: TOK_RAND
#line 1003 "frontends/verilog/verilog_parser.y"
                 {
	    extra->current_wire_rand = true;
	}
#line 1926 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 133: // wire_type_token: net_type
#line 1013 "frontends/verilog/verilog_parser.y"
                 {
	}
#line 1933 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 134: // wire_type_token: net_type logic_type
#line 1015 "frontends/verilog/verilog_parser.y"
                            {
	}
#line 1940 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 135: // wire_type_token: TOK_REG
#line 1018 "frontends/verilog/verilog_parser.y"
                {
		extra->astbuf3->is_reg = true;
	}
#line 1948 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 136: // wire_type_token: TOK_VAR TOK_REG
#line 1021 "frontends/verilog/verilog_parser.y"
                        {
		extra->astbuf3->is_reg = true;
	}
#line 1956 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 137: // wire_type_token: TOK_VAR
#line 1025 "frontends/verilog/verilog_parser.y"
                {
		extra->astbuf3->is_logic = true;
	}
#line 1964 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 138: // wire_type_token: TOK_VAR logic_type
#line 1028 "frontends/verilog/verilog_parser.y"
                           {
		extra->astbuf3->is_logic = true;
	}
#line 1972 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 139: // wire_type_token: logic_type
#line 1031 "frontends/verilog/verilog_parser.y"
                   {
		extra->astbuf3->is_logic = true;
	}
#line 1980 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 140: // wire_type_token: TOK_GENVAR
#line 1034 "frontends/verilog/verilog_parser.y"
                   {
		extra->astbuf3->type = AST_GENVAR;
		extra->astbuf3->is_reg = true;
		extra->astbuf3->is_signed = true;
		extra->astbuf3->range_left = 31;
		extra->astbuf3->range_right = 0;
	}
#line 1992 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 141: // net_type: TOK_WOR
#line 1043 "frontends/verilog/verilog_parser.y"
                {
		extra->astbuf3->is_wor = true;
	}
#line 2000 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 142: // net_type: TOK_WAND
#line 1046 "frontends/verilog/verilog_parser.y"
                 {
		extra->astbuf3->is_wand = true;
	}
#line 2008 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 144: // logic_type: TOK_LOGIC
#line 1052 "frontends/verilog/verilog_parser.y"
                  {
	}
#line 2015 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 145: // logic_type: integer_atom_type
#line 1054 "frontends/verilog/verilog_parser.y"
                          {
		extra->astbuf3->range_left = yystack_[0].value.as < integer_t > () - 1;
		extra->astbuf3->range_right = 0;
		extra->astbuf3->is_signed = true;
	}
#line 2025 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 146: // logic_type: hierarchical_type_id
#line 1059 "frontends/verilog/verilog_parser.y"
                             {
		extra->addWiretypeNode(yystack_[0].value.as < string_t > ().get(), extra->astbuf3.get());
	}
#line 2033 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 147: // integer_atom_type: TOK_INTEGER
#line 1064 "frontends/verilog/verilog_parser.y"
                        { yylhs.value.as < integer_t > () = 32; }
#line 2039 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 148: // integer_atom_type: TOK_INT
#line 1065 "frontends/verilog/verilog_parser.y"
                        { yylhs.value.as < integer_t > () = 32; }
#line 2045 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 149: // integer_atom_type: TOK_SHORTINT
#line 1066 "frontends/verilog/verilog_parser.y"
                        { yylhs.value.as < integer_t > () = 16; }
#line 2051 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 150: // integer_atom_type: TOK_LONGINT
#line 1067 "frontends/verilog/verilog_parser.y"
                        { yylhs.value.as < integer_t > () = 64; }
#line 2057 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 151: // integer_atom_type: TOK_BYTE
#line 1068 "frontends/verilog/verilog_parser.y"
                        { yylhs.value.as < integer_t > () =  8; }
#line 2063 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 152: // integer_vector_type: TOK_LOGIC
#line 1071 "frontends/verilog/verilog_parser.y"
                  { yylhs.value.as < integer_t > () = token::TOK_LOGIC; }
#line 2069 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 153: // integer_vector_type: TOK_REG
#line 1072 "frontends/verilog/verilog_parser.y"
                  { yylhs.value.as < integer_t > () = token::TOK_REG; }
#line 2075 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 154: // non_opt_range: "'['" expr "':'" expr "']'"
#line 1075 "frontends/verilog/verilog_parser.y"
                                            {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_RANGE);
		yylhs.value.as < ast_t > ()->children.push_back(std::move(yystack_[3].value.as < ast_t > ()));
		yylhs.value.as < ast_t > ()->children.push_back(std::move(yystack_[1].value.as < ast_t > ()));
	}
#line 2085 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 155: // non_opt_range: "'['" expr TOK_POS_INDEXED expr "']'"
#line 1080 "frontends/verilog/verilog_parser.y"
                                                    {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_RANGE);
		auto expr = std::make_unique<AstNode>(yylhs.location, AST_SELFSZ, std::move(yystack_[3].value.as < ast_t > ()));
		yylhs.value.as < ast_t > ()->children.push_back(std::make_unique<AstNode>(yylhs.location, AST_SUB, std::make_unique<AstNode>(yylhs.location, AST_ADD, expr->clone(), std::move(yystack_[1].value.as < ast_t > ())), AstNode::mkconst_int(yylhs.location, 1, true)));
		yylhs.value.as < ast_t > ()->children.push_back(std::make_unique<AstNode>(yylhs.location, AST_ADD, std::move(expr), AstNode::mkconst_int(yylhs.location, 0, true)));
	}
#line 2096 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 156: // non_opt_range: "'['" expr TOK_NEG_INDEXED expr "']'"
#line 1086 "frontends/verilog/verilog_parser.y"
                                                    {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_RANGE);
		auto expr = std::make_unique<AstNode>(yylhs.location, AST_SELFSZ, std::move(yystack_[3].value.as < ast_t > ()));
		yylhs.value.as < ast_t > ()->children.push_back(std::make_unique<AstNode>(yylhs.location, AST_ADD, expr->clone(), AstNode::mkconst_int(yylhs.location, 0, true)));
		yylhs.value.as < ast_t > ()->children.push_back(std::make_unique<AstNode>(yylhs.location, AST_SUB, std::make_unique<AstNode>(yylhs.location, AST_ADD, std::move(expr), AstNode::mkconst_int(yylhs.location, 1, true)), std::move(yystack_[1].value.as < ast_t > ())));
	}
#line 2107 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 157: // non_opt_range: "'['" expr "']'"
#line 1092 "frontends/verilog/verilog_parser.y"
                               {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_RANGE);
		yylhs.value.as < ast_t > ()->children.push_back(std::move(yystack_[1].value.as < ast_t > ()));
	}
#line 2116 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 158: // non_opt_multirange: non_opt_range non_opt_range
#line 1098 "frontends/verilog/verilog_parser.y"
                                    {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_MULTIRANGE, std::move(yystack_[1].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
	}
#line 2124 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 159: // non_opt_multirange: non_opt_multirange non_opt_range
#line 1101 "frontends/verilog/verilog_parser.y"
                                         {
		yylhs.value.as < ast_t > () = std::move(yystack_[1].value.as < ast_t > ());
		yylhs.value.as < ast_t > ()->children.push_back(std::move(yystack_[0].value.as < ast_t > ()));
	}
#line 2133 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 160: // range: non_opt_range
#line 1107 "frontends/verilog/verilog_parser.y"
                      {
		yylhs.value.as < ast_t > () = std::move(yystack_[0].value.as < ast_t > ());
	}
#line 2141 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 161: // range: %empty
#line 1110 "frontends/verilog/verilog_parser.y"
               {
		yylhs.value.as < ast_t > () = nullptr;
	}
#line 2149 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 162: // range_or_multirange: range
#line 1115 "frontends/verilog/verilog_parser.y"
              { yylhs.value.as < ast_t > () = std::move(yystack_[0].value.as < ast_t > ()); }
#line 2155 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 163: // range_or_multirange: non_opt_multirange
#line 1116 "frontends/verilog/verilog_parser.y"
                           { yylhs.value.as < ast_t > () = std::move(yystack_[0].value.as < ast_t > ()); }
#line 2161 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 188: // $@23: %empty
#line 1132 "frontends/verilog/verilog_parser.y"
                                       {
		AstNode* node = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_GENBLOCK));
		node->str = *yystack_[1].value.as < string_t > ();
	}
#line 2170 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 189: // checker_decl: TOK_CHECKER TOK_ID "';'" $@23 module_body TOK_ENDCHECKER
#line 1135 "frontends/verilog/verilog_parser.y"
                                     {
		extra->ast_stack.pop_back();
	}
#line 2178 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 190: // $@24: %empty
#line 1140 "frontends/verilog/verilog_parser.y"
                                            {
		extra->current_function_or_task = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_DPI_FUNCTION, AstNode::mkconst_str(yystack_[1].location, *yystack_[1].value.as < string_t > ()), AstNode::mkconst_str(yystack_[0].location, *yystack_[0].value.as < string_t > ())));
		extra->current_function_or_task->str = *yystack_[0].value.as < string_t > ();
		append_attr(extra->current_function_or_task, std::move(yystack_[3].value.as < al_t > ()));
	}
#line 2188 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 191: // task_func_decl: attr TOK_DPI_FUNCTION TOK_ID TOK_ID $@24 opt_dpi_function_args "';'"
#line 1144 "frontends/verilog/verilog_parser.y"
                                            {
		extra->current_function_or_task = nullptr;
	}
#line 2196 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 192: // $@25: %empty
#line 1147 "frontends/verilog/verilog_parser.y"
                                                          {
		extra->current_function_or_task = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_DPI_FUNCTION, AstNode::mkconst_str(yystack_[1].location, *yystack_[1].value.as < string_t > ()), AstNode::mkconst_str(yystack_[3].location, *yystack_[3].value.as < string_t > ())));
		extra->current_function_or_task->str = *yystack_[0].value.as < string_t > ();
		append_attr(extra->current_function_or_task, std::move(yystack_[5].value.as < al_t > ()));
	}
#line 2206 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 193: // task_func_decl: attr TOK_DPI_FUNCTION TOK_ID "'='" TOK_ID TOK_ID $@25 opt_dpi_function_args "';'"
#line 1151 "frontends/verilog/verilog_parser.y"
                                            {
		extra->current_function_or_task = nullptr;
	}
#line 2214 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 194: // $@26: %empty
#line 1154 "frontends/verilog/verilog_parser.y"
                                                                         {
		extra->current_function_or_task = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_DPI_FUNCTION, AstNode::mkconst_str(yystack_[1].location, *yystack_[1].value.as < string_t > ()), AstNode::mkconst_str(location_range(yystack_[5].location, yystack_[3].location), *yystack_[5].value.as < string_t > () + ":" + RTLIL::unescape_id(*yystack_[3].value.as < string_t > ()))));
		extra->current_function_or_task->str = *yystack_[0].value.as < string_t > ();
		append_attr(extra->current_function_or_task, std::move(yystack_[7].value.as < al_t > ()));
	}
#line 2224 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 195: // task_func_decl: attr TOK_DPI_FUNCTION TOK_ID "':'" TOK_ID "'='" TOK_ID TOK_ID $@26 opt_dpi_function_args "';'"
#line 1158 "frontends/verilog/verilog_parser.y"
                                            {
		extra->current_function_or_task = nullptr;
	}
#line 2232 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 196: // $@27: %empty
#line 1161 "frontends/verilog/verilog_parser.y"
                                           {
		extra->current_function_or_task = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_TASK));
		extra->current_function_or_task->str = *yystack_[0].value.as < string_t > ();
		append_attr(extra->current_function_or_task, std::move(yystack_[3].value.as < al_t > ()));
		extra->current_function_or_task_port_id = 1;
	}
#line 2243 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 197: // task_func_decl: attr TOK_TASK opt_automatic TOK_ID $@27 task_func_args_opt "';'" task_func_body TOK_ENDTASK
#line 1166 "frontends/verilog/verilog_parser.y"
                                                                    {
		extra->current_function_or_task = nullptr;
		extra->ast_stack.pop_back();
	}
#line 2252 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 198: // $@28: %empty
#line 1170 "frontends/verilog/verilog_parser.y"
                                                        {
		// The difference between void functions and tasks is that
		// always_comb's implicit sensitivity list behaves as if functions were
		// inlined, but ignores signals read only in tasks. This only matters
		// for event based simulation, and for synthesis we can treat a void
		// function like a task.
		extra->current_function_or_task = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_TASK));
		extra->current_function_or_task->str = *yystack_[0].value.as < string_t > ();
		append_attr(extra->current_function_or_task, std::move(yystack_[4].value.as < al_t > ()));
		extra->current_function_or_task_port_id = 1;
	}
#line 2268 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 199: // task_func_decl: attr TOK_FUNCTION opt_automatic TOK_VOID TOK_ID $@28 task_func_args_opt "';'" task_func_body TOK_ENDFUNCTION
#line 1180 "frontends/verilog/verilog_parser.y"
                                                                        {
		extra->current_function_or_task = nullptr;
		extra->ast_stack.pop_back();
	}
#line 2277 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 200: // $@29: %empty
#line 1184 "frontends/verilog/verilog_parser.y"
                                                                {
		extra->current_function_or_task = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_FUNCTION));
		extra->current_function_or_task->str = *yystack_[0].value.as < string_t > ();
		append_attr(extra->current_function_or_task, std::move(yystack_[4].value.as < al_t > ()));
		auto outreg = std::make_unique<AstNode>(yylhs.location, AST_WIRE);
		outreg->str = *yystack_[0].value.as < string_t > ();
		outreg->is_signed = false;
		outreg->is_reg = true;
		if (yystack_[1].value.as < ast_t > () != nullptr) {
			outreg->is_signed = yystack_[1].value.as < ast_t > ()->is_signed;
			yystack_[1].value.as < ast_t > ()->is_signed = false;
			outreg->is_custom_type = yystack_[1].value.as < ast_t > ()->type == AST_WIRETYPE;
			outreg->children.push_back(std::move(yystack_[1].value.as < ast_t > ()));
		}
		extra->current_function_or_task->children.push_back(std::move(outreg));
		extra->current_function_or_task_port_id = 1;
	}
#line 2299 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 201: // task_func_decl: attr TOK_FUNCTION opt_automatic func_return_type TOK_ID $@29 task_func_args_opt "';'" task_func_body TOK_ENDFUNCTION
#line 1200 "frontends/verilog/verilog_parser.y"
                                                                        {
		extra->current_function_or_task = nullptr;
		extra->ast_stack.pop_back();
	}
#line 2308 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 202: // func_return_type: hierarchical_type_id
#line 1206 "frontends/verilog/verilog_parser.y"
                             {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_WIRETYPE);
		yylhs.value.as < ast_t > ()->str = *yystack_[0].value.as < string_t > ();
	}
#line 2317 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 203: // func_return_type: opt_type_vec opt_signedness_default_unsigned
#line 1210 "frontends/verilog/verilog_parser.y"
                                                     {
		yylhs.value.as < ast_t > () = makeRange(yylhs.location, 0, 0, yystack_[0].value.as < boolean_t > ());
	}
#line 2325 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 204: // func_return_type: opt_type_vec opt_signedness_default_unsigned non_opt_range
#line 1213 "frontends/verilog/verilog_parser.y"
                                                                   {
		yylhs.value.as < ast_t > () = std::move(yystack_[0].value.as < ast_t > ());
		yylhs.value.as < ast_t > ()->is_signed = yystack_[1].value.as < boolean_t > ();
	}
#line 2334 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 205: // func_return_type: integer_atom_type opt_signedness_default_signed
#line 1217 "frontends/verilog/verilog_parser.y"
                                                        {
		yylhs.value.as < ast_t > () = makeRange(yylhs.location, yystack_[1].value.as < integer_t > () - 1, 0, yystack_[0].value.as < boolean_t > ());
	}
#line 2342 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 209: // opt_signedness_default_signed: %empty
#line 1228 "frontends/verilog/verilog_parser.y"
                        { yylhs.value.as < boolean_t > () = true; }
#line 2348 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 210: // opt_signedness_default_signed: TOK_SIGNED
#line 1229 "frontends/verilog/verilog_parser.y"
                        { yylhs.value.as < boolean_t > () = true; }
#line 2354 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 211: // opt_signedness_default_signed: TOK_UNSIGNED
#line 1230 "frontends/verilog/verilog_parser.y"
                        { yylhs.value.as < boolean_t > () = false; }
#line 2360 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 212: // opt_signedness_default_unsigned: %empty
#line 1233 "frontends/verilog/verilog_parser.y"
                        { yylhs.value.as < boolean_t > () = false; }
#line 2366 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 213: // opt_signedness_default_unsigned: TOK_SIGNED
#line 1234 "frontends/verilog/verilog_parser.y"
                        { yylhs.value.as < boolean_t > () = true; }
#line 2372 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 214: // opt_signedness_default_unsigned: TOK_UNSIGNED
#line 1235 "frontends/verilog/verilog_parser.y"
                        { yylhs.value.as < boolean_t > () = false; }
#line 2378 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 215: // dpi_function_arg: TOK_ID TOK_ID
#line 1239 "frontends/verilog/verilog_parser.y"
                      {
		extra->current_function_or_task->children.push_back(AstNode::mkconst_str(yystack_[1].location, *yystack_[1].value.as < string_t > ()));
	}
#line 2386 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 216: // dpi_function_arg: TOK_ID
#line 1242 "frontends/verilog/verilog_parser.y"
               {
		extra->current_function_or_task->children.push_back(AstNode::mkconst_str(yystack_[0].location, *yystack_[0].value.as < string_t > ()));
	}
#line 2394 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 225: // opt_lifetime: TOK_AUTOMATIC
#line 1261 "frontends/verilog/verilog_parser.y"
                      { extra->current_wire_automatic = true; }
#line 2400 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 229: // $@30: %empty
#line 1265 "frontends/verilog/verilog_parser.y"
                                                    {
		extra->albuf = nullptr;
		extra->astbuf1 = nullptr;
		extra->astbuf2 = nullptr;
	}
#line 2410 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 230: // $@31: %empty
#line 1269 "frontends/verilog/verilog_parser.y"
                                        {
		(void)extra->astbuf1.reset();
		if (extra->astbuf2 != nullptr)
			(void)extra->astbuf2.reset();
		extra->albuf.reset();
	}
#line 2421 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 234: // $@32: %empty
#line 1280 "frontends/verilog/verilog_parser.y"
                                           {
		bool prev_was_input = true;
		bool prev_was_output = false;
		if (extra->albuf) {
			prev_was_input = extra->astbuf1->is_input;
			prev_was_output = extra->astbuf1->is_output;
			(void)extra->astbuf1.reset();
			if (extra->astbuf2 != nullptr)
				(void)extra->astbuf2.reset();
			extra->albuf.reset();
		}
		extra->albuf = std::move(yystack_[2].value.as < al_t > ());
		extra->astbuf1 = std::move(yystack_[1].value.as < ast_t > ());
		extra->astbuf2 = checkRange(extra->astbuf1.get(), std::move(yystack_[0].value.as < ast_t > ()));
		if (!extra->astbuf1->is_input && !extra->astbuf1->is_output) {
			if (!mode->sv)
				err_at_loc(yystack_[1].location, "task/function argument direction missing");
			extra->astbuf1->is_input = prev_was_input;
			extra->astbuf1->is_output = prev_was_output;
		}
	}
#line 2447 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 236: // $@33: %empty
#line 1301 "frontends/verilog/verilog_parser.y"
        {
		if (!extra->astbuf1) {
			if (!mode->sv)
				err_at_loc(yylhs.location, "task/function argument direction missing");
			extra->albuf = std::make_unique<dict<IdString, std::unique_ptr<AstNode>>>();
			extra->astbuf1 = std::make_unique<AstNode>(yylhs.location, AST_WIRE);
			extra->current_wire_rand = false;
			extra->current_wire_const = false;
			extra->astbuf1->is_input = true;
			extra->astbuf2 = nullptr;
		}
	}
#line 2464 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 243: // specify_item: specify_if "'('" specify_edge expr TOK_SPECIFY_OPER specify_target "')'" "'='" specify_rise_fall "';'"
#line 1328 "frontends/verilog/verilog_parser.y"
                                                                                                                                {
		auto en_expr = std::move(yystack_[9].value.as < ast_t > ());
		char specify_edge = yystack_[7].value.as < ch_t > ();
		auto src_expr = std::move(yystack_[6].value.as < ast_t > ());
		string *oper = yystack_[5].value.as < string_t > ().get();
		specify_target_ptr_t target = std::move(yystack_[4].value.as < specify_target_ptr_t > ());
		specify_rise_fall_ptr_t timing = std::move(yystack_[1].value.as < specify_rise_fall_ptr_t > ());

		if (specify_edge != 0 && target->dat == nullptr)
			err_at_loc(yystack_[7].location, "Found specify edge but no data spec.");

		auto cell_owned = std::make_unique<AstNode>(yylhs.location, AST_CELL);
		auto cell = cell_owned.get();
		extra->ast_stack.back()->children.push_back(std::move(cell_owned));
		cell->str = stringf("$specify$%d", autoidx++);
		cell->children.push_back(std::make_unique<AstNode>(yylhs.location, AST_CELLTYPE));
		cell->children.back()->str = target->dat ? "$specify3" : "$specify2";
		SET_AST_NODE_LOC(cell, en_expr.get() ? yystack_[9].location : yystack_[8].location, yystack_[0].location);

		char oper_polarity = 0;
		char oper_type = oper->at(0);

		if (oper->size() == 3) {
			oper_polarity = oper->at(0);
			oper_type = oper->at(1);
		}

		cell->children.push_back(std::make_unique<AstNode>(yystack_[5].location, AST_PARASET, AstNode::mkconst_int(yystack_[5].location, oper_type == '*', false, 1)));
		cell->children.back()->str = "\\FULL";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[5].location, AST_PARASET, AstNode::mkconst_int(yystack_[5].location, oper_polarity != 0, false, 1)));
		cell->children.back()->str = "\\SRC_DST_PEN";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[5].location, AST_PARASET, AstNode::mkconst_int(yystack_[5].location, oper_polarity == '+', false, 1)));
		cell->children.back()->str = "\\SRC_DST_POL";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[1].location, AST_PARASET, std::move(timing->rise.t_min)));
		cell->children.back()->str = "\\T_RISE_MIN";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[1].location, AST_PARASET, std::move(timing->rise.t_avg)));
		cell->children.back()->str = "\\T_RISE_TYP";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[1].location, AST_PARASET, std::move(timing->rise.t_max)));
		cell->children.back()->str = "\\T_RISE_MAX";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[1].location, AST_PARASET, std::move(timing->fall.t_min)));
		cell->children.back()->str = "\\T_FALL_MIN";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[1].location, AST_PARASET, std::move(timing->fall.t_avg)));
		cell->children.back()->str = "\\T_FALL_TYP";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[1].location, AST_PARASET, std::move(timing->fall.t_max)));
		cell->children.back()->str = "\\T_FALL_MAX";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[9].location, AST_ARGUMENT, en_expr ? std::move(en_expr) : AstNode::mkconst_int(yystack_[9].location, 1, false, 1)));
		cell->children.back()->str = "\\EN";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[6].location, AST_ARGUMENT, std::move(src_expr)));
		cell->children.back()->str = "\\SRC";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[4].location, AST_ARGUMENT, std::move(target->dst)));
		cell->children.back()->str = "\\DST";

		if (target->dat)
		{
			cell->children.push_back(std::make_unique<AstNode>(yystack_[7].location, AST_PARASET, AstNode::mkconst_int(yystack_[7].location, specify_edge != 0, false, 1)));
			cell->children.back()->str = "\\EDGE_EN";

			cell->children.push_back(std::make_unique<AstNode>(yystack_[7].location, AST_PARASET, AstNode::mkconst_int(yystack_[7].location, specify_edge == 'p', false, 1)));
			cell->children.back()->str = "\\EDGE_POL";

			cell->children.push_back(std::make_unique<AstNode>(yystack_[4].location, AST_PARASET, AstNode::mkconst_int(yystack_[4].location, target->polarity_op != 0, false, 1)));
			cell->children.back()->str = "\\DAT_DST_PEN";

			cell->children.push_back(std::make_unique<AstNode>(yystack_[4].location, AST_PARASET, AstNode::mkconst_int(yystack_[4].location, target->polarity_op == '+', false, 1)));
			cell->children.back()->str = "\\DAT_DST_POL";

			cell->children.push_back(std::make_unique<AstNode>(yystack_[4].location, AST_ARGUMENT, std::move(target->dat)));
			cell->children.back()->str = "\\DAT";
		}
	}
#line 2550 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 244: // specify_item: TOK_ID "'('" specify_edge expr specify_condition "','" specify_edge expr specify_condition "','" specify_triple specify_opt_triple "')'" "';'"
#line 1409 "frontends/verilog/verilog_parser.y"
                                                                                                                                                                               {
		if (*yystack_[13].value.as < string_t > () != "$setup" && *yystack_[13].value.as < string_t > () != "$hold" && *yystack_[13].value.as < string_t > () != "$setuphold" && *yystack_[13].value.as < string_t > () != "$removal" && *yystack_[13].value.as < string_t > () != "$recovery" &&
				*yystack_[13].value.as < string_t > () != "$recrem" && *yystack_[13].value.as < string_t > () != "$skew" && *yystack_[13].value.as < string_t > () != "$timeskew" && *yystack_[13].value.as < string_t > () != "$fullskew" && *yystack_[13].value.as < string_t > () != "$nochange")
			err_at_loc(yystack_[13].location, "Unsupported specify rule type: %s", *yystack_[13].value.as < string_t > ());

		auto src_pen = AstNode::mkconst_int(yystack_[11].location, yystack_[11].value.as < ch_t > () != 0, false, 1);
		auto src_pol = AstNode::mkconst_int(yystack_[11].location, yystack_[11].value.as < ch_t > () == 'p', false, 1);
		auto src_expr = std::move(yystack_[10].value.as < ast_t > ()), src_en = yystack_[9].value.as < ast_t > () ? std::move(yystack_[9].value.as < ast_t > ()) : AstNode::mkconst_int(yystack_[9].location, 1, false, 1);

		auto dst_pen = AstNode::mkconst_int(yystack_[7].location, yystack_[7].value.as < ch_t > () != 0, false, 1);
		auto dst_pol = AstNode::mkconst_int(yystack_[7].location, yystack_[7].value.as < ch_t > () == 'p', false, 1);
		auto dst_expr = std::move(yystack_[6].value.as < ast_t > ()), dst_en = yystack_[5].value.as < ast_t > () ? std::move(yystack_[5].value.as < ast_t > ()) : AstNode::mkconst_int(yystack_[9].location, 1, false, 1);

		specify_triple_ptr_t limit = std::move(yystack_[3].value.as < specify_triple_ptr_t > ());
		specify_triple_ptr_t limit2 = std::move(yystack_[2].value.as < specify_triple_ptr_t > ());

		auto cell_owned = std::make_unique<AstNode>(yylhs.location, AST_CELL);
		auto cell = cell_owned.get();
		extra->ast_stack.back()->children.push_back(std::move(cell_owned));
		cell->str = stringf("$specify$%d", autoidx++);
		cell->children.push_back(std::make_unique<AstNode>(yylhs.location, AST_CELLTYPE));
		cell->children.back()->str = "$specrule";
		SET_AST_NODE_LOC(cell, yystack_[13].location, yystack_[0].location);

		cell->children.push_back(std::make_unique<AstNode>(yystack_[13].location, AST_PARASET, AstNode::mkconst_str(yystack_[13].location, *yystack_[13].value.as < string_t > ())));
		cell->children.back()->str = "\\TYPE";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[3].location, AST_PARASET, std::move(limit->t_min)));
		cell->children.back()->str = "\\T_LIMIT_MIN";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[3].location, AST_PARASET, std::move(limit->t_avg)));
		cell->children.back()->str = "\\T_LIMIT_TYP";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[3].location, AST_PARASET, std::move(limit->t_max)));
		cell->children.back()->str = "\\T_LIMIT_MAX";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[2].location, AST_PARASET, limit2 ? std::move(limit2->t_min) : AstNode::mkconst_int(yystack_[2].location, 0, true)));
		cell->children.back()->str = "\\T_LIMIT2_MIN";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[2].location, AST_PARASET, limit2 ? std::move(limit2->t_avg) : AstNode::mkconst_int(yystack_[2].location, 0, true)));
		cell->children.back()->str = "\\T_LIMIT2_TYP";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[2].location, AST_PARASET, limit2 ? std::move(limit2->t_max) : AstNode::mkconst_int(yystack_[2].location, 0, true)));
		cell->children.back()->str = "\\T_LIMIT2_MAX";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[11].location, AST_PARASET, std::move(src_pen)));
		cell->children.back()->str = "\\SRC_PEN";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[11].location, AST_PARASET, std::move(src_pol)));
		cell->children.back()->str = "\\SRC_POL";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[11].location, AST_PARASET, std::move(dst_pen)));
		cell->children.back()->str = "\\DST_PEN";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[7].location, AST_PARASET, std::move(dst_pol)));
		cell->children.back()->str = "\\DST_POL";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[9].location, AST_ARGUMENT, std::move(src_en)));
		cell->children.back()->str = "\\SRC_EN";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[10].location, AST_ARGUMENT, std::move(src_expr)));
		cell->children.back()->str = "\\SRC";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[5].location, AST_ARGUMENT, std::move(dst_en)));
		cell->children.back()->str = "\\DST_EN";

		cell->children.push_back(std::make_unique<AstNode>(yystack_[6].location, AST_ARGUMENT, std::move(dst_expr)));
		cell->children.back()->str = "\\DST";
	}
#line 2624 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 245: // specify_opt_triple: "','" specify_triple
#line 1480 "frontends/verilog/verilog_parser.y"
                                 {
		yylhs.value.as < specify_triple_ptr_t > () = std::move(yystack_[0].value.as < specify_triple_ptr_t > ());
	}
#line 2632 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 246: // specify_opt_triple: %empty
#line 1483 "frontends/verilog/verilog_parser.y"
               {
		yylhs.value.as < specify_triple_ptr_t > () = nullptr;
	}
#line 2640 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 247: // specify_if: TOK_IF "'('" expr "')'"
#line 1488 "frontends/verilog/verilog_parser.y"
                                          {
		yylhs.value.as < ast_t > () = std::move(yystack_[1].value.as < ast_t > ());
	}
#line 2648 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 248: // specify_if: %empty
#line 1491 "frontends/verilog/verilog_parser.y"
               {
		yylhs.value.as < ast_t > () = nullptr;
	}
#line 2656 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 249: // specify_condition: TOK_SPECIFY_AND expr
#line 1496 "frontends/verilog/verilog_parser.y"
                             {
		yylhs.value.as < ast_t > () = std::move(yystack_[0].value.as < ast_t > ());
	}
#line 2664 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 250: // specify_condition: %empty
#line 1499 "frontends/verilog/verilog_parser.y"
               {
		yylhs.value.as < ast_t > () = nullptr;
	}
#line 2672 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 251: // specify_target: expr
#line 1504 "frontends/verilog/verilog_parser.y"
             {
		yylhs.value.as < specify_target_ptr_t > () = std::make_unique<struct specify_target>();
		yylhs.value.as < specify_target_ptr_t > ()->polarity_op = 0;
		yylhs.value.as < specify_target_ptr_t > ()->dst = std::move(yystack_[0].value.as < ast_t > ());
		yylhs.value.as < specify_target_ptr_t > ()->dat = nullptr;
	}
#line 2683 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 252: // specify_target: "'('" expr "':'" expr "')'"
#line 1510 "frontends/verilog/verilog_parser.y"
                                               {
		yylhs.value.as < specify_target_ptr_t > () = std::make_unique<struct specify_target>();
		yylhs.value.as < specify_target_ptr_t > ()->polarity_op = 0;
		yylhs.value.as < specify_target_ptr_t > ()->dst = std::move(yystack_[3].value.as < ast_t > ());
		yylhs.value.as < specify_target_ptr_t > ()->dat = std::move(yystack_[1].value.as < ast_t > ());
	}
#line 2694 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 253: // specify_target: "'('" expr TOK_NEG_INDEXED expr "')'"
#line 1516 "frontends/verilog/verilog_parser.y"
                                                       {
		yylhs.value.as < specify_target_ptr_t > () = std::make_unique<struct specify_target>();
		yylhs.value.as < specify_target_ptr_t > ()->polarity_op = '-';
		yylhs.value.as < specify_target_ptr_t > ()->dst = std::move(yystack_[3].value.as < ast_t > ());
		yylhs.value.as < specify_target_ptr_t > ()->dat = std::move(yystack_[1].value.as < ast_t > ());
	}
#line 2705 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 254: // specify_target: "'('" expr TOK_POS_INDEXED expr "')'"
#line 1522 "frontends/verilog/verilog_parser.y"
                                                       {
		yylhs.value.as < specify_target_ptr_t > () = std::make_unique<struct specify_target>();
		yylhs.value.as < specify_target_ptr_t > ()->polarity_op = '+';
		yylhs.value.as < specify_target_ptr_t > ()->dst = std::move(yystack_[3].value.as < ast_t > ());
		yylhs.value.as < specify_target_ptr_t > ()->dat = std::move(yystack_[1].value.as < ast_t > ());
	}
#line 2716 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 255: // specify_edge: TOK_POSEDGE
#line 1530 "frontends/verilog/verilog_parser.y"
                    { yylhs.value.as < ch_t > () = 'p'; }
#line 2722 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 256: // specify_edge: TOK_NEGEDGE
#line 1531 "frontends/verilog/verilog_parser.y"
                    { yylhs.value.as < ch_t > () = 'n'; }
#line 2728 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 257: // specify_edge: %empty
#line 1532 "frontends/verilog/verilog_parser.y"
               { yylhs.value.as < ch_t > () = 0; }
#line 2734 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 258: // specify_rise_fall: specify_triple
#line 1535 "frontends/verilog/verilog_parser.y"
                       {
		yylhs.value.as < specify_rise_fall_ptr_t > () = std::make_unique<struct specify_rise_fall>();
		yylhs.value.as < specify_rise_fall_ptr_t > ()->fall.t_min = yystack_[0].value.as < specify_triple_ptr_t > ()->t_min->clone();
		yylhs.value.as < specify_rise_fall_ptr_t > ()->fall.t_avg = yystack_[0].value.as < specify_triple_ptr_t > ()->t_avg->clone();
		yylhs.value.as < specify_rise_fall_ptr_t > ()->fall.t_max = yystack_[0].value.as < specify_triple_ptr_t > ()->t_max->clone();
		yylhs.value.as < specify_rise_fall_ptr_t > ()->rise = std::move(*yystack_[0].value.as < specify_triple_ptr_t > ());
	}
#line 2746 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 259: // specify_rise_fall: "'('" specify_triple "','" specify_triple "')'"
#line 1542 "frontends/verilog/verilog_parser.y"
                                                                      {
		yylhs.value.as < specify_rise_fall_ptr_t > () = std::make_unique<struct specify_rise_fall>();
		yylhs.value.as < specify_rise_fall_ptr_t > ()->rise = std::move(*yystack_[3].value.as < specify_triple_ptr_t > ());
		yylhs.value.as < specify_rise_fall_ptr_t > ()->fall = std::move(*yystack_[1].value.as < specify_triple_ptr_t > ());
	}
#line 2756 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 260: // specify_rise_fall: "'('" specify_triple "','" specify_triple "','" specify_triple "')'"
#line 1547 "frontends/verilog/verilog_parser.y"
                                                                                               {
		yylhs.value.as < specify_rise_fall_ptr_t > () = std::make_unique<struct specify_rise_fall>();
		yylhs.value.as < specify_rise_fall_ptr_t > ()->rise = std::move(*yystack_[5].value.as < specify_triple_ptr_t > ());
		yylhs.value.as < specify_rise_fall_ptr_t > ()->fall = std::move(*yystack_[3].value.as < specify_triple_ptr_t > ());
		warn_at_loc(yylhs.location, "Path delay expressions beyond rise/fall not currently supported. Ignoring.");
	}
#line 2767 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 261: // specify_rise_fall: "'('" specify_triple "','" specify_triple "','" specify_triple "','" specify_triple "','" specify_triple "','" specify_triple "')'"
#line 1553 "frontends/verilog/verilog_parser.y"
                                                                                                                                                                          {
		yylhs.value.as < specify_rise_fall_ptr_t > () = std::make_unique<struct specify_rise_fall>();
		yylhs.value.as < specify_rise_fall_ptr_t > ()->rise = std::move(*yystack_[11].value.as < specify_triple_ptr_t > ());
		yylhs.value.as < specify_rise_fall_ptr_t > ()->fall = std::move(*yystack_[9].value.as < specify_triple_ptr_t > ());
		warn_at_loc(yylhs.location, "Path delay expressions beyond rise/fall not currently supported. Ignoring.");
	}
#line 2778 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 262: // specify_rise_fall: "'('" specify_triple "','" specify_triple "','" specify_triple "','" specify_triple "','" specify_triple "','" specify_triple "','" specify_triple "','" specify_triple "','" specify_triple "','" specify_triple "','" specify_triple "','" specify_triple "')'"
#line 1559 "frontends/verilog/verilog_parser.y"
                                                                                                                                                                                                                                                                                                                                {
		yylhs.value.as < specify_rise_fall_ptr_t > () = std::make_unique<struct specify_rise_fall>();
		yylhs.value.as < specify_rise_fall_ptr_t > ()->rise = std::move(*yystack_[23].value.as < specify_triple_ptr_t > ());
		yylhs.value.as < specify_rise_fall_ptr_t > ()->fall = std::move(*yystack_[21].value.as < specify_triple_ptr_t > ());
		warn_at_loc(yylhs.location, "Path delay expressions beyond rise/fall not currently supported. Ignoring.");
	}
#line 2789 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 263: // specify_triple: expr
#line 1567 "frontends/verilog/verilog_parser.y"
             {
		yylhs.value.as < specify_triple_ptr_t > () = std::make_unique<struct specify_triple>();
		yylhs.value.as < specify_triple_ptr_t > ()->t_avg = yystack_[0].value.as < ast_t > ()->clone();
		yylhs.value.as < specify_triple_ptr_t > ()->t_max = yystack_[0].value.as < ast_t > ()->clone();
		yylhs.value.as < specify_triple_ptr_t > ()->t_min = std::move(yystack_[0].value.as < ast_t > ());
	}
#line 2800 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 264: // specify_triple: expr "':'" expr "':'" expr
#line 1573 "frontends/verilog/verilog_parser.y"
                                       {
		yylhs.value.as < specify_triple_ptr_t > () = std::make_unique<struct specify_triple>();
		yylhs.value.as < specify_triple_ptr_t > ()->t_min = std::move(yystack_[4].value.as < ast_t > ());
		yylhs.value.as < specify_triple_ptr_t > ()->t_avg = std::move(yystack_[2].value.as < ast_t > ());
		yylhs.value.as < specify_triple_ptr_t > ()->t_max = std::move(yystack_[0].value.as < ast_t > ());
	}
#line 2811 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 337: // ignspec_constant_expression: expr
#line 1736 "frontends/verilog/verilog_parser.y"
             {  }
#line 2817 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 338: // ignspec_expr: expr
#line 1739 "frontends/verilog/verilog_parser.y"
             {  }
#line 2823 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 339: // ignspec_expr: expr "':'" expr "':'" expr
#line 1740 "frontends/verilog/verilog_parser.y"
                                       {
	}
#line 2830 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 340: // $@34: %empty
#line 1744 "frontends/verilog/verilog_parser.y"
               {  }
#line 2836 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 341: // ignspec_id: TOK_ID $@34 range_or_multirange
#line 1745 "frontends/verilog/verilog_parser.y"
                            {  }
#line 2842 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 342: // param_signed: TOK_SIGNED
#line 1750 "frontends/verilog/verilog_parser.y"
                   {
		extra->astbuf1->is_signed = true;
	}
#line 2850 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 343: // param_signed: TOK_UNSIGNED
#line 1752 "frontends/verilog/verilog_parser.y"
                         {
		extra->astbuf1->is_signed = false;
	}
#line 2858 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 345: // param_integer: type_atom
#line 1757 "frontends/verilog/verilog_parser.y"
                  {
		extra->astbuf1->is_reg = false;
	}
#line 2866 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 346: // param_real: TOK_REAL
#line 1762 "frontends/verilog/verilog_parser.y"
                 {
		extra->astbuf1->children.push_back(std::make_unique<AstNode>(yylhs.location, AST_REALVALUE));
	}
#line 2874 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 347: // param_range: range
#line 1767 "frontends/verilog/verilog_parser.y"
              {
		if (yystack_[0].value.as < ast_t > () != nullptr) {
			extra->astbuf1->children.push_back(std::move(yystack_[0].value.as < ast_t > ()));
		}
	}
#line 2884 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 349: // param_range_type: type_vec param_signed
#line 1775 "frontends/verilog/verilog_parser.y"
                              {
		addRange(extra->astbuf1.get(), 0, 0);
	}
#line 2892 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 350: // param_range_type: type_vec param_signed non_opt_range
#line 1778 "frontends/verilog/verilog_parser.y"
                                            {
		extra->astbuf1->children.push_back(std::move(yystack_[0].value.as < ast_t > ()));
	}
#line 2900 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 356: // param_type: hierarchical_type_id
#line 1785 "frontends/verilog/verilog_parser.y"
                             {
		extra->addWiretypeNode(yystack_[0].value.as < string_t > ().get(), extra->astbuf1.get());
	}
#line 2908 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 357: // $@35: %empty
#line 1790 "frontends/verilog/verilog_parser.y"
                           {
		extra->astbuf1 = std::make_unique<AstNode>(yylhs.location, AST_PARAMETER);
		extra->astbuf1->children.push_back(AstNode::mkconst_int(yylhs.location, 0, true));
		append_attr(extra->astbuf1.get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 2918 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 358: // param_decl: attr TOK_PARAMETER $@35 param_type param_decl_list "';'"
#line 1794 "frontends/verilog/verilog_parser.y"
                                                 {
		(void)extra->astbuf1.reset();
	}
#line 2926 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 359: // $@36: %empty
#line 1799 "frontends/verilog/verilog_parser.y"
                            {
		extra->astbuf1 = std::make_unique<AstNode>(yylhs.location, AST_LOCALPARAM);
		extra->astbuf1->children.push_back(AstNode::mkconst_int(yylhs.location, 0, true));
		append_attr(extra->astbuf1.get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 2936 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 360: // localparam_decl: attr TOK_LOCALPARAM $@36 param_type param_decl_list "';'"
#line 1803 "frontends/verilog/verilog_parser.y"
                                                 {
		(void)extra->astbuf1.reset();
	}
#line 2944 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 363: // single_param_decl: single_param_decl_ident "'='" expr
#line 1811 "frontends/verilog/verilog_parser.y"
                                            {
		AstNode *decl = extra->ast_stack.back()->children.back().get();
		log_assert(decl->type == AST_PARAMETER || decl->type == AST_LOCALPARAM);
		decl->children[0] = std::move(yystack_[0].value.as < ast_t > ());
	}
#line 2954 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 364: // single_param_decl: single_param_decl_ident
#line 1816 "frontends/verilog/verilog_parser.y"
                                {
		AstNode *decl = extra->ast_stack.back()->children.back().get();
		if (decl->type != AST_PARAMETER) {
			log_assert(decl->type == AST_LOCALPARAM);
			err_at_loc(yystack_[0].location, "localparam initialization is missing!");
		}
		if (!mode->sv)
			err_at_loc(yystack_[0].location, "Parameter defaults can only be omitted in SystemVerilog mode!");
		decl->children.erase(decl->children.begin());
	}
#line 2969 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 365: // single_param_decl_ident: TOK_ID
#line 1828 "frontends/verilog/verilog_parser.y"
               {
		std::unique_ptr<AstNode> node_owned;
		if (extra->astbuf1 == nullptr) {
			if (!mode->sv)
				err_at_loc(yystack_[0].location, "In pure Verilog (not SystemVerilog), parameter/localparam with an initializer must use the parameter/localparam keyword");
			node_owned = std::make_unique<AstNode>(yylhs.location, AST_PARAMETER);
			node_owned->children.push_back(AstNode::mkconst_int(yylhs.location, 0, true));
		} else {
			node_owned = extra->astbuf1->clone();
		}
		node_owned->str = *yystack_[0].value.as < string_t > ();
		auto node = node_owned.get();
		extra->ast_stack.back()->children.push_back(std::move(node_owned));
		SET_AST_NODE_LOC(node, yystack_[0].location, yystack_[0].location);
	}
#line 2989 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 369: // single_defparam_decl: range rvalue "'='" expr
#line 1851 "frontends/verilog/verilog_parser.y"
                                 {
		auto node = std::make_unique<AstNode>(yylhs.location, AST_DEFPARAM);
		node->children.push_back(std::move(yystack_[2].value.as < ast_t > ()));
		node->children.push_back(std::move(yystack_[0].value.as < ast_t > ()));
		if (yystack_[3].value.as < ast_t > () != nullptr)
			node->children.push_back(std::move(yystack_[3].value.as < ast_t > ()));
		extra->ast_stack.back()->children.push_back(std::move(node));
	}
#line 3002 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 370: // $@37: %empty
#line 1864 "frontends/verilog/verilog_parser.y"
                    {
		static int enum_count;
		// create parent node for the enum
		extra->astbuf2 = std::make_unique<AstNode>(yylhs.location, AST_ENUM);
		extra->astbuf2->str = std::string("$enum");
		extra->astbuf2->str += std::to_string(enum_count++);
		log_assert(!extra->cell_hack);
		extra->cell_hack = extra->astbuf2.get();
		extra->ast_stack.back()->children.push_back(std::move(extra->astbuf2));
		// create the template for the names
		extra->astbuf1 = std::make_unique<AstNode>(yylhs.location, AST_ENUM_ITEM);
		extra->astbuf1->children.push_back(AstNode::mkconst_int(yylhs.location, 0, true));
	}
#line 3020 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 371: // enum_type: TOK_ENUM $@37 enum_base_type "'{'" enum_name_list optional_comma "'}'"
#line 1876 "frontends/verilog/verilog_parser.y"
                                                                           {
		// create template for the enum vars
		log_assert(extra->cell_hack);
		auto tnode_owned = extra->astbuf1->clone();
		auto* tnode = tnode_owned.get();
		extra->astbuf1 = std::move(tnode_owned);
		tnode->type = AST_WIRE;
		tnode->attributes[ID::enum_type] = AstNode::mkconst_str(yylhs.location, extra->cell_hack->str);
		extra->cell_hack = nullptr;
		// drop constant but keep any range
		tnode->children.erase(tnode->children.begin());
		yylhs.value.as < ast_t > () = extra->astbuf1->clone();
	}
#line 3038 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 373: // enum_base_type: type_vec type_signing range
#line 1891 "frontends/verilog/verilog_parser.y"
                                        { if (yystack_[0].value.as < ast_t > ()) extra->astbuf1->children.push_back(std::move(yystack_[0].value.as < ast_t > ())); }
#line 3044 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 374: // enum_base_type: %empty
#line 1892 "frontends/verilog/verilog_parser.y"
                                        { extra->astbuf1->is_reg = true; addRange(extra->astbuf1.get()); }
#line 3050 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 375: // type_atom: integer_atom_type
#line 1896 "frontends/verilog/verilog_parser.y"
                          {
		extra->astbuf1->is_reg = true;
		extra->astbuf1->is_signed = true;
		addRange(extra->astbuf1.get(), yystack_[0].value.as < integer_t > () - 1, 0);
	}
#line 3060 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 376: // type_vec: TOK_REG
#line 1902 "frontends/verilog/verilog_parser.y"
                                { extra->astbuf1->is_reg   = true; }
#line 3066 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 377: // type_vec: TOK_LOGIC
#line 1903 "frontends/verilog/verilog_parser.y"
                                { extra->astbuf1->is_logic = true; }
#line 3072 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 378: // type_signing: TOK_SIGNED
#line 1907 "frontends/verilog/verilog_parser.y"
                                { extra->astbuf1->is_signed = true; }
#line 3078 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 379: // type_signing: TOK_UNSIGNED
#line 1908 "frontends/verilog/verilog_parser.y"
                                { extra->astbuf1->is_signed = false; }
#line 3084 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 383: // enum_name_decl: TOK_ID opt_enum_init
#line 1917 "frontends/verilog/verilog_parser.y"
                             {
		// put in fn
		log_assert((bool)extra->astbuf1);
		log_assert((bool)extra->cell_hack);
		auto node = extra->astbuf1->clone();
		node->str = *yystack_[1].value.as < string_t > ();
		SET_AST_NODE_LOC(node.get(), yystack_[1].location, yystack_[1].location);
		node->children[0] = yystack_[0].value.as < ast_t > () ? std::move(yystack_[0].value.as < ast_t > ()) : std::make_unique<AstNode>(yylhs.location, AST_NONE);
		extra->cell_hack->children.push_back(std::move(node));
	}
#line 3099 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 384: // opt_enum_init: "'='" basic_expr
#line 1930 "frontends/verilog/verilog_parser.y"
                                        { yylhs.value.as < ast_t > () = std::move(yystack_[0].value.as < ast_t > ()); }
#line 3105 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 385: // opt_enum_init: %empty
#line 1931 "frontends/verilog/verilog_parser.y"
                                { yylhs.value.as < ast_t > () = nullptr; }
#line 3111 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 388: // enum_var: TOK_ID
#line 1939 "frontends/verilog/verilog_parser.y"
                 {
		log_assert((bool)extra->astbuf1);
		auto node = extra->astbuf1->clone();
		node->str = *yystack_[0].value.as < string_t > ();
		SET_AST_NODE_LOC(node.get(), yystack_[0].location, yystack_[0].location);
		node->is_enum = true;
		extra->ast_stack.back()->children.push_back(std::move(node));
	}
#line 3124 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 389: // enum_decl: enum_type enum_var_list "';'"
#line 1949 "frontends/verilog/verilog_parser.y"
                                                        {  }
#line 3130 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 390: // $@38: %empty
#line 1957 "frontends/verilog/verilog_parser.y"
                         {
		append_attr(extra->astbuf2.get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 3138 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 391: // struct_decl: attr struct_type $@38 struct_var_list "';'"
#line 1959 "frontends/verilog/verilog_parser.y"
                                      {
		(void)extra->astbuf2.reset();
	}
#line 3146 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 392: // $@39: %empty
#line 1965 "frontends/verilog/verilog_parser.y"
                     {
		extra->astbuf2 = std::move(yystack_[0].value.as < ast_t > ());
		extra->astbuf2->is_custom_type = true;
	}
#line 3155 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 393: // struct_type: struct_union $@39 struct_body
#line 1968 "frontends/verilog/verilog_parser.y"
                      {
		yylhs.value.as < ast_t > () = extra->astbuf2->clone();
	}
#line 3163 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 394: // struct_union: TOK_STRUCT
#line 1974 "frontends/verilog/verilog_parser.y"
                                { yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_STRUCT); }
#line 3169 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 395: // struct_union: TOK_UNION
#line 1975 "frontends/verilog/verilog_parser.y"
                                { yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_UNION); }
#line 3175 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 398: // opt_packed: %empty
#line 1983 "frontends/verilog/verilog_parser.y"
               { err_at_loc(yylhs.location, "Only PACKED supported at this time"); }
#line 3181 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 399: // opt_signed_struct: TOK_SIGNED
#line 1986 "frontends/verilog/verilog_parser.y"
                                { extra->astbuf2->is_signed = true; }
#line 3187 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 400: // opt_signed_struct: TOK_UNSIGNED
#line 1987 "frontends/verilog/verilog_parser.y"
                                { extra->astbuf2->is_signed = false; }
#line 3193 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 404: // struct_member: struct_member_type member_name_list "';'"
#line 1995 "frontends/verilog/verilog_parser.y"
                                                                        { (void)extra->astbuf1.reset(); }
#line 3199 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 407: // $@40: %empty
#line 2003 "frontends/verilog/verilog_parser.y"
                    {
		extra->astbuf1->str = yystack_[0].value.as < string_t > ()->substr(1);
		extra->astbuf3 = extra->astbuf1->clone();
		log_assert(!extra->member_hack);
		extra->member_hack = extra->astbuf3.get();
		SET_AST_NODE_LOC(extra->member_hack, yystack_[0].location, yystack_[0].location);
		extra->astbuf2->children.push_back(std::move(extra->astbuf3));
	}
#line 3212 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 408: // member_name: TOK_ID $@40 range
#line 2010 "frontends/verilog/verilog_parser.y"
                {
		log_assert((bool)extra->member_hack);
		if (yystack_[0].value.as < ast_t > ()) extra->member_hack->children.push_back(std::move(yystack_[0].value.as < ast_t > ()));
		extra->member_hack = nullptr;
	}
#line 3222 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 409: // $@41: %empty
#line 2017 "frontends/verilog/verilog_parser.y"
                    { extra->astbuf1 = std::make_unique<AstNode>(yylhs.location, AST_STRUCT_ITEM); }
#line 3228 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 411: // member_type_token: member_type range_or_multirange
#line 2021 "frontends/verilog/verilog_parser.y"
                                        {
		auto range = checkRange(extra->astbuf1.get(), std::move(yystack_[0].value.as < ast_t > ()));
		if (range)
			extra->astbuf1->children.push_back(std::move(range));
	}
#line 3238 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 412: // $@42: %empty
#line 2026 "frontends/verilog/verilog_parser.y"
          {
		(void)extra->astbuf1.reset();
	}
#line 3246 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 413: // $@43: %empty
#line 2028 "frontends/verilog/verilog_parser.y"
                       {
			// stash state on extra->ast_stack
			// sketchy!
			extra->ast_stack.push_back(extra->astbuf2.release());
			extra->astbuf2 = std::move(yystack_[0].value.as < ast_t > ());
		}
#line 3257 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 414: // member_type_token: $@42 struct_union $@43 struct_body
#line 2033 "frontends/verilog/verilog_parser.y"
                               {
			extra->astbuf1 = std::move(extra->astbuf2);
			// recover state
			extra->astbuf2.reset(extra->ast_stack.back());
			extra->ast_stack.pop_back();
		}
#line 3268 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 417: // member_type: hierarchical_type_id
#line 2043 "frontends/verilog/verilog_parser.y"
                               { extra->addWiretypeNode(yystack_[0].value.as < string_t > ().get(), extra->astbuf1.get()); }
#line 3274 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 420: // struct_var: TOK_ID
#line 2051 "frontends/verilog/verilog_parser.y"
                {
		auto var_node = extra->astbuf2->clone();
		var_node->str = *yystack_[0].value.as < string_t > ();
		SET_AST_NODE_LOC(var_node.get(), yystack_[0].location, yystack_[0].location);
		extra->ast_stack.back()->children.push_back(std::move(var_node));
	}
#line 3285 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 421: // $@44: %empty
#line 2063 "frontends/verilog/verilog_parser.y"
                                           {
		extra->albuf = std::move(yystack_[2].value.as < al_t > ());
		extra->astbuf1 = std::move(yystack_[1].value.as < ast_t > ());
		extra->astbuf2 = checkRange(extra->astbuf1.get(), std::move(yystack_[0].value.as < ast_t > ()));
	}
#line 3295 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 422: // $@45: %empty
#line 2067 "frontends/verilog/verilog_parser.y"
                               {
		(void)extra->astbuf1.reset();
		if (extra->astbuf2 != nullptr)
			(void)extra->astbuf2.reset();
		extra->albuf.reset();
	}
#line 3306 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 424: // $@46: %empty
#line 2073 "frontends/verilog/verilog_parser.y"
                                {
		extra->ast_stack.back()->children.push_back(std::make_unique<AstNode>(yylhs.location, AST_WIRE));
		extra->ast_stack.back()->children.back()->str = *yystack_[0].value.as < string_t > ();
		append_attr(extra->ast_stack.back()->children.back().get(), std::move(yystack_[2].value.as < al_t > ()));
		extra->ast_stack.back()->children.push_back(std::make_unique<AstNode>(yylhs.location, AST_ASSIGN, std::make_unique<AstNode>(yylhs.location, AST_IDENTIFIER), AstNode::mkconst_int(yylhs.location, 0, false, 1)));
		extra->ast_stack.back()->children.back()->children[0]->str = *yystack_[0].value.as < string_t > ();
	}
#line 3318 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 426: // $@47: %empty
#line 2080 "frontends/verilog/verilog_parser.y"
                                {
		extra->ast_stack.back()->children.push_back(std::make_unique<AstNode>(yylhs.location, AST_WIRE));
		extra->ast_stack.back()->children.back()->str = *yystack_[0].value.as < string_t > ();
		append_attr(extra->ast_stack.back()->children.back().get(), std::move(yystack_[2].value.as < al_t > ()));
		extra->ast_stack.back()->children.push_back(std::make_unique<AstNode>(yylhs.location, AST_ASSIGN, std::make_unique<AstNode>(yylhs.location, AST_IDENTIFIER), AstNode::mkconst_int(yylhs.location, 1, false, 1)));
		extra->ast_stack.back()->children.back()->children[0]->str = *yystack_[0].value.as < string_t > ();
	}
#line 3330 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 429: // opt_supply_wires: opt_supply_wires "','" TOK_ID
#line 2090 "frontends/verilog/verilog_parser.y"
                                          {
		auto wire_node = extra->ast_stack.back()->children.at(GetSize(extra->ast_stack.back()->children)-2)->clone();
		auto assign_node = extra->ast_stack.back()->children.at(GetSize(extra->ast_stack.back()->children)-1)->clone();
		wire_node->str = *yystack_[0].value.as < string_t > ();
		assign_node->children[0]->str = *yystack_[0].value.as < string_t > ();
		extra->ast_stack.back()->children.push_back(std::move(wire_node));
		extra->ast_stack.back()->children.push_back(std::move(assign_node));
	}
#line 3343 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 432: // wire_name_and_opt_assign: wire_name
#line 2103 "frontends/verilog/verilog_parser.y"
                  {
		bool attr_anyconst = false;
		bool attr_anyseq = false;
		bool attr_allconst = false;
		bool attr_allseq = false;
		if (extra->ast_stack.back()->children.back()->get_bool_attribute(ID::anyconst)) {
			extra->ast_stack.back()->children.back()->attributes.erase(ID::anyconst);
			attr_anyconst = true;
		}
		if (extra->ast_stack.back()->children.back()->get_bool_attribute(ID::anyseq)) {
			extra->ast_stack.back()->children.back()->attributes.erase(ID::anyseq);
			attr_anyseq = true;
		}
		if (extra->ast_stack.back()->children.back()->get_bool_attribute(ID::allconst)) {
			extra->ast_stack.back()->children.back()->attributes.erase(ID::allconst);
			attr_allconst = true;
		}
		if (extra->ast_stack.back()->children.back()->get_bool_attribute(ID::allseq)) {
			extra->ast_stack.back()->children.back()->attributes.erase(ID::allseq);
			attr_allseq = true;
		}
		if (extra->current_wire_rand || attr_anyconst || attr_anyseq || attr_allconst || attr_allseq) {
			auto wire = std::make_unique<AstNode>(yylhs.location, AST_IDENTIFIER);
			auto fcall = std::make_unique<AstNode>(yylhs.location, AST_FCALL);
			wire->str = extra->ast_stack.back()->children.back()->str;
			fcall->str = extra->current_wire_const ? "\\$anyconst" : "\\$anyseq";
			if (attr_anyconst)
				fcall->str = "\\$anyconst";
			if (attr_anyseq)
				fcall->str = "\\$anyseq";
			if (attr_allconst)
				fcall->str = "\\$allconst";
			if (attr_allseq)
				fcall->str = "\\$allseq";
			fcall->attributes[ID::reg] = AstNode::mkconst_str(yylhs.location, RTLIL::unescape_id(wire->str));
			extra->ast_stack.back()->children.push_back(std::make_unique<AstNode>(yylhs.location, AST_ASSIGN, std::move(wire), std::move(fcall)));
		}
	}
#line 3386 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 433: // wire_name_and_opt_assign: wire_name "'='" expr
#line 2141 "frontends/verilog/verilog_parser.y"
                              {
		auto wire = std::make_unique<AstNode>(yylhs.location, AST_IDENTIFIER);
		wire->str = extra->ast_stack.back()->children.back()->str;
		if (extra->astbuf1->is_input) {
			extra->astbuf1->attributes[ID::defaultvalue] = std::move(yystack_[0].value.as < ast_t > ());
		}
		else if (extra->astbuf1->is_reg || extra->astbuf1->is_logic){
			auto assign = std::make_unique<AstNode>(yylhs.location, AST_ASSIGN_LE, std::move(wire), std::move(yystack_[0].value.as < ast_t > ()));
			SET_AST_NODE_LOC(assign.get(), yystack_[2].location, yystack_[0].location);
			auto block = std::make_unique<AstNode>(yylhs.location, AST_BLOCK, std::move(assign));
			SET_AST_NODE_LOC(block.get(), yystack_[2].location, yystack_[0].location);
			auto init = std::make_unique<AstNode>(yylhs.location, AST_INITIAL, std::move(block));
			SET_AST_NODE_LOC(init.get(), yystack_[2].location, yystack_[0].location);

			extra->ast_stack.back()->children.push_back(std::move(init));
		}
		else {
			auto assign = std::make_unique<AstNode>(yylhs.location, AST_ASSIGN, std::move(wire), std::move(yystack_[0].value.as < ast_t > ()));
			SET_AST_NODE_LOC(assign.get(), yystack_[2].location, yystack_[0].location);
			extra->ast_stack.back()->children.push_back(std::move(assign));
		}

	}
#line 3414 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 434: // wire_name: TOK_ID range_or_multirange
#line 2166 "frontends/verilog/verilog_parser.y"
                                   {
		if (extra->astbuf1 == nullptr)
			err_at_loc(yystack_[1].location, "Internal error - should not happen - no AST_WIRE node.");
		auto node = extra->astbuf1->clone();
		node->str = *yystack_[1].value.as < string_t > ();
		append_attr_clone(node.get(), extra->albuf);
		if (extra->astbuf2 != nullptr)
			node->children.push_back(extra->astbuf2->clone());
		if (yystack_[0].value.as < ast_t > () != nullptr) {
			if (node->is_input || node->is_output)
				err_at_loc(yystack_[0].location, "input/output/inout ports cannot have unpacked dimensions.");
			if (!extra->astbuf2 && !node->is_custom_type) {
				addRange(node.get(), 0, 0, false);
			}
			rewriteAsMemoryNode(node.get(), std::move(yystack_[0].value.as < ast_t > ()));
		}
		if (extra->current_function_or_task) {
			if (node->is_input || node->is_output)
				node->port_id = extra->current_function_or_task_port_id++;
		} else if (extra->ast_stack.back()->type == AST_GENBLOCK) {
			if (node->is_input || node->is_output)
				err_at_loc(yystack_[1].location, "Cannot declare module port `%s' within a generate block.", *yystack_[1].value.as < string_t > ());
		} else {
			if (extra->do_not_require_port_stubs && (node->is_input || node->is_output) && extra->port_stubs.count(*yystack_[1].value.as < string_t > ()) == 0) {
				extra->port_stubs[*yystack_[1].value.as < string_t > ()] = ++extra->port_counter;
			}
			if (extra->port_stubs.count(*yystack_[1].value.as < string_t > ()) != 0) {
				if (!node->is_input && !node->is_output)
					err_at_loc(yystack_[1].location, "Module port `%s' is neither input nor output.", *yystack_[1].value.as < string_t > ());
				if (node->is_reg && node->is_input && !node->is_output && !mode->sv)
					err_at_loc(yystack_[1].location, "Input port `%s' is declared as register.", *yystack_[1].value.as < string_t > ());
				node->port_id = extra->port_stubs[*yystack_[1].value.as < string_t > ()];
				extra->port_stubs.erase(*yystack_[1].value.as < string_t > ());
			} else {
				if (node->is_input || node->is_output)
					err_at_loc(yystack_[1].location, "Module port `%s' is not declared in module header.", *yystack_[1].value.as < string_t > ());
			}
		}
		//FIXME: for some reason, TOK_ID has a location which always points to one column *after* the real last column...
		SET_AST_NODE_LOC(node.get(), yystack_[1].location, yystack_[1].location);
		extra->ast_stack.back()->children.push_back(std::move(node));

	}
#line 3462 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 438: // assign_expr: lvalue "'='" expr
#line 2217 "frontends/verilog/verilog_parser.y"
                           {
		AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_ASSIGN, std::move(yystack_[2].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ())));
		SET_AST_NODE_LOC(node, yylhs.location, yylhs.location);
	}
#line 3471 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 439: // type_name: TOK_ID
#line 2222 "frontends/verilog/verilog_parser.y"
                  { yylhs.value.as < string_t > () = std::move(yystack_[0].value.as < string_t > ()); }
#line 3477 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 440: // type_name: TOK_USER_TYPE
#line 2223 "frontends/verilog/verilog_parser.y"
                                { if (extra->isInLocalScope(yystack_[0].value.as < string_t > ().get())) err_at_loc(yystack_[0].location, "Duplicate declaration of TYPEDEF '%s'", yystack_[0].value.as < string_t > ()->c_str()+1); yylhs.value.as < string_t > () = std::move(yystack_[0].value.as < string_t > ()); }
#line 3483 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 441: // typedef_decl: TOK_TYPEDEF typedef_base_type range_or_multirange type_name range_or_multirange "';'"
#line 2227 "frontends/verilog/verilog_parser.y"
                                                                                                    {
		extra->astbuf1 = std::move(yystack_[4].value.as < ast_t > ());
		extra->astbuf2 = checkRange(extra->astbuf1.get(), std::move(yystack_[3].value.as < ast_t > ()));
		bool has_a_range = (bool)extra->astbuf2;
		if (extra->astbuf2) {
			extra->astbuf1->children.push_back(std::move(extra->astbuf2));
		}

		if (yystack_[1].value.as < ast_t > () != nullptr) {
			if (!has_a_range && !extra->astbuf1->is_custom_type) {
				addRange(extra->astbuf1.get(), 0, 0, false);
			}
			rewriteAsMemoryNode(extra->astbuf1.get(), std::move(yystack_[1].value.as < ast_t > ()));
		}
		extra->addTypedefNode(yystack_[2].value.as < string_t > ().get(), std::move(extra->astbuf1)); }
#line 3503 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 442: // typedef_decl: TOK_TYPEDEF enum_struct_type type_name "';'"
#line 2242 "frontends/verilog/verilog_parser.y"
                                                               { extra->addTypedefNode(yystack_[1].value.as < string_t > ().get(), std::move(yystack_[2].value.as < ast_t > ())); }
#line 3509 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 443: // typedef_base_type: hierarchical_type_id
#line 2246 "frontends/verilog/verilog_parser.y"
                             {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_WIRE);
		yylhs.value.as < ast_t > ()->is_logic = true;
		extra->addWiretypeNode(yystack_[0].value.as < string_t > ().get(), yylhs.value.as < ast_t > ().get());
	}
#line 3519 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 444: // typedef_base_type: integer_vector_type opt_signedness_default_unsigned
#line 2251 "frontends/verilog/verilog_parser.y"
                                                            {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_WIRE);
		if (yystack_[1].value.as < integer_t > () == token::TOK_REG) {
			yylhs.value.as < ast_t > ()->is_reg = true;
		} else {
			yylhs.value.as < ast_t > ()->is_logic = true;
		}
		yylhs.value.as < ast_t > ()->is_signed = yystack_[0].value.as < boolean_t > ();
	}
#line 3533 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 445: // typedef_base_type: integer_atom_type opt_signedness_default_signed
#line 2260 "frontends/verilog/verilog_parser.y"
                                                        {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_WIRE);
		yylhs.value.as < ast_t > ()->is_logic = true;
		yylhs.value.as < ast_t > ()->is_signed = yystack_[0].value.as < boolean_t > ();
		yylhs.value.as < ast_t > ()->range_left = yystack_[1].value.as < integer_t > () - 1;
		yylhs.value.as < ast_t > ()->range_right = 0;
	}
#line 3545 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 446: // enum_struct_type: enum_type
#line 2269 "frontends/verilog/verilog_parser.y"
                    { yylhs.value.as < ast_t > () = std::move(yystack_[0].value.as < ast_t > ()); }
#line 3551 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 447: // enum_struct_type: struct_type
#line 2270 "frontends/verilog/verilog_parser.y"
                      { yylhs.value.as < ast_t > () = std::move(yystack_[0].value.as < ast_t > ()); }
#line 3557 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 448: // $@48: %empty
#line 2274 "frontends/verilog/verilog_parser.y"
                    {
		extra->astbuf1 = std::make_unique<AstNode>(yylhs.location, AST_CELL);
		append_attr(extra->astbuf1.get(), std::move(yystack_[1].value.as < al_t > ()));
		extra->astbuf1->children.push_back(std::make_unique<AstNode>(yylhs.location, AST_CELLTYPE));
		extra->astbuf1->children[0]->str = *yystack_[0].value.as < string_t > ();
	}
#line 3568 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 449: // cell_stmt: attr TOK_ID $@48 cell_parameter_list_opt cell_list "';'"
#line 2279 "frontends/verilog/verilog_parser.y"
                                                        {
		(void)extra->astbuf1.reset();
	}
#line 3576 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 450: // $@49: %empty
#line 2282 "frontends/verilog/verilog_parser.y"
                                    {
		extra->astbuf1 = std::make_unique<AstNode>(yylhs.location, AST_PRIMITIVE);
		extra->astbuf1->str = *yystack_[1].value.as < string_t > ();
		append_attr(extra->astbuf1.get(), std::move(yystack_[2].value.as < al_t > ()));
	}
#line 3586 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 451: // cell_stmt: attr tok_prim_wrapper delay $@49 prim_list "';'"
#line 2286 "frontends/verilog/verilog_parser.y"
                                {
		(void)extra->astbuf1.reset();
	}
#line 3594 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 452: // tok_prim_wrapper: TOK_PRIMITIVE
#line 2291 "frontends/verilog/verilog_parser.y"
                      {
		yylhs.value.as < string_t > () = std::move(yystack_[0].value.as < string_t > ());
	}
#line 3602 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 453: // tok_prim_wrapper: TOK_OR
#line 2294 "frontends/verilog/verilog_parser.y"
               {
		yylhs.value.as < string_t > () = std::make_unique<std::string>("or");
	}
#line 3610 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 458: // $@50: %empty
#line 2306 "frontends/verilog/verilog_parser.y"
               {
		extra->astbuf2 = extra->astbuf1->clone();
		if (extra->astbuf2->type != AST_PRIMITIVE)
			extra->astbuf2->str = *yystack_[0].value.as < string_t > ();
		// TODO optimize again
		extra->cell_hack = extra->astbuf2.get();
		extra->ast_stack.back()->children.push_back(std::move(extra->astbuf2));
	}
#line 3623 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 459: // single_cell_no_array: TOK_ID $@50 "'('" cell_port_list "')'"
#line 2313 "frontends/verilog/verilog_parser.y"
                                               {
		log_assert(extra->cell_hack);
		SET_AST_NODE_LOC(extra->cell_hack, yystack_[4].location, yylhs.location);
		extra->cell_hack = nullptr;
	}
#line 3633 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 460: // $@51: %empty
#line 2320 "frontends/verilog/verilog_parser.y"
                             {
		extra->astbuf2 = extra->astbuf1->clone();
		if (extra->astbuf2->type != AST_PRIMITIVE)
			extra->astbuf2->str = *yystack_[1].value.as < string_t > ();
		// TODO optimize again
		extra->cell_hack = extra->astbuf2.get();
		extra->ast_stack.back()->children.push_back(std::make_unique<AstNode>(yylhs.location, AST_CELLARRAY, std::move(yystack_[0].value.as < ast_t > ()), std::move(extra->astbuf2)));
	}
#line 3646 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 461: // single_cell_arraylist: TOK_ID non_opt_range $@51 "'('" cell_port_list "')'"
#line 2327 "frontends/verilog/verilog_parser.y"
                                              {
		log_assert(extra->cell_hack);
		SET_AST_NODE_LOC(extra->cell_hack, yystack_[5].location, yylhs.location);
		extra->cell_hack = nullptr;
	}
#line 3656 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 467: // $@52: %empty
#line 2343 "frontends/verilog/verilog_parser.y"
                      {
		extra->astbuf2 = extra->astbuf1->clone();
		log_assert(!extra->cell_hack);
		extra->cell_hack = extra->astbuf2.get();
		// TODO optimize again
		extra->ast_stack.back()->children.push_back(std::move(extra->astbuf2));
	}
#line 3668 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 468: // single_prim: $@52 "'('" cell_port_list "')'"
#line 2349 "frontends/verilog/verilog_parser.y"
                                               {
		log_assert(extra->cell_hack);
		SET_AST_NODE_LOC(extra->cell_hack, yystack_[3].location, yylhs.location);
		extra->cell_hack = nullptr;
	}
#line 3678 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 474: // cell_parameter: expr
#line 2363 "frontends/verilog/verilog_parser.y"
             {
		auto node = std::make_unique<AstNode>(yylhs.location, AST_PARASET);
		node->children.push_back(std::move(yystack_[0].value.as < ast_t > ()));
		extra->astbuf1->children.push_back(std::move(node));
	}
#line 3688 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 475: // cell_parameter: "'.'" TOK_ID "'('" "')'"
#line 2368 "frontends/verilog/verilog_parser.y"
                                             {
		// just ignore empty parameters
	}
#line 3696 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 476: // cell_parameter: "'.'" TOK_ID "'('" expr "')'"
#line 2371 "frontends/verilog/verilog_parser.y"
                                                  {
		auto node = std::make_unique<AstNode>(yylhs.location, AST_PARASET);
		node->str = *yystack_[3].value.as < string_t > ();
		node->children.push_back(std::move(yystack_[1].value.as < ast_t > ()));
		extra->astbuf1->children.push_back(std::move(node));
	}
#line 3707 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 477: // cell_port_list: cell_port_list_rules
#line 2379 "frontends/verilog/verilog_parser.y"
                             {
		// remove empty args from end of list
		while (!extra->cell_hack->children.empty()) {
			auto& node = extra->cell_hack->children.back();
			if (node->type != AST_ARGUMENT) break;
			if (!node->children.empty()) break;
			if (!node->str.empty()) break;
			extra->cell_hack->children.pop_back();
		}

		// check port types
		bool has_positional_args = false;
		bool has_named_args = false;
		for (auto& node : extra->cell_hack->children) {
			if (node->type != AST_ARGUMENT) continue;
			if (node->str.empty())
				has_positional_args = true;
			else
				has_named_args = true;
		}

		if (has_positional_args && has_named_args)
			err_at_loc(yystack_[0].location, "Mix of positional and named cell ports.");
	}
#line 3736 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 480: // cell_port: attr
#line 2408 "frontends/verilog/verilog_parser.y"
             {
		auto node = std::make_unique<AstNode>(yylhs.location, AST_ARGUMENT);
		extra->cell_hack->children.push_back(std::move(node));
	}
#line 3745 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 481: // cell_port: attr expr
#line 2412 "frontends/verilog/verilog_parser.y"
                  {
		auto node = std::make_unique<AstNode>(yylhs.location, AST_ARGUMENT);
		node->children.push_back(std::move(yystack_[0].value.as < ast_t > ()));
		extra->cell_hack->children.push_back(std::move(node));
	}
#line 3755 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 482: // cell_port: attr "'.'" TOK_ID "'('" expr "')'"
#line 2417 "frontends/verilog/verilog_parser.y"
                                                       {
		auto node = std::make_unique<AstNode>(yylhs.location, AST_ARGUMENT);
		node->str = *yystack_[3].value.as < string_t > ();
		node->children.push_back(std::move(yystack_[1].value.as < ast_t > ()));
		extra->cell_hack->children.push_back(std::move(node));
	}
#line 3766 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 483: // cell_port: attr "'.'" TOK_ID "'('" "')'"
#line 2423 "frontends/verilog/verilog_parser.y"
                                                  {
		auto node = std::make_unique<AstNode>(yylhs.location, AST_ARGUMENT);
		node->str = *yystack_[2].value.as < string_t > ();
		extra->cell_hack->children.push_back(std::move(node));
	}
#line 3776 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 484: // cell_port: attr "'.'" TOK_ID
#line 2428 "frontends/verilog/verilog_parser.y"
                            {
		auto node = std::make_unique<AstNode>(yylhs.location, AST_ARGUMENT);
		node->str = *yystack_[0].value.as < string_t > ();
		node->children.push_back(std::make_unique<AstNode>(yylhs.location, AST_IDENTIFIER));
		node->children.back()->str = *yystack_[0].value.as < string_t > ();
		extra->cell_hack->children.push_back(std::move(node));
	}
#line 3788 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 485: // cell_port: attr TOK_WILDCARD_CONNECT
#line 2435 "frontends/verilog/verilog_parser.y"
                                  {
		if (!mode->sv)
			err_at_loc(yystack_[0].location, "Wildcard port connections are only supported in SystemVerilog mode.");
		extra->cell_hack->attributes[ID::wildcard_port_conns] = AstNode::mkconst_int(yystack_[0].location, 1, false);
	}
#line 3798 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 486: // always_comb_or_latch: TOK_ALWAYS_COMB
#line 2442 "frontends/verilog/verilog_parser.y"
                        {
		yylhs.value.as < boolean_t > () = false;
	}
#line 3806 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 487: // always_comb_or_latch: TOK_ALWAYS_LATCH
#line 2445 "frontends/verilog/verilog_parser.y"
                         {
		yylhs.value.as < boolean_t > () = true;
	}
#line 3814 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 488: // always_or_always_ff: TOK_ALWAYS
#line 2450 "frontends/verilog/verilog_parser.y"
                   {
		yylhs.value.as < boolean_t > () = false;
	}
#line 3822 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 489: // always_or_always_ff: TOK_ALWAYS_FF
#line 2453 "frontends/verilog/verilog_parser.y"
                      {
		yylhs.value.as < boolean_t > () = true;
	}
#line 3830 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 490: // $@53: %empty
#line 2458 "frontends/verilog/verilog_parser.y"
                                 {
		AstNode* node = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_ALWAYS));
		append_attr(node, std::move(yystack_[1].value.as < al_t > ()));
		if (yystack_[0].value.as < boolean_t > ())
			node->attributes[ID::always_ff] = AstNode::mkconst_int(yystack_[0].location, 1, false);
	}
#line 3841 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 491: // $@54: %empty
#line 2463 "frontends/verilog/verilog_parser.y"
                      {
		(void)extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_BLOCK));
	}
#line 3849 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 492: // always_stmt: attr always_or_always_ff $@53 always_cond $@54 behavioral_stmt
#line 2465 "frontends/verilog/verilog_parser.y"
                          {
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[0].location, yystack_[0].location);
		extra->ast_stack.pop_back();

		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[4].location, yylhs.location);
		extra->ast_stack.pop_back();

		SET_RULE_LOC(yylhs.location, yystack_[4].location, yylhs.location);
	}
#line 3863 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 493: // $@55: %empty
#line 2474 "frontends/verilog/verilog_parser.y"
                                  {
		AstNode* node = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_ALWAYS));
		append_attr(node, std::move(yystack_[1].value.as < al_t > ()));
		if (yystack_[0].value.as < boolean_t > ())
			node->attributes[ID::always_latch] = AstNode::mkconst_int(yystack_[0].location, 1, false);
		else
			node->attributes[ID::always_comb] = AstNode::mkconst_int(yystack_[0].location, 1, false);
		(void)extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_BLOCK));
	}
#line 3877 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 494: // always_stmt: attr always_comb_or_latch $@55 behavioral_stmt
#line 2482 "frontends/verilog/verilog_parser.y"
                          {
		extra->ast_stack.pop_back();
		extra->ast_stack.pop_back();
	}
#line 3886 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 495: // $@56: %empty
#line 2486 "frontends/verilog/verilog_parser.y"
                         {
		AstNode* node = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_INITIAL));
		append_attr(node, std::move(yystack_[1].value.as < al_t > ()));
		(void)extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_BLOCK));
	}
#line 3896 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 496: // always_stmt: attr TOK_INITIAL $@56 behavioral_stmt
#line 2490 "frontends/verilog/verilog_parser.y"
                          {
		extra->ast_stack.pop_back();
		extra->ast_stack.pop_back();
	}
#line 3905 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 506: // always_event: TOK_POSEDGE expr
#line 2509 "frontends/verilog/verilog_parser.y"
                         {
		auto node = std::make_unique<AstNode>(yylhs.location, AST_POSEDGE);
		SET_AST_NODE_LOC(node.get(), yystack_[1].location, yystack_[1].location);
		node->children.push_back(std::move(yystack_[0].value.as < ast_t > ()));
		extra->ast_stack.back()->children.push_back(std::move(node));
	}
#line 3916 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 507: // always_event: TOK_NEGEDGE expr
#line 2515 "frontends/verilog/verilog_parser.y"
                         {
		auto node = std::make_unique<AstNode>(yylhs.location, AST_NEGEDGE);
		SET_AST_NODE_LOC(node.get(), yystack_[1].location, yystack_[1].location);
		node->children.push_back(std::move(yystack_[0].value.as < ast_t > ()));
		extra->ast_stack.back()->children.push_back(std::move(node));
	}
#line 3927 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 508: // always_event: expr
#line 2521 "frontends/verilog/verilog_parser.y"
             {
		auto node = std::make_unique<AstNode>(yylhs.location, AST_EDGE);
		node->children.push_back(std::move(yystack_[0].value.as < ast_t > ()));
		extra->ast_stack.back()->children.push_back(std::move(node));
	}
#line 3937 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 509: // opt_label: "':'" TOK_ID
#line 2528 "frontends/verilog/verilog_parser.y"
                       {
		yylhs.value.as < string_t > () = std::move(yystack_[0].value.as < string_t > ());
	}
#line 3945 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 510: // opt_label: %empty
#line 2531 "frontends/verilog/verilog_parser.y"
               {
		yylhs.value.as < string_t > () = nullptr;
	}
#line 3953 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 511: // opt_sva_label: TOK_SVA_LABEL "':'"
#line 2536 "frontends/verilog/verilog_parser.y"
                              {
		yylhs.value.as < string_t > () = std::move(yystack_[1].value.as < string_t > ());
	}
#line 3961 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 512: // opt_sva_label: %empty
#line 2539 "frontends/verilog/verilog_parser.y"
               {
		yylhs.value.as < string_t > () = nullptr;
	}
#line 3969 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 513: // opt_property: TOK_PROPERTY
#line 2544 "frontends/verilog/verilog_parser.y"
                     {
		yylhs.value.as < boolean_t > () = true;
	}
#line 3977 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 514: // opt_property: TOK_FINAL
#line 2547 "frontends/verilog/verilog_parser.y"
                  {
		yylhs.value.as < boolean_t > () = false;
	}
#line 3985 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 515: // opt_property: %empty
#line 2550 "frontends/verilog/verilog_parser.y"
               {
		yylhs.value.as < boolean_t > () = false;
	}
#line 3993 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 516: // $@57: %empty
#line 2555 "frontends/verilog/verilog_parser.y"
                       {
		AstNode* modport = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_MODPORT));
        modport->str = *yystack_[0].value.as < string_t > ();

    }
#line 4003 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 517: // $@58: %empty
#line 2559 "frontends/verilog/verilog_parser.y"
                        {
        extra->ast_stack.pop_back();
        log_assert(extra->ast_stack.size() == 2);
    }
#line 4012 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 525: // modport_member: TOK_ID
#line 2575 "frontends/verilog/verilog_parser.y"
           {
		AstNode* modport_member = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_MODPORTMEMBER));
        modport_member->str = *yystack_[0].value.as < string_t > ();
        modport_member->is_input = extra->current_modport_input;
        modport_member->is_output = extra->current_modport_output;

    }
#line 4024 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 526: // modport_type_token: TOK_INPUT
#line 2584 "frontends/verilog/verilog_parser.y"
              {extra->current_modport_input = 1; extra->current_modport_output = 0;}
#line 4030 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 527: // modport_type_token: TOK_OUTPUT
#line 2584 "frontends/verilog/verilog_parser.y"
                                                                                                  {extra->current_modport_input = 0; extra->current_modport_output = 1;}
#line 4036 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 528: // assert: opt_sva_label TOK_ASSERT opt_property "'('" expr "')'" "';'"
#line 2587 "frontends/verilog/verilog_parser.y"
                                                                                     {
		if (mode->noassert) {

		} else {
			AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, mode->assume_asserts ? AST_ASSUME : AST_ASSERT, std::move(yystack_[2].value.as < ast_t > ())));
			SET_AST_NODE_LOC(node, (yystack_[6].value.as < string_t > () != nullptr ? yystack_[6].location : yystack_[5].location), yystack_[1].location);
			if (yystack_[6].value.as < string_t > () != nullptr)
				node->str = *yystack_[6].value.as < string_t > ();
		}
	}
#line 4051 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 529: // assert: opt_sva_label TOK_ASSUME opt_property "'('" expr "')'" "';'"
#line 2597 "frontends/verilog/verilog_parser.y"
                                                                                     {
		if (mode->noassume) {
		} else {
			AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, mode->assert_assumes ? AST_ASSERT : AST_ASSUME, std::move(yystack_[2].value.as < ast_t > ())));
			SET_AST_NODE_LOC(node, (yystack_[6].value.as < string_t > () != nullptr ? yystack_[6].location : yystack_[5].location), yystack_[1].location);
			if (yystack_[6].value.as < string_t > () != nullptr)
				node->str = *yystack_[6].value.as < string_t > ();
		}
	}
#line 4065 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 530: // assert: opt_sva_label TOK_ASSERT opt_property "'('" TOK_EVENTUALLY expr "')'" "';'"
#line 2606 "frontends/verilog/verilog_parser.y"
                                                                                                    {
		if (mode->noassert) {
		} else {
			AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, mode->assume_asserts ? AST_FAIR : AST_LIVE, std::move(yystack_[2].value.as < ast_t > ())));
			SET_AST_NODE_LOC(node, (yystack_[7].value.as < string_t > () != nullptr ? yystack_[7].location : yystack_[6].location), yystack_[1].location);
			if (yystack_[7].value.as < string_t > () != nullptr)
				node->str = *yystack_[7].value.as < string_t > ();
		}
	}
#line 4079 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 531: // assert: opt_sva_label TOK_ASSUME opt_property "'('" TOK_EVENTUALLY expr "')'" "';'"
#line 2615 "frontends/verilog/verilog_parser.y"
                                                                                                    {
		if (mode->noassume) {
		} else {
			AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, mode->assert_assumes ? AST_LIVE : AST_FAIR, std::move(yystack_[2].value.as < ast_t > ())));
			SET_AST_NODE_LOC(node, (yystack_[7].value.as < string_t > () != nullptr ? yystack_[7].location : yystack_[6].location), yystack_[1].location);
			if (yystack_[7].value.as < string_t > () != nullptr)
				node->str = *yystack_[7].value.as < string_t > ();
		}
	}
#line 4093 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 532: // assert: opt_sva_label TOK_COVER opt_property "'('" expr "')'" "';'"
#line 2624 "frontends/verilog/verilog_parser.y"
                                                                                    {
		AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_COVER, std::move(yystack_[2].value.as < ast_t > ())));
		SET_AST_NODE_LOC(node, (yystack_[6].value.as < string_t > () != nullptr ? yystack_[6].location : yystack_[5].location), yystack_[1].location);
		if (yystack_[6].value.as < string_t > () != nullptr) {
			node->str = *yystack_[6].value.as < string_t > ();
		}
	}
#line 4105 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 533: // assert: opt_sva_label TOK_COVER opt_property "'('" "')'" "';'"
#line 2631 "frontends/verilog/verilog_parser.y"
                                                                               {
		AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_COVER, AstNode::mkconst_int(yylhs.location, 1, false)));
		SET_AST_NODE_LOC(node, (yystack_[5].value.as < string_t > () != nullptr ? yystack_[5].location : yystack_[4].location), yystack_[1].location);
		if (yystack_[5].value.as < string_t > () != nullptr) {
			node->str = *yystack_[5].value.as < string_t > ();
		}
	}
#line 4117 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 534: // assert: opt_sva_label TOK_COVER "';'"
#line 2638 "frontends/verilog/verilog_parser.y"
                                            {
		AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_COVER, AstNode::mkconst_int(yylhs.location, 1, false)));
		SET_AST_NODE_LOC(node, (yystack_[2].value.as < string_t > () != nullptr ? yystack_[2].location : yystack_[1].location), yystack_[1].location);
		if (yystack_[2].value.as < string_t > () != nullptr) {
			node->str = *yystack_[2].value.as < string_t > ();
		}
	}
#line 4129 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 535: // assert: opt_sva_label TOK_RESTRICT opt_property "'('" expr "')'" "';'"
#line 2645 "frontends/verilog/verilog_parser.y"
                                                                                       {
		if (mode->norestrict) {
		} else {
			AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_ASSUME, std::move(yystack_[2].value.as < ast_t > ())));
			SET_AST_NODE_LOC(node, (yystack_[6].value.as < string_t > () != nullptr ? yystack_[6].location : yystack_[5].location), yystack_[1].location);
			if (yystack_[6].value.as < string_t > () != nullptr)
				node->str = *yystack_[6].value.as < string_t > ();
		}
		if (!yystack_[4].value.as < boolean_t > ())
			warn_at_loc(yystack_[4].location, "SystemVerilog does not allow \"restrict\" without \"property\".");
	}
#line 4145 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 536: // assert: opt_sva_label TOK_RESTRICT opt_property "'('" TOK_EVENTUALLY expr "')'" "';'"
#line 2656 "frontends/verilog/verilog_parser.y"
                                                                                                      {
		if (mode->norestrict) {
		} else {
			AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_FAIR, std::move(yystack_[2].value.as < ast_t > ())));
			SET_AST_NODE_LOC(node, (yystack_[7].value.as < string_t > () != nullptr ? yystack_[7].location : yystack_[6].location), yystack_[1].location);
			if (yystack_[7].value.as < string_t > () != nullptr)
				node->str = *yystack_[7].value.as < string_t > ();
		}
		if (!yystack_[5].value.as < boolean_t > ())
			warn_at_loc(yystack_[5].location, "SystemVerilog does not allow \"restrict\" without \"property\".");
	}
#line 4161 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 537: // assert_property: opt_sva_label TOK_ASSERT TOK_PROPERTY "'('" expr "')'" "';'"
#line 2669 "frontends/verilog/verilog_parser.y"
                                                                                     {
		AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, mode->assume_asserts ? AST_ASSUME : AST_ASSERT, std::move(yystack_[2].value.as < ast_t > ())));
		SET_AST_NODE_LOC(node, yystack_[6].location, yystack_[1].location);
		if (yystack_[6].value.as < string_t > () != nullptr) {
			extra->ast_stack.back()->children.back()->str = *yystack_[6].value.as < string_t > ();
		}
	}
#line 4173 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 538: // assert_property: opt_sva_label TOK_ASSUME TOK_PROPERTY "'('" expr "')'" "';'"
#line 2676 "frontends/verilog/verilog_parser.y"
                                                                                     {
		AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_ASSUME, std::move(yystack_[2].value.as < ast_t > ())));
		SET_AST_NODE_LOC(node, yystack_[6].location, yystack_[1].location);
		if (yystack_[6].value.as < string_t > () != nullptr) {
			extra->ast_stack.back()->children.back()->str = *yystack_[6].value.as < string_t > ();
		}
	}
#line 4185 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 539: // assert_property: opt_sva_label TOK_ASSERT TOK_PROPERTY "'('" TOK_EVENTUALLY expr "')'" "';'"
#line 2683 "frontends/verilog/verilog_parser.y"
                                                                                                    {
		AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, mode->assume_asserts ? AST_FAIR : AST_LIVE, std::move(yystack_[2].value.as < ast_t > ())));
		SET_AST_NODE_LOC(node, yystack_[7].location, yystack_[1].location);
		if (yystack_[7].value.as < string_t > () != nullptr) {
			extra->ast_stack.back()->children.back()->str = *yystack_[7].value.as < string_t > ();
		}
	}
#line 4197 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 540: // assert_property: opt_sva_label TOK_ASSUME TOK_PROPERTY "'('" TOK_EVENTUALLY expr "')'" "';'"
#line 2690 "frontends/verilog/verilog_parser.y"
                                                                                                    {
		AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_FAIR, std::move(yystack_[2].value.as < ast_t > ())));
		SET_AST_NODE_LOC(node, yystack_[7].location, yystack_[1].location);
		if (yystack_[7].value.as < string_t > () != nullptr) {
			extra->ast_stack.back()->children.back()->str = *yystack_[7].value.as < string_t > ();
		}
	}
#line 4209 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 541: // assert_property: opt_sva_label TOK_COVER TOK_PROPERTY "'('" expr "')'" "';'"
#line 2697 "frontends/verilog/verilog_parser.y"
                                                                                    {
		AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_COVER, std::move(yystack_[2].value.as < ast_t > ())));
		SET_AST_NODE_LOC(node, yystack_[6].location, yystack_[1].location);
		if (yystack_[6].value.as < string_t > () != nullptr) {
			extra->ast_stack.back()->children.back()->str = *yystack_[6].value.as < string_t > ();
		}
	}
#line 4221 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 542: // assert_property: opt_sva_label TOK_RESTRICT TOK_PROPERTY "'('" expr "')'" "';'"
#line 2704 "frontends/verilog/verilog_parser.y"
                                                                                       {
		if (mode->norestrict) {
		} else {
			AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_ASSUME, std::move(yystack_[2].value.as < ast_t > ())));
			SET_AST_NODE_LOC(node, yystack_[6].location, yystack_[1].location);
			if (yystack_[6].value.as < string_t > () != nullptr) {
				extra->ast_stack.back()->children.back()->str = *yystack_[6].value.as < string_t > ();
			}
		}
	}
#line 4236 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 543: // assert_property: opt_sva_label TOK_RESTRICT TOK_PROPERTY "'('" TOK_EVENTUALLY expr "')'" "';'"
#line 2714 "frontends/verilog/verilog_parser.y"
                                                                                                      {
		if (mode->norestrict) {
		} else {
			AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_FAIR, std::move(yystack_[2].value.as < ast_t > ())));
			SET_AST_NODE_LOC(node, yystack_[7].location, yystack_[1].location);
			if (yystack_[7].value.as < string_t > () != nullptr) {
				extra->ast_stack.back()->children.back()->str = *yystack_[7].value.as < string_t > ();
			}
		}
	}
#line 4251 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 544: // simple_behavioral_stmt: attr lvalue "'='" delay expr
#line 2726 "frontends/verilog/verilog_parser.y"
                                      {
		AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_ASSIGN_EQ, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ())));
		SET_AST_NODE_LOC(node, yystack_[3].location, yystack_[0].location);
		append_attr(node, std::move(yystack_[4].value.as < al_t > ()));
	}
#line 4261 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 545: // simple_behavioral_stmt: attr lvalue attr inc_or_dec_op
#line 2731 "frontends/verilog/verilog_parser.y"
                                       {
		extra->addIncOrDecStmt(std::move(yystack_[3].value.as < al_t > ()), std::move(yystack_[2].value.as < ast_t > ()), std::move(yystack_[1].value.as < al_t > ()), yystack_[0].value.as < ast_node_type_t > (), location_range(yystack_[3].location, yystack_[0].location));
	}
#line 4269 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 546: // simple_behavioral_stmt: attr inc_or_dec_op attr lvalue
#line 2734 "frontends/verilog/verilog_parser.y"
                                       {
		extra->addIncOrDecStmt(std::move(yystack_[3].value.as < al_t > ()), std::move(yystack_[0].value.as < ast_t > ()), std::move(yystack_[1].value.as < al_t > ()), yystack_[2].value.as < ast_node_type_t > (), location_range(yystack_[3].location, yystack_[0].location));
	}
#line 4277 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 547: // simple_behavioral_stmt: attr lvalue OP_LE delay expr
#line 2737 "frontends/verilog/verilog_parser.y"
                                     {
		AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_ASSIGN_LE, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ())));
		SET_AST_NODE_LOC(node, yystack_[3].location, yystack_[0].location);
		append_attr(node, std::move(yystack_[4].value.as < al_t > ()));
	}
#line 4287 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 548: // simple_behavioral_stmt: attr lvalue asgn_binop delay expr
#line 2742 "frontends/verilog/verilog_parser.y"
                                          {
		(void)extra->addAsgnBinopStmt(std::move(yystack_[4].value.as < al_t > ()), std::move(yystack_[3].value.as < ast_t > ()), yystack_[2].value.as < ast_node_type_t > (), std::move(yystack_[0].value.as < ast_t > ()));
	}
#line 4295 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 549: // asgn_binop: TOK_BIT_OR_ASSIGN
#line 2747 "frontends/verilog/verilog_parser.y"
                          { yylhs.value.as < ast_node_type_t > () = AST_BIT_OR; }
#line 4301 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 550: // asgn_binop: TOK_BIT_AND_ASSIGN
#line 2748 "frontends/verilog/verilog_parser.y"
                           { yylhs.value.as < ast_node_type_t > () = AST_BIT_AND; }
#line 4307 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 551: // asgn_binop: TOK_BIT_XOR_ASSIGN
#line 2749 "frontends/verilog/verilog_parser.y"
                           { yylhs.value.as < ast_node_type_t > () = AST_BIT_XOR; }
#line 4313 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 552: // asgn_binop: TOK_ADD_ASSIGN
#line 2750 "frontends/verilog/verilog_parser.y"
                       { yylhs.value.as < ast_node_type_t > () = AST_ADD; }
#line 4319 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 553: // asgn_binop: TOK_SUB_ASSIGN
#line 2751 "frontends/verilog/verilog_parser.y"
                       { yylhs.value.as < ast_node_type_t > () = AST_SUB; }
#line 4325 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 554: // asgn_binop: TOK_DIV_ASSIGN
#line 2752 "frontends/verilog/verilog_parser.y"
                       { yylhs.value.as < ast_node_type_t > () = AST_DIV; }
#line 4331 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 555: // asgn_binop: TOK_MOD_ASSIGN
#line 2753 "frontends/verilog/verilog_parser.y"
                       { yylhs.value.as < ast_node_type_t > () = AST_MOD; }
#line 4337 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 556: // asgn_binop: TOK_MUL_ASSIGN
#line 2754 "frontends/verilog/verilog_parser.y"
                       { yylhs.value.as < ast_node_type_t > () = AST_MUL; }
#line 4343 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 557: // asgn_binop: TOK_SHL_ASSIGN
#line 2755 "frontends/verilog/verilog_parser.y"
                       { yylhs.value.as < ast_node_type_t > () = AST_SHIFT_LEFT; }
#line 4349 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 558: // asgn_binop: TOK_SHR_ASSIGN
#line 2756 "frontends/verilog/verilog_parser.y"
                       { yylhs.value.as < ast_node_type_t > () = AST_SHIFT_RIGHT; }
#line 4355 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 559: // asgn_binop: TOK_SSHL_ASSIGN
#line 2757 "frontends/verilog/verilog_parser.y"
                        { yylhs.value.as < ast_node_type_t > () = AST_SHIFT_SLEFT; }
#line 4361 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 560: // asgn_binop: TOK_SSHR_ASSIGN
#line 2758 "frontends/verilog/verilog_parser.y"
                        { yylhs.value.as < ast_node_type_t > () = AST_SHIFT_SRIGHT; }
#line 4367 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 561: // inc_or_dec_op: TOK_INCREMENT
#line 2763 "frontends/verilog/verilog_parser.y"
                      { yylhs.value.as < ast_node_type_t > () = AST_ADD; }
#line 4373 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 562: // inc_or_dec_op: TOK_DECREMENT
#line 2764 "frontends/verilog/verilog_parser.y"
                      { yylhs.value.as < ast_node_type_t > () = AST_SUB; }
#line 4379 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 563: // for_initialization: TOK_ID "'='" expr
#line 2767 "frontends/verilog/verilog_parser.y"
                           {
		auto ident = std::make_unique<AstNode>(yylhs.location, AST_IDENTIFIER);
		ident->str = *yystack_[2].value.as < string_t > ();
		auto node = std::make_unique<AstNode>(yylhs.location, AST_ASSIGN_EQ, std::move(ident), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(node.get(), yystack_[2].location, yystack_[0].location);
		extra->ast_stack.back()->children.push_back(std::move(node));
	}
#line 4391 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 564: // for_initialization: non_io_wire_type range TOK_ID
#line 2774 "frontends/verilog/verilog_parser.y"
                                      {
		err_at_loc(yystack_[0].location, "For loop variable declaration is missing initialization!");
	}
#line 4399 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 565: // for_initialization: non_io_wire_type range TOK_ID "'='" expr
#line 2777 "frontends/verilog/verilog_parser.y"
                                                  {
		if (!mode->sv)
			err_at_loc(yystack_[1].location, "For loop inline variable declaration is only supported in SystemVerilog mode!");

		// loop variable declaration
		auto wire = std::move(yystack_[4].value.as < ast_t > ());
		auto range = checkRange(wire.get(), std::move(yystack_[3].value.as < ast_t > ()));
		SET_AST_NODE_LOC(wire.get(), yystack_[4].location, yystack_[2].location);
		SET_AST_NODE_LOC(range.get(), yystack_[3].location, yystack_[3].location);
		if (range != nullptr)
			wire->children.push_back(std::move(range));

		auto ident = std::make_unique<AstNode>(yylhs.location, AST_IDENTIFIER);
		ident->str = *yystack_[2].value.as < string_t > ();
		wire->str = *yystack_[2].value.as < string_t > ();

		AstNode *parent = extra->ast_stack.at(extra->ast_stack.size() - 2);
		auto& loop = parent->children.back();
		log_assert(extra->ast_stack.back() == loop.get());

		// loop variable initialization
		SET_AST_NODE_LOC(ident.get(), yystack_[2].location, yystack_[2].location);
		auto asgn = std::make_unique<AstNode>(yylhs.location, AST_ASSIGN_EQ, std::move(ident), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(asgn.get(), yystack_[2].location, yystack_[0].location);
		loop->children.push_back(std::move(asgn));

		// inject a wrapping block to declare the loop variable and
		// contain the current loop
		auto wrapper = std::make_unique<AstNode>(yylhs.location, AST_BLOCK);
		wrapper->str = "$fordecl_block$" + std::to_string(autoidx++);
		wrapper->children.push_back(std::move(wire));
		wrapper->children.push_back(std::move(loop));
		parent->children.back() = std::move(wrapper);
	}
#line 4438 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 575: // $@59: %empty
#line 2818 "frontends/verilog/verilog_parser.y"
                             {
		AstNode* node = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_TCALL));
		node->str = *yystack_[0].value.as < string_t > ();
		append_attr(node, std::move(yystack_[1].value.as < al_t > ()));
	}
#line 4448 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 576: // behavioral_stmt: attr hierarchical_id $@59 opt_arg_list "';'"
#line 2822 "frontends/verilog/verilog_parser.y"
                                  {
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[3].location, yystack_[0].location);
		extra->ast_stack.pop_back();
	}
#line 4457 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 577: // $@60: %empty
#line 2826 "frontends/verilog/verilog_parser.y"
                           {
		AstNode* node = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_TCALL));
		node->str = *yystack_[0].value.as < string_t > ();
		append_attr(node, std::move(yystack_[1].value.as < al_t > ()));
	}
#line 4467 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 578: // behavioral_stmt: attr TOK_MSG_TASKS $@60 opt_arg_list "';'"
#line 2830 "frontends/verilog/verilog_parser.y"
                                  {
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[3].location, yystack_[0].location);
		extra->ast_stack.pop_back();
	}
#line 4476 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 579: // $@61: %empty
#line 2834 "frontends/verilog/verilog_parser.y"
                       {
		extra->enterTypeScope();
	}
#line 4484 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 580: // $@62: %empty
#line 2836 "frontends/verilog/verilog_parser.y"
                    {
		AstNode* node = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_BLOCK));
		append_attr(node, std::move(yystack_[3].value.as < al_t > ()));
		if (yystack_[0].value.as < string_t > () != nullptr)
			node->str = *yystack_[0].value.as < string_t > ();
	}
#line 4495 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 581: // behavioral_stmt: attr TOK_BEGIN $@61 opt_label $@62 behavioral_stmt_list TOK_END opt_label
#line 2841 "frontends/verilog/verilog_parser.y"
                                                 {
		extra->exitTypeScope();
		checkLabelsMatch(yystack_[0].location, "Begin label", yystack_[4].value.as < string_t > ().get(), yystack_[0].value.as < string_t > ().get());
		AstNode *node = extra->ast_stack.back();
		// In SystemVerilog, unnamed blocks with block item declarations
		// create an implicit hierarchy scope
		if (mode->sv && node->str.empty())
		    for (auto& child : node->children)
			if (child->type == AST_WIRE || child->type == AST_MEMORY || child->type == AST_PARAMETER
				|| child->type == AST_LOCALPARAM || child->type == AST_TYPEDEF) {
			    node->str = "$unnamed_block$" + std::to_string(autoidx++);
			    break;
			}
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[6].location, yystack_[0].location);
		extra->ast_stack.pop_back();
	}
#line 4516 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 582: // $@63: %empty
#line 2857 "frontends/verilog/verilog_parser.y"
                                {
		AstNode* node = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_FOR));
		append_attr(node, std::move(yystack_[2].value.as < al_t > ()));
	}
#line 4525 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 583: // $@64: %empty
#line 2860 "frontends/verilog/verilog_parser.y"
                                              {
		extra->ast_stack.back()->children.push_back(std::move(yystack_[0].value.as < ast_t > ()));
	}
#line 4533 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 584: // $@65: %empty
#line 2862 "frontends/verilog/verilog_parser.y"
                                                        {
		AstNode* block = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_BLOCK));
		block->str = "$for_loop$" + std::to_string(autoidx++);
	}
#line 4542 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 585: // behavioral_stmt: attr TOK_FOR "'('" $@63 for_initialization "';'" expr $@64 "';'" simple_behavioral_stmt "')'" $@65 behavioral_stmt
#line 2865 "frontends/verilog/verilog_parser.y"
                          {
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[0].location, yystack_[0].location);
		extra->ast_stack.pop_back();
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[11].location, yystack_[0].location);
		extra->ast_stack.pop_back();
	}
#line 4553 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 586: // $@66: %empty
#line 2871 "frontends/verilog/verilog_parser.y"
                                                  {
		AstNode* node = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_WHILE));
		append_attr(node, std::move(yystack_[4].value.as < al_t > ()));
		auto block_owned = std::make_unique<AstNode>(yylhs.location, AST_BLOCK);
		auto* block = block_owned.get();
		extra->ast_stack.back()->children.push_back(std::move(yystack_[1].value.as < ast_t > ()));
		extra->ast_stack.back()->children.push_back(std::move(block_owned));
		extra->ast_stack.push_back(block);
	}
#line 4567 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 587: // behavioral_stmt: attr TOK_WHILE "'('" expr "')'" $@66 behavioral_stmt
#line 2879 "frontends/verilog/verilog_parser.y"
                          {
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[0].location, yystack_[0].location);
		extra->ast_stack.pop_back();
		extra->ast_stack.pop_back();
	}
#line 4577 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 588: // $@67: %empty
#line 2884 "frontends/verilog/verilog_parser.y"
                                                   {
		AstNode* node = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_REPEAT));
		append_attr(node, std::move(yystack_[4].value.as < al_t > ()));
		auto block_owned = std::make_unique<AstNode>(yylhs.location, AST_BLOCK);
		auto* block = block_owned.get();
		extra->ast_stack.back()->children.push_back(std::move(yystack_[1].value.as < ast_t > ()));
		extra->ast_stack.back()->children.push_back(std::move(block_owned));
		extra->ast_stack.push_back(block);
	}
#line 4591 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 589: // behavioral_stmt: attr TOK_REPEAT "'('" expr "')'" $@67 behavioral_stmt
#line 2892 "frontends/verilog/verilog_parser.y"
                          {
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[0].location, yystack_[0].location);
		extra->ast_stack.pop_back();
		extra->ast_stack.pop_back();
	}
#line 4601 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 590: // $@68: %empty
#line 2897 "frontends/verilog/verilog_parser.y"
                                                  {
		std::unique_ptr<AstNode> node_owned;
		AstNode* node = nullptr;
		AstNode *context = extra->ast_stack.back();
		bool patch_block_on_stack = false;
		if (context && context->type == AST_BLOCK && context->get_bool_attribute(ID::promoted_if)) {
			AstNode *outer = extra->ast_stack[extra->ast_stack.size() - 2];
			log_assert (outer && outer->type == AST_CASE);
			if (outer->get_bool_attribute(ID::parallel_case)) {
				// parallel "else if": append condition to outer "if"
				node = outer;
				log_assert (node->children.size());
				node->children.pop_back();
				// `context` has been killed as a grandchild of `outer`
				// we have to undangle it from the stack
				patch_block_on_stack = true;
			} else if (outer->get_bool_attribute(ID::full_case))
				(*yystack_[4].value.as < al_t > ())[ID::full_case] = AstNode::mkconst_int(yylhs.location, 1, false);
		}
		auto expr = std::make_unique<AstNode>(yylhs.location, AST_REDUCE_BOOL, std::move(yystack_[1].value.as < ast_t > ()));
		if (!node) {
			// not parallel "else if": begin new construction
			node_owned = std::make_unique<AstNode>(yylhs.location, AST_CASE);
			node = node_owned.get();
			append_attr(node, std::move(yystack_[4].value.as < al_t > ()));
			node->children.push_back(node->get_bool_attribute(ID::parallel_case) ? AstNode::mkconst_int(yylhs.location, 1, false, 1) : expr->clone());
			extra->ast_stack.back()->children.push_back(std::move(node_owned));
		}
		auto block_owned = std::make_unique<AstNode>(yylhs.location, AST_BLOCK);
		auto* block = block_owned.get();
		auto cond_owned = std::make_unique<AstNode>(yylhs.location, AST_COND, node->get_bool_attribute(ID::parallel_case) ? std::move(expr) : AstNode::mkconst_int(yylhs.location, 1, false, 1), std::move(block_owned));
		SET_AST_NODE_LOC(cond_owned.get(), yystack_[1].location, yystack_[1].location);
		node->children.push_back(std::move(cond_owned));
		// Double it and give it to the next person
		if (patch_block_on_stack)
			extra->ast_stack.back() = block;
		extra->ast_stack.push_back(node);
		extra->ast_stack.push_back(block);
	}
#line 4645 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 591: // $@69: %empty
#line 2935 "frontends/verilog/verilog_parser.y"
                          {
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[0].location, yystack_[0].location);
	}
#line 4653 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 592: // behavioral_stmt: if_attr TOK_IF "'('" expr "')'" $@68 behavioral_stmt $@69 optional_else
#line 2937 "frontends/verilog/verilog_parser.y"
                        {
		extra->ast_stack.pop_back();
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[7].location, yystack_[0].location);
		extra->ast_stack.pop_back();
	}
#line 4663 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 593: // $@70: %empty
#line 2942 "frontends/verilog/verilog_parser.y"
                                                       {
		AstNode* node = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_CASE, std::move(yystack_[1].value.as < ast_t > ())));
		append_attr(node, std::move(yystack_[4].value.as < al_t > ()));
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[1].location, yystack_[1].location);
	}
#line 4673 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 594: // behavioral_stmt: case_attr case_type "'('" expr "')'" $@70 opt_synopsys_attr case_body TOK_ENDCASE
#line 2946 "frontends/verilog/verilog_parser.y"
                                                  {
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[7].location, yystack_[0].location);
		extra->case_type_stack.pop_back();
		extra->ast_stack.pop_back();
	}
#line 4683 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 595: // if_attr: attr
#line 2953 "frontends/verilog/verilog_parser.y"
             {
		yylhs.value.as < al_t > () = std::move(yystack_[0].value.as < al_t > ());
	}
#line 4691 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 596: // if_attr: attr TOK_UNIQUE0
#line 2956 "frontends/verilog/verilog_parser.y"
                         {
		AstNode *context = extra->ast_stack.back();
		if (context && context->type == AST_BLOCK && context->get_bool_attribute(ID::promoted_if))
			err_at_loc(yystack_[0].location, "unique0 keyword cannot be used for 'else if' branch.");
		(*yystack_[1].value.as < al_t > ())[ID::parallel_case] = AstNode::mkconst_int(yylhs.location, 1, false);
		yylhs.value.as < al_t > () = std::move(yystack_[1].value.as < al_t > ());
	}
#line 4703 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 597: // if_attr: attr TOK_PRIORITY
#line 2963 "frontends/verilog/verilog_parser.y"
                          {
		AstNode *context = extra->ast_stack.back();
		if (context && context->type == AST_BLOCK && context->get_bool_attribute(ID::promoted_if))
			err_at_loc(yystack_[0].location, "priority keyword cannot be used for 'else if' branch.");
		(*yystack_[1].value.as < al_t > ())[ID::full_case] = AstNode::mkconst_int(yylhs.location, 1, false);
		yylhs.value.as < al_t > () = std::move(yystack_[1].value.as < al_t > ());
	}
#line 4715 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 598: // if_attr: attr TOK_UNIQUE
#line 2970 "frontends/verilog/verilog_parser.y"
                        {
		AstNode *context = extra->ast_stack.back();
		if (context && context->type == AST_BLOCK && context->get_bool_attribute(ID::promoted_if))
			err_at_loc(yystack_[0].location, "unique keyword cannot be used for 'else if' branch.");
		(*yystack_[1].value.as < al_t > ())[ID::full_case] = AstNode::mkconst_int(yylhs.location, 1, false);
		(*yystack_[1].value.as < al_t > ())[ID::parallel_case] = AstNode::mkconst_int(yylhs.location, 1, false);
		yylhs.value.as < al_t > () = std::move(yystack_[1].value.as < al_t > ());
	}
#line 4728 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 599: // case_attr: attr
#line 2980 "frontends/verilog/verilog_parser.y"
             {
		yylhs.value.as < al_t > () = std::move(yystack_[0].value.as < al_t > ());
	}
#line 4736 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 600: // case_attr: attr TOK_UNIQUE0
#line 2983 "frontends/verilog/verilog_parser.y"
                         {
		(*yystack_[1].value.as < al_t > ())[ID::parallel_case] = AstNode::mkconst_int(yylhs.location, 1, false);
		yylhs.value.as < al_t > () = std::move(yystack_[1].value.as < al_t > ());
	}
#line 4745 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 601: // case_attr: attr TOK_PRIORITY
#line 2987 "frontends/verilog/verilog_parser.y"
                          {
		(*yystack_[1].value.as < al_t > ())[ID::full_case] = AstNode::mkconst_int(yylhs.location, 1, false);
		yylhs.value.as < al_t > () = std::move(yystack_[1].value.as < al_t > ());
	}
#line 4754 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 602: // case_attr: attr TOK_UNIQUE
#line 2991 "frontends/verilog/verilog_parser.y"
                        {
		(*yystack_[1].value.as < al_t > ())[ID::full_case] = AstNode::mkconst_int(yylhs.location, 1, false);
		(*yystack_[1].value.as < al_t > ())[ID::parallel_case] = AstNode::mkconst_int(yylhs.location, 1, false);
		yylhs.value.as < al_t > () = std::move(yystack_[1].value.as < al_t > ());
	}
#line 4764 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 603: // case_type: TOK_CASE
#line 2998 "frontends/verilog/verilog_parser.y"
                 {
		extra->case_type_stack.push_back(0);
	}
#line 4772 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 604: // case_type: TOK_CASEX
#line 3001 "frontends/verilog/verilog_parser.y"
                  {
		extra->case_type_stack.push_back('x');
	}
#line 4780 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 605: // case_type: TOK_CASEZ
#line 3004 "frontends/verilog/verilog_parser.y"
                  {
		extra->case_type_stack.push_back('z');
	}
#line 4788 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 606: // opt_synopsys_attr: opt_synopsys_attr TOK_SYNOPSYS_FULL_CASE
#line 3009 "frontends/verilog/verilog_parser.y"
                                                 {
		if (extra->ast_stack.back()->attributes.count(ID::full_case) == 0)
			extra->ast_stack.back()->attributes[ID::full_case] = AstNode::mkconst_int(yylhs.location, 1, false);
	}
#line 4797 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 607: // opt_synopsys_attr: opt_synopsys_attr TOK_SYNOPSYS_PARALLEL_CASE
#line 3013 "frontends/verilog/verilog_parser.y"
                                                     {
		if (extra->ast_stack.back()->attributes.count(ID::parallel_case) == 0)
			extra->ast_stack.back()->attributes[ID::parallel_case] = AstNode::mkconst_int(yylhs.location, 1, false);
	}
#line 4806 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 611: // $@71: %empty
#line 3024 "frontends/verilog/verilog_parser.y"
                 {
		extra->ast_stack.pop_back();
		auto block_owned = std::make_unique<AstNode>(yylhs.location, AST_BLOCK);
		auto* block = block_owned.get();
		block->attributes[ID::promoted_if] = AstNode::mkconst_int(yylhs.location, 1, false);
		AstNode* cond = extra->saveChild(
			std::make_unique<AstNode>(yylhs.location, AST_COND,
				std::make_unique<AstNode>(yylhs.location, AST_DEFAULT),
				std::move(block_owned)));
		extra->ast_stack.push_back(block);
		SET_AST_NODE_LOC(cond, yystack_[0].location, yystack_[0].location);
	}
#line 4823 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 612: // optional_else: TOK_ELSE $@71 behavioral_stmt
#line 3035 "frontends/verilog/verilog_parser.y"
                          {
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[0].location, yystack_[0].location);
	}
#line 4831 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 616: // $@72: %empty
#line 3045 "frontends/verilog/verilog_parser.y"
        {
		(void)extra->pushChild(std::make_unique<AstNode>(
				yylhs.location,
				extra->case_type_stack.size() && extra->case_type_stack.back() == 'x' ? AST_CONDX :
				extra->case_type_stack.size() && extra->case_type_stack.back() == 'z' ? AST_CONDZ : AST_COND));
	}
#line 4842 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 617: // $@73: %empty
#line 3050 "frontends/verilog/verilog_parser.y"
                      {
		(void)extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_BLOCK));
		extra->case_type_stack.push_back(0);
	}
#line 4851 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 618: // case_item: $@72 case_select $@73 behavioral_stmt
#line 3053 "frontends/verilog/verilog_parser.y"
                          {
		extra->case_type_stack.pop_back();
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[0].location, yystack_[0].location);
		extra->ast_stack.pop_back();
		extra->ast_stack.pop_back();
	}
#line 4862 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 621: // $@74: %empty
#line 3065 "frontends/verilog/verilog_parser.y"
        {
		(void)extra->pushChild(std::make_unique<AstNode>(
				yylhs.location,
				extra->case_type_stack.size() && extra->case_type_stack.back() == 'x' ? AST_CONDX :
				extra->case_type_stack.size() && extra->case_type_stack.back() == 'z' ? AST_CONDZ : AST_COND));
	}
#line 4873 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 622: // $@75: %empty
#line 3070 "frontends/verilog/verilog_parser.y"
                      {
		extra->case_type_stack.push_back(0);
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[0].location, yystack_[0].location);
	}
#line 4882 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 623: // gen_case_item: $@74 case_select $@75 gen_stmt_block
#line 3073 "frontends/verilog/verilog_parser.y"
                         {
		extra->case_type_stack.pop_back();
		extra->ast_stack.pop_back();
	}
#line 4891 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 626: // case_expr_list: TOK_DEFAULT
#line 3083 "frontends/verilog/verilog_parser.y"
                    {
		AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_DEFAULT));
		SET_AST_NODE_LOC(node, yystack_[0].location, yystack_[0].location);
	}
#line 4900 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 627: // case_expr_list: TOK_SVA_LABEL
#line 3087 "frontends/verilog/verilog_parser.y"
                      {
		AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_IDENTIFIER));
		node->str = *yystack_[0].value.as < string_t > ();
		SET_AST_NODE_LOC(node, yystack_[0].location, yystack_[0].location);
	}
#line 4910 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 628: // case_expr_list: expr
#line 3092 "frontends/verilog/verilog_parser.y"
             {
		extra->ast_stack.back()->children.push_back(std::move(yystack_[0].value.as < ast_t > ()));
	}
#line 4918 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 629: // case_expr_list: case_expr_list "','" expr
#line 3095 "frontends/verilog/verilog_parser.y"
                                      {
		extra->ast_stack.back()->children.push_back(std::move(yystack_[0].value.as < ast_t > ()));
	}
#line 4926 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 630: // rvalue: hierarchical_id "'['" expr "']'" "'.'" rvalue
#line 3100 "frontends/verilog/verilog_parser.y"
                                                              {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_PREFIX, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
		yylhs.value.as < ast_t > ()->str = *yystack_[5].value.as < string_t > ();
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[5].location, yystack_[0].location);
	}
#line 4936 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 631: // rvalue: hierarchical_id range
#line 3105 "frontends/verilog/verilog_parser.y"
                              {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_IDENTIFIER, std::move(yystack_[0].value.as < ast_t > ()));
		yylhs.value.as < ast_t > ()->str = *yystack_[1].value.as < string_t > ();
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[1].location, yystack_[1].location);
		if (yystack_[0].value.as < ast_t > () == nullptr && (yylhs.value.as < ast_t > ()->str == "\\$initstate" ||
				yylhs.value.as < ast_t > ()->str == "\\$anyconst" || yylhs.value.as < ast_t > ()->str == "\\$anyseq" ||
				yylhs.value.as < ast_t > ()->str == "\\$allconst" || yylhs.value.as < ast_t > ()->str == "\\$allseq"))
			yylhs.value.as < ast_t > ()->type = AST_FCALL;
	}
#line 4950 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 632: // rvalue: hierarchical_id non_opt_multirange
#line 3114 "frontends/verilog/verilog_parser.y"
                                           {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_IDENTIFIER, std::move(yystack_[0].value.as < ast_t > ()));
		yylhs.value.as < ast_t > ()->str = *yystack_[1].value.as < string_t > ();
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[1].location, yystack_[1].location);
	}
#line 4960 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 633: // lvalue: rvalue
#line 3121 "frontends/verilog/verilog_parser.y"
               {
		yylhs.value.as < ast_t > () = std::move(yystack_[0].value.as < ast_t > ());
	}
#line 4968 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 634: // lvalue: "'{'" lvalue_concat_list "'}'"
#line 3124 "frontends/verilog/verilog_parser.y"
                                               {
		yylhs.value.as < ast_t > () = std::move(yystack_[1].value.as < ast_t > ());
	}
#line 4976 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 635: // lvalue_concat_list: expr
#line 3129 "frontends/verilog/verilog_parser.y"
             {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_CONCAT);
		yylhs.value.as < ast_t > ()->children.push_back(std::move(yystack_[0].value.as < ast_t > ()));
	}
#line 4985 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 636: // lvalue_concat_list: expr "','" lvalue_concat_list
#line 3133 "frontends/verilog/verilog_parser.y"
                                          {
		yylhs.value.as < ast_t > () = std::move(yystack_[0].value.as < ast_t > ());
		yylhs.value.as < ast_t > ()->children.push_back(std::move(yystack_[2].value.as < ast_t > ()));
	}
#line 4994 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 643: // single_arg: expr
#line 3151 "frontends/verilog/verilog_parser.y"
             {
		extra->ast_stack.back()->children.push_back(std::move(yystack_[0].value.as < ast_t > ()));
	}
#line 5002 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 650: // genvar_identifier: TOK_ID
#line 3165 "frontends/verilog/verilog_parser.y"
               {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_IDENTIFIER);
		yylhs.value.as < ast_t > ()->str = *yystack_[0].value.as < string_t > ();
	}
#line 5011 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 651: // genvar_initialization: TOK_GENVAR genvar_identifier
#line 3171 "frontends/verilog/verilog_parser.y"
                                     {
		err_at_loc(yystack_[0].location, "Generate for loop variable declaration is missing initialization!");
	}
#line 5019 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 652: // genvar_initialization: TOK_GENVAR genvar_identifier "'='" expr
#line 3174 "frontends/verilog/verilog_parser.y"
                                                 {
		if (!mode->sv)
			err_at_loc(yystack_[1].location, "Generate for loop inline variable declaration is only supported in SystemVerilog mode!");
		AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_GENVAR));
		node->is_reg = true;
		node->is_signed = true;
		node->range_left = 31;
		node->range_right = 0;
		node->str = yystack_[2].value.as < ast_t > ()->str;
		node->children.push_back(checkRange(node, nullptr));
		SET_AST_NODE_LOC(node, yystack_[3].location, yystack_[0].location);
		node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_ASSIGN_EQ, std::move(yystack_[2].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ())));
		SET_AST_NODE_LOC(node, yystack_[3].location, yystack_[0].location);
	}
#line 5038 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 653: // genvar_initialization: genvar_identifier "'='" expr
#line 3188 "frontends/verilog/verilog_parser.y"
                                      {
		AstNode* node = extra->saveChild(std::make_unique<AstNode>(yylhs.location, AST_ASSIGN_EQ, std::move(yystack_[2].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ())));
		SET_AST_NODE_LOC(node, yystack_[2].location, yystack_[0].location);
	}
#line 5047 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 654: // $@76: %empty
#line 3195 "frontends/verilog/verilog_parser.y"
                           {
		(void)extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_GENFOR));
	}
#line 5055 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 655: // $@77: %empty
#line 3197 "frontends/verilog/verilog_parser.y"
                                                 {
		extra->ast_stack.back()->children.push_back(std::move(yystack_[0].value.as < ast_t > ()));
	}
#line 5063 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 656: // gen_stmt: TOK_FOR "'('" $@76 genvar_initialization "';'" expr $@77 "';'" simple_behavioral_stmt "')'" gen_stmt_block
#line 3199 "frontends/verilog/verilog_parser.y"
                                                                       {
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[10].location, yystack_[0].location);
		extra->rewriteGenForDeclInit(extra->ast_stack.back());
		extra->ast_stack.pop_back();
	}
#line 5073 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 657: // $@78: %empty
#line 3204 "frontends/verilog/verilog_parser.y"
                                          {
		(void)extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_GENIF));
		extra->ast_stack.back()->children.push_back(std::move(yystack_[1].value.as < ast_t > ()));
	}
#line 5082 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 658: // gen_stmt: TOK_IF "'('" expr "')'" $@78 gen_stmt_block opt_gen_else
#line 3207 "frontends/verilog/verilog_parser.y"
                                      {
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[6].location, yystack_[0].location);
		extra->ast_stack.pop_back();
	}
#line 5091 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 659: // $@79: %empty
#line 3211 "frontends/verilog/verilog_parser.y"
                                             {
		(void)extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_GENCASE, std::move(yystack_[1].value.as < ast_t > ())));
	}
#line 5099 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 660: // gen_stmt: case_type "'('" expr "')'" $@79 gen_case_body TOK_ENDCASE
#line 3213 "frontends/verilog/verilog_parser.y"
                                    {
		extra->case_type_stack.pop_back();
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[6].location, yystack_[0].location);
		extra->ast_stack.pop_back();
	}
#line 5109 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 661: // $@80: %empty
#line 3218 "frontends/verilog/verilog_parser.y"
                      {
		AstNode* node = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_TECALL));
		node->str = *yystack_[0].value.as < string_t > ();
	}
#line 5118 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 662: // gen_stmt: TOK_MSG_TASKS $@80 opt_arg_list "';'"
#line 3221 "frontends/verilog/verilog_parser.y"
                                  {
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[3].location, yystack_[1].location);
		extra->ast_stack.pop_back();
	}
#line 5127 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 663: // $@81: %empty
#line 3227 "frontends/verilog/verilog_parser.y"
                  {
		extra->enterTypeScope();
	}
#line 5135 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 664: // $@82: %empty
#line 3229 "frontends/verilog/verilog_parser.y"
                    {
		AstNode* node = extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_GENBLOCK));
		node->str = yystack_[0].value.as < string_t > () ? *yystack_[0].value.as < string_t > () : std::string();
	}
#line 5144 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 665: // gen_block: TOK_BEGIN $@81 opt_label $@82 module_gen_body TOK_END opt_label
#line 3232 "frontends/verilog/verilog_parser.y"
                                            {
		extra->exitTypeScope();
		checkLabelsMatch(yystack_[0].location, "Begin label", yystack_[4].value.as < string_t > ().get(), yystack_[0].value.as < string_t > ().get());
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[6].location, yystack_[0].location);
		extra->ast_stack.pop_back();
	}
#line 5155 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 666: // $@83: %empty
#line 3241 "frontends/verilog/verilog_parser.y"
        {
		(void)extra->pushChild(std::make_unique<AstNode>(yylhs.location, AST_GENBLOCK));
	}
#line 5163 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 667: // gen_stmt_block: $@83 gen_stmt_or_module_body_stmt
#line 3243 "frontends/verilog/verilog_parser.y"
                                       {
		SET_AST_NODE_LOC(extra->ast_stack.back(), yystack_[0].location, yystack_[0].location);
		extra->ast_stack.pop_back();
	}
#line 5172 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 671: // expr: basic_expr
#line 3252 "frontends/verilog/verilog_parser.y"
                   {
		yylhs.value.as < ast_t > () = std::move(yystack_[0].value.as < ast_t > ());
	}
#line 5180 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 672: // expr: basic_expr "'?'" attr expr "':'" expr
#line 3255 "frontends/verilog/verilog_parser.y"
                                                  {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_TERNARY);
		yylhs.value.as < ast_t > ()->children.push_back(std::move(yystack_[5].value.as < ast_t > ()));
		yylhs.value.as < ast_t > ()->children.push_back(std::move(yystack_[2].value.as < ast_t > ()));
		yylhs.value.as < ast_t > ()->children.push_back(std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[5].location, yylhs.location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[3].value.as < al_t > ()));
	}
#line 5193 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 673: // expr: inc_or_dec_op attr rvalue
#line 3263 "frontends/verilog/verilog_parser.y"
                                  {
		yylhs.value.as < ast_t > () = extra->addIncOrDecExpr(std::move(yystack_[0].value.as < ast_t > ()), std::move(yystack_[1].value.as < al_t > ()), yystack_[2].value.as < ast_node_type_t > (), location_range(yystack_[2].location, yystack_[0].location), false, mode->sv);
	}
#line 5201 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 674: // expr: rvalue inc_or_dec_op
#line 3268 "frontends/verilog/verilog_parser.y"
                             {
		yylhs.value.as < ast_t > () = extra->addIncOrDecExpr(std::move(yystack_[1].value.as < ast_t > ()), nullptr, yystack_[0].value.as < ast_node_type_t > (), location_range(yystack_[1].location, yystack_[0].location), true, mode->sv);
	}
#line 5209 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 675: // basic_expr: rvalue
#line 3273 "frontends/verilog/verilog_parser.y"
               {
		yylhs.value.as < ast_t > () = std::move(yystack_[0].value.as < ast_t > ());
	}
#line 5217 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 676: // basic_expr: "'('" expr "')'" integral_number
#line 3276 "frontends/verilog/verilog_parser.y"
                                                   {
		if (yystack_[0].value.as < string_t > ()->compare(0, 1, "'") != 0)
			err_at_loc(yystack_[0].location, "Cast operation must be applied on sized constants e.g. (<expr>)<constval> , while %s is not a sized constant.", *yystack_[0].value.as < string_t > ());
		ConstParser p{yystack_[0].location};
		auto val = p.const2ast(*yystack_[0].value.as < string_t > (), extra->case_type_stack.size() == 0 ? 0 : extra->case_type_stack.back(), !mode->lib);
		if (val == nullptr)
			log_error("Value conversion failed: `%s'\n", *yystack_[0].value.as < string_t > ());
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_TO_BITS, std::move(yystack_[2].value.as < ast_t > ()), std::move(val));
	}
#line 5231 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 677: // basic_expr: hierarchical_id integral_number
#line 3285 "frontends/verilog/verilog_parser.y"
                                        {
		if (yystack_[0].value.as < string_t > ()->compare(0, 1, "'") != 0)
			err_at_loc(yystack_[0].location, "Cast operation must be applied on sized constants, e.g. <ID>\'d0, while %s is not a sized constant.", *yystack_[0].value.as < string_t > ());
		auto bits = std::make_unique<AstNode>(yylhs.location, AST_IDENTIFIER);
		bits->str = *yystack_[1].value.as < string_t > ();
		SET_AST_NODE_LOC(bits.get(), yystack_[1].location, yystack_[1].location);
		ConstParser p{yystack_[0].location};
		auto val = p.const2ast(*yystack_[0].value.as < string_t > (), extra->case_type_stack.size() == 0 ? 0 : extra->case_type_stack.back(), !mode->lib);
		SET_AST_NODE_LOC(val.get(), yystack_[0].location, yystack_[0].location);
		if (val == nullptr)
			log_error("Value conversion failed: `%s'\n", *yystack_[0].value.as < string_t > ());
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_TO_BITS, std::move(bits), std::move(val));
	}
#line 5249 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 678: // basic_expr: integral_number
#line 3298 "frontends/verilog/verilog_parser.y"
                        {
		ConstParser p{yystack_[0].location};
		yylhs.value.as < ast_t > () = p.const2ast(*yystack_[0].value.as < string_t > (), extra->case_type_stack.size() == 0 ? 0 : extra->case_type_stack.back(), !mode->lib);
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[0].location, yystack_[0].location);
		if (yylhs.value.as < ast_t > () == nullptr)
			log_error("Value conversion failed: `%s'\n", *yystack_[0].value.as < string_t > ());
	}
#line 5261 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 679: // basic_expr: TOK_REALVAL
#line 3305 "frontends/verilog/verilog_parser.y"
                    {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_REALVALUE);
		char *p = (char*)malloc(GetSize(*yystack_[0].value.as < string_t > ()) + 1), *q;
		for (int i = 0, j = 0; j < GetSize(*yystack_[0].value.as < string_t > ()); j++)
			if ((*yystack_[0].value.as < string_t > ())[j] != '_')
				p[i++] = (*yystack_[0].value.as < string_t > ())[j], p[i] = 0;
		yylhs.value.as < ast_t > ()->realvalue = strtod(p, &q);
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[0].location, yystack_[0].location);
		log_assert(*q == 0);
		free(p);
	}
#line 5277 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 680: // basic_expr: TOK_STRING
#line 3316 "frontends/verilog/verilog_parser.y"
                   {
		yylhs.value.as < ast_t > () = AstNode::mkconst_str(yystack_[0].location, *yystack_[0].value.as < string_t > ());
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[0].location, yystack_[0].location);
	}
#line 5286 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 681: // @84: %empty
#line 3320 "frontends/verilog/verilog_parser.y"
                                    {
		// Here we use "Typed Midrule Actions".
		// https://www.gnu.org/software/bison/manual/html_node/Typed-Midrule-Actions.html
		auto fcall = std::make_unique<AstNode>(yystack_[1].location, AST_FCALL);
		AstNode *fcall_node = fcall.get();
		fcall_node->str = *yystack_[1].value.as < string_t > ();
		extra->ast_stack.push_back(fcall_node);
		SET_AST_NODE_LOC(fcall_node, yystack_[1].location, yystack_[1].location);
		append_attr(fcall_node, std::move(yystack_[0].value.as < al_t > ()));
		yylhs.value.as < ast_t > () = std::move(fcall);
	}
#line 5302 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 682: // basic_expr: hierarchical_id attr @84 "'('" arg_list optional_comma "')'"
#line 3330 "frontends/verilog/verilog_parser.y"
                                                        {
		log_assert(yystack_[4].value.as < ast_t > () != nullptr);
		yylhs.value.as < ast_t > () = std::move(yystack_[4].value.as < ast_t > ());
		extra->ast_stack.pop_back();
	}
#line 5312 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 683: // basic_expr: TOK_TO_SIGNED attr "'('" expr "')'"
#line 3335 "frontends/verilog/verilog_parser.y"
                                                      {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_TO_SIGNED, std::move(yystack_[1].value.as < ast_t > ()));
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[3].value.as < al_t > ()));
	}
#line 5321 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 684: // basic_expr: TOK_TO_UNSIGNED attr "'('" expr "')'"
#line 3339 "frontends/verilog/verilog_parser.y"
                                                        {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_TO_UNSIGNED, std::move(yystack_[1].value.as < ast_t > ()));
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[3].value.as < al_t > ()));
	}
#line 5330 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 685: // basic_expr: "'('" expr "')'"
#line 3343 "frontends/verilog/verilog_parser.y"
                                   {
		yylhs.value.as < ast_t > () = std::move(yystack_[1].value.as < ast_t > ());
	}
#line 5338 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 686: // basic_expr: "'('" expr "':'" expr "':'" expr "')'"
#line 3346 "frontends/verilog/verilog_parser.y"
                                                             {
		yylhs.value.as < ast_t > () = std::move(yystack_[3].value.as < ast_t > ());
	}
#line 5346 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 687: // basic_expr: "'{'" concat_list "'}'"
#line 3349 "frontends/verilog/verilog_parser.y"
                                        {
		yylhs.value.as < ast_t > () = std::move(yystack_[1].value.as < ast_t > ());
	}
#line 5354 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 688: // basic_expr: "'{'" expr "'{'" concat_list "'}'" "'}'"
#line 3352 "frontends/verilog/verilog_parser.y"
                                                                 {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_REPLICATE, std::move(yystack_[4].value.as < ast_t > ()), std::move(yystack_[2].value.as < ast_t > ()));
	}
#line 5362 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 689: // basic_expr: "'~'" attr basic_expr
#line 3355 "frontends/verilog/verilog_parser.y"
                                                  {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_BIT_NOT, std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[2].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5372 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 690: // basic_expr: basic_expr "'&'" attr basic_expr
#line 3360 "frontends/verilog/verilog_parser.y"
                                           {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_BIT_AND, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5382 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 691: // basic_expr: basic_expr OP_NAND attr basic_expr
#line 3365 "frontends/verilog/verilog_parser.y"
                                           {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_BIT_NOT, std::make_unique<AstNode>(yylhs.location, AST_BIT_AND, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ())));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5392 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 692: // basic_expr: basic_expr "'|'" attr basic_expr
#line 3370 "frontends/verilog/verilog_parser.y"
                                            {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_BIT_OR, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5402 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 693: // basic_expr: basic_expr OP_NOR attr basic_expr
#line 3375 "frontends/verilog/verilog_parser.y"
                                          {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_BIT_NOT, std::make_unique<AstNode>(yylhs.location, AST_BIT_OR, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ())));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5412 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 694: // basic_expr: basic_expr "'^'" attr basic_expr
#line 3380 "frontends/verilog/verilog_parser.y"
                                             {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_BIT_XOR, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5422 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 695: // basic_expr: basic_expr OP_XNOR attr basic_expr
#line 3385 "frontends/verilog/verilog_parser.y"
                                           {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_BIT_XNOR, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5432 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 696: // basic_expr: "'&'" attr basic_expr
#line 3390 "frontends/verilog/verilog_parser.y"
                                                {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_REDUCE_AND, std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[2].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5442 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 697: // basic_expr: OP_NAND attr basic_expr
#line 3395 "frontends/verilog/verilog_parser.y"
                                                {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_REDUCE_AND, std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[2].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_LOGIC_NOT, std::move(yylhs.value.as < ast_t > ()));
	}
#line 5453 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 698: // basic_expr: "'|'" attr basic_expr
#line 3401 "frontends/verilog/verilog_parser.y"
                                                 {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_REDUCE_OR, std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[2].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5463 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 699: // basic_expr: OP_NOR attr basic_expr
#line 3406 "frontends/verilog/verilog_parser.y"
                                               {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_REDUCE_OR, std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[2].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_LOGIC_NOT, std::move(yylhs.value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[2].location, yystack_[0].location);
	}
#line 5475 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 700: // basic_expr: "'^'" attr basic_expr
#line 3413 "frontends/verilog/verilog_parser.y"
                                                  {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_REDUCE_XOR, std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[2].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5485 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 701: // basic_expr: OP_XNOR attr basic_expr
#line 3418 "frontends/verilog/verilog_parser.y"
                                                {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_REDUCE_XNOR, std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[2].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5495 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 702: // basic_expr: basic_expr OP_SHL attr basic_expr
#line 3423 "frontends/verilog/verilog_parser.y"
                                          {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_SHIFT_LEFT, std::move(yystack_[3].value.as < ast_t > ()), std::make_unique<AstNode>(yylhs.location, AST_TO_UNSIGNED, std::move(yystack_[0].value.as < ast_t > ())));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5505 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 703: // basic_expr: basic_expr OP_SHR attr basic_expr
#line 3428 "frontends/verilog/verilog_parser.y"
                                          {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_SHIFT_RIGHT, std::move(yystack_[3].value.as < ast_t > ()), std::make_unique<AstNode>(yylhs.location, AST_TO_UNSIGNED, std::move(yystack_[0].value.as < ast_t > ())));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5515 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 704: // basic_expr: basic_expr OP_SSHL attr basic_expr
#line 3433 "frontends/verilog/verilog_parser.y"
                                           {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_SHIFT_SLEFT, std::move(yystack_[3].value.as < ast_t > ()), std::make_unique<AstNode>(yylhs.location, AST_TO_UNSIGNED, std::move(yystack_[0].value.as < ast_t > ())));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5525 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 705: // basic_expr: basic_expr OP_SSHR attr basic_expr
#line 3438 "frontends/verilog/verilog_parser.y"
                                           {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_SHIFT_SRIGHT, std::move(yystack_[3].value.as < ast_t > ()), std::make_unique<AstNode>(yylhs.location, AST_TO_UNSIGNED, std::move(yystack_[0].value.as < ast_t > ())));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5535 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 706: // basic_expr: basic_expr "'<'" attr basic_expr
#line 3443 "frontends/verilog/verilog_parser.y"
                                          {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_LT, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5545 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 707: // basic_expr: basic_expr OP_LE attr basic_expr
#line 3448 "frontends/verilog/verilog_parser.y"
                                         {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_LE, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5555 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 708: // basic_expr: basic_expr OP_EQ attr basic_expr
#line 3453 "frontends/verilog/verilog_parser.y"
                                         {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_EQ, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5565 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 709: // basic_expr: basic_expr OP_NE attr basic_expr
#line 3458 "frontends/verilog/verilog_parser.y"
                                         {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_NE, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5575 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 710: // basic_expr: basic_expr OP_EQX attr basic_expr
#line 3463 "frontends/verilog/verilog_parser.y"
                                          {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_EQX, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5585 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 711: // basic_expr: basic_expr OP_NEX attr basic_expr
#line 3468 "frontends/verilog/verilog_parser.y"
                                          {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_NEX, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5595 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 712: // basic_expr: basic_expr OP_GE attr basic_expr
#line 3473 "frontends/verilog/verilog_parser.y"
                                         {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_GE, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5605 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 713: // basic_expr: basic_expr "'>'" attr basic_expr
#line 3478 "frontends/verilog/verilog_parser.y"
                                          {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_GT, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5615 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 714: // basic_expr: basic_expr "'+'" attr basic_expr
#line 3483 "frontends/verilog/verilog_parser.y"
                                            {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_ADD, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5625 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 715: // basic_expr: basic_expr "'-'" attr basic_expr
#line 3488 "frontends/verilog/verilog_parser.y"
                                             {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_SUB, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5635 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 716: // basic_expr: basic_expr "'*'" attr basic_expr
#line 3493 "frontends/verilog/verilog_parser.y"
                                             {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_MUL, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5645 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 717: // basic_expr: basic_expr "'/'" attr basic_expr
#line 3498 "frontends/verilog/verilog_parser.y"
                                             {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_DIV, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5655 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 718: // basic_expr: basic_expr "'%'" attr basic_expr
#line 3503 "frontends/verilog/verilog_parser.y"
                                            {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_MOD, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5665 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 719: // basic_expr: basic_expr OP_POW attr basic_expr
#line 3508 "frontends/verilog/verilog_parser.y"
                                          {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_POW, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5675 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 720: // basic_expr: "'+'" attr basic_expr
#line 3513 "frontends/verilog/verilog_parser.y"
                                                 {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_POS, std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[2].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5685 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 721: // basic_expr: "'-'" attr basic_expr
#line 3518 "frontends/verilog/verilog_parser.y"
                                                  {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_NEG, std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[2].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5695 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 722: // basic_expr: basic_expr OP_LAND attr basic_expr
#line 3523 "frontends/verilog/verilog_parser.y"
                                           {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_LOGIC_AND, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5705 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 723: // basic_expr: basic_expr OP_LOR attr basic_expr
#line 3528 "frontends/verilog/verilog_parser.y"
                                          {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_LOGIC_OR, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[3].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5715 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 724: // basic_expr: "'!'" attr basic_expr
#line 3533 "frontends/verilog/verilog_parser.y"
                                                 {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_LOGIC_NOT, std::move(yystack_[0].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[2].location, yystack_[0].location);
		append_attr(yylhs.value.as < ast_t > ().get(), std::move(yystack_[1].value.as < al_t > ()));
	}
#line 5725 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 725: // basic_expr: TOK_SIGNED OP_CAST "'('" expr "')'"
#line 3538 "frontends/verilog/verilog_parser.y"
                                                      {
		if (!mode->sv)
			err_at_loc(yystack_[3].location, "Static cast is only supported in SystemVerilog mode.");
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_TO_SIGNED, std::move(yystack_[1].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[4].location, yystack_[1].location);
	}
#line 5736 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 726: // basic_expr: TOK_UNSIGNED OP_CAST "'('" expr "')'"
#line 3544 "frontends/verilog/verilog_parser.y"
                                                        {
		if (!mode->sv)
			err_at_loc(yystack_[3].location, "Static cast is only supported in SystemVerilog mode.");
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_TO_UNSIGNED, std::move(yystack_[1].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[4].location, yystack_[1].location);
	}
#line 5747 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 727: // basic_expr: basic_expr OP_CAST "'('" expr "')'"
#line 3550 "frontends/verilog/verilog_parser.y"
                                                      {
		if (!mode->sv)
			err_at_loc(yystack_[3].location, "Static cast is only supported in SystemVerilog mode.");
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_CAST_SIZE, std::move(yystack_[4].value.as < ast_t > ()), std::move(yystack_[1].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[4].location, yystack_[1].location);
	}
#line 5758 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 728: // basic_expr: typedef_base_type OP_CAST "'('" expr "')'"
#line 3556 "frontends/verilog/verilog_parser.y"
                                                             {
		if (!mode->sv)
			err_at_loc(yystack_[3].location, "Static cast is only supported in SystemVerilog mode.");
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_CAST_SIZE, std::move(yystack_[4].value.as < ast_t > ()), std::move(yystack_[1].value.as < ast_t > ()));
		SET_AST_NODE_LOC(yylhs.value.as < ast_t > ().get(), yystack_[4].location, yystack_[1].location);
	}
#line 5769 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 729: // basic_expr: "'('" expr "'='" expr "')'"
#line 3562 "frontends/verilog/verilog_parser.y"
                                               {
		extra->ensureAsgnExprAllowed(yystack_[2].location, mode->sv);
		yylhs.value.as < ast_t > () = yystack_[3].value.as < ast_t > ()->clone();
		auto node = std::make_unique<AstNode>(yylhs.location, AST_ASSIGN_EQ, std::move(yystack_[3].value.as < ast_t > ()), std::move(yystack_[1].value.as < ast_t > ()));
		SET_AST_NODE_LOC(node.get(), yystack_[3].location, yystack_[1].location);
		extra->ast_stack.back()->children.push_back(std::move(node));
	}
#line 5781 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 730: // basic_expr: "'('" expr asgn_binop expr "')'"
#line 3569 "frontends/verilog/verilog_parser.y"
                                                   {
		extra->ensureAsgnExprAllowed(yystack_[2].location, mode->sv);
		yylhs.value.as < ast_t > () = extra->addAsgnBinopStmt(nullptr, std::move(yystack_[3].value.as < ast_t > ()), yystack_[2].value.as < ast_node_type_t > (), std::move(yystack_[1].value.as < ast_t > ()))-> clone();
	}
#line 5790 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 731: // concat_list: expr
#line 3575 "frontends/verilog/verilog_parser.y"
             {
		yylhs.value.as < ast_t > () = std::make_unique<AstNode>(yylhs.location, AST_CONCAT, std::move(yystack_[0].value.as < ast_t > ()));
	}
#line 5798 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 732: // concat_list: expr "','" concat_list
#line 3578 "frontends/verilog/verilog_parser.y"
                                   {
		yylhs.value.as < ast_t > () = std::move(yystack_[0].value.as < ast_t > ());
		yylhs.value.as < ast_t > ()->children.push_back(std::move(yystack_[2].value.as < ast_t > ()));
	}
#line 5807 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 733: // integral_number: TOK_CONSTVAL
#line 3584 "frontends/verilog/verilog_parser.y"
                     { yylhs.value.as < string_t > () = std::move(yystack_[0].value.as < string_t > ()); }
#line 5813 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 734: // integral_number: TOK_UNBASED_UNSIZED_CONSTVAL
#line 3585 "frontends/verilog/verilog_parser.y"
                                     { yylhs.value.as < string_t > () = std::move(yystack_[0].value.as < string_t > ()); }
#line 5819 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 735: // integral_number: TOK_BASE TOK_BASED_CONSTVAL
#line 3586 "frontends/verilog/verilog_parser.y"
                                    {
		yystack_[1].value.as < string_t > ()->append(*yystack_[0].value.as < string_t > ());
		yylhs.value.as < string_t > () = std::move(yystack_[1].value.as < string_t > ());
	}
#line 5828 "frontends/verilog/verilog_parser.tab.cc"
    break;

  case 736: // integral_number: TOK_CONSTVAL TOK_BASE TOK_BASED_CONSTVAL
#line 3590 "frontends/verilog/verilog_parser.y"
                                                 {
		yystack_[2].value.as < string_t > ()->append(*yystack_[1].value.as < string_t > ()).append(*yystack_[0].value.as < string_t > ());
		yylhs.value.as < string_t > () = std::move(yystack_[2].value.as < string_t > ());
	}
#line 5837 "frontends/verilog/verilog_parser.tab.cc"
    break;


#line 5841 "frontends/verilog/verilog_parser.tab.cc"

            default:
              break;
            }
        }
#if YY_EXCEPTIONS
      catch (const syntax_error& yyexc)
        {
          YYCDEBUG << "Caught exception: " << yyexc.what() << '\n';
          error (yyexc);
          YYERROR;
        }
#endif // YY_EXCEPTIONS
      YY_SYMBOL_PRINT ("-> $$ =", yylhs);
      yypop_ (yylen);
      yylen = 0;

      // Shift the result of the reduction.
      yypush_ (YY_NULLPTR, YY_MOVE (yylhs));
    }
    goto yynewstate;


  /*--------------------------------------.
  | yyerrlab -- here on detecting error.  |
  `--------------------------------------*/
  yyerrlab:
    // If not already recovering from an error, report this error.
    if (!yyerrstatus_)
      {
        ++yynerrs_;
        context yyctx (*this, yyla);
        std::string msg = yysyntax_error_ (yyctx);
        error (yyla.location, YY_MOVE (msg));
      }


    yyerror_range[1].location = yyla.location;
    if (yyerrstatus_ == 3)
      {
        /* If just tried and failed to reuse lookahead token after an
           error, discard it.  */

        // Return failure if at end of input.
        if (yyla.kind () == symbol_kind::S_YYEOF)
          YYABORT;
        else if (!yyla.empty ())
          {
            yy_destroy_ ("Error: discarding", yyla);
            yyla.clear ();
          }
      }

    // Else will try to reuse lookahead token after shifting the error token.
    goto yyerrlab1;


  /*---------------------------------------------------.
  | yyerrorlab -- error raised explicitly by YYERROR.  |
  `---------------------------------------------------*/
  yyerrorlab:
    /* Pacify compilers when the user code never invokes YYERROR and
       the label yyerrorlab therefore never appears in user code.  */
    if (false)
      YYERROR;

    /* Do not reclaim the symbols of the rule whose action triggered
       this YYERROR.  */
    yypop_ (yylen);
    yylen = 0;
    YY_STACK_PRINT ();
    goto yyerrlab1;


  /*-------------------------------------------------------------.
  | yyerrlab1 -- common code for both syntax error and YYERROR.  |
  `-------------------------------------------------------------*/
  yyerrlab1:
    yyerrstatus_ = 3;   // Each real token shifted decrements this.
    // Pop stack until we find a state that shifts the error token.
    for (;;)
      {
        yyn = yypact_[+yystack_[0].state];
        if (!yy_pact_value_is_default_ (yyn))
          {
            yyn += symbol_kind::S_YYerror;
            if (0 <= yyn && yyn <= yylast_
                && yycheck_[yyn] == symbol_kind::S_YYerror)
              {
                yyn = yytable_[yyn];
                if (0 < yyn)
                  break;
              }
          }

        // Pop the current state because it cannot handle the error token.
        if (yystack_.size () == 1)
          YYABORT;

        yyerror_range[1].location = yystack_[0].location;
        yy_destroy_ ("Error: popping", yystack_[0]);
        yypop_ ();
        YY_STACK_PRINT ();
      }
    {
      stack_symbol_type error_token;

      yyerror_range[2].location = yyla.location;
      YYLLOC_DEFAULT (error_token.location, yyerror_range, 2);

      // Shift the error token.
      yy_lac_discard_ ("error recovery");
      error_token.state = state_type (yyn);
      yypush_ ("Shifting", YY_MOVE (error_token));
    }
    goto yynewstate;


  /*-------------------------------------.
  | yyacceptlab -- YYACCEPT comes here.  |
  `-------------------------------------*/
  yyacceptlab:
    yyresult = 0;
    goto yyreturn;


  /*-----------------------------------.
  | yyabortlab -- YYABORT comes here.  |
  `-----------------------------------*/
  yyabortlab:
    yyresult = 1;
    goto yyreturn;


  /*-----------------------------------------------------.
  | yyreturn -- parsing is finished, return the result.  |
  `-----------------------------------------------------*/
  yyreturn:
    if (!yyla.empty ())
      yy_destroy_ ("Cleanup: discarding lookahead", yyla);

    /* Do not reclaim the symbols of the rule whose action triggered
       this YYABORT or YYACCEPT.  */
    yypop_ (yylen);
    YY_STACK_PRINT ();
    while (1 < yystack_.size ())
      {
        yy_destroy_ ("Cleanup: popping", yystack_[0]);
        yypop_ ();
      }

    return yyresult;
  }
#if YY_EXCEPTIONS
    catch (...)
      {
        YYCDEBUG << "Exception caught: cleaning lookahead and stack\n";
        // Do not try to display the values of the reclaimed symbols,
        // as their printers might throw an exception.
        if (!yyla.empty ())
          yy_destroy_ (YY_NULLPTR, yyla);

        while (1 < yystack_.size ())
          {
            yy_destroy_ (YY_NULLPTR, yystack_[0]);
            yypop_ ();
          }
        throw;
      }
#endif // YY_EXCEPTIONS
  }

  void
  parser::error (const syntax_error& yyexc)
  {
    error (yyexc.location, yyexc.what ());
  }

  const char *
  parser::symbol_name (symbol_kind_type yysymbol)
  {
    static const char *const yy_sname[] =
    {
    "end of file", "error", "invalid token", "string", "ast_t", "al_t",
  "specify target", "specify triple", "specify rise and fall", "boolean",
  "invalid token", "integer", "ast_node_type_t", "TOK_STRING", "TOK_ID",
  "TOK_CONSTVAL", "TOK_REALVAL", "TOK_PRIMITIVE", "TOK_SVA_LABEL",
  "TOK_SPECIFY_OPER", "TOK_MSG_TASKS", "TOK_BASE", "TOK_BASED_CONSTVAL",
  "TOK_UNBASED_UNSIZED_CONSTVAL", "TOK_USER_TYPE", "TOK_PKG_USER_TYPE",
  "TOK_ASSERT", "TOK_ASSUME", "TOK_RESTRICT", "TOK_COVER", "TOK_FINAL",
  "ATTR_BEGIN", "ATTR_END", "DEFATTR_BEGIN", "DEFATTR_END", "TOK_MODULE",
  "TOK_ENDMODULE", "TOK_PARAMETER", "TOK_LOCALPARAM", "TOK_DEFPARAM",
  "TOK_PACKAGE", "TOK_ENDPACKAGE", "TOK_PACKAGESEP", "TOK_INTERFACE",
  "TOK_ENDINTERFACE", "TOK_MODPORT", "TOK_VAR", "TOK_WILDCARD_CONNECT",
  "TOK_INPUT", "TOK_OUTPUT", "TOK_INOUT", "TOK_WIRE", "TOK_WAND",
  "TOK_WOR", "TOK_REG", "TOK_LOGIC", "TOK_INTEGER", "TOK_SIGNED",
  "TOK_ASSIGN", "TOK_ALWAYS", "TOK_INITIAL", "TOK_ALWAYS_FF",
  "TOK_ALWAYS_COMB", "TOK_ALWAYS_LATCH", "TOK_BEGIN", "TOK_END", "TOK_IF",
  "TOK_ELSE", "TOK_IFNONE", "TOK_FOR", "TOK_WHILE", "TOK_REPEAT",
  "TOK_DPI_FUNCTION", "TOK_POSEDGE", "TOK_NEGEDGE", "TOK_OR",
  "TOK_AUTOMATIC", "TOK_CASE", "TOK_CASEX", "TOK_CASEZ", "TOK_ENDCASE",
  "TOK_DEFAULT", "TOK_FUNCTION", "TOK_ENDFUNCTION", "TOK_TASK",
  "TOK_ENDTASK", "TOK_SPECIFY", "TOK_IGNORED_SPECIFY", "TOK_ENDSPECIFY",
  "TOK_SPECPARAM", "TOK_SPECIFY_AND", "TOK_IGNORED_SPECIFY_AND",
  "TOK_GENERATE", "TOK_ENDGENERATE", "TOK_GENVAR", "TOK_REAL",
  "TOK_SYNOPSYS_FULL_CASE", "TOK_SYNOPSYS_PARALLEL_CASE", "TOK_SUPPLY0",
  "TOK_SUPPLY1", "TOK_TO_SIGNED", "TOK_TO_UNSIGNED", "TOK_POS_INDEXED",
  "TOK_NEG_INDEXED", "TOK_PROPERTY", "TOK_ENUM", "TOK_TYPEDEF", "TOK_RAND",
  "TOK_CONST", "TOK_CHECKER", "TOK_ENDCHECKER", "TOK_EVENTUALLY",
  "TOK_INCREMENT", "TOK_DECREMENT", "TOK_UNIQUE", "TOK_UNIQUE0",
  "TOK_PRIORITY", "TOK_STRUCT", "TOK_PACKED", "TOK_UNSIGNED", "TOK_INT",
  "TOK_BYTE", "TOK_SHORTINT", "TOK_LONGINT", "TOK_VOID", "TOK_UNION",
  "TOK_BIT_OR_ASSIGN", "TOK_BIT_AND_ASSIGN", "TOK_BIT_XOR_ASSIGN",
  "TOK_ADD_ASSIGN", "TOK_SUB_ASSIGN", "TOK_DIV_ASSIGN", "TOK_MOD_ASSIGN",
  "TOK_MUL_ASSIGN", "TOK_SHL_ASSIGN", "TOK_SHR_ASSIGN", "TOK_SSHL_ASSIGN",
  "TOK_SSHR_ASSIGN", "TOK_BIND", "TOK_TIME_SCALE", "TOK_IMPORT", "'!'",
  "'#'", "'%'", "'&'", "'('", "')'", "'*'", "'+'", "','", "'-'", "'.'",
  "'/'", "':'", "';'", "'<'", "'='", "'>'", "'?'", "'@'", "'['", "']'",
  "'^'", "'_'", "'{'", "'|'", "'}'", "'~'", "'n'", "'p'", "'x'", "'z'",
  "OP_LOR", "OP_LAND", "OP_NOR", "OP_XNOR", "OP_NAND", "OP_EQ", "OP_NE",
  "OP_EQX", "OP_NEX", "OP_LE", "OP_GE", "OP_SHL", "OP_SHR", "OP_SSHL",
  "OP_SSHR", "OP_POW", "OP_CAST", "UNARY_OPS", "FAKE_THEN", "$accept",
  "input", "$@1", "design", "attr", "$@2", "attr_opt", "defattr", "$@3",
  "$@4", "opt_attr_list", "attr_list", "attr_assign", "hierarchical_id",
  "hierarchical_type_id", "module", "$@5", "$@6", "module_para_opt",
  "module_para_list", "single_module_para", "$@7", "$@8",
  "module_args_opt", "module_args", "optional_comma",
  "module_arg_opt_assignment", "module_arg", "$@9", "$@10", "$@11", "$@12",
  "package", "$@13", "$@14", "package_body", "package_body_stmt",
  "import_stmt", "$@15", "import_item_list", "import_item", "interface",
  "$@16", "$@17", "interface_body", "interface_body_stmt",
  "bind_directive", "$@18", "$@19", "$@20", "bind_target",
  "opt_bind_target_instance_list", "bind_target_instance_list",
  "bind_target_instance", "mintypmax_expr", "non_opt_delay", "delay",
  "io_wire_type", "$@21", "non_io_wire_type", "$@22", "wire_type",
  "wire_type_token_io", "wire_type_signedness", "wire_type_const_rand",
  "opt_wire_type_token", "wire_type_token", "net_type", "logic_type",
  "integer_atom_type", "integer_vector_type", "non_opt_range",
  "non_opt_multirange", "range", "range_or_multirange", "module_body",
  "module_body_stmt", "checker_decl", "$@23", "task_func_decl", "$@24",
  "$@25", "$@26", "$@27", "$@28", "$@29", "func_return_type",
  "opt_type_vec", "opt_signedness_default_signed",
  "opt_signedness_default_unsigned", "dpi_function_arg",
  "opt_dpi_function_args", "dpi_function_args", "opt_automatic",
  "opt_lifetime", "task_func_args_opt", "$@30", "$@31", "task_func_args",
  "task_func_port", "$@32", "$@33", "task_func_body", "specify_block",
  "specify_item_list", "specify_item", "specify_opt_triple", "specify_if",
  "specify_condition", "specify_target", "specify_edge",
  "specify_rise_fall", "specify_triple", "ignored_specify_block",
  "ignored_specify_item_opt", "ignored_specify_item",
  "specparam_declaration", "specparam_range",
  "list_of_specparam_assignments", "specparam_assignment",
  "path_declaration", "simple_path_declaration",
  "state_dependent_path_declaration", "module_path_expression",
  "module_path_primary", "number", "path_delay_value",
  "list_of_path_delay_extra_expressions", "specify_edge_identifier",
  "parallel_path_description", "full_path_description",
  "list_of_path_inputs", "more_path_inputs", "list_of_path_outputs",
  "opt_polarity_operator", "specify_input_terminal_descriptor",
  "specify_output_terminal_descriptor", "system_timing_declaration",
  "system_timing_arg", "system_timing_args", "ignspec_constant_expression",
  "ignspec_expr", "ignspec_id", "$@34", "param_signed", "param_integer",
  "param_real", "param_range", "param_integer_type", "param_range_type",
  "param_implicit_type", "param_type", "param_decl", "$@35",
  "localparam_decl", "$@36", "param_decl_list", "single_param_decl",
  "single_param_decl_ident", "defparam_decl", "defparam_decl_list",
  "single_defparam_decl", "enum_type", "$@37", "enum_base_type",
  "type_atom", "type_vec", "type_signing", "enum_name_list",
  "enum_name_decl", "opt_enum_init", "enum_var_list", "enum_var",
  "enum_decl", "struct_decl", "$@38", "struct_type", "$@39",
  "struct_union", "struct_body", "opt_packed", "opt_signed_struct",
  "struct_member_list", "struct_member", "member_name_list", "member_name",
  "$@40", "struct_member_type", "$@41", "member_type_token", "$@42",
  "$@43", "member_type", "struct_var_list", "struct_var", "wire_decl",
  "$@44", "$@45", "$@46", "$@47", "opt_supply_wires", "wire_name_list",
  "wire_name_and_opt_assign", "wire_name", "assign_stmt",
  "assign_expr_list", "assign_expr", "type_name", "typedef_decl",
  "typedef_base_type", "enum_struct_type", "cell_stmt", "$@48", "$@49",
  "tok_prim_wrapper", "cell_list", "single_cell", "single_cell_no_array",
  "$@50", "single_cell_arraylist", "$@51", "cell_list_no_array",
  "prim_list", "single_prim", "$@52", "cell_parameter_list_opt",
  "cell_parameter_list", "cell_parameter", "cell_port_list",
  "cell_port_list_rules", "cell_port", "always_comb_or_latch",
  "always_or_always_ff", "always_stmt", "$@53", "$@54", "$@55", "$@56",
  "always_cond", "always_events", "always_event", "opt_label",
  "opt_sva_label", "opt_property", "modport_stmt", "$@57", "$@58",
  "modport_args_opt", "modport_args", "modport_arg", "modport_member",
  "modport_type_token", "assert", "assert_property",
  "simple_behavioral_stmt", "asgn_binop", "inc_or_dec_op",
  "for_initialization", "behavioral_stmt", "$@59", "$@60", "$@61", "$@62",
  "$@63", "$@64", "$@65", "$@66", "$@67", "$@68", "$@69", "$@70",
  "if_attr", "case_attr", "case_type", "opt_synopsys_attr",
  "behavioral_stmt_list", "optional_else", "$@71", "case_body",
  "case_item", "$@72", "$@73", "gen_case_body", "gen_case_item", "$@74",
  "$@75", "case_select", "case_expr_list", "rvalue", "lvalue",
  "lvalue_concat_list", "opt_arg_list", "arg_list", "arg_list2",
  "single_arg", "module_gen_body", "gen_stmt_or_module_body_stmt",
  "genvar_identifier", "genvar_initialization", "gen_stmt", "$@76", "$@77",
  "$@78", "$@79", "$@80", "gen_block", "$@81", "$@82", "gen_stmt_block",
  "$@83", "opt_gen_else", "expr", "basic_expr", "@84", "concat_list",
  "integral_number", YY_NULLPTR
    };
    return yy_sname[yysymbol];
  }



  // parser::context.
  parser::context::context (const parser& yyparser, const symbol_type& yyla)
    : yyparser_ (yyparser)
    , yyla_ (yyla)
  {}

  int
  parser::context::expected_tokens (symbol_kind_type yyarg[], int yyargn) const
  {
    // Actual number of expected tokens
    int yycount = 0;

#if FRONTEND_VERILOG_YYDEBUG
    // Execute LAC once. We don't care if it is successful, we
    // only do it for the sake of debugging output.
    if (!yyparser_.yy_lac_established_)
      yyparser_.yy_lac_check_ (yyla_.kind ());
#endif

    for (int yyx = 0; yyx < YYNTOKENS; ++yyx)
      {
        symbol_kind_type yysym = YY_CAST (symbol_kind_type, yyx);
        if (yysym != symbol_kind::S_YYerror
            && yysym != symbol_kind::S_YYUNDEF
            && yyparser_.yy_lac_check_ (yysym))
          {
            if (!yyarg)
              ++yycount;
            else if (yycount == yyargn)
              return 0;
            else
              yyarg[yycount++] = yysym;
          }
      }
    if (yyarg && yycount == 0 && 0 < yyargn)
      yyarg[0] = symbol_kind::S_YYEMPTY;
    return yycount;
  }




  bool
  parser::yy_lac_check_ (symbol_kind_type yytoken) const
  {
    // Logically, the yylac_stack's lifetime is confined to this function.
    // Clear it, to get rid of potential left-overs from previous call.
    yylac_stack_.clear ();
    // Reduce until we encounter a shift and thereby accept the token.
#if FRONTEND_VERILOG_YYDEBUG
    YYCDEBUG << "LAC: checking lookahead " << symbol_name (yytoken) << ':';
#endif
    std::ptrdiff_t lac_top = 0;
    while (true)
      {
        state_type top_state = (yylac_stack_.empty ()
                                ? yystack_[lac_top].state
                                : yylac_stack_.back ());
        int yyrule = yypact_[+top_state];
        if (yy_pact_value_is_default_ (yyrule)
            || (yyrule += yytoken) < 0 || yylast_ < yyrule
            || yycheck_[yyrule] != yytoken)
          {
            // Use the default action.
            yyrule = yydefact_[+top_state];
            if (yyrule == 0)
              {
                YYCDEBUG << " Err\n";
                return false;
              }
          }
        else
          {
            // Use the action from yytable.
            yyrule = yytable_[yyrule];
            if (yy_table_value_is_error_ (yyrule))
              {
                YYCDEBUG << " Err\n";
                return false;
              }
            if (0 < yyrule)
              {
                YYCDEBUG << " S" << yyrule << '\n';
                return true;
              }
            yyrule = -yyrule;
          }
        // By now we know we have to simulate a reduce.
        YYCDEBUG << " R" << yyrule - 1;
        // Pop the corresponding number of values from the stack.
        {
          std::ptrdiff_t yylen = yyr2_[yyrule];
          // First pop from the LAC stack as many tokens as possible.
          std::ptrdiff_t lac_size = std::ptrdiff_t (yylac_stack_.size ());
          if (yylen < lac_size)
            {
              yylac_stack_.resize (std::size_t (lac_size - yylen));
              yylen = 0;
            }
          else if (lac_size)
            {
              yylac_stack_.clear ();
              yylen -= lac_size;
            }
          // Only afterwards look at the main stack.
          // We simulate popping elements by incrementing lac_top.
          lac_top += yylen;
        }
        // Keep top_state in sync with the updated stack.
        top_state = (yylac_stack_.empty ()
                     ? yystack_[lac_top].state
                     : yylac_stack_.back ());
        // Push the resulting state of the reduction.
        state_type state = yy_lr_goto_state_ (top_state, yyr1_[yyrule]);
        YYCDEBUG << " G" << int (state);
        yylac_stack_.push_back (state);
      }
  }

  // Establish the initial context if no initial context currently exists.
  bool
  parser::yy_lac_establish_ (symbol_kind_type yytoken)
  {
    /* Establish the initial context for the current lookahead if no initial
       context is currently established.

       We define a context as a snapshot of the parser stacks.  We define
       the initial context for a lookahead as the context in which the
       parser initially examines that lookahead in order to select a
       syntactic action.  Thus, if the lookahead eventually proves
       syntactically unacceptable (possibly in a later context reached via a
       series of reductions), the initial context can be used to determine
       the exact set of tokens that would be syntactically acceptable in the
       lookahead's place.  Moreover, it is the context after which any
       further semantic actions would be erroneous because they would be
       determined by a syntactically unacceptable token.

       yy_lac_establish_ should be invoked when a reduction is about to be
       performed in an inconsistent state (which, for the purposes of LAC,
       includes consistent states that don't know they're consistent because
       their default reductions have been disabled).

       For parse.lac=full, the implementation of yy_lac_establish_ is as
       follows.  If no initial context is currently established for the
       current lookahead, then check if that lookahead can eventually be
       shifted if syntactic actions continue from the current context.  */
    if (yy_lac_established_)
      return true;
    else
      {
#if FRONTEND_VERILOG_YYDEBUG
        YYCDEBUG << "LAC: initial context established for "
                 << symbol_name (yytoken) << '\n';
#endif
        yy_lac_established_ = true;
        return yy_lac_check_ (yytoken);
      }
  }

  // Discard any previous initial lookahead context.
  void
  parser::yy_lac_discard_ (const char* event)
  {
   /* Discard any previous initial lookahead context because of Event,
      which may be a lookahead change or an invalidation of the currently
      established initial context for the current lookahead.

      The most common example of a lookahead change is a shift.  An example
      of both cases is syntax error recovery.  That is, a syntax error
      occurs when the lookahead is syntactically erroneous for the
      currently established initial context, so error recovery manipulates
      the parser stacks to try to find a new initial context in which the
      current lookahead is syntactically acceptable.  If it fails to find
      such a context, it discards the lookahead.  */
    if (yy_lac_established_)
      {
        YYCDEBUG << "LAC: initial context discarded due to "
                 << event << '\n';
        yy_lac_established_ = false;
      }
  }


  int
  parser::yy_syntax_error_arguments_ (const context& yyctx,
                                                 symbol_kind_type yyarg[], int yyargn) const
  {
    /* There are many possibilities here to consider:
       - If this state is a consistent state with a default action, then
         the only way this function was invoked is if the default action
         is an error action.  In that case, don't check for expected
         tokens because there are none.
       - The only way there can be no lookahead present (in yyla) is
         if this state is a consistent state with a default action.
         Thus, detecting the absence of a lookahead is sufficient to
         determine that there is no unexpected or expected token to
         report.  In that case, just report a simple "syntax error".
       - Don't assume there isn't a lookahead just because this state is
         a consistent state with a default action.  There might have
         been a previous inconsistent state, consistent state with a
         non-default action, or user semantic action that manipulated
         yyla.  (However, yyla is currently not documented for users.)
         In the first two cases, it might appear that the current syntax
         error should have been detected in the previous state when
         yy_lac_check was invoked.  However, at that time, there might
         have been a different syntax error that discarded a different
         initial context during error recovery, leaving behind the
         current lookahead.
    */

    if (!yyctx.lookahead ().empty ())
      {
        if (yyarg)
          yyarg[0] = yyctx.token ();
        int yyn = yyctx.expected_tokens (yyarg ? yyarg + 1 : yyarg, yyargn - 1);
        return yyn + 1;
      }
    return 0;
  }

  // Generate an error message.
  std::string
  parser::yysyntax_error_ (const context& yyctx) const
  {
    // Its maximum.
    enum { YYARGS_MAX = 5 };
    // Arguments of yyformat.
    symbol_kind_type yyarg[YYARGS_MAX];
    int yycount = yy_syntax_error_arguments_ (yyctx, yyarg, YYARGS_MAX);

    char const* yyformat = YY_NULLPTR;
    switch (yycount)
      {
#define YYCASE_(N, S)                         \
        case N:                               \
          yyformat = S;                       \
        break
      default: // Avoid compiler warnings.
        YYCASE_ (0, YY_("syntax error"));
        YYCASE_ (1, YY_("syntax error, unexpected %s"));
        YYCASE_ (2, YY_("syntax error, unexpected %s, expecting %s"));
        YYCASE_ (3, YY_("syntax error, unexpected %s, expecting %s or %s"));
        YYCASE_ (4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
        YYCASE_ (5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
#undef YYCASE_
      }

    std::string yyres;
    // Argument number.
    std::ptrdiff_t yyi = 0;
    for (char const* yyp = yyformat; *yyp; ++yyp)
      if (yyp[0] == '%' && yyp[1] == 's' && yyi < yycount)
        {
          yyres += symbol_name (yyarg[yyi++]);
          ++yyp;
        }
      else
        yyres += *yyp;
    return yyres;
  }


  const short parser::yypact_ninf_ = -1178;

  const short parser::yytable_ninf_ = -627;

  const short
  parser::yypact_[] =
  {
   -1178,   122,    91, -1178, -1178, -1178,   994, -1178,   133, -1178,
     385, -1178,    91,    91,    91,    91,    91,    91,    91,    91,
      91,    91,   158,   194, -1178, -1178, -1178, -1178, -1178, -1178,
   -1178, -1178, -1178, -1178, -1178, -1178,   213, -1178,   117,   205,
   -1178, -1178, -1178,   109,   128,   158,   268, -1178, -1178, -1178,
   -1178,   241,   273,   273,   333, -1178, -1178, -1178, -1178, -1178,
   -1178, -1178, -1178, -1178, -1178, -1178, -1178,   231, -1178,    95,
   -1178,   343,   286, -1178, -1178, -1178, -1178, -1178, -1178,   322,
    2849,   109,   109, -1178,   128, -1178, -1178,   298,    31, -1178,
     301,   353,   446,   920,   920,   457,    39, -1178,   667,   488,
     158,   492,   158,   514,   553,  2849,   364, -1178, -1178, -1178,
     370,   224,   224, -1178,   249, -1178,   411, -1178,   609, -1178,
     613, -1178,   449, -1178, -1178, -1178, -1178,   453, -1178, -1178,
    2963, -1178, -1178, -1178,  2849, -1178, -1178, -1178, -1178, -1178,
     138,   455, -1178,    50,   175,  3702, -1178, -1178, -1178,   109,
   -1178,   648,   158, -1178,   513,   658, -1178, -1178, -1178, -1178,
   -1178,   109,   262, -1178, -1178, -1178, -1178,   663, -1178,   262,
     663, -1178, -1178,   665,   680, -1178, -1178,   682, -1178,   117,
     703,   205, -1178,   649, -1178, -1178, -1178, -1178, -1178,   538,
     567,   706, -1178, -1178, -1178,   109, -1178, -1178, -1178, -1178,
     711, -1178,   601,   606,   612,   619,  3311,  3311,   286,  1294,
    3311,  3311,  3311,   -26,   610,  3311,  3311,  3311,  3311,  3311,
    2849, -1178,   109, -1178, -1178,   633,   158, -1178,  2849,  2849,
    2849, -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178,
   -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178,
   -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178,   656,
     650, -1178,   618, -1178, -1178, -1178,    49, -1178,   364, -1178,
   -1178, -1178, -1178, -1178,   131, -1178,   637,   109,   171,   657,
     668,   646,   789, -1178, -1178, -1178,   109,   673, -1178,    38,
      81,   660,   672,   687, -1178, -1178,   674, -1178,   815,  1004,
   -1178,  2849,  2849,  2849,  2849, -1178, -1178, -1178, -1178, -1178,
   -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178,
     104,  2849,  2849,  2849, -1178, -1178, -1178,  2849,  2849, -1178,
   -1178, -1178, -1178, -1178, -1178,   289,   693,  2849,    84, -1178,
     678,   686,   688,  3311,  3311,  3311,  3311,  3311,  3311,  3311,
    3311,  2849,  3311,  3311,  3311,  3311,  3311,  3311,  3311,  3311,
    3311,  3311,  3311,  3311,  3311,  3311,  3311,  3311,  3311,  3311,
    2849, -1178,   701,   158,   658, -1178,   567,   663, -1178,  2849,
   -1178, -1178, -1178,   834,   696,   840, -1178,   673,   673, -1178,
     717,   710,   510,   260, -1178, -1178,   851, -1178,   718,   537,
     719, -1178, -1178,  3311, -1178,   706,   707, -1178, -1178, -1178,
     284, -1178, -1178,   224,   224, -1178,    41,   109,   728,   729,
     730,   731, -1178,   725,   733,   734,   735, -1178,   716,   732,
    2849,   739, -1178, -1178, -1178,   466,  1834,   466,   362,   362,
     466,  1296,  1296,   736,  3902,  3886,  3794,  3840,  3886,  3902,
    1834,  1946,  1946,  1946,  1946,  1296,  1296,   526,   526,   526,
     526,   700,   748,   751,   884, -1178, -1178,   746, -1178, -1178,
      69,   887, -1178,   275, -1178,   888,   668,   749,   750, -1178,
     892, -1178, -1178, -1178, -1178,    38,   752,   895,   759, -1178,
     639, -1178,   835,   109,   107,   771,   257,  3748, -1178, -1178,
     109,   815, -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178,
   -1178,  2849, -1178, -1178,   754,   158,   769, -1178, -1178, -1178,
   -1178,  2849, -1178,  1887, -1178, -1178,   354, -1178,   773,   481,
   -1178, -1178, -1178, -1178, -1178, -1178, -1178,   834, -1178,   768,
   -1178, -1178,   537,   779, -1178,   918,   311,   920,   920, -1178,
    2849, -1178, -1178, -1178, -1178, -1178, -1178,   622, -1178,   622,
     919, -1178, -1178,   109, -1178,   921,   794,   772, -1178, -1178,
   -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178,
     322,   791, -1178, -1178,  2849,   792, -1178,   925,   310, -1178,
   -1178,   795,   884, -1178,  3463,   936, -1178, -1178,   668, -1178,
     401,   418,   109,    99, -1178,   109, -1178,   800, -1178,   203,
     893, -1178,   246, -1178, -1178, -1178, -1178,   630, -1178,   801,
   -1178,   890,   676,   663,   663, -1178,   752,   846, -1178,   685,
     685, -1178,   158,   376, -1178, -1178, -1178,    35, -1178, -1178,
   -1178, -1178, -1178,   944,   947,   109, -1178, -1178, -1178, -1178,
   -1178, -1178,   821, -1178,  1887, -1178, -1178, -1178,   773, -1178,
     823,   828, -1178, -1178, -1178,    75,   245,    21, -1178,   964,
   -1178,  3745, -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178,
   -1178, -1178, -1178,   965, -1178, -1178, -1178, -1178, -1178, -1178,
   -1178,   698, -1178,   836, -1178, -1178, -1178,   826, -1178, -1178,
   -1178, -1178,   837, -1178, -1178, -1178, -1178, -1178, -1178,  1947,
   -1178, -1178,   841,   844,   845,   916,   927,   930, -1178,  2849,
     149, -1178, -1178,  1282, -1178,    67,    67,    67,    42, -1178,
     850,   852, -1178, -1178, -1178, -1178,  1314, -1178, -1178, -1178,
   -1178, -1178, -1178, -1178,   265, -1178,   770, -1178, -1178,   265,
     752,   829,   109, -1178,   853,   390, -1178,   847,   246, -1178,
   -1178, -1178,   246,   842,  2092, -1178,  1157,   856,   855, -1178,
     865, -1178,   773,  2849, -1178,   866,   868,   926,    75,   871,
   -1178,   872,   885, -1178,   313,   294, -1178, -1178, -1178,   878,
     880,   879,   881, -1178,   899,  2849,  1031,   412, -1178,   897,
    3580,   901, -1178, -1178, -1178, -1178,   794, -1178,   422, -1178,
     942,   959,   963,   966,  2849, -1178,   918, -1178,   905,   329,
     915,   865,   773, -1178,  2849,  2849,   906,   922,   865,    35,
     794,   794,    50,   794, -1178, -1178,   931,   932,   934, -1178,
     937,  2849,  2849, -1178, -1178, -1178, -1178, -1178, -1178, -1178,
   -1178,  2849, -1178,    80, -1178,    35, -1178,  2849, -1178, -1178,
   -1178,   794, -1178,   120, -1178, -1178,   928, -1178,  1061, -1178,
   -1178, -1178,  2849,   933, -1178,   935,    82,   669,  2849, -1178,
   -1178,   669,   109,   191, -1178, -1178, -1178,  1031,   938,   625,
   -1178, -1178, -1178, -1178, -1178,  3023,  3023,  1589,   939, -1178,
     423,  1031, -1178,  2849, -1178,  3341, -1178, -1178, -1178, -1178,
   -1178,   701,  1069, -1178,   965, -1178,   941,   948,   950,   951,
     943, -1178, -1178, -1178,  2849,  2849,   954, -1178,  1083,   967,
     972, -1178,  2849,   955, -1178,  2849,  2849, -1178,  2849,  2152,
    2267,  2327,  2441,   974,   975, -1178, -1178, -1178, -1178, -1178,
     956, -1178, -1178,  1096,   958, -1178, -1178,   424,   430,   918,
     977,  1508, -1178,   246, -1178,   992, -1178,   769, -1178, -1178,
   -1178, -1178,  1124,   984,   987, -1178, -1178,  2849,   997,  2849,
   -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178,
   -1178, -1178,  1422, -1178, -1178, -1178,   998,   373,   989, -1178,
    1031, -1178,   632,   991,  2963, -1178,  1009,  1006, -1178,  1031,
    1031, -1178,   266, -1178,  2849, -1178, -1178, -1178, -1178, -1178,
    1146, -1178,   467, -1178,  1146, -1178,  2501,  2615,  2675,  2849,
   -1178,   366,  1008, -1178, -1178,  1007,   109,  1010, -1178, -1178,
   -1178, -1178, -1178, -1178, -1178,  2849,  1019,  2849,  1021,  2849,
    1022,  1015,  1028, -1178, -1178,   503,  1030, -1178, -1178,  1161,
   -1178, -1178,  1034, -1178,  1023, -1178, -1178,  2849,  2849,  1039,
      64, -1178, -1178, -1178,  2789,  1041,  3635,  1113,  1032,  2849,
    2849,  1099, -1178,  1171,   387,   387,   387,   387,   387,   387,
     387,   387, -1178,   885, -1178, -1178, -1178, -1178, -1178, -1178,
   -1178,  1035,  1036, -1178,  1031, -1178,  1031, -1178,  1037,  1009,
    1706,  2849, -1178,  2849, -1178, -1178,  1589,  1042,  1589,  1038,
    3487,   109,   470, -1178, -1178, -1178,  1069, -1178, -1178,   471,
   -1178,  1046,  2849,  1051,  2849,  1052,  2849,  1054,  1056, -1178,
   -1178,  2849,  2849,   605,  2849,  1191,  2849,   246,   246,  1062,
    1053,  1063,  1064,  1070,  1065, -1178,  1067,   246, -1178, -1178,
   -1178, -1178,   918,  1068,  2849, -1178, -1178, -1178,  1703, -1178,
    1703, -1178,  1078, -1178,   773, -1178,  1143,  3710,  2849, -1178,
   -1178,  2849,  1066,  3137, -1178, -1178, -1178, -1178, -1178, -1178,
   -1178, -1178,   191, -1178,   191,   191,   191,   191,   191,   191,
     191,  1080,  1081,   408, -1178, -1178, -1178,  1031,  1084,  2849,
    1009,  1074, -1178, -1178, -1178, -1178, -1178, -1178,  1146, -1178,
   -1178,  1146, -1178, -1178,  1086,  1075,  1087,  1088,  1091,  1095,
    1097,  1154,  1104, -1178,   773, -1178, -1178,  1098, -1178, -1178,
   -1178,  1105, -1178,  1111, -1178,  1114, -1178, -1178, -1178,   652,
   -1178, -1178, -1178, -1178, -1178, -1178, -1178,  1113, -1178, -1178,
   -1178,  1118, -1178,   669,  2963,  1106, -1178,   582,   305,   588,
     929,   520,   305, -1178, -1178,  1031,  1031, -1178,  1031,  1107,
   -1178,  1120, -1178,  2849,  1122, -1178, -1178,  1128,  1121, -1178,
    1129, -1178,  1130, -1178, -1178, -1178, -1178,  1773, -1178, -1178,
    2849,  1131, -1178, -1178, -1178,  1215, -1178, -1178,  1207, -1178,
   -1178,  2849,  1423,  1133,   324,   287, -1178, -1178,  2849, -1178,
   -1178, -1178, -1178, -1178, -1178, -1178,    37, -1178,   163, -1178,
   -1178, -1178, -1178, -1178, -1178, -1178,  1773,    19,  1145,  1099,
    2849,  2849,  2849,  3197,  2849,  1137,  2849,  1139,   791,  1147,
    1113,  2849, -1178,  1148,   246, -1178,  1113,  1150,  1149,  1151,
     151,  2963,  1142, -1178,  1153,  1158,  2849,  1163,  2849, -1178,
   -1178, -1178, -1178, -1178,   246, -1178,  2849, -1178, -1178, -1178,
    1162,  2025, -1178,  2849,  1164,  1167,  1168,  1169,   246, -1178,
    1176,  2849,  2849,  1165, -1178,  1170, -1178,  1174, -1178,  2849,
    1180,   496,  1175,  2849, -1178, -1178, -1178,  1173, -1178,  2849,
    2849, -1178, -1178,   517,   791, -1178,  2849,  1185,  2849,  1186,
    2849,   570, -1178,  2849,  1187,  2849,  1188,  2849,  1203,  2849,
    1204,  2849,  1208,  2849,  1183, -1178
  };

  const short
  parser::yydefact_[] =
  {
       2,     0,    15,     1,    19,    79,     0,    93,     0,     3,
       0,    18,    15,    15,    15,    15,    15,    15,    15,    15,
      15,    15,    23,     0,    31,    32,   153,   152,   147,   370,
     394,   148,   151,   149,   150,   395,     0,   443,   209,   212,
     446,   447,   392,   161,     0,     0,     0,    34,   357,   359,
      64,     0,   224,   224,    16,     5,     4,    10,    11,    12,
      13,     6,     7,     8,     9,    28,    20,    22,    24,    26,
      80,   374,     0,   210,   211,   445,   213,   214,   444,   398,
       0,   160,   163,   162,     0,   439,   440,     0,   102,    94,
      99,    74,     0,   344,   344,     0,     0,   223,   206,     0,
      23,     0,     0,     0,     0,     0,    38,   376,   377,   375,
       0,   380,   380,    33,   401,   393,     0,   680,   733,   679,
       0,   734,     0,    15,    15,   561,   562,     0,    15,    15,
       0,    15,    15,    15,     0,    15,    15,    15,    15,    15,
     161,     0,    15,   675,     0,   671,   678,   158,   159,   161,
     442,     0,     0,    97,     0,     0,    35,   342,   346,   343,
     356,   161,   344,   353,   352,   354,   355,     0,   345,   344,
       0,    65,   190,     0,     0,   207,   208,     0,   202,   209,
       0,   212,   196,     0,    21,    25,    29,    30,    27,     0,
      48,     0,   378,   379,   372,   161,   399,   400,   397,   409,
       0,   735,     0,     0,     0,     0,     0,     0,    31,     0,
       0,     0,     0,   731,     0,     0,     0,     0,     0,     0,
       0,   681,   632,   631,   677,     0,     0,   674,     0,     0,
       0,   157,    15,    15,    15,    15,    15,    15,    15,    15,
      15,    15,    15,    15,    15,    15,    15,    15,    15,    15,
      15,    15,    15,    15,    15,    15,    15,    15,    15,     0,
       0,    95,    98,   100,    73,    78,     0,    76,    38,   160,
     347,   351,   348,   365,     0,   361,   364,   349,     0,     0,
     218,     0,     0,   198,   205,   200,   203,   228,    17,    15,
      15,     0,   385,    53,   381,   373,   409,   402,     0,   412,
     736,     0,     0,     0,     0,   675,   724,   696,   549,   550,
     551,   552,   553,   554,   555,   556,   557,   558,   559,   560,
     685,     0,     0,     0,   720,   721,   700,     0,     0,   687,
     698,   689,   699,   701,   697,     0,     0,     0,   161,   673,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,   441,   470,     0,     0,    75,    48,     0,   358,     0,
     350,   360,    68,   222,     0,     0,   192,   228,   228,   204,
     229,     0,     0,     0,    39,    46,    56,    47,     0,   117,
      53,    50,    83,     0,   383,    52,     0,   396,   403,   407,
       0,   405,   417,   380,   380,   410,     0,   161,     0,     0,
       0,     0,   676,     0,     0,     0,   731,   732,     0,   157,
     640,     0,   155,   156,   154,   718,   690,   716,   714,   715,
     717,   706,   713,     0,   694,   692,   723,   722,   693,   695,
     691,   708,   709,   710,   711,   707,   712,   702,   703,   704,
     705,   719,     0,     0,     0,   101,    77,     0,   362,   363,
      15,   216,   221,     0,   191,     0,   218,     0,     0,   227,
      15,   239,    42,    44,    37,    15,    55,     0,     0,   119,
       0,   120,   226,   161,    15,     0,    15,   384,   382,   371,
     161,     0,   404,   415,   416,   413,   411,   725,   683,   684,
     726,     0,   729,   730,     0,     0,    53,   639,   641,   643,
     728,     0,   727,   473,   458,   462,     0,   168,   510,     0,
      67,    72,    71,    70,    69,   215,   217,   220,   194,     0,
     239,   239,   117,    53,   232,     0,    15,   344,   344,    40,
       0,    57,    59,    63,   121,   122,   123,   130,   225,   130,
       0,    51,    49,   161,    81,     0,   114,   117,    82,    92,
      84,    85,    87,    88,    90,    86,    89,    91,   408,   406,
     398,     0,   688,   630,    52,     0,   672,     0,     0,   471,
     474,     0,     0,    96,    15,     0,    66,   219,   218,   193,
      15,    15,   161,    15,   230,   161,   237,     0,   197,     0,
     117,   566,    15,   569,   570,   568,   571,     0,   567,     0,
     238,     0,     0,     0,     0,    54,    55,   129,   128,   132,
       0,    61,     0,     0,   367,   516,   113,     0,   488,   495,
     489,   486,   487,     0,     0,   161,   493,   490,   414,   686,
     642,   682,     0,   469,   473,    15,   463,   661,   510,   663,
       0,     0,   603,   604,   605,   242,     0,     0,   646,     0,
     167,   117,   184,   181,   164,   186,   169,   170,   187,   175,
     171,   172,   174,     0,   179,   180,   176,   177,   173,   178,
     182,     0,   185,     0,   165,   166,   509,     0,   199,   201,
     234,   233,     0,   434,   511,   105,   106,   107,   108,     0,
     577,   579,     0,     0,     0,   602,   600,   601,   574,     0,
     161,    15,   633,    15,   572,   515,   515,   515,   515,   573,
       0,     0,    43,    45,    60,   127,   137,   143,   142,   141,
     135,   144,   140,   146,   126,   131,   133,   139,   145,   126,
      55,     0,   161,   366,     0,     0,   436,     0,    15,   424,
     426,   421,    15,   502,     0,   472,   480,     0,   477,   478,
     638,    36,   510,     0,   654,     0,     0,     0,   242,     0,
     340,     0,     0,   266,     0,     0,   268,   269,   270,     0,
       0,     0,     0,   271,     0,     0,     0,     0,   275,     0,
      15,     0,   448,   452,   453,   390,   114,   388,     0,   386,
       0,     0,     0,     0,     0,   195,     0,   231,     0,     0,
     103,   638,   510,   582,     0,     0,     0,   635,   638,     0,
     114,   114,     0,   114,   514,   513,     0,     0,     0,   534,
       0,     0,     0,   136,   138,   124,   125,   116,   134,   118,
      62,     0,   368,     0,   517,     0,   435,     0,   496,   428,
     428,   114,   494,     0,   491,   475,     0,   485,     0,   481,
     459,    15,   640,     0,   664,     0,     0,   257,     0,   240,
     241,   257,   161,     0,   283,   311,   312,     0,     0,   327,
     328,   265,   267,   278,   279,     0,     0,     0,     0,   337,
       0,     0,   272,     0,   183,   117,   648,   644,   647,   645,
     188,   470,     0,   450,     0,   389,     0,     0,     0,     0,
       0,   235,   109,   110,     0,     0,     0,   580,   117,     0,
       0,   634,     0,     0,   546,     0,     0,   545,     0,     0,
       0,     0,     0,     0,     0,   369,   525,   526,   527,   519,
      53,   521,   524,     0,     0,   437,   438,     0,     0,     0,
       0,     0,   501,    15,   476,   484,   479,    53,   662,   646,
     657,   650,     0,     0,     0,   255,   256,     0,     0,     0,
     341,   303,   302,   305,    15,    15,    15,    15,    15,    15,
      15,    15,     0,   284,   301,   304,     0,   327,     0,   325,
       0,   326,   327,   319,     0,   280,   307,   338,   281,     0,
       0,   334,     0,   333,     0,   273,   276,   277,   649,   168,
       0,   420,     0,   418,   467,   387,     0,     0,     0,     0,
     659,     0,     0,   578,   610,     0,   161,     0,   586,   588,
     636,   576,   544,   547,   548,     0,     0,     0,     0,     0,
       0,     0,     0,   590,   593,    52,     0,   523,   518,     0,
     425,   427,   422,   430,   432,   499,   500,     0,     0,     0,
       0,   503,   508,   492,     0,     0,    15,   666,   651,     0,
       0,   250,   247,     0,     0,     0,     0,     0,     0,     0,
       0,     0,    15,     0,    15,    15,    15,    15,    15,    15,
      15,     0,     0,   319,     0,   321,     0,   320,     0,     0,
     338,     0,   308,     0,   331,   332,     0,     0,     0,     0,
      15,   458,     0,   454,   456,   457,     0,   391,   466,     0,
     464,     0,     0,     0,     0,     0,     0,     0,     0,   620,
     111,     0,     0,    15,     0,     0,     0,    15,    15,     0,
       0,     0,     0,     0,     0,   533,     0,    15,   608,   522,
     520,   429,     0,     0,     0,   506,   507,   498,     0,   497,
       0,   483,     0,   637,   510,   668,   670,    15,     0,   653,
     655,     0,     0,     0,   285,   287,   291,   289,   286,   290,
     292,   288,     0,   282,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,   323,   329,   322,     0,     0,     0,
     309,     0,   335,   330,   336,   274,   189,   460,     0,   449,
     419,   467,   451,    15,     0,     0,     0,     0,     0,     0,
       0,   621,     0,   104,   510,   609,   563,   564,   583,   587,
     589,     0,   528,     0,   529,     0,   535,   532,   591,   615,
     431,   423,   433,   504,   505,   482,   665,   666,   658,   667,
     652,     0,   249,   257,     0,     0,   251,   297,   299,   298,
     296,   295,   300,   293,   294,     0,     0,   316,     0,     0,
     306,     0,   310,     0,     0,   455,   465,     0,     0,   537,
       0,   538,     0,   542,   541,   660,   619,     0,   112,   581,
       0,     0,   530,   531,   536,   613,   606,   607,   616,   669,
      15,     0,     0,     0,   327,   327,   324,   313,     0,   339,
      15,   468,   539,   540,   543,   627,   625,   622,     0,   628,
     565,    15,   611,   592,   594,   614,     0,     0,     0,   250,
       0,     0,     0,     0,     0,     0,     0,     0,   339,     0,
     666,     0,   624,     0,    15,   617,   666,     0,     0,     0,
       0,     0,     0,   258,   263,     0,     0,     0,     0,   461,
     623,   629,   584,   612,    15,   656,     0,   254,   253,   252,
       0,   263,   243,     0,     0,     0,     0,     0,    15,   618,
     246,     0,     0,     0,   318,     0,   315,     0,   585,     0,
       0,     0,     0,     0,   317,   314,   245,     0,   259,     0,
       0,   264,   244,     0,   264,   260,     0,     0,     0,     0,
       0,     0,   261,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,   262
  };

  const short
  parser::yypgoto_[] =
  {
   -1178, -1178, -1178,  1452,   357, -1178, -1178,    24, -1178, -1178,
    1200, -1178,  1238,    12,   -71, -1178, -1178, -1178,  1049, -1178,
     873, -1178, -1178,   988, -1178,  -386,  -571,   877, -1178, -1178,
   -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178,
     993, -1178, -1178, -1178, -1178, -1178,  -449, -1178, -1178, -1178,
   -1178, -1178, -1178,  -133,  -878,  -538,  -293, -1178, -1178,   437,
   -1178,  -348, -1178,   617,   843, -1178,   774, -1178,  -581,    22,
   -1178,   -52,  -137,   -84,  -147,   361,  -588, -1178, -1178,  -459,
   -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178,  1220,  1219,
     864,  -359, -1178,  1350, -1178,   382, -1178, -1178, -1178,   802,
   -1178, -1178,   256, -1178,   628, -1178, -1178, -1178,    68, -1178,
    -869, -1178,  -504, -1178, -1178,   675,  -576, -1178,   645,   541,
   -1178,  -767, -1178,   -44,  -383, -1178,   549, -1017, -1178, -1178,
   -1178,   571, -1178,   186,  -984,  -856,  -931, -1178,  -834, -1178,
     448,  -718,  -596, -1178,   145, -1178, -1178, -1178, -1178, -1178,
   -1178,   -86,    46, -1178,    66, -1178,  1304,  -269, -1178,   979,
   -1178,   724,  1472, -1178, -1178,   -50,   -47,   -96, -1178,  1090,
   -1178, -1178,   572, -1178, -1178, -1178,  1479, -1178,  1100,   940,
   -1178, -1178, -1178,  1218, -1178,  1014, -1178, -1178, -1178, -1178,
   -1178, -1178, -1178, -1178,   391,  -421, -1178, -1178, -1178, -1178,
     659, -1178,   356,  -528,  1040, -1178,   683,  1443,    86,  1522,
   -1178, -1178, -1178, -1178, -1178, -1178,  -988,  -390, -1178, -1178,
   -1178, -1178, -1178,   309, -1178,   624, -1178,   883, -1087, -1178,
     670, -1178, -1178,  1043, -1178, -1178, -1178, -1178, -1178, -1178,
    -763,  -654,  -589,    57, -1178, -1178, -1178, -1178, -1178,   487,
     590, -1178, -1178, -1178, -1177,   822,  -142, -1178,  -602, -1178,
   -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178, -1178,
   -1178, -1178, -1178,   924, -1178, -1178, -1178, -1178, -1178, -1178,
   -1178, -1178, -1178, -1178, -1178, -1178,   212, -1178,  1029,  -568,
     629,  -410,   695, -1178,   986,   602,   395,   603, -1178,  -587,
   -1178, -1178, -1178, -1178, -1178,  -585, -1178, -1178, -1090, -1178,
   -1178,   -80,  1144, -1178,   472,   -64
  };

  const short
  parser::yydefgoto_[] =
  {
       0,     1,     2,     9,   610,    11,    54,   611,    22,   101,
      66,    67,    68,   140,    37,    13,    92,   268,   190,   393,
     394,   547,   548,   291,   400,   406,   551,   401,   486,   487,
     626,   750,    14,    95,   279,   470,   530,    15,   155,   266,
     267,    16,    23,   106,   496,   568,    17,    45,   151,   372,
      89,   153,   262,    90,   819,   612,   637,   489,   490,   491,
     492,   645,   557,   847,   629,   744,   745,   746,   747,    38,
      39,    81,    82,    83,    84,   594,   906,   675,  1019,    18,
     280,   476,   598,   287,   387,   388,   180,   181,    75,    78,
     472,   384,   473,    98,   559,   391,   480,   702,   543,   544,
     816,   545,   546,   677,   777,   778,  1400,   779,  1182,  1265,
     977,  1362,  1363,   678,   785,   786,   679,   796,   797,   798,
     788,   789,   790,   992,   993,   994,  1005,  1112,   887,   791,
     792,   888,  1002,  1203,  1003,   889,  1204,   793,  1011,  1012,
     898,  1013,  1205,   882,   161,   162,   163,   271,   164,   165,
     166,   167,   613,    93,   614,    94,   274,   275,   276,   682,
     633,   634,   683,    71,   110,   168,   169,   194,   293,   294,
     404,   808,   809,   684,   685,   912,   805,    79,    42,   115,
     116,   198,   296,   297,   410,   411,   500,   298,   299,   415,
     416,   580,   417,  1022,  1023,   615,   861,  1163,   859,   860,
     957,  1062,  1063,  1064,   687,   755,   756,    87,   616,   141,
      44,   689,   911,  1024,   806,  1122,  1128,  1124,   591,  1125,
    1284,   526,  1129,  1130,  1131,   464,   588,   589,   767,   768,
     769,   646,   647,   690,   763,   963,   762,   758,   864,  1070,
    1071,   596,   617,   836,   577,   754,   954,   854,   950,   951,
     952,   953,   618,   692,   619,   323,   142,  1037,   620,   828,
     821,   822,  1034,   928,  1301,  1388,  1147,  1148,  1157,  1305,
    1158,   621,   622,   693,  1249,  1143,  1333,  1354,  1308,  1335,
    1336,  1374,  1231,  1296,  1297,  1350,  1327,  1328,   143,   723,
     826,   873,   516,   517,   518,   800,   907,   973,   974,   908,
     876,  1261,  1077,  1139,   770,  1175,   772,   969,  1176,  1177,
    1258,  1364,   145,   336,   214,   146
  };

  const short
  parser::yytable_[] =
  {
     144,   227,   260,   222,   771,   691,   674,   694,   170,   695,
     724,   531,   979,  1103,   495,   884,   195,   606,  1107,   263,
     395,   111,   160,   160,   112,   188,    12,   178,   636,   147,
     148,   997,  1123,    65,    69,   780,    12,    12,    12,    12,
      12,    12,    12,    12,    12,    12,  1031,   569,    19,    65,
     209,   493,   273,   172,   213,   734,   223,    88,    19,    19,
      19,    19,    19,    19,    19,    19,    19,    19,    20,   757,
     794,   799,   834,   103,   525,   573,   224,   270,    20,    20,
      20,    20,    20,    20,    20,    20,    20,    20,    21,   775,
     787,   -14,  1208,   109,   946,   396,   971,   834,    21,    21,
      21,    21,    21,    21,    21,    21,    21,    21,   468,   269,
     528,   295,    69,  -236,    69,   109,   109,   539,   874,   118,
     179,   396,     3,   327,     4,   120,   103,   121,   947,   948,
     585,   125,   126,  1338,     5,   676,  1287,   103,   328,  1168,
     335,   776,    85,   269,  1105,   673,   835,    46,   340,   341,
     342,   960,    86,   118,  1353,   844,   858,   604,    30,   120,
     862,   121,   125,   126,    88,   848,    35,  1309,   927,   -15,
     148,   835,    65,   686,    73,     6,   972,  1006,  1006,   850,
     103,   795,   104,   719,   -41,  1017,  -626,   -41,   890,   794,
    -626,   103,   173,  1282,   602,   174,   839,     6,   374,   719,
     799,   222,   656,   375,   981,   982,   118,   983,    70,   787,
    1169,   691,   120,  1170,   121,   909,   395,   705,   706,   707,
    -248,   418,   419,   420,   421,   380,   949,   397,   412,     7,
    1285,     8,   398,  1349,   389,   104,    74,    72,   338,   697,
     465,   423,   424,   425,   220,   -52,   104,   426,   426,   413,
    1206,   105,   414,   -52,   223,    96,   422,   431,   398,   780,
    1370,   934,    76,  1232,   607,   961,  1375,   962,   636,    80,
     506,   443,  -512,  -512,  -512,  -512,  1279,   228,   229,     4,
     377,   192,  1212,   -15,  1214,   378,  1109,   757,   921,   104,
     462,   890,   636,   636,  -575,   636,   563,  1379,   220,   469,
     104,   564,   565,  -575,   511,   799,   196,   272,   780,   220,
      91,   781,  1351,   782,   277,   566,  1352,   503,   504,   157,
     377,   109,   845,   636,    77,   381,  1193,   780,   230,   607,
    1345,  1347,   984,   783,   667,   985,   231,  -512,  -512,  -512,
    -512,   676,   708,   193,     4,  1315,   560,  1316,   709,    97,
     519,   673,     6,   986,   732,   733,   987,  1116,   988,    10,
     781,  1073,   782,     6,   100,   989,   990,   991,   197,    10,
      10,    10,    10,    10,    10,    10,    10,    10,    10,   686,
     102,   159,   891,   667,   846,    88,   885,   886,   609,  1346,
     784,   228,   229,  1210,  1311,     7,   608,   107,   108,    28,
     981,   982,   118,   983,   890,  1253,   484,  1254,   120,   485,
     121,   926,  1117,  1114,  1115,  1118,   578,     6,   933,   607,
      47,   536,    48,    49,   537,    50,  1344,  -512,  -512,  -512,
    -512,   581,   113,   501,     4,   999,   607,  1001,   502,   784,
     114,   586,   230,   590,  -512,  -512,  -512,  -512,   269,  1092,
     429,     4,   150,   609,   152,   700,   653,    51,   703,   654,
     156,   623,   624,    31,    32,    33,    34,    52,   721,    53,
     625,   171,   999,  1278,  1001,   923,   160,   160,   924,   632,
     203,   204,  1099,  1100,   698,   206,   207,   691,   210,   211,
     212,   909,   215,   216,   217,   218,   219,   221,   761,   226,
     154,   699,   182,   592,   519,   232,   189,     6,   593,   234,
     890,   269,  1140,   913,   237,  1141,   532,   946,    48,    49,
    1256,   999,  1000,  1001,     6,   752,   184,   338,   186,  1102,
     753,   691,   674,   694,   191,   695,   533,   935,   936,   855,
     938,  1235,   570,   609,   856,  1239,  1240,   482,   483,   258,
     259,   947,   948,    51,  1277,  1248,   534,  1278,   743,   743,
     609,   901,   571,    52,  1056,    53,   902,   187,   959,   109,
     109,   914,   901,  1059,   590,   199,   915,  1015,  1060,  1059,
    1299,  1075,   575,   222,  1061,  -115,  -115,  -115,   691,   343,
     344,   345,   346,   347,   348,   349,   350,   351,   352,   353,
     354,   355,   356,   357,   358,   359,   360,   361,   362,   363,
     364,   365,   366,   367,   368,   369,  1126,   676,   672,  1218,
    1221,  1127,   720,   607,  1219,  1222,  1365,   673,  1367,   820,
     200,  -512,  -512,  -512,  -512,   201,   223,   202,     4,   827,
     680,   205,  1408,   225,   338,  1409,   392,   399,  1385,   338,
    1387,   748,   748,   258,   259,   686,   725,   726,   727,   728,
     681,   676,   261,  1415,  1092,   743,  1416,   264,   632,   232,
    1234,   673,   265,   234,   235,   743,   236,   273,   237,   281,
     688,   288,  1094,   289,   866,  1095,   869,   554,   555,   556,
     937,    24,    25,   875,   282,  1098,   283,  1099,  1100,   686,
     269,  1184,  1185,  1186,  1187,  1188,  1189,  1190,  1191,    24,
      25,     6,   290,   258,   259,   899,  1422,   285,   676,  1423,
     292,   175,   176,    28,   810,   811,   812,   813,   673,   627,
     628,   736,  1092,   300,   920,   980,   737,   738,   739,   740,
     741,    28,   975,   976,   929,   930,   301,   609,  1306,  1307,
    1094,   302,  1373,   662,   663,   664,   686,   303,   748,  1099,
    1100,   943,   944,  1098,   304,  1099,  1100,   373,   748,   477,
     478,   945,  1389,   999,  1000,  1001,   329,   956,   337,   742,
     999,  1106,  1001,   837,   838,   840,  1398,    31,    32,    33,
      34,   177,   519,   379,    24,    25,   600,   601,   978,   427,
     428,   370,   385,   386,   371,    31,    32,    33,    34,    48,
      49,   382,    36,   383,   402,  1007,  1007,  1007,   390,   995,
    -115,  -115,  -115,  1007,   672,   741,    28,   529,   403,   409,
      36,   638,   639,   640,   641,   642,   405,   542,   430,   432,
     407,   338,   392,   463,   820,  1032,   680,   433,   471,   434,
     474,   399,   827,   567,   475,  1042,  1043,  1380,  1044,  1046,
    1048,  1050,  1052,   479,   481,   -58,   681,   338,   494,   488,
     643,   644,  1390,   499,   507,   508,   509,   510,   511,   512,
     513,  1072,   514,   515,   327,   520,   688,  1401,   259,   521,
      31,    32,    33,    34,   522,  1406,   523,  1081,   524,  1083,
     527,   535,   538,   540,   541,  1413,  -236,    65,   550,   552,
     553,   558,  1417,   710,  1419,    36,  1421,   562,   584,  1424,
     582,  1426,   599,  1428,  1110,  1430,   595,  1432,   603,  1434,
      48,    49,   605,   631,   899,   635,   609,   649,   651,   652,
     655,  -115,  -115,  -115,    24,    25,  1133,  1135,  1137,  1138,
     696,   671,  1145,   704,   735,   729,   730,   711,   759,  -595,
     542,   760,   712,   713,   714,  1149,   764,  1151,   773,  1153,
    -599,  -599,  -599,   774,   107,   108,    28,   157,   801,   807,
     815,   814,  -598,   817,   269,   851,   823,  1165,  1166,   824,
     825,   643,   644,  -596,  1172,   841,  -597,   842,   853,  1179,
    1180,   863,   870,   857,   871,   125,   126,   715,   716,   717,
     872,   877,   766,   878,   879,   158,   881,   883,    24,    25,
     995,   995,   995,   995,   995,   995,   995,   995,    24,    25,
     784,  1007,   893,  1211,   894,   895,  1007,   896,  1007,   159,
      31,    32,    33,    34,   897,   780,   916,   718,    26,    27,
      28,   922,  1224,   903,  1226,   910,  1228,   719,   107,   108,
      28,   820,  1233,   917,  1236,    36,  1238,   918,   925,  1217,
     919,   932,   931,  1092,   964,   965,   939,   940,   829,   941,
     832,   970,   942,  1021,  1252,   998,  1026,   968,  1072,  1030,
    1072,  1094,  1014,  1027,  1095,  1028,  1029,  1035,  1260,    29,
     672,  1262,  1097,  1266,  1098,  1055,  1099,  1100,  1033,  1041,
     946,    30,  1058,  1038,    31,    32,    33,    34,  1039,    35,
    1053,  1054,   680,  1065,    31,    32,    33,    34,   995,  1281,
     995,   995,   995,   995,   995,   995,   995,  1074,   971,    36,
    1079,  1080,   681,  1082,   672,  1101,  1104,  1108,  1267,    36,
    1268,  1269,  1270,  1271,  1272,  1273,  1274,   905,  1111,  1113,
    1121,  1142,   688,  1144,  1146,  1150,   680,  1152,  1154,  1155,
     117,    65,   118,   119,  1156,  1161,  1160,   659,   120,  1164,
     121,    24,    25,  1162,  1312,  1167,   681,  1173,  1178,  1181,
    1183,  1223,  1201,  1202,  1207,   721,  1213,  1225,  1227,  1215,
    1229,   672,  1230,  1319,   867,  1237,   688,  1242,  1241,  1243,
    1257,    26,    27,    28,   122,  1263,  1245,  1329,  1244,  1246,
    1330,  1247,  1251,   680,  1255,  1275,  1276,  1283,   766,  1289,
    1280,  1339,  1288,  1290,  1295,   305,   305,  1292,  1348,   305,
     305,   305,  1291,   681,   305,   305,   305,   305,   305,  1293,
    1298,  1294,  1313,  1317,  1300,   339,  1329,   123,   124,  1302,
    1358,  1359,  1360,   688,  1007,  1303,  1007,  1320,  1304,   125,
     126,  1371,  1310,  1318,  1321,  1322,   127,    31,    32,    33,
      34,  1381,  1332,  1323,  1324,  1331,  1007,  1334,  1007,  1343,
    1366,  1356,  1368,  1369,  1372,  1377,  1382,  1378,   128,  1376,
     183,   129,   130,  1393,  1384,   131,  1383,   132,   868,  1386,
    1394,  1391,  1402,  1395,  1396,  1397,  1404,   376,  1403,   133,
    1405,   134,   135,  1411,   136,  1399,  1407,  1412,  1410,  1435,
    1414,   137,   138,   139,  1418,  1420,  1425,  1427,    24,    25,
     185,  1084,  1085,  1086,  1087,  1088,  1089,  1090,  1091,   338,
     306,   307,  1429,  1431,   324,   325,   326,  1433,   549,   330,
     331,   332,   333,   334,   467,  1036,   849,   466,   843,   741,
      28,   561,   305,   305,   305,   305,   305,   305,   305,   305,
    1120,   305,   305,   305,   305,   305,   305,   305,   305,   305,
     305,   305,   305,   305,   305,   305,   305,   305,   305,   284,
     286,   597,   630,    99,   749,   701,   880,  1357,   308,   309,
     310,   311,   312,   313,   314,   315,   316,   317,   318,   319,
     308,   309,   310,   311,   312,   313,   314,   315,   316,   317,
     318,   319,   305,   905,    31,    32,    33,    34,   830,   232,
     320,   900,  1016,   234,   235,  1008,   236,   321,   237,  1192,
     322,  1194,  1195,  1196,  1197,  1198,  1199,  1200,   996,    36,
     892,  1314,  1119,   831,    55,    56,    57,    58,    59,    60,
      61,    62,    63,    64,   278,   572,   852,   671,    40,   254,
     255,   256,   257,   258,   259,    41,  1025,   435,   436,   437,
     438,   439,   440,   441,   442,   498,   444,   445,   446,   447,
     448,   449,   450,   451,   452,   453,   454,   455,   456,   457,
     458,   459,   460,   461,   408,   579,   505,  1220,  1250,   958,
     648,   117,    65,   118,   119,  1340,  1341,   149,    43,   120,
    1286,   121,    24,    25,   905,  1020,   574,   765,   955,   576,
    1066,   966,  1159,  1057,   583,   833,   731,   497,  1355,   308,
     309,   310,   311,   312,   313,   314,   315,   316,   317,   318,
     319,  1040,    26,    27,    28,   122,  1092,   967,  1093,   320,
     650,  1076,  1259,     0,     0,  1078,  1342,     0,     0,   322,
     766,  1067,  1068,     0,  1094,     0,     0,  1095,     0,     0,
       0,     0,     0,     0,  1096,  1097,     0,  1098,     0,  1099,
    1100,     0,   117,    65,   118,   119,     0,     0,   123,   124,
     120,     0,   121,    24,    25,     0,     0,     0,     0,     0,
     125,   126,     0,     0,     0,     0,     0,   127,    31,    32,
      33,    34,     0,     0,     0,     0,     0,     0,     0,   722,
       0,     0,     0,    26,    27,    28,   122,     0,     0,   128,
       0,     0,   129,   130,     0,  1069,   131,     0,   132,     0,
       0,   751,  1009,  1010,     0,     0,   722,  1337,     0,     0,
     133,     0,   134,   135,     0,   136,     0,   766,     0,     0,
       0,     0,   137,   138,   139,     0,     0,     0,  1337,   123,
     124,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,   125,   126,     0,     0,     0,     0,     0,   127,    31,
      32,    33,    34,     0,     0,     0,   117,    65,   118,   119,
       0,     0,     0,     0,   120,     0,   121,    24,    25,     0,
     128,     0,     0,   129,   130,     0,     0,   131,     0,   132,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,   133,     0,   134,   135,     0,   136,    26,    27,    28,
     122,     0,     0,   137,   138,   139,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,  1067,  1068,     0,     0,
       0,     0,     0,     0,     0,     0,   117,    65,   118,   119,
       0,  1325,     0,     0,   120,     0,   121,    24,    25,     0,
       0,     0,     0,   123,   124,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,   125,   126,     0,     0,     0,
       0,     0,   127,    31,    32,    33,    34,    26,    27,    28,
     122,     0,   308,   309,   310,   311,   312,   313,   314,   315,
     316,   317,   318,   319,   128,     0,     0,   129,   130,     0,
       0,   131,   320,   132,  1326,     0,     0,     0,   722,  1209,
       0,     0,   322,     0,     0,   133,     0,   134,   135,     0,
     136,     0,     0,   123,   124,     0,     0,   137,   138,   139,
       0,     0,     0,     0,   722,   125,   126,     0,     0,     0,
       0,     0,   127,    31,    32,    33,    34,     0,     0,     0,
     117,    65,   118,   119,     0,     0,     0,     0,   120,     0,
     121,    24,    25,     0,   128,     0,     0,   129,   130,     0,
       0,   131,     0,   132,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,   133,     0,   134,   135,     0,
     136,    26,    27,    28,   122,     0,     0,   137,   138,   139,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     117,    65,   118,   119,     0,     0,     0,     0,   120,     0,
     121,    24,    25,     0,     0,     0,     0,   232,     0,     0,
       0,   234,   235,     0,   236,     0,   237,   123,   124,   238,
       0,   239,     0,     0,     0,     0,     0,     0,     0,   125,
     126,    26,    27,    28,   122,     0,   127,    31,    32,    33,
      34,   248,   249,   250,   251,   252,   253,   254,   255,   256,
     257,   258,   259,     0,     0,     0,     0,     0,   128,     0,
       0,   129,   130,     0,     0,   131,     0,   132,   587,     0,
       0,     0,     0,     0,     0,     0,     0,   123,   124,   133,
       0,   134,   135,     0,   136,     0,     0,     0,     0,   125,
     126,   137,   138,   139,     0,     0,   127,    31,    32,    33,
      34,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,   818,     0,   128,   232,
       0,   129,   130,   234,   235,   131,   236,   132,   237,     0,
       0,   238,     0,   239,     0,   117,    65,   118,   119,   133,
       0,   134,   135,   120,   136,   121,    24,    25,     0,     0,
       0,   137,   138,   139,     0,     0,     0,   252,   253,   254,
     255,   256,   257,   258,   259,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,    26,    27,    28,   122,
       0,   308,   309,   310,   311,   312,   313,   314,   315,   316,
     317,   318,   319,     0,     0,   117,    65,   118,   119,     0,
       0,   320,     0,   120,     0,   121,    24,    25,  1392,     0,
       0,   322,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,   123,   124,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,   125,   126,    26,    27,    28,   122,
       0,   127,    31,    32,    33,    34,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,   128,     0,     0,   129,   130,   865,     0,
     131,     0,   132,     0,     0,     0,     0,     0,     0,     0,
       0,     0,   123,   124,   133,     0,   134,   135,     0,   136,
       0,     0,     0,  1045,   125,   126,   137,   138,   139,     0,
       0,   127,    31,    32,    33,    34,     0,     0,     0,     0,
     117,    65,   118,   119,     0,     0,     0,     0,   120,     0,
     121,    24,    25,   128,     0,     0,   129,   130,     0,     0,
     131,     0,   132,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,   133,     0,   134,   135,     0,   136,
       0,    26,    27,    28,   122,     0,   137,   138,   139,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     117,    65,   118,   119,     0,     0,     0,     0,   120,     0,
     121,    24,    25,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,   722,   123,   124,     0,
       0,     0,     0,     0,     0,     0,     0,     0,  1047,   125,
     126,    26,    27,    28,   122,     0,   127,    31,    32,    33,
      34,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,   128,     0,
       0,   129,   130,     0,     0,   131,     0,   132,     0,     0,
       0,     0,     0,     0,     0,     0,     0,   123,   124,   133,
       0,   134,   135,     0,   136,     0,     0,     0,  1049,   125,
     126,   137,   138,   139,     0,     0,   127,    31,    32,    33,
      34,     0,     0,     0,   117,    65,   118,   119,     0,     0,
       0,     0,   120,     0,   121,    24,    25,     0,   128,     0,
       0,   129,   130,     0,     0,   131,     0,   132,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,   133,
       0,   134,   135,     0,   136,    26,    27,    28,   122,     0,
       0,   137,   138,   139,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,   117,    65,   118,   119,     0,     0,
       0,     0,   120,     0,   121,    24,    25,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,   123,   124,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,   125,   126,    26,    27,    28,   122,     0,
     127,    31,    32,    33,    34,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,   128,     0,     0,   129,   130,  1051,     0,   131,
       0,   132,     0,     0,     0,     0,     0,     0,     0,     0,
       0,   123,   124,   133,     0,   134,   135,     0,   136,     0,
       0,     0,  1132,   125,   126,   137,   138,   139,     0,     0,
     127,    31,    32,    33,    34,     0,     0,     0,   117,    65,
     118,   119,     0,     0,     0,     0,   120,     0,   121,    24,
      25,     0,   128,     0,     0,   129,   130,     0,     0,   131,
       0,   132,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,   133,     0,   134,   135,     0,   136,    26,
      27,    28,   122,     0,     0,   137,   138,   139,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,   117,    65,
     118,   119,     0,     0,     0,     0,   120,     0,   121,    24,
      25,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,   123,   124,     0,     0,     0,
       0,     0,     0,     0,     0,     0,  1134,   125,   126,    26,
      27,    28,   122,     0,   127,    31,    32,    33,    34,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,   128,     0,     0,   129,
     130,     0,     0,   131,     0,   132,     0,     0,     0,     0,
       0,     0,     0,     0,     0,   123,   124,   133,     0,   134,
     135,     0,   136,     0,     0,     0,  1136,   125,   126,   137,
     138,   139,     0,     0,   127,    31,    32,    33,    34,     0,
       0,     0,   117,    65,   118,   119,     0,     0,     0,     0,
     120,     0,   121,    24,    25,     0,   128,     0,     0,   129,
     130,     0,     0,   131,     0,   132,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,   133,     0,   134,
     135,     0,   136,    26,    27,    28,   122,     0,     0,   137,
     138,   139,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,   117,    65,   118,   119,     0,     0,     0,     0,
     120,     0,   121,    24,    25,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,   123,
     124,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,   125,   126,    26,    27,    28,   122,     0,   127,    31,
      32,    33,    34,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     128,     0,     0,   129,   130,  1171,     0,   131,     0,   132,
       0,     0,     0,     0,     0,     0,     0,     0,     0,   123,
     124,   133,     0,   134,   135,     0,   136,     0,     0,     0,
       0,   125,   126,   137,   138,   139,     0,     0,   127,    31,
      32,    33,    34,     0,     0,     0,   117,    65,   118,   119,
       0,     0,     0,     0,   120,     0,   121,   208,    25,     0,
     128,     0,     0,   129,   130,     0,     0,   131,     0,   132,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,   133,     0,   134,   135,     0,   136,    26,    27,    28,
     122,     0,     0,   137,   138,   139,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,   117,    65,   118,   119,
       0,     0,     0,     0,   120,     0,   121,    24,    25,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,   123,   124,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,   125,   126,    26,    27,    28,
     122,     0,   127,    31,    32,    33,    34,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,   128,     0,     0,   129,   130,     0,
       0,   131,     0,   132,     0,     0,     0,     0,     0,     0,
       0,     0,     0,   123,   124,   133,     0,   134,   135,     0,
     136,     0,     0,     0,     0,   125,   126,   137,   138,   139,
       0,     0,   127,    31,    32,    33,    34,     0,     0,     0,
     117,    65,   118,   119,     0,     0,     0,     0,   120,     0,
     121,    24,    25,     0,   128,     0,     0,   129,  1004,     0,
       0,   131,     0,   132,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,   133,     0,   134,   135,     0,
     136,    26,    27,    28,   122,     0,     0,   137,   138,   139,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     117,    65,   118,   119,     0,     0,     0,     0,   120,     0,
     121,    24,    25,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,   123,   124,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,   125,
     126,    26,    27,    28,   122,     0,   127,    31,    32,    33,
      34,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,   128,     0,
       0,   129,  1264,     0,     0,   131,     0,   132,     0,     0,
       0,     0,     0,     0,     0,     0,     0,   123,   124,   133,
       0,   134,   135,     0,   136,     0,     0,     0,     0,   125,
     126,   137,   138,   139,     0,     0,   127,    31,    32,    33,
      34,     0,     0,     0,   117,    65,   118,   119,     0,     0,
       0,     0,   120,     0,   121,    24,    25,     0,   128,     0,
       0,   129,  1361,     0,     0,   131,     0,   132,     0,     0,
       0,     0,     0,     0,     0,   802,     0,     0,   803,   133,
       0,   134,   135,     0,   136,    26,    27,    28,   122,     0,
       0,   137,   138,   139,     0,     0,     0,     0,    48,    49,
       0,     0,     0,     0,     0,     0,     0,     0,     0,  -115,
    -115,  -115,     0,     0,     0,     0,     0,     0,     0,     0,
     638,   639,   640,   641,   642,     0,     0,     0,     0,     0,
       0,   123,   124,    51,     0,     0,   804,     0,     0,     0,
       0,     0,     0,    52,     0,    53,     0,     0,     0,     0,
     127,    31,    32,    33,    34,     0,     0,     0,     0,   643,
     644,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,   128,     0,     0,   129,   130,     0,    30,   131,
       0,   132,     0,     0,     0,     0,    35,     0,     0,     0,
       0,     0,     0,   133,     0,   134,   135,     0,   136,     0,
       0,   607,     0,   657,     0,   137,   138,   139,     0,  -512,
    -512,  -512,  -512,     0,     0,  1018,     4,     0,     0,   658,
       0,     0,   563,     0,     0,   607,     0,   657,     0,     0,
       0,     0,     0,  -512,  -512,  -512,  -512,     0,     0,     0,
       4,   566,     0,     0,     0,     0,   563,   659,     0,   660,
       0,     0,   661,     0,     0,     0,     0,     0,     0,     0,
     662,   663,   664,     0,     0,   566,     0,     0,     0,   665,
     666,   659,   667,   660,     0,   668,   661,     0,     0,     0,
       0,     0,     0,     0,   662,   663,   664,     0,    29,     6,
       0,     0,   669,   665,   666,     0,   667,     0,     0,   668,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,    29,     6,     0,     0,   669,  1216,   607,     0,
     657,     7,     0,     0,     0,     0,  -512,  -512,  -512,  -512,
       0,     0,     0,     4,     0,     0,     0,   670,     0,   563,
       0,     0,     0,     0,     0,     7,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,   566,     0,
       0,   670,     0,     0,   659,     0,   660,     0,     0,   661,
       0,     0,     0,   607,     0,   657,     0,   662,   663,   664,
       0,  -512,  -512,  -512,  -512,     0,   665,   666,     4,   667,
       0,     0,   668,   904,   563,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,    29,     6,     0,     0,   669,
       0,     0,     0,   566,     0,     0,     0,     0,     0,   659,
    1174,   660,     0,     0,   661,     0,     0,     0,     0,     0,
       0,     0,   662,   663,   664,     0,     0,     0,     7,     0,
       0,   665,   666,     0,   667,     0,     0,   668,   607,     0,
     657,     0,     0,     0,     0,     0,  -512,  -512,  -512,  -512,
      29,     6,     0,     4,   669,     0,     0,     0,     0,   563,
       0,     0,     0,     0,     0,     0,     0,     0,     0,   802,
       0,     0,   803,     0,     0,     0,     0,     0,   566,     0,
       0,     0,     0,     7,     0,     0,   660,     0,     0,   661,
       0,     0,    48,    49,     0,     0,     0,   662,   663,   664,
       0,     0,     0,  -115,  -115,  -115,   665,   666,     0,   667,
       0,     0,   668,     0,   638,   639,   640,   641,   642,     0,
       0,     0,     0,     0,     0,    29,     6,    51,     0,   669,
     804,     0,     0,     0,     0,     0,     0,    52,     0,    53,
       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     0,     0,   643,   644,   232,   233,     0,     7,   234,
     235,     0,   236,     0,   237,     0,     0,   238,     0,   239,
     240,     0,    30,     0,   241,     0,     0,   242,     0,     0,
      35,     0,     0,     0,   243,   244,   245,   246,   247,   248,
     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
     259,   232,   233,     0,     0,   234,   235,     0,   236,     0,
     237,     0,     0,   238,     0,   239,     0,     0,     0,     0,
     241,     0,     0,   242,     0,     0,     0,     0,     0,     0,
     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,
     253,   254,   255,   256,   257,   258,   259,   232,   233,     0,
       0,   234,   235,     0,   236,     0,   237,     0,     0,   238,
       0,   239,     0,     0,     0,     0,   241,     0,     0,   242,
       0,     0,     0,     0,     0,     0,     0,   244,   245,   246,
     247,   248,   249,   250,   251,   252,   253,   254,   255,   256,
     257,   258,   259,   232,   233,     0,     0,   234,   235,     0,
     236,     0,   237,     0,     0,   238,     0,   239,     0,     0,
       0,     0,   241,     0,     0,   242,     0,     0,     0,     0,
       0,     0,     0,     0,   245,   246,   247,   248,   249,   250,
     251,   252,   253,   254,   255,   256,   257,   258,   259,   232,
     233,     0,     0,   234,   235,     0,   236,     0,   237,     0,
       0,   238,     0,   239,     0,   232,   233,     0,   241,   234,
     235,     0,   236,     0,   237,     0,     0,   238,     0,   239,
       0,   246,   247,   248,   249,   250,   251,   252,   253,   254,
     255,   256,   257,   258,   259,     0,     0,     0,   247,   248,
     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
     259
  };

  const short
  parser::yycheck_[] =
  {
      80,   143,   149,   140,   658,   594,   594,   594,    94,   594,
     612,   470,   881,   997,   400,   782,   112,   545,  1002,   152,
     289,    71,    93,    94,    71,   105,     2,    98,   566,    81,
      82,   887,  1020,    14,    22,    14,    12,    13,    14,    15,
      16,    17,    18,    19,    20,    21,   924,   496,     2,    14,
     130,   399,    14,    14,   134,   626,   140,    45,    12,    13,
      14,    15,    16,    17,    18,    19,    20,    21,     2,   637,
     666,   667,    30,    42,   464,   496,   140,   161,    12,    13,
      14,    15,    16,    17,    18,    19,    20,    21,     2,    14,
     666,     0,  1109,    71,    14,    14,    14,    30,    12,    13,
      14,    15,    16,    17,    18,    19,    20,    21,   377,   161,
      41,   195,   100,    14,   102,    93,    94,   476,   772,    15,
      98,    14,     0,   149,    33,    21,    42,    23,    48,    49,
     516,   112,   113,  1310,    43,   594,  1223,    42,   164,    75,
     220,    66,    14,   195,  1000,   594,   104,    14,   228,   229,
     230,    31,    24,    15,  1331,   736,   758,   543,   117,    21,
     762,    23,   112,   113,   152,   746,   125,  1257,   822,    31,
     222,   104,    14,   594,    57,   106,    94,   895,   896,   750,
      42,   160,   151,   164,   146,   903,   149,   149,   784,   785,
     153,    42,   153,  1210,   542,   156,   154,   106,   149,   164,
     796,   338,   592,   154,    13,    14,    15,    16,    14,   785,
     146,   800,    21,   149,    23,   800,   485,    14,    15,    16,
     145,   301,   302,   303,   304,   277,   146,   146,   299,   138,
    1218,   140,   151,  1320,   286,   151,   119,    24,   226,   598,
     373,   321,   322,   323,   160,   146,   151,   327,   328,   299,
    1106,   156,   299,   146,   338,    14,   320,   337,   151,    14,
    1350,   829,    57,  1141,    18,   145,  1356,   147,   806,   160,
     417,   351,    26,    27,    28,    29,  1207,   102,   103,    33,
     149,    57,  1116,   145,  1118,   154,  1004,   855,   816,   151,
     370,   887,   830,   831,   145,   833,    39,   146,   160,   379,
     151,    44,    45,   154,   153,   901,    57,   162,    14,   160,
      42,    66,   149,    68,   169,    58,   153,   413,   414,    57,
     149,   299,    57,   861,   119,   154,  1093,    14,   153,    18,
    1314,  1315,   141,    88,    89,   144,   161,    26,    27,    28,
      29,   800,   139,   119,    33,  1276,   493,  1278,   145,    76,
     430,   800,   106,   162,   623,   624,   165,    91,   167,     2,
      66,   963,    68,   106,    31,   174,   175,   176,   119,    12,
      13,    14,    15,    16,    17,    18,    19,    20,    21,   800,
     149,   119,    88,    89,   119,   373,    73,    74,   142,   102,
     145,   102,   103,  1111,  1263,   138,    85,    54,    55,    56,
      13,    14,    15,    16,  1000,  1168,   146,  1170,    21,   149,
      23,   821,   146,  1009,  1010,   149,   500,   106,   828,    18,
      35,   146,    37,    38,   149,    40,   102,    26,    27,    28,
      29,   511,   146,   149,    33,   148,    18,   150,   154,   145,
     118,   521,   153,   523,    26,    27,    28,    29,   500,   144,
     161,    33,   154,   142,   153,   602,   146,    72,   605,   149,
      14,   547,   548,   120,   121,   122,   123,    82,   610,    84,
     550,    14,   148,   149,   150,   146,   547,   548,   149,   563,
     123,   124,   177,   178,    83,   128,   129,  1076,   131,   132,
     133,  1076,   135,   136,   137,   138,   139,   140,   645,   142,
     147,    83,    14,   149,   584,   143,   142,   106,   154,   147,
    1106,   563,   146,   806,   152,   149,   470,    14,    37,    38,
    1174,   148,   149,   150,   106,   149,    34,   515,    14,   156,
     154,  1120,  1120,  1120,   164,  1120,   470,   830,   831,   149,
     833,  1143,   496,   142,   154,  1147,  1148,    37,    38,   187,
     188,    48,    49,    72,   146,  1157,   470,   149,   629,   630,
     142,   149,   496,    82,   950,    84,   154,    14,   861,   547,
     548,   149,   149,   149,   654,   164,   154,   154,   154,   149,
    1234,   967,   496,   720,   154,    48,    49,    50,  1177,   232,
     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,
     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,
     253,   254,   255,   256,   257,   258,   149,  1076,   594,   149,
     149,   154,   610,    18,   154,   154,  1344,  1076,  1346,   709,
      21,    26,    27,    28,    29,    22,   720,   188,    33,   719,
     594,   188,   146,   188,   632,   149,   289,   290,  1366,   637,
    1368,   629,   630,   187,   188,  1076,    26,    27,    28,    29,
     594,  1120,    14,   146,   144,   736,   149,   154,   752,   143,
      65,  1120,    14,   147,   148,   746,   150,    14,   152,    14,
     594,    32,   162,   145,   764,   165,   766,    48,    49,    50,
     832,    24,    25,   773,    14,   175,    14,   177,   178,  1120,
     752,  1084,  1085,  1086,  1087,  1088,  1089,  1090,  1091,    24,
      25,   106,   145,   187,   188,   795,   146,    14,  1177,   149,
      14,    54,    55,    56,    26,    27,    28,    29,  1177,   107,
     108,    46,   144,    22,   814,   882,    51,    52,    53,    54,
      55,    56,    73,    74,   824,   825,   145,   142,    96,    97,
     162,   145,  1354,    77,    78,    79,  1177,   145,   736,   177,
     178,   841,   842,   175,   145,   177,   178,   149,   746,   387,
     388,   851,  1374,   148,   149,   150,   166,   857,   145,    94,
     148,   149,   150,   726,   727,   728,  1388,   120,   121,   122,
     123,   124,   872,   156,    24,    25,   540,   541,   878,   327,
     328,   145,   156,    14,   154,   120,   121,   122,   123,    37,
      38,   154,   145,   145,   154,   895,   896,   897,   145,   883,
      48,    49,    50,   903,   800,    55,    56,   470,   156,    14,
     145,    59,    60,    61,    62,    63,   149,   480,   145,   161,
     166,   829,   485,   142,   924,   925,   800,   161,    14,   161,
     154,   494,   932,   496,    14,   935,   936,  1361,   938,   939,
     940,   941,   942,   146,   154,    14,   800,   855,   149,   151,
      98,    99,  1376,   166,   146,   146,   146,   146,   153,   146,
     146,   961,   166,   151,   149,   146,   800,  1391,   188,   153,
     120,   121,   122,   123,   146,  1399,   145,   977,    14,   979,
     154,    14,    14,   154,   154,  1409,    14,    14,   156,    14,
     151,    76,  1416,    20,  1418,   145,  1420,   146,   149,  1423,
     166,  1425,   154,  1427,  1004,  1429,   153,  1431,   149,  1433,
      37,    38,    14,    14,  1014,    14,   142,   146,   146,    14,
     145,    48,    49,    50,    24,    25,  1026,  1027,  1028,  1029,
      14,   594,  1036,   153,   108,   154,    66,    64,    14,    66,
     603,    14,    69,    70,    71,  1045,   145,  1047,   145,  1049,
      77,    78,    79,   145,    54,    55,    56,    57,    14,    14,
     154,   145,    66,   146,  1036,   156,   145,  1067,  1068,   145,
     145,    98,    99,    66,  1074,   145,    66,   145,   145,  1079,
    1080,   159,   146,   156,   149,   112,   113,   114,   115,   116,
     145,   145,   655,   145,    88,    95,   145,   145,    24,    25,
    1084,  1085,  1086,  1087,  1088,  1089,  1090,  1091,    24,    25,
     145,  1111,   154,  1113,   154,   156,  1116,   156,  1118,   119,
     120,   121,   122,   123,   145,    14,   104,   154,    54,    55,
      56,   146,  1132,   156,  1134,   154,  1136,   164,    54,    55,
      56,  1141,  1142,   104,  1144,   145,  1146,   104,   153,  1121,
     104,   149,   166,   144,   146,    14,   145,   145,   721,   145,
     723,   146,   145,    14,  1164,   147,   145,   154,  1168,   146,
    1170,   162,   153,   145,   165,   145,   145,    14,  1178,   105,
    1076,  1181,   173,  1183,   175,   149,   177,   178,   154,   154,
      14,   117,   154,   146,   120,   121,   122,   123,   146,   125,
     146,   146,  1076,   146,   120,   121,   122,   123,  1192,  1209,
    1194,  1195,  1196,  1197,  1198,  1199,  1200,   145,    14,   145,
     156,   154,  1076,   146,  1120,   147,   157,   156,  1192,   145,
    1194,  1195,  1196,  1197,  1198,  1199,  1200,   800,   149,   153,
      14,   153,  1076,   156,   154,   146,  1120,   146,   146,   154,
      13,    14,    15,    16,   146,    14,   146,    64,    21,   156,
      23,    24,    25,   149,  1264,   146,  1120,   146,   156,    90,
      19,   145,   157,   157,   157,  1337,   154,   146,   146,   161,
     146,  1177,   146,  1283,    47,    14,  1120,   154,   146,   146,
      67,    54,    55,    56,    57,   149,   146,  1297,   154,   154,
    1300,   154,   154,  1177,   146,   145,   145,   153,   871,   154,
     146,  1311,   146,   146,    80,   206,   207,   146,  1318,   210,
     211,   212,   154,  1177,   215,   216,   217,   218,   219,   154,
     146,   154,   146,   146,   156,   226,  1336,   100,   101,   154,
    1340,  1341,  1342,  1177,  1344,   154,  1346,   145,   154,   112,
     113,  1351,   154,   153,   146,   154,   119,   120,   121,   122,
     123,  1361,    67,   154,   154,   154,  1366,    80,  1368,   156,
     153,   146,   153,   146,   146,   146,   154,   146,   141,   149,
     100,   144,   145,  1383,   146,   148,   153,   150,   151,   146,
     146,   149,  1392,   146,   146,   146,   146,   268,   153,   162,
     146,   164,   165,  1403,   167,   149,   146,   154,   153,   146,
    1410,   174,   175,   176,   149,   149,   149,   149,    24,    25,
     102,   984,   985,   986,   987,   988,   989,   990,   991,  1337,
     206,   207,   149,   149,   210,   211,   212,   149,   485,   215,
     216,   217,   218,   219,   376,   928,   749,   374,    54,    55,
      56,   494,   343,   344,   345,   346,   347,   348,   349,   350,
    1019,   352,   353,   354,   355,   356,   357,   358,   359,   360,
     361,   362,   363,   364,   365,   366,   367,   368,   369,   179,
     181,   537,   559,    53,   630,   603,   778,  1339,   126,   127,
     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
     136,   137,   403,  1076,   120,   121,   122,   123,   156,   143,
     146,   796,   901,   147,   148,   896,   150,   153,   152,  1092,
     156,  1094,  1095,  1096,  1097,  1098,  1099,  1100,   887,   145,
     785,  1275,  1014,   181,    12,    13,    14,    15,    16,    17,
      18,    19,    20,    21,   170,   496,   752,  1120,     6,   183,
     184,   185,   186,   187,   188,     6,   914,   343,   344,   345,
     346,   347,   348,   349,   350,   405,   352,   353,   354,   355,
     356,   357,   358,   359,   360,   361,   362,   363,   364,   365,
     366,   367,   368,   369,   296,   501,   416,  1126,  1162,   860,
     580,    13,    14,    15,    16,   102,   103,    84,     6,    21,
    1221,    23,    24,    25,  1177,   911,   496,   654,   855,   496,
      32,   871,  1055,   953,   515,   723,   622,   403,  1336,   126,
     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
     137,   932,    54,    55,    56,    57,   144,   872,   146,   146,
     584,   969,  1177,    -1,    -1,   972,   153,    -1,    -1,   156,
    1223,    73,    74,    -1,   162,    -1,    -1,   165,    -1,    -1,
      -1,    -1,    -1,    -1,   172,   173,    -1,   175,    -1,   177,
     178,    -1,    13,    14,    15,    16,    -1,    -1,   100,   101,
      21,    -1,    23,    24,    25,    -1,    -1,    -1,    -1,    -1,
     112,   113,    -1,    -1,    -1,    -1,    -1,   119,   120,   121,
     122,   123,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   610,
      -1,    -1,    -1,    54,    55,    56,    57,    -1,    -1,   141,
      -1,    -1,   144,   145,    -1,   147,   148,    -1,   150,    -1,
      -1,   632,    73,    74,    -1,    -1,   637,  1310,    -1,    -1,
     162,    -1,   164,   165,    -1,   167,    -1,  1320,    -1,    -1,
      -1,    -1,   174,   175,   176,    -1,    -1,    -1,  1331,   100,
     101,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,   112,   113,    -1,    -1,    -1,    -1,    -1,   119,   120,
     121,   122,   123,    -1,    -1,    -1,    13,    14,    15,    16,
      -1,    -1,    -1,    -1,    21,    -1,    23,    24,    25,    -1,
     141,    -1,    -1,   144,   145,    -1,    -1,   148,    -1,   150,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,   162,    -1,   164,   165,    -1,   167,    54,    55,    56,
      57,    -1,    -1,   174,   175,   176,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    73,    74,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    13,    14,    15,    16,
      -1,    18,    -1,    -1,    21,    -1,    23,    24,    25,    -1,
      -1,    -1,    -1,   100,   101,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,   112,   113,    -1,    -1,    -1,
      -1,    -1,   119,   120,   121,   122,   123,    54,    55,    56,
      57,    -1,   126,   127,   128,   129,   130,   131,   132,   133,
     134,   135,   136,   137,   141,    -1,    -1,   144,   145,    -1,
      -1,   148,   146,   150,    81,    -1,    -1,    -1,   829,   153,
      -1,    -1,   156,    -1,    -1,   162,    -1,   164,   165,    -1,
     167,    -1,    -1,   100,   101,    -1,    -1,   174,   175,   176,
      -1,    -1,    -1,    -1,   855,   112,   113,    -1,    -1,    -1,
      -1,    -1,   119,   120,   121,   122,   123,    -1,    -1,    -1,
      13,    14,    15,    16,    -1,    -1,    -1,    -1,    21,    -1,
      23,    24,    25,    -1,   141,    -1,    -1,   144,   145,    -1,
      -1,   148,    -1,   150,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,   162,    -1,   164,   165,    -1,
     167,    54,    55,    56,    57,    -1,    -1,   174,   175,   176,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      13,    14,    15,    16,    -1,    -1,    -1,    -1,    21,    -1,
      23,    24,    25,    -1,    -1,    -1,    -1,   143,    -1,    -1,
      -1,   147,   148,    -1,   150,    -1,   152,   100,   101,   155,
      -1,   157,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   112,
     113,    54,    55,    56,    57,    -1,   119,   120,   121,   122,
     123,   177,   178,   179,   180,   181,   182,   183,   184,   185,
     186,   187,   188,    -1,    -1,    -1,    -1,    -1,   141,    -1,
      -1,   144,   145,    -1,    -1,   148,    -1,   150,   151,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,   100,   101,   162,
      -1,   164,   165,    -1,   167,    -1,    -1,    -1,    -1,   112,
     113,   174,   175,   176,    -1,    -1,   119,   120,   121,   122,
     123,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,   139,    -1,   141,   143,
      -1,   144,   145,   147,   148,   148,   150,   150,   152,    -1,
      -1,   155,    -1,   157,    -1,    13,    14,    15,    16,   162,
      -1,   164,   165,    21,   167,    23,    24,    25,    -1,    -1,
      -1,   174,   175,   176,    -1,    -1,    -1,   181,   182,   183,
     184,   185,   186,   187,   188,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    54,    55,    56,    57,
      -1,   126,   127,   128,   129,   130,   131,   132,   133,   134,
     135,   136,   137,    -1,    -1,    13,    14,    15,    16,    -1,
      -1,   146,    -1,    21,    -1,    23,    24,    25,   153,    -1,
      -1,   156,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,   100,   101,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,   112,   113,    54,    55,    56,    57,
      -1,   119,   120,   121,   122,   123,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,   141,    -1,    -1,   144,   145,   146,    -1,
     148,    -1,   150,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,   100,   101,   162,    -1,   164,   165,    -1,   167,
      -1,    -1,    -1,   111,   112,   113,   174,   175,   176,    -1,
      -1,   119,   120,   121,   122,   123,    -1,    -1,    -1,    -1,
      13,    14,    15,    16,    -1,    -1,    -1,    -1,    21,    -1,
      23,    24,    25,   141,    -1,    -1,   144,   145,    -1,    -1,
     148,    -1,   150,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,   162,    -1,   164,   165,    -1,   167,
      -1,    54,    55,    56,    57,    -1,   174,   175,   176,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      13,    14,    15,    16,    -1,    -1,    -1,    -1,    21,    -1,
      23,    24,    25,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,  1337,   100,   101,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   111,   112,
     113,    54,    55,    56,    57,    -1,   119,   120,   121,   122,
     123,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   141,    -1,
      -1,   144,   145,    -1,    -1,   148,    -1,   150,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,   100,   101,   162,
      -1,   164,   165,    -1,   167,    -1,    -1,    -1,   111,   112,
     113,   174,   175,   176,    -1,    -1,   119,   120,   121,   122,
     123,    -1,    -1,    -1,    13,    14,    15,    16,    -1,    -1,
      -1,    -1,    21,    -1,    23,    24,    25,    -1,   141,    -1,
      -1,   144,   145,    -1,    -1,   148,    -1,   150,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   162,
      -1,   164,   165,    -1,   167,    54,    55,    56,    57,    -1,
      -1,   174,   175,   176,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    13,    14,    15,    16,    -1,    -1,
      -1,    -1,    21,    -1,    23,    24,    25,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,   100,   101,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,   112,   113,    54,    55,    56,    57,    -1,
     119,   120,   121,   122,   123,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,   141,    -1,    -1,   144,   145,   146,    -1,   148,
      -1,   150,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,   100,   101,   162,    -1,   164,   165,    -1,   167,    -1,
      -1,    -1,   111,   112,   113,   174,   175,   176,    -1,    -1,
     119,   120,   121,   122,   123,    -1,    -1,    -1,    13,    14,
      15,    16,    -1,    -1,    -1,    -1,    21,    -1,    23,    24,
      25,    -1,   141,    -1,    -1,   144,   145,    -1,    -1,   148,
      -1,   150,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,   162,    -1,   164,   165,    -1,   167,    54,
      55,    56,    57,    -1,    -1,   174,   175,   176,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    13,    14,
      15,    16,    -1,    -1,    -1,    -1,    21,    -1,    23,    24,
      25,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,   100,   101,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,   111,   112,   113,    54,
      55,    56,    57,    -1,   119,   120,   121,   122,   123,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,   141,    -1,    -1,   144,
     145,    -1,    -1,   148,    -1,   150,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,   100,   101,   162,    -1,   164,
     165,    -1,   167,    -1,    -1,    -1,   111,   112,   113,   174,
     175,   176,    -1,    -1,   119,   120,   121,   122,   123,    -1,
      -1,    -1,    13,    14,    15,    16,    -1,    -1,    -1,    -1,
      21,    -1,    23,    24,    25,    -1,   141,    -1,    -1,   144,
     145,    -1,    -1,   148,    -1,   150,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,   162,    -1,   164,
     165,    -1,   167,    54,    55,    56,    57,    -1,    -1,   174,
     175,   176,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    13,    14,    15,    16,    -1,    -1,    -1,    -1,
      21,    -1,    23,    24,    25,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   100,
     101,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,   112,   113,    54,    55,    56,    57,    -1,   119,   120,
     121,   122,   123,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
     141,    -1,    -1,   144,   145,   146,    -1,   148,    -1,   150,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   100,
     101,   162,    -1,   164,   165,    -1,   167,    -1,    -1,    -1,
      -1,   112,   113,   174,   175,   176,    -1,    -1,   119,   120,
     121,   122,   123,    -1,    -1,    -1,    13,    14,    15,    16,
      -1,    -1,    -1,    -1,    21,    -1,    23,    24,    25,    -1,
     141,    -1,    -1,   144,   145,    -1,    -1,   148,    -1,   150,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,   162,    -1,   164,   165,    -1,   167,    54,    55,    56,
      57,    -1,    -1,   174,   175,   176,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    13,    14,    15,    16,
      -1,    -1,    -1,    -1,    21,    -1,    23,    24,    25,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,   100,   101,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,   112,   113,    54,    55,    56,
      57,    -1,   119,   120,   121,   122,   123,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,   141,    -1,    -1,   144,   145,    -1,
      -1,   148,    -1,   150,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,   100,   101,   162,    -1,   164,   165,    -1,
     167,    -1,    -1,    -1,    -1,   112,   113,   174,   175,   176,
      -1,    -1,   119,   120,   121,   122,   123,    -1,    -1,    -1,
      13,    14,    15,    16,    -1,    -1,    -1,    -1,    21,    -1,
      23,    24,    25,    -1,   141,    -1,    -1,   144,   145,    -1,
      -1,   148,    -1,   150,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,   162,    -1,   164,   165,    -1,
     167,    54,    55,    56,    57,    -1,    -1,   174,   175,   176,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      13,    14,    15,    16,    -1,    -1,    -1,    -1,    21,    -1,
      23,    24,    25,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,   100,   101,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   112,
     113,    54,    55,    56,    57,    -1,   119,   120,   121,   122,
     123,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   141,    -1,
      -1,   144,   145,    -1,    -1,   148,    -1,   150,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,   100,   101,   162,
      -1,   164,   165,    -1,   167,    -1,    -1,    -1,    -1,   112,
     113,   174,   175,   176,    -1,    -1,   119,   120,   121,   122,
     123,    -1,    -1,    -1,    13,    14,    15,    16,    -1,    -1,
      -1,    -1,    21,    -1,    23,    24,    25,    -1,   141,    -1,
      -1,   144,   145,    -1,    -1,   148,    -1,   150,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    14,    -1,    -1,    17,   162,
      -1,   164,   165,    -1,   167,    54,    55,    56,    57,    -1,
      -1,   174,   175,   176,    -1,    -1,    -1,    -1,    37,    38,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    48,
      49,    50,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      59,    60,    61,    62,    63,    -1,    -1,    -1,    -1,    -1,
      -1,   100,   101,    72,    -1,    -1,    75,    -1,    -1,    -1,
      -1,    -1,    -1,    82,    -1,    84,    -1,    -1,    -1,    -1,
     119,   120,   121,   122,   123,    -1,    -1,    -1,    -1,    98,
      99,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,   141,    -1,    -1,   144,   145,    -1,   117,   148,
      -1,   150,    -1,    -1,    -1,    -1,   125,    -1,    -1,    -1,
      -1,    -1,    -1,   162,    -1,   164,   165,    -1,   167,    -1,
      -1,    18,    -1,    20,    -1,   174,   175,   176,    -1,    26,
      27,    28,    29,    -1,    -1,   154,    33,    -1,    -1,    36,
      -1,    -1,    39,    -1,    -1,    18,    -1,    20,    -1,    -1,
      -1,    -1,    -1,    26,    27,    28,    29,    -1,    -1,    -1,
      33,    58,    -1,    -1,    -1,    -1,    39,    64,    -1,    66,
      -1,    -1,    69,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      77,    78,    79,    -1,    -1,    58,    -1,    -1,    -1,    86,
      87,    64,    89,    66,    -1,    92,    69,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    77,    78,    79,    -1,   105,   106,
      -1,    -1,   109,    86,    87,    -1,    89,    -1,    -1,    92,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,   105,   106,    -1,    -1,   109,   110,    18,    -1,
      20,   138,    -1,    -1,    -1,    -1,    26,    27,    28,    29,
      -1,    -1,    -1,    33,    -1,    -1,    -1,   154,    -1,    39,
      -1,    -1,    -1,    -1,    -1,   138,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    58,    -1,
      -1,   154,    -1,    -1,    64,    -1,    66,    -1,    -1,    69,
      -1,    -1,    -1,    18,    -1,    20,    -1,    77,    78,    79,
      -1,    26,    27,    28,    29,    -1,    86,    87,    33,    89,
      -1,    -1,    92,    93,    39,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,    -1,   105,   106,    -1,    -1,   109,
      -1,    -1,    -1,    58,    -1,    -1,    -1,    -1,    -1,    64,
      65,    66,    -1,    -1,    69,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    77,    78,    79,    -1,    -1,    -1,   138,    -1,
      -1,    86,    87,    -1,    89,    -1,    -1,    92,    18,    -1,
      20,    -1,    -1,    -1,    -1,    -1,    26,    27,    28,    29,
     105,   106,    -1,    33,   109,    -1,    -1,    -1,    -1,    39,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    14,
      -1,    -1,    17,    -1,    -1,    -1,    -1,    -1,    58,    -1,
      -1,    -1,    -1,   138,    -1,    -1,    66,    -1,    -1,    69,
      -1,    -1,    37,    38,    -1,    -1,    -1,    77,    78,    79,
      -1,    -1,    -1,    48,    49,    50,    86,    87,    -1,    89,
      -1,    -1,    92,    -1,    59,    60,    61,    62,    63,    -1,
      -1,    -1,    -1,    -1,    -1,   105,   106,    72,    -1,   109,
      75,    -1,    -1,    -1,    -1,    -1,    -1,    82,    -1,    84,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    98,    99,   143,   144,    -1,   138,   147,
     148,    -1,   150,    -1,   152,    -1,    -1,   155,    -1,   157,
     158,    -1,   117,    -1,   162,    -1,    -1,   165,    -1,    -1,
     125,    -1,    -1,    -1,   172,   173,   174,   175,   176,   177,
     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
     188,   143,   144,    -1,    -1,   147,   148,    -1,   150,    -1,
     152,    -1,    -1,   155,    -1,   157,    -1,    -1,    -1,    -1,
     162,    -1,    -1,   165,    -1,    -1,    -1,    -1,    -1,    -1,
     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
     182,   183,   184,   185,   186,   187,   188,   143,   144,    -1,
      -1,   147,   148,    -1,   150,    -1,   152,    -1,    -1,   155,
      -1,   157,    -1,    -1,    -1,    -1,   162,    -1,    -1,   165,
      -1,    -1,    -1,    -1,    -1,    -1,    -1,   173,   174,   175,
     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
     186,   187,   188,   143,   144,    -1,    -1,   147,   148,    -1,
     150,    -1,   152,    -1,    -1,   155,    -1,   157,    -1,    -1,
      -1,    -1,   162,    -1,    -1,   165,    -1,    -1,    -1,    -1,
      -1,    -1,    -1,    -1,   174,   175,   176,   177,   178,   179,
     180,   181,   182,   183,   184,   185,   186,   187,   188,   143,
     144,    -1,    -1,   147,   148,    -1,   150,    -1,   152,    -1,
      -1,   155,    -1,   157,    -1,   143,   144,    -1,   162,   147,
     148,    -1,   150,    -1,   152,    -1,    -1,   155,    -1,   157,
      -1,   175,   176,   177,   178,   179,   180,   181,   182,   183,
     184,   185,   186,   187,   188,    -1,    -1,    -1,   176,   177,
     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
     188
  };

  const short
  parser::yystos_[] =
  {
       0,   192,   193,     0,    33,    43,   106,   138,   140,   194,
     195,   196,   198,   206,   223,   228,   232,   237,   270,   343,
     345,   399,   199,   233,    24,    25,    54,    55,    56,   105,
     117,   120,   121,   122,   123,   125,   145,   205,   260,   261,
     353,   367,   369,   400,   401,   238,    14,    35,    37,    38,
      40,    72,    82,    84,   197,   194,   194,   194,   194,   194,
     194,   194,   194,   194,   194,    14,   201,   202,   203,   204,
      14,   354,    24,    57,   119,   279,    57,   119,   280,   368,
     160,   262,   263,   264,   265,    14,    24,   398,   204,   241,
     244,    42,   207,   344,   346,   224,    14,    76,   284,   284,
      31,   200,   149,    42,   151,   156,   234,    54,    55,   260,
     355,   356,   357,   146,   118,   370,   371,    13,    15,    16,
      21,    23,    57,   100,   101,   112,   113,   119,   141,   144,
     145,   148,   150,   162,   164,   165,   167,   174,   175,   176,
     204,   400,   447,   479,   502,   503,   506,   262,   262,   398,
     154,   239,   153,   242,   147,   229,    14,    57,    95,   119,
     205,   335,   336,   337,   339,   340,   341,   342,   356,   357,
     342,    14,    14,   153,   156,    54,    55,   124,   205,   260,
     277,   278,    14,   201,    34,   203,    14,    14,   502,   142,
     209,   164,    57,   119,   358,   358,    57,   119,   372,   164,
      21,    22,   188,   195,   195,   188,   195,   195,    24,   502,
     195,   195,   195,   502,   505,   195,   195,   195,   195,   195,
     160,   195,   263,   264,   506,   188,   195,   447,   102,   103,
     153,   161,   143,   144,   147,   148,   150,   152,   155,   157,
     158,   162,   165,   172,   173,   174,   175,   176,   177,   178,
     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
     265,    14,   243,   244,   154,    14,   230,   231,   208,   262,
     264,   338,   335,    14,   347,   348,   349,   335,   347,   225,
     271,    14,    14,    14,   279,    14,   280,   274,    32,   145,
     145,   214,    14,   359,   360,   264,   373,   374,   378,   379,
      22,   145,   145,   145,   145,   479,   503,   503,   126,   127,
     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
     146,   153,   156,   446,   503,   503,   503,   149,   164,   166,
     503,   503,   503,   503,   503,   502,   504,   145,   204,   479,
     502,   502,   502,   195,   195,   195,   195,   195,   195,   195,
     195,   195,   195,   195,   195,   195,   195,   195,   195,   195,
     195,   195,   195,   195,   195,   195,   195,   195,   195,   195,
     145,   154,   240,   149,   149,   154,   209,   149,   154,   156,
     262,   154,   154,   145,   282,   156,    14,   275,   276,   262,
     145,   286,   195,   210,   211,   348,    14,   146,   151,   195,
     215,   218,   154,   156,   361,   149,   216,   166,   374,    14,
     375,   376,   205,   356,   357,   380,   381,   383,   502,   502,
     502,   502,   506,   502,   502,   502,   502,   505,   505,   161,
     145,   502,   161,   161,   161,   503,   503,   503,   503,   503,
     503,   503,   503,   502,   503,   503,   503,   503,   503,   503,
     503,   503,   503,   503,   503,   503,   503,   503,   503,   503,
     503,   503,   502,   142,   416,   244,   231,   214,   348,   502,
     226,    14,   281,   283,   154,    14,   272,   286,   286,   146,
     287,   154,    37,    38,   146,   149,   219,   220,   151,   248,
     249,   250,   251,   252,   149,   216,   235,   503,   360,   166,
     377,   149,   154,   358,   358,   369,   265,   146,   146,   146,
     146,   153,   146,   146,   166,   151,   483,   484,   485,   502,
     146,   153,   146,   145,    14,   408,   412,   154,    41,   195,
     227,   270,   343,   345,   399,    14,   146,   149,    14,   282,
     154,   154,   195,   289,   290,   292,   293,   212,   213,   211,
     156,   217,    14,   151,    48,    49,    50,   253,    76,   285,
     265,   218,   146,    39,    44,    45,    58,   195,   236,   237,
     343,   345,   350,   386,   395,   399,   424,   435,   264,   376,
     382,   502,   166,   479,   149,   216,   502,   151,   417,   418,
     502,   409,   149,   154,   266,   153,   432,   281,   273,   154,
     293,   293,   252,   149,   216,    14,   394,    18,    85,   142,
     195,   198,   246,   343,   345,   386,   399,   433,   443,   445,
     449,   462,   463,   342,   342,   502,   221,   107,   108,   255,
     255,    14,   264,   351,   352,    14,   246,   247,    59,    60,
      61,    62,    63,    98,    99,   252,   422,   423,   370,   146,
     485,   146,    14,   146,   149,   145,   408,    20,    36,    64,
      66,    69,    77,    78,    79,    86,    87,    89,    92,   109,
     154,   195,   198,   237,   267,   268,   270,   294,   304,   307,
     343,   345,   350,   353,   364,   365,   386,   395,   399,   402,
     424,   433,   444,   464,   490,   496,    14,   282,    83,    83,
     265,   290,   288,   265,   153,    14,    15,    16,   139,   145,
      20,    64,    69,    70,    71,   114,   115,   116,   154,   164,
     204,   447,   479,   480,   449,    26,    27,    28,    29,   154,
      66,   464,   348,   348,   217,   108,    46,    51,    52,    53,
      54,    55,    94,   205,   256,   257,   258,   259,   260,   257,
     222,   479,   149,   154,   436,   396,   397,   480,   428,    14,
      14,   265,   427,   425,   145,   418,   195,   419,   420,   421,
     495,   432,   497,   145,   145,    14,    66,   295,   296,   298,
      14,    66,    68,    88,   145,   305,   306,   307,   311,   312,
     313,   320,   321,   328,   333,   160,   308,   309,   310,   333,
     486,    14,    14,    17,    75,   367,   405,    14,   362,   363,
      26,    27,    28,    29,   145,   154,   291,   146,   139,   245,
     502,   451,   452,   145,   145,   145,   481,   502,   450,   195,
     156,   181,   195,   446,    30,   104,   434,   434,   434,   154,
     434,   145,   145,    54,   259,    57,   119,   254,   259,   254,
     217,   156,   352,   145,   438,   149,   154,   156,   449,   389,
     390,   387,   449,   159,   429,   146,   502,    47,   151,   502,
     146,   149,   145,   482,   432,   502,   491,   145,   145,    88,
     295,   145,   334,   145,   312,    73,    74,   319,   322,   326,
     333,    88,   306,   154,   154,   156,   156,   145,   331,   502,
     309,   149,   154,   156,    93,   195,   267,   487,   490,   496,
     154,   403,   366,   247,   149,   154,   104,   104,   104,   104,
     502,   394,   146,   146,   149,   153,   482,   432,   454,   502,
     502,   166,   149,   482,   480,   247,   247,   447,   247,   145,
     145,   145,   145,   502,   502,   502,    14,    48,    49,   146,
     439,   440,   441,   442,   437,   397,   502,   391,   391,   247,
      31,   145,   147,   426,   146,    14,   421,   483,   154,   498,
     146,    14,    94,   488,   489,    73,    74,   301,   502,   301,
     265,    13,    14,    16,   141,   144,   162,   165,   167,   174,
     175,   176,   314,   315,   316,   506,   322,   326,   147,   148,
     149,   150,   323,   325,   145,   317,   332,   502,   317,    73,
      74,   329,   330,   332,   153,   154,   310,   332,   154,   269,
     416,    14,   384,   385,   404,   363,   145,   145,   145,   145,
     146,   245,   502,   154,   453,    14,   250,   448,   146,   146,
     481,   154,   502,   502,   502,   111,   502,   111,   502,   111,
     502,   146,   502,   146,   146,   149,   216,   441,   154,   149,
     154,   154,   392,   393,   394,   146,    32,    73,    74,   147,
     430,   431,   502,   449,   145,   216,   486,   493,   488,   156,
     154,   502,   146,   502,   195,   195,   195,   195,   195,   195,
     195,   195,   144,   146,   162,   165,   172,   173,   175,   177,
     178,   147,   156,   325,   157,   326,   149,   325,   156,   332,
     502,   149,   318,   153,   333,   333,    91,   146,   149,   331,
     266,    14,   406,   407,   408,   410,   149,   154,   407,   413,
     414,   415,   111,   502,   111,   502,   111,   502,   502,   494,
     146,   149,   153,   466,   156,   264,   154,   457,   458,   502,
     146,   502,   146,   502,   146,   154,   146,   459,   461,   440,
     146,    14,   149,   388,   156,   502,   502,   146,    75,   146,
     149,   146,   502,   146,    65,   496,   499,   500,   156,   502,
     502,    90,   299,    19,   315,   315,   315,   315,   315,   315,
     315,   315,   195,   312,   195,   195,   195,   195,   195,   195,
     195,   157,   157,   324,   327,   333,   326,   157,   318,   153,
     332,   502,   329,   154,   329,   161,   110,   262,   149,   154,
     385,   149,   154,   145,   502,   146,   502,   146,   502,   146,
     146,   473,   245,   502,    65,   449,   502,    14,   502,   449,
     449,   146,   154,   146,   154,   146,   154,   154,   449,   465,
     393,   154,   502,   431,   431,   146,   432,    67,   501,   487,
     502,   492,   502,   149,   145,   300,   502,   314,   314,   314,
     314,   314,   314,   314,   314,   145,   145,   146,   149,   327,
     146,   502,   318,   153,   411,   407,   414,   419,   146,   154,
     146,   154,   146,   154,   154,    80,   474,   475,   146,   432,
     156,   455,   154,   154,   154,   460,    96,    97,   469,   499,
     154,   301,   502,   146,   324,   327,   327,   146,   153,   502,
     145,   146,   154,   154,   154,    18,    81,   477,   478,   502,
     502,   154,    67,   467,    80,   470,   471,   195,   445,   502,
     102,   103,   153,   156,   102,   325,   102,   325,   502,   419,
     476,   149,   153,   445,   468,   477,   146,   299,   502,   502,
     502,   145,   302,   303,   502,   332,   153,   332,   153,   146,
     499,   502,   146,   449,   472,   499,   149,   146,   146,   146,
     303,   502,   154,   153,   146,   332,   146,   332,   456,   449,
     303,   149,   153,   502,   146,   146,   146,   146,   449,   149,
     297,   303,   502,   153,   146,   146,   303,   146,   146,   149,
     153,   502,   154,   303,   502,   146,   149,   303,   149,   303,
     149,   303,   146,   149,   303,   149,   303,   149,   303,   149,
     303,   149,   303,   149,   303,   146
  };

  const short
  parser::yyr1_[] =
  {
       0,   191,   193,   192,   194,   194,   194,   194,   194,   194,
     194,   194,   194,   194,   194,   196,   195,   197,   197,   199,
     200,   198,   201,   201,   202,   202,   203,   203,   204,   204,
     204,   205,   205,   205,   207,   208,   206,   209,   209,   210,
     210,   211,   212,   211,   213,   211,   211,   214,   214,   214,
     215,   215,   216,   216,   217,   217,   219,   218,   220,   221,
     218,   222,   218,   218,   224,   225,   223,   226,   226,   227,
     227,   227,   227,   228,   229,   228,   230,   230,   231,   233,
     234,   232,   235,   235,   236,   236,   236,   236,   236,   236,
     236,   236,   236,   238,   239,   240,   237,   241,   242,   242,
     243,   243,   244,   245,   245,   246,   246,   246,   246,   246,
     246,   246,   246,   247,   247,   249,   248,   251,   250,   252,
     252,   253,   253,   253,   254,   254,   254,   255,   255,   255,
     255,   256,   256,   257,   257,   257,   257,   257,   257,   257,
     257,   258,   258,   258,   259,   259,   259,   260,   260,   260,
     260,   260,   261,   261,   262,   262,   262,   262,   263,   263,
     264,   264,   265,   265,   266,   266,   266,   266,   266,   267,
     267,   267,   267,   267,   267,   267,   267,   267,   267,   267,
     267,   267,   267,   267,   267,   267,   267,   267,   269,   268,
     271,   270,   272,   270,   273,   270,   274,   270,   275,   270,
     276,   270,   277,   277,   277,   277,   278,   278,   278,   279,
     279,   279,   280,   280,   280,   281,   281,   282,   282,   283,
     283,   283,   283,   284,   284,   285,   285,   286,   286,   287,
     288,   286,   289,   289,   291,   290,   292,   290,   293,   293,
     294,   295,   295,   296,   296,   297,   297,   298,   298,   299,
     299,   300,   300,   300,   300,   301,   301,   301,   302,   302,
     302,   302,   302,   303,   303,   304,   304,   305,   305,   306,
     306,   306,   307,   307,   308,   309,   309,   310,   311,   311,
     312,   312,   313,   313,   314,   314,   314,   314,   314,   314,
     314,   314,   314,   314,   314,   314,   314,   314,   314,   314,
     314,   315,   315,   315,   316,   316,   317,   317,   317,   318,
     318,   319,   319,   320,   320,   320,   321,   321,   321,   322,
     322,   323,   323,   324,   324,   325,   325,   325,   326,   327,
     328,   329,   329,   329,   330,   330,   330,   331,   332,   332,
     334,   333,   335,   335,   335,   336,   337,   338,   339,   340,
     340,   341,   342,   342,   342,   342,   342,   344,   343,   346,
     345,   347,   347,   348,   348,   349,   350,   351,   351,   352,
     354,   353,   355,   355,   355,   356,   357,   357,   358,   358,
     358,   359,   359,   360,   361,   361,   362,   362,   363,   364,
     366,   365,   368,   367,   369,   369,   370,   371,   371,   372,
     372,   372,   373,   373,   374,   375,   375,   377,   376,   379,
     378,   380,   381,   382,   380,   383,   383,   383,   384,   384,
     385,   387,   388,   386,   389,   386,   390,   386,   391,   391,
     392,   392,   393,   393,   394,   395,   396,   396,   397,   398,
     398,   399,   399,   400,   400,   400,   401,   401,   403,   402,
     404,   402,   405,   405,   406,   406,   407,   407,   409,   408,
     411,   410,   412,   412,   413,   413,   414,   415,   414,   416,
     416,   417,   417,   418,   418,   418,   418,   419,   420,   420,
     421,   421,   421,   421,   421,   421,   422,   422,   423,   423,
     425,   426,   424,   427,   424,   428,   424,   429,   429,   429,
     429,   429,   429,   430,   430,   430,   431,   431,   431,   432,
     432,   433,   433,   434,   434,   434,   436,   437,   435,   438,
     438,   439,   439,   440,   440,   441,   442,   442,   443,   443,
     443,   443,   443,   443,   443,   443,   443,   444,   444,   444,
     444,   444,   444,   444,   445,   445,   445,   445,   445,   446,
     446,   446,   446,   446,   446,   446,   446,   446,   446,   446,
     446,   447,   447,   448,   448,   448,   449,   449,   449,   449,
     449,   449,   449,   449,   449,   450,   449,   451,   449,   452,
     453,   449,   454,   455,   456,   449,   457,   449,   458,   449,
     459,   460,   449,   461,   449,   462,   462,   462,   462,   463,
     463,   463,   463,   464,   464,   464,   465,   465,   465,   466,
     466,   468,   467,   467,   469,   469,   471,   472,   470,   473,
     473,   475,   476,   474,   477,   477,   478,   478,   478,   478,
     479,   479,   479,   480,   480,   481,   481,   482,   482,   483,
     483,   484,   484,   485,   486,   486,   486,   487,   487,   487,
     488,   489,   489,   489,   491,   492,   490,   493,   490,   494,
     490,   495,   490,   497,   498,   496,   500,   499,   499,   501,
     501,   502,   502,   502,   502,   503,   503,   503,   503,   503,
     503,   504,   503,   503,   503,   503,   503,   503,   503,   503,
     503,   503,   503,   503,   503,   503,   503,   503,   503,   503,
     503,   503,   503,   503,   503,   503,   503,   503,   503,   503,
     503,   503,   503,   503,   503,   503,   503,   503,   503,   503,
     503,   503,   503,   503,   503,   503,   503,   503,   503,   503,
     503,   505,   505,   506,   506,   506,   506
  };

  const signed char
  parser::yyr2_[] =
  {
       0,     2,     0,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     0,     0,     2,     4,     0,     0,
       0,     5,     1,     0,     1,     3,     1,     3,     1,     3,
       3,     1,     1,     3,     0,     0,    11,     4,     0,     1,
       3,     0,     0,     5,     0,     5,     1,     2,     0,     4,
       1,     3,     1,     0,     2,     0,     0,     3,     0,     0,
       5,     0,     6,     3,     0,     0,     9,     2,     0,     1,
       1,     1,     1,     5,     0,     6,     1,     3,     1,     0,
       0,     9,     2,     0,     1,     1,     1,     1,     1,     1,
       1,     1,     1,     0,     0,     0,     9,     2,     2,     0,
       1,     3,     1,     1,     5,     2,     2,     2,     2,     4,
       4,     6,     8,     1,     0,     0,     5,     0,     5,     1,
       1,     1,     1,     1,     1,     1,     0,     2,     1,     1,
       0,     1,     0,     1,     2,     1,     2,     1,     2,     1,
       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
       1,     1,     1,     1,     5,     5,     5,     3,     2,     2,
       1,     0,     1,     1,     2,     2,     2,     2,     0,     1,
       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
       1,     1,     1,     3,     1,     1,     1,     1,     0,     6,
       0,     7,     0,     9,     0,    11,     0,     9,     0,    10,
       0,    10,     1,     2,     3,     2,     0,     1,     1,     0,
       1,     1,     0,     1,     1,     2,     1,     3,     0,     3,
       2,     1,     0,     1,     0,     1,     0,     2,     0,     0,
       0,     6,     1,     3,     0,     5,     0,     2,     2,     0,
       3,     2,     0,    10,    14,     2,     0,     4,     0,     2,
       0,     1,     5,     5,     5,     1,     1,     0,     1,     5,
       7,    13,    25,     1,     5,     3,     2,     2,     1,     1,
       1,     1,     3,     4,     5,     1,     3,     3,     2,     2,
       3,     3,     5,     2,     1,     3,     3,     3,     3,     3,
       3,     3,     3,     4,     4,     4,     4,     4,     4,     4,
       4,     1,     1,     1,     1,     1,     4,     1,     2,     2,
       3,     1,     1,     7,    12,    11,     6,    12,    11,     2,
       3,     2,     3,     1,     3,     1,     1,     0,     1,     1,
       5,     2,     2,     1,     1,     3,     3,     1,     1,     5,
       0,     3,     1,     1,     0,     1,     1,     1,     2,     2,
       3,     2,     1,     1,     1,     1,     1,     0,     6,     0,
       6,     1,     3,     3,     1,     1,     3,     1,     3,     4,
       0,     7,     2,     3,     0,     1,     1,     1,     1,     1,
       0,     1,     3,     2,     2,     0,     1,     3,     1,     3,
       0,     5,     0,     3,     1,     1,     4,     2,     0,     1,
       1,     0,     1,     2,     3,     1,     3,     0,     3,     0,
       2,     2,     0,     0,     4,     2,     2,     1,     1,     3,
       1,     0,     0,     8,     0,     6,     0,     6,     0,     3,
       1,     3,     1,     3,     2,     4,     1,     3,     3,     1,
       1,     6,     4,     1,     2,     2,     1,     1,     0,     6,
       0,     6,     1,     1,     1,     3,     1,     1,     0,     5,
       0,     6,     1,     3,     1,     3,     1,     0,     4,     4,
       0,     1,     3,     0,     1,     4,     5,     1,     1,     3,
       1,     2,     6,     5,     3,     2,     1,     1,     1,     1,
       0,     0,     6,     0,     4,     0,     4,     4,     4,     3,
       3,     2,     0,     1,     3,     3,     2,     2,     1,     2,
       0,     2,     0,     1,     1,     0,     0,     0,     6,     2,
       4,     1,     3,     2,     1,     1,     1,     1,     7,     7,
       8,     8,     7,     6,     3,     7,     8,     7,     7,     8,
       8,     7,     7,     8,     5,     4,     4,     5,     5,     1,
       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
       1,     1,     1,     3,     3,     5,     1,     1,     1,     1,
       1,     1,     2,     2,     2,     0,     5,     0,     5,     0,
       0,     8,     0,     0,     0,    13,     0,     7,     0,     7,
       0,     0,     9,     0,     9,     1,     2,     2,     2,     1,
       2,     2,     2,     1,     1,     1,     2,     2,     0,     2,
       0,     0,     3,     0,     2,     0,     0,     0,     4,     2,
       0,     0,     0,     4,     2,     1,     1,     1,     1,     3,
       6,     2,     2,     1,     3,     1,     3,     4,     0,     1,
       0,     1,     3,     1,     2,     2,     0,     1,     1,     2,
       1,     2,     4,     3,     0,     0,    11,     0,     7,     0,
       7,     0,     4,     0,     0,     7,     0,     2,     1,     2,
       0,     1,     6,     3,     2,     1,     4,     2,     1,     1,
       1,     0,     7,     5,     5,     3,     7,     3,     6,     3,
       4,     4,     4,     4,     4,     4,     3,     3,     3,     3,
       3,     3,     4,     4,     4,     4,     4,     4,     4,     4,
       4,     4,     4,     4,     4,     4,     4,     4,     4,     4,
       3,     3,     4,     4,     3,     5,     5,     5,     5,     5,
       5,     1,     3,     1,     1,     2,     3
  };




#if FRONTEND_VERILOG_YYDEBUG
  const short
  parser::yyrline_[] =
  {
       0,   593,   593,   593,   604,   605,   606,   607,   608,   609,
     610,   611,   612,   613,   614,   617,   617,   633,   636,   639,
     644,   639,   655,   655,   658,   659,   662,   665,   670,   673,
     680,   689,   690,   691,   695,   697,   695,   718,   718,   721,
     721,   724,   725,   725,   730,   730,   735,   738,   738,   738,
     741,   741,   744,   744,   747,   763,   766,   766,   779,   783,
     779,   791,   791,   806,   811,   813,   811,   826,   826,   829,
     829,   829,   829,   832,   838,   838,   848,   849,   852,   860,
     862,   860,   880,   880,   883,   883,   883,   883,   883,   883,
     883,   884,   884,   887,   890,   894,   887,   921,   926,   927,
     930,   931,   936,   943,   944,   947,   948,   949,   951,   952,
     953,   954,   955,   958,   958,   961,   961,   966,   966,   975,
     976,   979,   982,   985,   991,   992,   993,   996,  1000,  1003,
    1006,  1009,  1009,  1013,  1015,  1018,  1021,  1025,  1028,  1031,
    1034,  1043,  1046,  1049,  1052,  1054,  1059,  1064,  1065,  1066,
    1067,  1068,  1071,  1072,  1075,  1080,  1086,  1092,  1098,  1101,
    1107,  1110,  1115,  1116,  1119,  1121,  1122,  1123,  1124,  1127,
    1127,  1127,  1127,  1127,  1127,  1127,  1127,  1127,  1127,  1128,
    1128,  1128,  1129,  1129,  1129,  1129,  1129,  1129,  1132,  1132,
    1140,  1140,  1147,  1147,  1154,  1154,  1161,  1161,  1170,  1170,
    1184,  1184,  1206,  1210,  1213,  1217,  1222,  1223,  1224,  1228,
    1229,  1230,  1233,  1234,  1235,  1239,  1242,  1247,  1248,  1251,
    1252,  1253,  1254,  1257,  1258,  1261,  1262,  1265,  1265,  1265,
    1269,  1265,  1277,  1277,  1280,  1280,  1301,  1301,  1315,  1316,
    1321,  1324,  1325,  1328,  1409,  1480,  1483,  1488,  1491,  1496,
    1499,  1504,  1510,  1516,  1522,  1530,  1531,  1532,  1535,  1542,
    1547,  1553,  1559,  1567,  1573,  1583,  1584,  1587,  1588,  1591,
    1594,  1595,  1599,  1600,  1606,  1609,  1609,  1612,  1615,  1617,
    1621,  1622,  1626,  1628,  1632,  1634,  1635,  1636,  1637,  1638,
    1639,  1640,  1641,  1643,  1644,  1645,  1646,  1647,  1648,  1649,
    1650,  1655,  1656,  1658,  1666,  1667,  1671,  1672,  1673,  1677,
    1678,  1682,  1682,  1685,  1686,  1687,  1690,  1691,  1692,  1696,
    1697,  1700,  1701,  1704,  1705,  1708,  1708,  1708,  1712,  1716,
    1719,  1722,  1723,  1724,  1727,  1728,  1729,  1736,  1739,  1740,
    1744,  1744,  1750,  1752,  1754,  1757,  1762,  1767,  1773,  1775,
    1778,  1781,  1784,  1784,  1784,  1784,  1785,  1790,  1790,  1799,
    1799,  1808,  1808,  1811,  1816,  1828,  1845,  1848,  1848,  1851,
    1864,  1864,  1890,  1891,  1892,  1896,  1902,  1903,  1907,  1908,
    1909,  1912,  1913,  1917,  1930,  1931,  1935,  1936,  1939,  1949,
    1957,  1957,  1965,  1965,  1974,  1975,  1978,  1982,  1983,  1986,
    1987,  1988,  1991,  1992,  1995,  1999,  2000,  2003,  2003,  2017,
    2017,  2021,  2026,  2028,  2026,  2041,  2042,  2043,  2046,  2047,
    2051,  2063,  2067,  2063,  2073,  2073,  2080,  2080,  2089,  2090,
    2100,  2100,  2103,  2141,  2166,  2211,  2214,  2214,  2217,  2222,
    2223,  2227,  2242,  2246,  2251,  2260,  2269,  2270,  2274,  2274,
    2282,  2282,  2291,  2294,  2299,  2300,  2303,  2303,  2306,  2306,
    2320,  2320,  2334,  2335,  2338,  2339,  2342,  2343,  2343,  2356,
    2356,  2359,  2359,  2362,  2363,  2368,  2371,  2379,  2405,  2405,
    2408,  2412,  2417,  2423,  2428,  2435,  2442,  2445,  2450,  2453,
    2458,  2463,  2458,  2474,  2474,  2486,  2486,  2496,  2497,  2498,
    2499,  2500,  2501,  2504,  2505,  2506,  2509,  2515,  2521,  2528,
    2531,  2536,  2539,  2544,  2547,  2550,  2555,  2559,  2555,  2565,
    2565,  2568,  2568,  2571,  2572,  2575,  2584,  2584,  2587,  2597,
    2606,  2615,  2624,  2631,  2638,  2645,  2656,  2669,  2676,  2683,
    2690,  2697,  2704,  2714,  2726,  2731,  2734,  2737,  2742,  2747,
    2748,  2749,  2750,  2751,  2752,  2753,  2754,  2755,  2756,  2757,
    2758,  2763,  2764,  2767,  2774,  2777,  2814,  2814,  2814,  2814,
    2814,  2814,  2815,  2816,  2817,  2818,  2818,  2826,  2826,  2834,
    2836,  2834,  2857,  2860,  2862,  2857,  2871,  2871,  2884,  2884,
    2897,  2935,  2897,  2942,  2942,  2953,  2956,  2963,  2970,  2980,
    2983,  2987,  2991,  2998,  3001,  3004,  3009,  3013,  3017,  3020,
    3021,  3024,  3024,  3038,  3041,  3042,  3045,  3050,  3045,  3061,
    3062,  3065,  3070,  3065,  3079,  3080,  3083,  3087,  3092,  3095,
    3100,  3105,  3114,  3121,  3124,  3129,  3133,  3139,  3140,  3143,
    3144,  3147,  3148,  3151,  3156,  3157,  3158,  3161,  3161,  3162,
    3165,  3171,  3174,  3188,  3195,  3197,  3195,  3204,  3204,  3211,
    3211,  3218,  3218,  3227,  3229,  3227,  3241,  3241,  3246,  3249,
    3249,  3252,  3255,  3263,  3268,  3273,  3276,  3285,  3298,  3305,
    3316,  3320,  3320,  3335,  3339,  3343,  3346,  3349,  3352,  3355,
    3360,  3365,  3370,  3375,  3380,  3385,  3390,  3395,  3401,  3406,
    3413,  3418,  3423,  3428,  3433,  3438,  3443,  3448,  3453,  3458,
    3463,  3468,  3473,  3478,  3483,  3488,  3493,  3498,  3503,  3508,
    3513,  3518,  3523,  3528,  3533,  3538,  3544,  3550,  3556,  3562,
    3569,  3575,  3578,  3584,  3585,  3586,  3590
  };

  void
  parser::yy_stack_print_ () const
  {
    *yycdebug_ << "Stack now";
    for (stack_type::const_iterator
           i = yystack_.begin (),
           i_end = yystack_.end ();
         i != i_end; ++i)
      *yycdebug_ << ' ' << int (i->state);
    *yycdebug_ << '\n';
  }

  void
  parser::yy_reduce_print_ (int yyrule) const
  {
    int yylno = yyrline_[yyrule];
    int yynrhs = yyr2_[yyrule];
    // Print the symbols being reduced, and their result.
    *yycdebug_ << "Reducing stack by rule " << yyrule - 1
               << " (line " << yylno << "):\n";
    // The symbols being reduced.
    for (int yyi = 0; yyi < yynrhs; yyi++)
      YY_SYMBOL_PRINT ("   $" << yyi + 1 << " =",
                       yystack_[(yynrhs) - (yyi + 1)]);
  }
#endif // FRONTEND_VERILOG_YYDEBUG


} // frontend_verilog_yy
#line 8036 "frontends/verilog/verilog_parser.tab.cc"

