mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 11:42:30 +00:00 
			
		
		
		
	New behavior for front-end handling of whiteboxes
Signed-off-by: Clifford Wolf <clifford@clifford.at>
This commit is contained in:
		
							parent
							
								
									f84a84e3f1
								
							
						
					
					
						commit
						fb7f02be55
					
				
					 6 changed files with 103 additions and 34 deletions
				
			
		|  | @ -145,12 +145,18 @@ struct VerilogFrontend : public Frontend { | |||
| 		log("    -nodpi\n"); | ||||
| 		log("        disable DPI-C support\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -noblackbox\n"); | ||||
| 		log("        do not automatically add a (* blackbox *) attribute to an\n"); | ||||
| 		log("        empty module.\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -lib\n"); | ||||
| 		log("        only create empty blackbox modules. This implies -DBLACKBOX.\n"); | ||||
| 		log("        modules with the (* whitebox *) attribute will be preserved.\n"); | ||||
| 		log("        (* lib_whitebox *) will be treated like (* whitebox *).\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -wb\n"); | ||||
| 		log("        like -lib, except do not touch modules with the whitebox\n"); | ||||
| 		log("        attribute set. This also implies -DBLACKBOX.\n"); | ||||
| 		log("    -nowb\n"); | ||||
| 		log("        delete (* whitebox *) and (* lib_whitebox *) attributes from\n"); | ||||
| 		log("        all modules.\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -noopt\n"); | ||||
| 		log("        don't perform basic optimizations (such as const folding) in the\n"); | ||||
|  | @ -231,8 +237,9 @@ struct VerilogFrontend : public Frontend { | |||
| 		formal_mode = false; | ||||
| 		norestrict_mode = false; | ||||
| 		assume_asserts_mode = false; | ||||
| 		noblackbox_mode = false; | ||||
| 		lib_mode = false; | ||||
| 		wb_mode = false; | ||||
| 		nowb_mode = false; | ||||
| 		default_nettype_wire = true; | ||||
| 
 | ||||
| 		log_header(design, "Executing Verilog-2005 frontend.\n"); | ||||
|  | @ -334,14 +341,17 @@ struct VerilogFrontend : public Frontend { | |||
| 				flag_nodpi = true; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (arg == "-lib" && !wb_mode) { | ||||
| 			if (arg == "-noblackbox") { | ||||
| 				noblackbox_mode = true; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (arg == "-lib") { | ||||
| 				lib_mode = true; | ||||
| 				defines_map["BLACKBOX"] = string(); | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (arg == "-wb" && !lib_mode) { | ||||
| 				wb_mode = true; | ||||
| 				defines_map["BLACKBOX"] = string(); | ||||
| 			if (arg == "-nowb") { | ||||
| 				nowb_mode = true; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (arg == "-noopt") { | ||||
|  | @ -439,7 +449,8 @@ struct VerilogFrontend : public Frontend { | |||
| 		if (flag_nodpi) | ||||
| 			error_on_dpi_function(current_ast); | ||||
| 
 | ||||
| 		AST::process(design, current_ast, flag_dump_ast1, flag_dump_ast2, flag_no_dump_ptr, flag_dump_vlog1, flag_dump_vlog2, flag_dump_rtlil, flag_nolatches, flag_nomeminit, flag_nomem2reg, flag_mem2reg, lib_mode, wb_mode, flag_noopt, flag_icells, flag_nooverwrite, flag_overwrite, flag_defer, default_nettype_wire); | ||||
| 		AST::process(design, current_ast, flag_dump_ast1, flag_dump_ast2, flag_no_dump_ptr, flag_dump_vlog1, flag_dump_vlog2, flag_dump_rtlil, flag_nolatches, | ||||
| 				flag_nomeminit, flag_nomem2reg, flag_mem2reg, noblackbox_mode, lib_mode, nowb_mode, flag_noopt, flag_icells, flag_nooverwrite, flag_overwrite, flag_defer, default_nettype_wire); | ||||
| 
 | ||||
| 		if (!flag_nopp) | ||||
| 			delete lexin; | ||||
|  |  | |||
|  | @ -69,11 +69,14 @@ namespace VERILOG_FRONTEND | |||
| 	// running in -assert-assumes mode
 | ||||
| 	extern bool assert_assumes_mode; | ||||
| 
 | ||||
| 	// running in -noblackbox mode
 | ||||
| 	extern bool noblackbox_mode; | ||||
| 
 | ||||
| 	// running in -lib mode
 | ||||
| 	extern bool lib_mode; | ||||
| 
 | ||||
| 	// running in -wb mode
 | ||||
| 	extern bool wb_mode; | ||||
| 	// running in -nowb mode
 | ||||
| 	extern bool nowb_mode; | ||||
| 
 | ||||
| 	// lexer input stream
 | ||||
| 	extern std::istream *lexin; | ||||
|  |  | |||
|  | @ -59,7 +59,7 @@ namespace VERILOG_FRONTEND { | |||
| 	std::vector<char> case_type_stack; | ||||
| 	bool do_not_require_port_stubs; | ||||
| 	bool default_nettype_wire; | ||||
| 	bool sv_mode, formal_mode, lib_mode, wb_mode; | ||||
| 	bool sv_mode, formal_mode, noblackbox_mode, lib_mode, nowb_mode; | ||||
| 	bool noassert_mode, noassume_mode, norestrict_mode; | ||||
| 	bool assume_asserts_mode, assert_assumes_mode; | ||||
| 	bool current_wire_rand, current_wire_const; | ||||
|  | @ -1906,7 +1906,7 @@ basic_expr: | |||
| 		if ($4->substr(0, 1) != "'") | ||||
| 			frontend_verilog_yyerror("Cast operation must be applied on sized constants e.g. (<expr>)<constval> , while %s is not a sized constant.", $4->c_str()); | ||||
| 		AstNode *bits = $2; | ||||
| 		AstNode *val = const2ast(*$4, case_type_stack.size() == 0 ? 0 : case_type_stack.back(), !lib_mode && !wb_mode); | ||||
| 		AstNode *val = const2ast(*$4, case_type_stack.size() == 0 ? 0 : case_type_stack.back(), !lib_mode); | ||||
| 		if (val == NULL) | ||||
| 			log_error("Value conversion failed: `%s'\n", $4->c_str()); | ||||
| 		$$ = new AstNode(AST_TO_BITS, bits, val); | ||||
|  | @ -1917,7 +1917,7 @@ basic_expr: | |||
| 			frontend_verilog_yyerror("Cast operation must be applied on sized constants, e.g. <ID>\'d0, while %s is not a sized constant.", $2->c_str()); | ||||
| 		AstNode *bits = new AstNode(AST_IDENTIFIER); | ||||
| 		bits->str = *$1; | ||||
| 		AstNode *val = const2ast(*$2, case_type_stack.size() == 0 ? 0 : case_type_stack.back(), !lib_mode && !wb_mode); | ||||
| 		AstNode *val = const2ast(*$2, case_type_stack.size() == 0 ? 0 : case_type_stack.back(), !lib_mode); | ||||
| 		if (val == NULL) | ||||
| 			log_error("Value conversion failed: `%s'\n", $2->c_str()); | ||||
| 		$$ = new AstNode(AST_TO_BITS, bits, val); | ||||
|  | @ -1925,14 +1925,14 @@ basic_expr: | |||
| 		delete $2; | ||||
| 	} | | ||||
| 	TOK_CONSTVAL TOK_CONSTVAL { | ||||
| 		$$ = const2ast(*$1 + *$2, case_type_stack.size() == 0 ? 0 : case_type_stack.back(), !lib_mode && !wb_mode); | ||||
| 		$$ = const2ast(*$1 + *$2, case_type_stack.size() == 0 ? 0 : case_type_stack.back(), !lib_mode); | ||||
| 		if ($$ == NULL || (*$2)[0] != '\'') | ||||
| 			log_error("Value conversion failed: `%s%s'\n", $1->c_str(), $2->c_str()); | ||||
| 		delete $1; | ||||
| 		delete $2; | ||||
| 	} | | ||||
| 	TOK_CONSTVAL { | ||||
| 		$$ = const2ast(*$1, case_type_stack.size() == 0 ? 0 : case_type_stack.back(), !lib_mode && !wb_mode); | ||||
| 		$$ = const2ast(*$1, case_type_stack.size() == 0 ? 0 : case_type_stack.back(), !lib_mode); | ||||
| 		if ($$ == NULL) | ||||
| 			log_error("Value conversion failed: `%s'\n", $1->c_str()); | ||||
| 		delete $1; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue