mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	Add "read_verilog -pwires" feature, closes #1106
Signed-off-by: Clifford Wolf <clifford@clifford.at>
This commit is contained in:
		
							parent
							
								
									5a1f1caa44
								
							
						
					
					
						commit
						ec4565009a
					
				
					 6 changed files with 48 additions and 9 deletions
				
			
		| 
						 | 
				
			
			@ -46,7 +46,7 @@ namespace AST {
 | 
			
		|||
// instantiate global variables (private API)
 | 
			
		||||
namespace AST_INTERNAL {
 | 
			
		||||
	bool flag_dump_ast1, flag_dump_ast2, flag_no_dump_ptr, flag_dump_vlog1, flag_dump_vlog2, flag_dump_rtlil, flag_nolatches, flag_nomeminit;
 | 
			
		||||
	bool flag_nomem2reg, flag_mem2reg, flag_noblackbox, flag_lib, flag_nowb, flag_noopt, flag_icells, flag_autowire;
 | 
			
		||||
	bool flag_nomem2reg, flag_mem2reg, flag_noblackbox, flag_lib, flag_nowb, flag_noopt, flag_icells, flag_pwires, flag_autowire;
 | 
			
		||||
	AstNode *current_ast, *current_ast_mod;
 | 
			
		||||
	std::map<std::string, AstNode*> current_scope;
 | 
			
		||||
	const dict<RTLIL::SigBit, RTLIL::SigBit> *genRTLIL_subst_ptr = NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -1112,6 +1112,7 @@ static AstModule* process_module(AstNode *ast, bool defer, AstNode *original_ast
 | 
			
		|||
	current_module->nowb = flag_nowb;
 | 
			
		||||
	current_module->noopt = flag_noopt;
 | 
			
		||||
	current_module->icells = flag_icells;
 | 
			
		||||
	current_module->pwires = flag_pwires;
 | 
			
		||||
	current_module->autowire = flag_autowire;
 | 
			
		||||
	current_module->fixup_ports();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1126,7 +1127,7 @@ static AstModule* process_module(AstNode *ast, bool defer, AstNode *original_ast
 | 
			
		|||
 | 
			
		||||
// create AstModule instances for all modules in the AST tree and add them to 'design'
 | 
			
		||||
void AST::process(RTLIL::Design *design, AstNode *ast, bool dump_ast1, bool dump_ast2, bool no_dump_ptr, bool dump_vlog1, bool dump_vlog2, bool dump_rtlil,
 | 
			
		||||
		bool nolatches, bool nomeminit, bool nomem2reg, bool mem2reg, bool noblackbox, bool lib, bool nowb, bool noopt, bool icells, bool nooverwrite, bool overwrite, bool defer, bool autowire)
 | 
			
		||||
		bool nolatches, bool nomeminit, bool nomem2reg, bool mem2reg, bool noblackbox, bool lib, bool nowb, bool noopt, bool icells, bool pwires, bool nooverwrite, bool overwrite, bool defer, bool autowire)
 | 
			
		||||
{
 | 
			
		||||
	current_ast = ast;
 | 
			
		||||
	flag_dump_ast1 = dump_ast1;
 | 
			
		||||
| 
						 | 
				
			
			@ -1144,6 +1145,7 @@ void AST::process(RTLIL::Design *design, AstNode *ast, bool dump_ast1, bool dump
 | 
			
		|||
	flag_nowb = nowb;
 | 
			
		||||
	flag_noopt = noopt;
 | 
			
		||||
	flag_icells = icells;
 | 
			
		||||
	flag_pwires = pwires;
 | 
			
		||||
	flag_autowire = autowire;
 | 
			
		||||
 | 
			
		||||
	log_assert(current_ast->type == AST_DESIGN);
 | 
			
		||||
| 
						 | 
				
			
			@ -1480,6 +1482,7 @@ std::string AstModule::derive_common(RTLIL::Design *design, dict<RTLIL::IdString
 | 
			
		|||
	flag_nowb = nowb;
 | 
			
		||||
	flag_noopt = noopt;
 | 
			
		||||
	flag_icells = icells;
 | 
			
		||||
	flag_pwires = pwires;
 | 
			
		||||
	flag_autowire = autowire;
 | 
			
		||||
	use_internal_line_num();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1551,6 +1554,7 @@ RTLIL::Module *AstModule::clone() const
 | 
			
		|||
	new_mod->lib = lib;
 | 
			
		||||
	new_mod->noopt = noopt;
 | 
			
		||||
	new_mod->icells = icells;
 | 
			
		||||
	new_mod->pwires = pwires;
 | 
			
		||||
	new_mod->autowire = autowire;
 | 
			
		||||
 | 
			
		||||
	return new_mod;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -286,13 +286,13 @@ namespace AST
 | 
			
		|||
 | 
			
		||||
	// process an AST tree (ast must point to an AST_DESIGN node) and generate RTLIL code
 | 
			
		||||
	void process(RTLIL::Design *design, AstNode *ast, bool dump_ast1, bool dump_ast2, bool no_dump_ptr, bool dump_vlog1, bool dump_vlog2, bool dump_rtlil, bool nolatches, bool nomeminit,
 | 
			
		||||
			bool nomem2reg, bool mem2reg, bool noblackbox, bool lib, bool nowb, bool noopt, bool icells, bool nooverwrite, bool overwrite, bool defer, bool autowire);
 | 
			
		||||
			bool nomem2reg, bool mem2reg, bool noblackbox, bool lib, bool nowb, bool noopt, bool icells, bool pwires, bool nooverwrite, bool overwrite, bool defer, bool autowire);
 | 
			
		||||
 | 
			
		||||
	// parametric modules are supported directly by the AST library
 | 
			
		||||
	// therefore we need our own derivate of RTLIL::Module with overloaded virtual functions
 | 
			
		||||
	struct AstModule : RTLIL::Module {
 | 
			
		||||
		AstNode *ast;
 | 
			
		||||
		bool nolatches, nomeminit, nomem2reg, mem2reg, noblackbox, lib, nowb, noopt, icells, autowire;
 | 
			
		||||
		bool nolatches, nomeminit, nomem2reg, mem2reg, noblackbox, lib, nowb, noopt, icells, pwires, autowire;
 | 
			
		||||
		~AstModule() YS_OVERRIDE;
 | 
			
		||||
		RTLIL::IdString derive(RTLIL::Design *design, dict<RTLIL::IdString, RTLIL::Const> parameters, bool mayfail) YS_OVERRIDE;
 | 
			
		||||
		RTLIL::IdString derive(RTLIL::Design *design, dict<RTLIL::IdString, RTLIL::Const> parameters, dict<RTLIL::IdString, RTLIL::Module*> interfaces, dict<RTLIL::IdString, RTLIL::IdString> modports, bool mayfail) YS_OVERRIDE;
 | 
			
		||||
| 
						 | 
				
			
			@ -325,7 +325,7 @@ namespace AST_INTERNAL
 | 
			
		|||
{
 | 
			
		||||
	// internal state variables
 | 
			
		||||
	extern bool flag_dump_ast1, flag_dump_ast2, flag_no_dump_ptr, flag_dump_rtlil, flag_nolatches, flag_nomeminit;
 | 
			
		||||
	extern bool flag_nomem2reg, flag_mem2reg, flag_lib, flag_noopt, flag_icells, flag_autowire;
 | 
			
		||||
	extern bool flag_nomem2reg, flag_mem2reg, flag_lib, flag_noopt, flag_icells, flag_pwires, flag_autowire;
 | 
			
		||||
	extern AST::AstNode *current_ast, *current_ast_mod;
 | 
			
		||||
	extern std::map<std::string, AST::AstNode*> current_scope;
 | 
			
		||||
	extern const dict<RTLIL::SigBit, RTLIL::SigBit> *genRTLIL_subst_ptr;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -853,7 +853,6 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint)
 | 
			
		|||
	case AST_FUNCTION:
 | 
			
		||||
	case AST_DPI_FUNCTION:
 | 
			
		||||
	case AST_AUTOWIRE:
 | 
			
		||||
	case AST_LOCALPARAM:
 | 
			
		||||
	case AST_DEFPARAM:
 | 
			
		||||
	case AST_GENVAR:
 | 
			
		||||
	case AST_GENFOR:
 | 
			
		||||
| 
						 | 
				
			
			@ -895,6 +894,26 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint)
 | 
			
		|||
	// remember the parameter, needed for example in techmap
 | 
			
		||||
	case AST_PARAMETER:
 | 
			
		||||
		current_module->avail_parameters.insert(str);
 | 
			
		||||
		/* fall through */
 | 
			
		||||
	case AST_LOCALPARAM:
 | 
			
		||||
		if (flag_pwires)
 | 
			
		||||
		{
 | 
			
		||||
			if (GetSize(children) < 1 || children[0]->type != AST_CONSTANT)
 | 
			
		||||
				log_file_error(filename, linenum, "Parameter `%s' with non-constant value!\n", str.c_str());
 | 
			
		||||
 | 
			
		||||
			RTLIL::Const val = children[0]->bitsAsConst();
 | 
			
		||||
			RTLIL::Wire *wire = current_module->addWire(str, GetSize(val));
 | 
			
		||||
			current_module->connect(wire, val);
 | 
			
		||||
 | 
			
		||||
			wire->attributes["\\src"] = stringf("%s:%d", filename.c_str(), linenum);
 | 
			
		||||
			wire->attributes[type == AST_PARAMETER ? "\\parameter" : "\\localparam"] = 1;
 | 
			
		||||
 | 
			
		||||
			for (auto &attr : attributes) {
 | 
			
		||||
				if (attr.second->type != AST_CONSTANT)
 | 
			
		||||
					log_file_error(filename, linenum, "Attribute `%s' with non-constant value!\n", attr.first.c_str());
 | 
			
		||||
				wire->attributes[attr.first] = attr.second->asAttrConst();
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	// create an RTLIL::Wire for an AST_WIRE node
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue