⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vparsebison.y

📁 Verilog Parser in Perl
💻 Y
📖 第 1 页 / 共 4 页
字号:
//************************************************// Typedefdata_declaration:		// ==IEEE: data_declaration (INCOMPLETE)//		dataDeclarationType  list_of_variable_decl_assignments ';'	{ }		type_declaration			{ }//	|	package_import_declaration		{ }//	|	virtual_interface_declaration	;// Needs a lot of worktype_declaration:		// ==IEEE: type_declaration (INCOMPLETE)		yTYPEDEF data_type yaID variable_dimensionE ';'	{ }//	|	yTYPEDEF yaID '.' yaID yaID ';'		{ }	|	yTYPEDEF yENUM yaID ';'			{ }	|	yTYPEDEF ySTRUCT yaID ';'		{ }	|	yTYPEDEF yUNION yaID ';'		{ }	|	yTYPEDEF yCLASS yaID ';'		{ }	;variable_dimensionE:		/* empty */				{ }//	|	variable_dimension			{ }	;//************************************************// Module Itemsmodule_itemListE:		// IEEE: Part of module_declaration		/* empty */				{ }	|	module_itemList				{ }	;module_itemList:		// IEEE: Part of module_declaration		module_item				{ }	|	module_itemList module_item		{ }	;module_item:			// ==IEEE: module_item	//			// IEEE: non_port_module_item		generate_region				{ }	|	module_or_generate_item			{ }	|	specify_block				{ }	;generate_region:		// ==IEEE: generate_region		yGENERATE genTopBlock yENDGENERATE	{ }	;// IEEE: module_or_generate_item + module_common_item + parameter_overridemodule_or_generate_item:	//			// IEEE: always_construct		yALWAYS stmtBlock			{ }	|	continuous_assign			{ }	|	initial_construct			{ }	|	final_construct				{ }	//	|	yDEFPARAM list_of_defparam_assignments ';'	{ }	|	package_import_declaration		{ }	|	instDecl 				{ }	|	task_declaration			{ }	|	function_declaration			{ }	|	portDecl	 			{ }	|	varDecl 				{ }	|	combinational_body			{ }	//	|	concurrent_assertion_item		{ }  // IEEE puts in module_item, all tools put here	|	clocking_declaration			{ }	//	|	error ';'				{ }	;continuous_assign:		// IEEE: continuous_assign		yASSIGN strengthSpecE delayE assignList ';'	{ }	;initial_construct:		// IEEE: initial_construct		yINITIAL stmtBlock			{ }	;final_construct:		// IEEE: final_construct		yFINAL stmtBlock			{ }	;//************************************************// Generates// Because genItemList includes variable declarations, we don't need beginNamedgenerate_block_or_null:		// IEEE: generate_block_or_null		genItem					{ }	|	genItemBegin				{ }	;genTopBlock:		genItemList				{ }	|	genItemBegin				{ }	;genItemBegin:			// IEEE: part of generate_block		yBEGIN genItemList yEND			{ }	|	yBEGIN yEND				{ }	|	yaID ':' yBEGIN genItemList yEND endLabelE	{ }	|	yaID ':' yBEGIN             yEND endLabelE	{ }	|	yBEGIN ':' yaID genItemList yEND endLabelE	{ }	|	yBEGIN ':' yaID             yEND endLabelE	{ }	;genItemList:		genItem					{ }	|	genItemList genItem			{ }	;genItem:			// IEEE: module_or_interface_or_generate_item (INCOMPLETE)		module_or_generate_item			{ }	|	conditional_generate_construct		{ }	|	loop_generate_construct			{ }	;conditional_generate_construct:	// ==IEEE: conditional_generate_construct		yCASE  '(' expr ')' case_generate_itemListE yENDCASE	{ }	|	yIF '(' expr ')' generate_block_or_null	%prec prLOWER_THAN_ELSE	{ }	|	yIF '(' expr ')' generate_block_or_null yELSE generate_block_or_null	{ }	;loop_generate_construct:	// ==IEEE: loop_generate_construct		yFOR '(' varRefBase '=' expr ';' expr ';' varRefBase '=' expr ')' generate_block_or_null			{ }	;case_generate_itemListE:	// IEEE: [{ case_generate_itemList }]		/* empty */				{ }	|	case_generate_itemList			{ }	;case_generate_itemList:		// IEEE: { case_generate_itemList }		case_generate_item			{ }	|	case_generate_itemList case_generate_item	{ }	;case_generate_item:		// ==IEEE: case_generate_item		caseCondList ':' generate_block_or_null	{ }	|	yDEFAULT ':' generate_block_or_null	{ }	|	yDEFAULT generate_block_or_null		{ }	;//************************************************// Assignments and register declarationsvariable_lvalue<str>:		// IEEE: variable_lvalue or net_lvalue		varRefDotBit				{ $<fl>$=$<fl>1; $$ = $1; }	|	'{' variable_lvalueList '}'		{ $<fl>$=$<fl>1; $$ = $1+$2+$3; }	;variable_lvalueList<str>:	// IEEE: part of variable_lvalue: variable_lvalue { ',' variable_lvalue }		variable_lvalue				{ $<fl>$=$<fl>1; $$ = $1; }	|	variable_lvalueList ',' variable_lvalue	{ $<fl>$=$<fl>1; $$ = $1+","+$3; }	;assignList:		assignOne				{ }	|	assignList ',' assignOne		{ }	;assignOne:		variable_lvalue '=' expr		{ }	;delayOrEvE:		// IEEE: delay_or_event_control plus empty		/* empty */				{ }	|	delay_control				{ } /* ignored */	|	event_control				{ } /* ignored */	|	yREPEAT '(' expr ')' delayOrEvE		{ } /* ignored */	;delayE:		/* empty */				{ }	|	delay_control				{ } /* ignored */	;delay_control:		// ==IEEE: delay_control		'#' dlyTerm				{ } /* ignored */	|	'#' '(' minTypMax ')'			{ } /* ignored */	|	'#' '(' minTypMax ',' minTypMax ')'		{ } /* ignored */	|	'#' '(' minTypMax ',' minTypMax ',' minTypMax ')'	{ } /* ignored */	;dlyTerm:		yaID 					{ }	|	yaINTNUM 				{ }	|	yaFLOATNUM 				{ }	|	yaTIMENUM 				{ }	;minTypMax:			// IEEE: mintypmax_expression and constant_mintypmax_expression		expr 					{ }	|	expr ':' expr ':' expr			{ }	;sigAndAttr<str>:		sigId sigAttrListE			{ $<fl>$=$<fl>1; $$=$1; }	;netSigList:		netSig  				{ }	|	netSigList ',' netSig		       	{ }	;netSig:		sigId sigAttrListE			{ }	|	yaID  sigAttrListE '=' expr		{ VARDONE($<fl>1, $1, $4); }	|	sigIdRange sigAttrListE			{ }	;sigIdRange:		yaID rangeList				{ $<fl>$=$<fl>1; VARARRAY($2); VARDONE($<fl>1, $1, ""); }	;regSigId<str>:		yaID rangeListE				{ $<fl>$=$<fl>1; VARARRAY($2); VARDONE($<fl>1, $1, ""); }	|	yaID rangeListE '=' constExpr		{ $<fl>$=$<fl>1; VARARRAY($2); VARDONE($<fl>1, $1, $4); }	;sigId<str>:		yaID					{ $<fl>$=$<fl>1; VARDONE($<fl>1, $1, ""); }	;sigList:		sigInit					{ }	|	sigList ',' sigInit			{ }	;sigInit:		sigAndAttr				{ }	|	sigAndAttr '=' expr			{ }	;regsig:		regSigId sigAttrListE			{}	;sigAttrListE:		/* empty */				{}	;rangeListE<str>:		/* empty */    		               	{ $$ = ""; }	|	rangeList 				{ $$ = $1; }	;rangeList<str>:			// IEEE: packed_dimension + ...		anyrange				{ $$ = $1; }        |	rangeList anyrange			{ $$ = $1+$2; }	;regrangeE<str>:		/* empty */    		               	{ VARRANGE(""); }	|	anyrange 				{ VARRANGE($1); }	;regArRangeE:		/* empty */    		               	{ }	|	regArRangeList 				{ }	;// Complication here is "[#:#]" is a range, while "[#:#][#:#]" is an array and range.regArRangeList:		anyrange				{ VARRANGE($1); }        |	regArRangeList anyrange			{ VARARRAY(GRAMMARP->m_varArray+GRAMMARP->m_varRange); VARRANGE($2); }	;anyrange<str>:		'[' constExpr ':' constExpr ']'		{ $$ = "["+$2+":"+$4+"]"; }	;delayrange:		regrangeE delayE 			{ }	|	ySCALARED regrangeE delayE 		{ }	|	yVECTORED regrangeE delayE		{ }	;portRangeE<str>:		/* empty */	                   	{ $$ = ""; }	|	'[' constExpr ']'              		{ $$ = "["+$2+"]"; }	|	'[' constExpr ':' constExpr  ']'    	{ $$ = "["+$2+":"+$4+"]"; }	;//************************************************// Parametersparam:		yaID sigAttrListE '=' expr		{ $<fl>$=$<fl>1; VARDONE($<fl>1, $1, $4); }	;paramList:		param					{ }	|	paramList ',' param			{ }	;list_of_defparam_assignments:	// ==IEEE: list_of_defparam_assignments		defparam_assignment			{ }	|	list_of_defparam_assignments ',' defparam_assignment	{ }	;defparam_assignment:		// ==IEEE: defparam_assignment		varRefDotBit '=' expr 		{ }	;//************************************************// Instances// We don't know if its a gate or module or udp instantiation//   modname        [#(params)]  name  (pins) [, name ...]//   gate (strong0) [#(delay)]  [name] (pins) [, (pins)...]instDecl:			// IEEE: module_instantiation + gate_instantiation + udp_instantiation		instModName {INSTPREP($1,1);} strengthSpecE instparamListE {INSTPREP($1,0);} instnameList ';'		 	{ }	;instModName<str>:		yaID 					{ $<fl>$=$<fl>1; $$ = $1; }	|	gateKwd			 		{ $<fl>$=$<fl>1; $$ = $1; }	;instparamListE:		/* empty */				{ }	|	'#' '(' cellpinList ')'			{ }	|	'#' dlyTerm				{ }	;instnameList:		instnameParen				{ }	|	instnameList ',' instnameParen		{ }	;instnameParen:		instname cellpinList ')'		{ PARSEP->endcellCb($<fl>3,""); }	;instname:		yaID instRangeE '(' 			{ PARSEP->instantCb($<fl>1, GRAMMARP->m_cellMod, $1, $2); PINPARAMS(); }	|	instRangeE '(' 				{ PARSEP->instantCb($<fl>2, GRAMMARP->m_cellMod, "", $1); PINPARAMS(); } // UDP	;instRangeE<str>:		/* empty */				{ $$ = ""; }	|	'[' constExpr ':' constExpr ']'		{ $$ = "["+$2+":"+$4+"]"; }	;cellpinList:		{ } cellpinItList			{ }	;cellpinItList:		cellpinItemE				{ }	|	cellpinItList ',' cellpinItemE		{ }	;cellpinItemE:		/* empty: ',,' is legal */		{ GRAMMARP->pinNumInc(); }  /*PINDONE(yylval.fl,"",""); <- No, as then () implys a pin*/	|	yP_DOTSTAR				{ PINDONE($<fl>1,"*","*");GRAMMARP->pinNumInc(); }	|	'.' yaID				{ PINDONE($<fl>1,$2,$2);  GRAMMARP->pinNumInc(); }	|	'.' yaID '(' ')'			{ PINDONE($<fl>1,$2,"");  GRAMMARP->pinNumInc(); }	|	'.' yaID '(' expr ')'			{ PINDONE($<fl>1,$2,$4);  GRAMMARP->pinNumInc(); }	|	expr					{ PINDONE($<fl>1,"",$1);  GRAMMARP->pinNumInc(); }	;//************************************************// EventControl listsevent_control:			// ==IEEE: event_control (INCOMPLETE)		'@' '(' senList ')'			{ }	|	'@' senitemVar				{ }	|	'@' '(' '*' ')'				{ }	|	'@' '*'					{ }  /* Verilog 2001 *///	|	'@' sequence_instance			{ }	;senList:			// IEEE: event_expression - split over several		senitem					{ }	|	senList yOR senitem			{ }	|	senList ',' senitem			{ }	/* Verilog 2001 */	;senitem:		senitemEdge				{ }	|	expr					{ }	;senitemVar:		varRefDotBit				{ }	;senitemEdge:			// IEEE: part of event_expression		yPOSEDGE expr				{ }	|	yPOSEDGE expr yIFF expr			{ }	|	yNEGEDGE expr				{ }	|	yNEGEDGE expr yIFF expr			{ }	;//************************************************// StatementsstmtBlock:		// IEEE: statement + seq_block + par_block		stmt					{ }	|	yBEGIN stmtList yEND			{ }	|	yBEGIN yEND				{ }	|	beginNamed stmtList yEND endLabelE	{ }	|	beginNamed 	    yEND endLabelE	{ }	|	yFORK stmtList	   yJOIN		{ }	|	yFORK 		   yJOIN		{ }	|	forkNamed stmtList yJOIN endLabelE	{ }	|	forkNamed 	   yJOIN endLabelE	{ }	;beginNamed:		yBEGIN ':' yaID varDeclList		{ }	|	yBEGIN ':' yaID 			{ }	;forkNamed:		yFORK ':' yaID varDeclList		{ }	|	yFORK ':' yaID 				{ }	;stmtList:		stmtBlock				{ }	|	stmtList stmtBlock			{ }	;// IEEE: statement_or_null (may include more stuff, not analyzed)//	== function_statement_or_nullstmt:	//			// from _or_null		';'					{ }	|	labeledStmt				{ }	|	yaID ':' labeledStmt			{ }  /*S05 block creation rule*/	//			// IEEE: operator_assignment	//			// added delayOrEvE as code found that expected it - maybe Verilog-XL accepted it?	|	variable_lvalue '=' 		delayOrEvE expr ';'	{ }	|	variable_lvalue yP_PLUSEQ	expr ';'	{ }	|	variable_lvalue yP_MINUSEQ	expr ';'	{ }	|	variable_lvalue yP_TIMESEQ	expr ';'	{ }	|	variable_lvalue yP_DIVEQ	expr ';'	{ }	|	variable_lvalue yP_MODEQ	expr ';'	{ }	|	variable_lvalue yP_ANDEQ	expr ';'	{ }	|	variable_lvalue yP_OREQ	expr ';'	{ }	|	variable_lvalue yP_XOREQ	expr ';'	{ }	|	variable_lvalue yP_SLEFTEQ	expr ';'	{ }	|	variable_lvalue yP_SRIGHTEQ	expr ';'	{ }	|	variable_lvalue yP_SSRIGHTEQ	expr ';'	{ }	//			// IEEE: nonblocking_assignment	|	variable_lvalue yP_LTE	delayOrEvE expr ';'	{ }	//			// IEEE: procedural_continuous_assignment

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -