mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-03 21:09:12 +00:00 
			
		
		
		
	Merge remote-tracking branch 'origin/clifford/whitebox' into xaig
This commit is contained in:
		
						commit
						8fe0a961b3
					
				
					 23 changed files with 81 additions and 42 deletions
				
			
		| 
						 | 
					@ -312,6 +312,10 @@ Verilog Attributes and non-standard features
 | 
				
			||||||
  passes to identify input and output ports of cells. The Verilog backend
 | 
					  passes to identify input and output ports of cells. The Verilog backend
 | 
				
			||||||
  also does not output blackbox modules on default.
 | 
					  also does not output blackbox modules on default.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- The ``whitebox`` attribute on modules triggers the same behavior as
 | 
				
			||||||
 | 
					  ``blackbox``, but is for whitebox modules, i.e. library modules that
 | 
				
			||||||
 | 
					  contain a behavioral model of the cell type.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- The ``dynports`` attribute is used by the Verilog front-end to mark modules
 | 
					- The ``dynports`` attribute is used by the Verilog front-end to mark modules
 | 
				
			||||||
  that have ports with a width that depends on a parameter.
 | 
					  that have ports with a width that depends on a parameter.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -140,7 +140,7 @@ struct BlifDumper
 | 
				
			||||||
			return "subckt";
 | 
								return "subckt";
 | 
				
			||||||
		if (!design->modules_.count(RTLIL::escape_id(cell_type)))
 | 
							if (!design->modules_.count(RTLIL::escape_id(cell_type)))
 | 
				
			||||||
			return "gate";
 | 
								return "gate";
 | 
				
			||||||
		if (design->modules_.at(RTLIL::escape_id(cell_type))->get_bool_attribute("\\blackbox"))
 | 
							if (design->modules_.at(RTLIL::escape_id(cell_type))->get_blackbox_attribute())
 | 
				
			||||||
			return "gate";
 | 
								return "gate";
 | 
				
			||||||
		return "subckt";
 | 
							return "subckt";
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -196,7 +196,7 @@ struct BlifDumper
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		f << stringf("\n");
 | 
							f << stringf("\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (module->get_bool_attribute("\\blackbox")) {
 | 
							if (module->get_blackbox_attribute()) {
 | 
				
			||||||
			f << stringf(".blackbox\n");
 | 
								f << stringf(".blackbox\n");
 | 
				
			||||||
			f << stringf(".end\n");
 | 
								f << stringf(".end\n");
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
| 
						 | 
					@ -640,7 +640,7 @@ struct BlifBackend : public Backend {
 | 
				
			||||||
		for (auto module_it : design->modules_)
 | 
							for (auto module_it : design->modules_)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			RTLIL::Module *module = module_it.second;
 | 
								RTLIL::Module *module = module_it.second;
 | 
				
			||||||
			if (module->get_bool_attribute("\\blackbox") && !config.blackbox_mode)
 | 
								if (module->get_blackbox_attribute() && !config.blackbox_mode)
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (module->processes.size() != 0)
 | 
								if (module->processes.size() != 0)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -178,7 +178,7 @@ struct EdifBackend : public Backend {
 | 
				
			||||||
		for (auto module_it : design->modules_)
 | 
							for (auto module_it : design->modules_)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			RTLIL::Module *module = module_it.second;
 | 
								RTLIL::Module *module = module_it.second;
 | 
				
			||||||
			if (module->get_bool_attribute("\\blackbox"))
 | 
								if (module->get_blackbox_attribute())
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (top_module_name.empty())
 | 
								if (top_module_name.empty())
 | 
				
			||||||
| 
						 | 
					@ -192,7 +192,7 @@ struct EdifBackend : public Backend {
 | 
				
			||||||
			for (auto cell_it : module->cells_)
 | 
								for (auto cell_it : module->cells_)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				RTLIL::Cell *cell = cell_it.second;
 | 
									RTLIL::Cell *cell = cell_it.second;
 | 
				
			||||||
				if (!design->modules_.count(cell->type) || design->modules_.at(cell->type)->get_bool_attribute("\\blackbox")) {
 | 
									if (!design->modules_.count(cell->type) || design->modules_.at(cell->type)->get_blackbox_attribute()) {
 | 
				
			||||||
					lib_cell_ports[cell->type];
 | 
										lib_cell_ports[cell->type];
 | 
				
			||||||
					for (auto p : cell->connections())
 | 
										for (auto p : cell->connections())
 | 
				
			||||||
						lib_cell_ports[cell->type][p.first] = GetSize(p.second);
 | 
											lib_cell_ports[cell->type][p.first] = GetSize(p.second);
 | 
				
			||||||
| 
						 | 
					@ -302,7 +302,7 @@ struct EdifBackend : public Backend {
 | 
				
			||||||
		*f << stringf("    (technology (numberDefinition))\n");
 | 
							*f << stringf("    (technology (numberDefinition))\n");
 | 
				
			||||||
		for (auto module : sorted_modules)
 | 
							for (auto module : sorted_modules)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if (module->get_bool_attribute("\\blackbox"))
 | 
								if (module->get_blackbox_attribute())
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			SigMap sigmap(module);
 | 
								SigMap sigmap(module);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -127,7 +127,7 @@ struct IntersynthBackend : public Backend {
 | 
				
			||||||
			RTLIL::Module *module = module_it.second;
 | 
								RTLIL::Module *module = module_it.second;
 | 
				
			||||||
			SigMap sigmap(module);
 | 
								SigMap sigmap(module);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (module->get_bool_attribute("\\blackbox"))
 | 
								if (module->get_blackbox_attribute())
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
			if (module->memories.size() == 0 && module->processes.size() == 0 && module->cells_.size() == 0)
 | 
								if (module->memories.size() == 0 && module->processes.size() == 0 && module->cells_.size() == 0)
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1543,7 +1543,7 @@ struct Smt2Backend : public Backend {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (auto module : sorted_modules)
 | 
							for (auto module : sorted_modules)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if (module->get_bool_attribute("\\blackbox") || module->has_memories_warn() || module->has_processes_warn())
 | 
								if (module->get_blackbox_attribute() || module->has_memories_warn() || module->has_processes_warn())
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			log("Creating SMT-LIBv2 representation of module %s.\n", log_id(module));
 | 
								log("Creating SMT-LIBv2 representation of module %s.\n", log_id(module));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -739,7 +739,7 @@ struct SmvBackend : public Backend {
 | 
				
			||||||
		pool<Module*> modules;
 | 
							pool<Module*> modules;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (auto module : design->modules())
 | 
							for (auto module : design->modules())
 | 
				
			||||||
			if (!module->get_bool_attribute("\\blackbox") && !module->has_memories_warn() && !module->has_processes_warn())
 | 
								if (!module->get_blackbox_attribute() && !module->has_memories_warn() && !module->has_processes_warn())
 | 
				
			||||||
				modules.insert(module);
 | 
									modules.insert(module);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (template_f.is_open())
 | 
							if (template_f.is_open())
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -212,7 +212,7 @@ struct SpiceBackend : public Backend {
 | 
				
			||||||
		for (auto module_it : design->modules_)
 | 
							for (auto module_it : design->modules_)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			RTLIL::Module *module = module_it.second;
 | 
								RTLIL::Module *module = module_it.second;
 | 
				
			||||||
			if (module->get_bool_attribute("\\blackbox"))
 | 
								if (module->get_blackbox_attribute())
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (module->processes.size() != 0)
 | 
								if (module->processes.size() != 0)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -67,7 +67,7 @@ struct TableBackend : public Backend {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (auto module : design->modules())
 | 
							for (auto module : design->modules())
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if (module->get_bool_attribute("\\blackbox"))
 | 
								if (module->get_blackbox_attribute())
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			SigMap sigmap(module);
 | 
								SigMap sigmap(module);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1770,7 +1770,7 @@ struct VerilogBackend : public Backend {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		*f << stringf("/* Generated by %s */\n", yosys_version_str);
 | 
							*f << stringf("/* Generated by %s */\n", yosys_version_str);
 | 
				
			||||||
		for (auto it = design->modules_.begin(); it != design->modules_.end(); ++it) {
 | 
							for (auto it = design->modules_.begin(); it != design->modules_.end(); ++it) {
 | 
				
			||||||
			if (it->second->get_bool_attribute("\\blackbox") != blackboxes)
 | 
								if (it->second->get_blackbox_attribute() != blackboxes)
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
			if (selected && !design->selected_whole_module(it->first)) {
 | 
								if (selected && !design->selected_whole_module(it->first)) {
 | 
				
			||||||
				if (design->selected_module(it->first))
 | 
									if (design->selected_module(it->first))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,7 +46,7 @@ namespace AST {
 | 
				
			||||||
// instantiate global variables (private API)
 | 
					// instantiate global variables (private API)
 | 
				
			||||||
namespace AST_INTERNAL {
 | 
					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_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_lib, flag_noopt, flag_icells, flag_autowire;
 | 
						bool flag_nomem2reg, flag_mem2reg, flag_lib, flag_wb, flag_noopt, flag_icells, flag_autowire;
 | 
				
			||||||
	AstNode *current_ast, *current_ast_mod;
 | 
						AstNode *current_ast, *current_ast_mod;
 | 
				
			||||||
	std::map<std::string, AstNode*> current_scope;
 | 
						std::map<std::string, AstNode*> current_scope;
 | 
				
			||||||
	const dict<RTLIL::SigBit, RTLIL::SigBit> *genRTLIL_subst_ptr = NULL;
 | 
						const dict<RTLIL::SigBit, RTLIL::SigBit> *genRTLIL_subst_ptr = NULL;
 | 
				
			||||||
| 
						 | 
					@ -956,7 +956,18 @@ static AstModule* process_module(AstNode *ast, bool defer, AstNode *original_ast
 | 
				
			||||||
			log("--- END OF AST DUMP ---\n");
 | 
								log("--- END OF AST DUMP ---\n");
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (flag_wb) {
 | 
				
			||||||
 | 
								if (!ast->attributes.count("\\whitebox"))
 | 
				
			||||||
 | 
									goto blackbox_module;
 | 
				
			||||||
 | 
								AstNode *n = ast->attributes.at("\\whitebox");
 | 
				
			||||||
 | 
								if (n->type != AST_CONSTANT)
 | 
				
			||||||
 | 
									log_file_error(ast->filename, ast->linenum, "Whitebox attribute with non-constant value!\n");
 | 
				
			||||||
 | 
								if (!n->asBool())
 | 
				
			||||||
 | 
									goto blackbox_module;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (flag_lib) {
 | 
							if (flag_lib) {
 | 
				
			||||||
 | 
						blackbox_module:
 | 
				
			||||||
			std::vector<AstNode*> new_children;
 | 
								std::vector<AstNode*> new_children;
 | 
				
			||||||
			for (auto child : ast->children) {
 | 
								for (auto child : ast->children) {
 | 
				
			||||||
				if (child->type == AST_WIRE && (child->is_input || child->is_output)) {
 | 
									if (child->type == AST_WIRE && (child->is_input || child->is_output)) {
 | 
				
			||||||
| 
						 | 
					@ -970,6 +981,10 @@ static AstModule* process_module(AstNode *ast, bool defer, AstNode *original_ast
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			ast->children.swap(new_children);
 | 
								ast->children.swap(new_children);
 | 
				
			||||||
 | 
								if (ast->attributes.count("\\whitebox")) {
 | 
				
			||||||
 | 
									delete ast->attributes.at("\\whitebox");
 | 
				
			||||||
 | 
									ast->attributes.erase("\\whitebox");
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			ast->attributes["\\blackbox"] = AstNode::mkconst_int(1, false);
 | 
								ast->attributes["\\blackbox"] = AstNode::mkconst_int(1, false);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1010,6 +1025,7 @@ static AstModule* process_module(AstNode *ast, bool defer, AstNode *original_ast
 | 
				
			||||||
	current_module->nomem2reg = flag_nomem2reg;
 | 
						current_module->nomem2reg = flag_nomem2reg;
 | 
				
			||||||
	current_module->mem2reg = flag_mem2reg;
 | 
						current_module->mem2reg = flag_mem2reg;
 | 
				
			||||||
	current_module->lib = flag_lib;
 | 
						current_module->lib = flag_lib;
 | 
				
			||||||
 | 
						current_module->wb = flag_wb;
 | 
				
			||||||
	current_module->noopt = flag_noopt;
 | 
						current_module->noopt = flag_noopt;
 | 
				
			||||||
	current_module->icells = flag_icells;
 | 
						current_module->icells = flag_icells;
 | 
				
			||||||
	current_module->autowire = flag_autowire;
 | 
						current_module->autowire = flag_autowire;
 | 
				
			||||||
| 
						 | 
					@ -1026,7 +1042,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'
 | 
					// 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,
 | 
					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 lib, bool noopt, bool icells, bool nooverwrite, bool overwrite, bool defer, bool autowire)
 | 
							bool nolatches, bool nomeminit, bool nomem2reg, bool mem2reg, bool lib, bool wb, bool noopt, bool icells, bool nooverwrite, bool overwrite, bool defer, bool autowire)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	current_ast = ast;
 | 
						current_ast = ast;
 | 
				
			||||||
	flag_dump_ast1 = dump_ast1;
 | 
						flag_dump_ast1 = dump_ast1;
 | 
				
			||||||
| 
						 | 
					@ -1040,6 +1056,7 @@ void AST::process(RTLIL::Design *design, AstNode *ast, bool dump_ast1, bool dump
 | 
				
			||||||
	flag_nomem2reg = nomem2reg;
 | 
						flag_nomem2reg = nomem2reg;
 | 
				
			||||||
	flag_mem2reg = mem2reg;
 | 
						flag_mem2reg = mem2reg;
 | 
				
			||||||
	flag_lib = lib;
 | 
						flag_lib = lib;
 | 
				
			||||||
 | 
						flag_wb = wb;
 | 
				
			||||||
	flag_noopt = noopt;
 | 
						flag_noopt = noopt;
 | 
				
			||||||
	flag_icells = icells;
 | 
						flag_icells = icells;
 | 
				
			||||||
	flag_autowire = autowire;
 | 
						flag_autowire = autowire;
 | 
				
			||||||
| 
						 | 
					@ -1374,6 +1391,7 @@ std::string AstModule::derive_common(RTLIL::Design *design, dict<RTLIL::IdString
 | 
				
			||||||
	flag_nomem2reg = nomem2reg;
 | 
						flag_nomem2reg = nomem2reg;
 | 
				
			||||||
	flag_mem2reg = mem2reg;
 | 
						flag_mem2reg = mem2reg;
 | 
				
			||||||
	flag_lib = lib;
 | 
						flag_lib = lib;
 | 
				
			||||||
 | 
						flag_wb = wb;
 | 
				
			||||||
	flag_noopt = noopt;
 | 
						flag_noopt = noopt;
 | 
				
			||||||
	flag_icells = icells;
 | 
						flag_icells = icells;
 | 
				
			||||||
	flag_autowire = autowire;
 | 
						flag_autowire = autowire;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -283,13 +283,13 @@ namespace AST
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// process an AST tree (ast must point to an AST_DESIGN node) and generate RTLIL code
 | 
						// 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,
 | 
						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 lib, bool noopt, bool icells, bool nooverwrite, bool overwrite, bool defer, bool autowire);
 | 
								bool nomem2reg, bool mem2reg, bool lib, bool wb, bool noopt, bool icells, bool nooverwrite, bool overwrite, bool defer, bool autowire);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// parametric modules are supported directly by the AST library
 | 
						// parametric modules are supported directly by the AST library
 | 
				
			||||||
	// therefore we need our own derivate of RTLIL::Module with overloaded virtual functions
 | 
						// therefore we need our own derivate of RTLIL::Module with overloaded virtual functions
 | 
				
			||||||
	struct AstModule : RTLIL::Module {
 | 
						struct AstModule : RTLIL::Module {
 | 
				
			||||||
		AstNode *ast;
 | 
							AstNode *ast;
 | 
				
			||||||
		bool nolatches, nomeminit, nomem2reg, mem2reg, lib, noopt, icells, autowire;
 | 
							bool nolatches, nomeminit, nomem2reg, mem2reg, lib, wb, noopt, icells, autowire;
 | 
				
			||||||
		~AstModule() YS_OVERRIDE;
 | 
							~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, 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;
 | 
							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;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -148,6 +148,10 @@ struct VerilogFrontend : public Frontend {
 | 
				
			||||||
		log("    -lib\n");
 | 
							log("    -lib\n");
 | 
				
			||||||
		log("        only create empty blackbox modules. This implies -DBLACKBOX.\n");
 | 
							log("        only create empty blackbox modules. This implies -DBLACKBOX.\n");
 | 
				
			||||||
		log("\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("\n");
 | 
				
			||||||
		log("    -noopt\n");
 | 
							log("    -noopt\n");
 | 
				
			||||||
		log("        don't perform basic optimizations (such as const folding) in the\n");
 | 
							log("        don't perform basic optimizations (such as const folding) in the\n");
 | 
				
			||||||
		log("        high-level front-end.\n");
 | 
							log("        high-level front-end.\n");
 | 
				
			||||||
| 
						 | 
					@ -228,6 +232,7 @@ struct VerilogFrontend : public Frontend {
 | 
				
			||||||
		norestrict_mode = false;
 | 
							norestrict_mode = false;
 | 
				
			||||||
		assume_asserts_mode = false;
 | 
							assume_asserts_mode = false;
 | 
				
			||||||
		lib_mode = false;
 | 
							lib_mode = false;
 | 
				
			||||||
 | 
							wb_mode = false;
 | 
				
			||||||
		default_nettype_wire = true;
 | 
							default_nettype_wire = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		log_header(design, "Executing Verilog-2005 frontend.\n");
 | 
							log_header(design, "Executing Verilog-2005 frontend.\n");
 | 
				
			||||||
| 
						 | 
					@ -329,11 +334,16 @@ struct VerilogFrontend : public Frontend {
 | 
				
			||||||
				flag_nodpi = true;
 | 
									flag_nodpi = true;
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if (arg == "-lib") {
 | 
								if (arg == "-lib" && !wb_mode) {
 | 
				
			||||||
				lib_mode = true;
 | 
									lib_mode = true;
 | 
				
			||||||
				defines_map["BLACKBOX"] = string();
 | 
									defines_map["BLACKBOX"] = string();
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								if (arg == "-wb" && !lib_mode) {
 | 
				
			||||||
 | 
									wb_mode = true;
 | 
				
			||||||
 | 
									defines_map["BLACKBOX"] = string();
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			if (arg == "-noopt") {
 | 
								if (arg == "-noopt") {
 | 
				
			||||||
				flag_noopt = true;
 | 
									flag_noopt = true;
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
| 
						 | 
					@ -429,7 +439,7 @@ struct VerilogFrontend : public Frontend {
 | 
				
			||||||
		if (flag_nodpi)
 | 
							if (flag_nodpi)
 | 
				
			||||||
			error_on_dpi_function(current_ast);
 | 
								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, 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, lib_mode, wb_mode, flag_noopt, flag_icells, flag_nooverwrite, flag_overwrite, flag_defer, default_nettype_wire);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!flag_nopp)
 | 
							if (!flag_nopp)
 | 
				
			||||||
			delete lexin;
 | 
								delete lexin;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -72,6 +72,9 @@ namespace VERILOG_FRONTEND
 | 
				
			||||||
	// running in -lib mode
 | 
						// running in -lib mode
 | 
				
			||||||
	extern bool lib_mode;
 | 
						extern bool lib_mode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// running in -wb mode
 | 
				
			||||||
 | 
						extern bool wb_mode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// lexer input stream
 | 
						// lexer input stream
 | 
				
			||||||
	extern std::istream *lexin;
 | 
						extern std::istream *lexin;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -59,7 +59,7 @@ namespace VERILOG_FRONTEND {
 | 
				
			||||||
	std::vector<char> case_type_stack;
 | 
						std::vector<char> case_type_stack;
 | 
				
			||||||
	bool do_not_require_port_stubs;
 | 
						bool do_not_require_port_stubs;
 | 
				
			||||||
	bool default_nettype_wire;
 | 
						bool default_nettype_wire;
 | 
				
			||||||
	bool sv_mode, formal_mode, lib_mode;
 | 
						bool sv_mode, formal_mode, lib_mode, wb_mode;
 | 
				
			||||||
	bool noassert_mode, noassume_mode, norestrict_mode;
 | 
						bool noassert_mode, noassume_mode, norestrict_mode;
 | 
				
			||||||
	bool assume_asserts_mode, assert_assumes_mode;
 | 
						bool assume_asserts_mode, assert_assumes_mode;
 | 
				
			||||||
	bool current_wire_rand, current_wire_const;
 | 
						bool current_wire_rand, current_wire_const;
 | 
				
			||||||
| 
						 | 
					@ -1906,7 +1906,7 @@ basic_expr:
 | 
				
			||||||
		if ($4->substr(0, 1) != "'")
 | 
							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());
 | 
								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 *bits = $2;
 | 
				
			||||||
		AstNode *val = const2ast(*$4, case_type_stack.size() == 0 ? 0 : case_type_stack.back(), !lib_mode);
 | 
							AstNode *val = const2ast(*$4, case_type_stack.size() == 0 ? 0 : case_type_stack.back(), !lib_mode && !wb_mode);
 | 
				
			||||||
		if (val == NULL)
 | 
							if (val == NULL)
 | 
				
			||||||
			log_error("Value conversion failed: `%s'\n", $4->c_str());
 | 
								log_error("Value conversion failed: `%s'\n", $4->c_str());
 | 
				
			||||||
		$$ = new AstNode(AST_TO_BITS, bits, val);
 | 
							$$ = 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());
 | 
								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);
 | 
							AstNode *bits = new AstNode(AST_IDENTIFIER);
 | 
				
			||||||
		bits->str = *$1;
 | 
							bits->str = *$1;
 | 
				
			||||||
		AstNode *val = const2ast(*$2, case_type_stack.size() == 0 ? 0 : case_type_stack.back(), !lib_mode);
 | 
							AstNode *val = const2ast(*$2, case_type_stack.size() == 0 ? 0 : case_type_stack.back(), !lib_mode && !wb_mode);
 | 
				
			||||||
		if (val == NULL)
 | 
							if (val == NULL)
 | 
				
			||||||
			log_error("Value conversion failed: `%s'\n", $2->c_str());
 | 
								log_error("Value conversion failed: `%s'\n", $2->c_str());
 | 
				
			||||||
		$$ = new AstNode(AST_TO_BITS, bits, val);
 | 
							$$ = new AstNode(AST_TO_BITS, bits, val);
 | 
				
			||||||
| 
						 | 
					@ -1925,14 +1925,14 @@ basic_expr:
 | 
				
			||||||
		delete $2;
 | 
							delete $2;
 | 
				
			||||||
	} |
 | 
						} |
 | 
				
			||||||
	TOK_CONSTVAL TOK_CONSTVAL {
 | 
						TOK_CONSTVAL TOK_CONSTVAL {
 | 
				
			||||||
		$$ = const2ast(*$1 + *$2, case_type_stack.size() == 0 ? 0 : case_type_stack.back(), !lib_mode);
 | 
							$$ = const2ast(*$1 + *$2, case_type_stack.size() == 0 ? 0 : case_type_stack.back(), !lib_mode && !wb_mode);
 | 
				
			||||||
		if ($$ == NULL || (*$2)[0] != '\'')
 | 
							if ($$ == NULL || (*$2)[0] != '\'')
 | 
				
			||||||
			log_error("Value conversion failed: `%s%s'\n", $1->c_str(), $2->c_str());
 | 
								log_error("Value conversion failed: `%s%s'\n", $1->c_str(), $2->c_str());
 | 
				
			||||||
		delete $1;
 | 
							delete $1;
 | 
				
			||||||
		delete $2;
 | 
							delete $2;
 | 
				
			||||||
	} |
 | 
						} |
 | 
				
			||||||
	TOK_CONSTVAL {
 | 
						TOK_CONSTVAL {
 | 
				
			||||||
		$$ = const2ast(*$1, case_type_stack.size() == 0 ? 0 : case_type_stack.back(), !lib_mode);
 | 
							$$ = const2ast(*$1, case_type_stack.size() == 0 ? 0 : case_type_stack.back(), !lib_mode && !wb_mode);
 | 
				
			||||||
		if ($$ == NULL)
 | 
							if ($$ == NULL)
 | 
				
			||||||
			log_error("Value conversion failed: `%s'\n", $1->c_str());
 | 
								log_error("Value conversion failed: `%s'\n", $1->c_str());
 | 
				
			||||||
		delete $1;
 | 
							delete $1;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -589,7 +589,7 @@ std::vector<RTLIL::Module*> RTLIL::Design::selected_modules() const
 | 
				
			||||||
	std::vector<RTLIL::Module*> result;
 | 
						std::vector<RTLIL::Module*> result;
 | 
				
			||||||
	result.reserve(modules_.size());
 | 
						result.reserve(modules_.size());
 | 
				
			||||||
	for (auto &it : modules_)
 | 
						for (auto &it : modules_)
 | 
				
			||||||
		if (selected_module(it.first) && !it.second->get_bool_attribute("\\blackbox"))
 | 
							if (selected_module(it.first) && !it.second->get_blackbox_attribute())
 | 
				
			||||||
			result.push_back(it.second);
 | 
								result.push_back(it.second);
 | 
				
			||||||
	return result;
 | 
						return result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -599,7 +599,7 @@ std::vector<RTLIL::Module*> RTLIL::Design::selected_whole_modules() const
 | 
				
			||||||
	std::vector<RTLIL::Module*> result;
 | 
						std::vector<RTLIL::Module*> result;
 | 
				
			||||||
	result.reserve(modules_.size());
 | 
						result.reserve(modules_.size());
 | 
				
			||||||
	for (auto &it : modules_)
 | 
						for (auto &it : modules_)
 | 
				
			||||||
		if (selected_whole_module(it.first) && !it.second->get_bool_attribute("\\blackbox"))
 | 
							if (selected_whole_module(it.first) && !it.second->get_blackbox_attribute())
 | 
				
			||||||
			result.push_back(it.second);
 | 
								result.push_back(it.second);
 | 
				
			||||||
	return result;
 | 
						return result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -609,7 +609,7 @@ std::vector<RTLIL::Module*> RTLIL::Design::selected_whole_modules_warn() const
 | 
				
			||||||
	std::vector<RTLIL::Module*> result;
 | 
						std::vector<RTLIL::Module*> result;
 | 
				
			||||||
	result.reserve(modules_.size());
 | 
						result.reserve(modules_.size());
 | 
				
			||||||
	for (auto &it : modules_)
 | 
						for (auto &it : modules_)
 | 
				
			||||||
		if (it.second->get_bool_attribute("\\blackbox"))
 | 
							if (it.second->get_blackbox_attribute())
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		else if (selected_whole_module(it.first))
 | 
							else if (selected_whole_module(it.first))
 | 
				
			||||||
			result.push_back(it.second);
 | 
								result.push_back(it.second);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -575,6 +575,10 @@ struct RTLIL::AttrObject
 | 
				
			||||||
	void set_bool_attribute(RTLIL::IdString id);
 | 
						void set_bool_attribute(RTLIL::IdString id);
 | 
				
			||||||
	bool get_bool_attribute(RTLIL::IdString id) const;
 | 
						bool get_bool_attribute(RTLIL::IdString id) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool get_blackbox_attribute() const {
 | 
				
			||||||
 | 
							return get_bool_attribute("\\blackbox") || get_bool_attribute("\\whitebox");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void set_strpool_attribute(RTLIL::IdString id, const pool<string> &data);
 | 
						void set_strpool_attribute(RTLIL::IdString id, const pool<string> &data);
 | 
				
			||||||
	void add_strpool_attribute(RTLIL::IdString id, const pool<string> &data);
 | 
						void add_strpool_attribute(RTLIL::IdString id, const pool<string> &data);
 | 
				
			||||||
	pool<string> get_strpool_attribute(RTLIL::IdString id) const;
 | 
						pool<string> get_strpool_attribute(RTLIL::IdString id) const;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -71,7 +71,7 @@ static void add_wire(RTLIL::Design *design, RTLIL::Module *module, std::string n
 | 
				
			||||||
		RTLIL::Module *mod = design->modules_.at(it.second->type);
 | 
							RTLIL::Module *mod = design->modules_.at(it.second->type);
 | 
				
			||||||
		if (!design->selected_whole_module(mod->name))
 | 
							if (!design->selected_whole_module(mod->name))
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		if (mod->get_bool_attribute("\\blackbox"))
 | 
							if (mod->get_blackbox_attribute())
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		if (it.second->hasPort(name))
 | 
							if (it.second->hasPort(name))
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -128,7 +128,7 @@ struct BugpointPass : public Pass {
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			for (auto &it : design_copy->modules_)
 | 
								for (auto &it : design_copy->modules_)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				if (it.second->get_bool_attribute("\\blackbox"))
 | 
									if (it.second->get_blackbox_attribute())
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (index++ == seed)
 | 
									if (index++ == seed)
 | 
				
			||||||
| 
						 | 
					@ -143,7 +143,7 @@ struct BugpointPass : public Pass {
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			for (auto mod : design_copy->modules())
 | 
								for (auto mod : design_copy->modules())
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				if (mod->get_bool_attribute("\\blackbox"))
 | 
									if (mod->get_blackbox_attribute())
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				for (auto wire : mod->wires())
 | 
									for (auto wire : mod->wires())
 | 
				
			||||||
| 
						 | 
					@ -168,7 +168,7 @@ struct BugpointPass : public Pass {
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			for (auto mod : design_copy->modules())
 | 
								for (auto mod : design_copy->modules())
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				if (mod->get_bool_attribute("\\blackbox"))
 | 
									if (mod->get_blackbox_attribute())
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				for (auto &it : mod->cells_)
 | 
									for (auto &it : mod->cells_)
 | 
				
			||||||
| 
						 | 
					@ -186,7 +186,7 @@ struct BugpointPass : public Pass {
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			for (auto mod : design_copy->modules())
 | 
								for (auto mod : design_copy->modules())
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				if (mod->get_bool_attribute("\\blackbox"))
 | 
									if (mod->get_blackbox_attribute())
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				for (auto cell : mod->cells())
 | 
									for (auto cell : mod->cells())
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -555,7 +555,7 @@ struct ShowWorker
 | 
				
			||||||
			if (!design->selected_module(module->name))
 | 
								if (!design->selected_module(module->name))
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
			if (design->selected_whole_module(module->name)) {
 | 
								if (design->selected_whole_module(module->name)) {
 | 
				
			||||||
				if (module->get_bool_attribute("\\blackbox")) {
 | 
									if (module->get_blackbox_attribute()) {
 | 
				
			||||||
					// log("Skipping blackbox module %s.\n", id2cstr(module->name));
 | 
										// log("Skipping blackbox module %s.\n", id2cstr(module->name));
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
				} else
 | 
									} else
 | 
				
			||||||
| 
						 | 
					@ -771,7 +771,7 @@ struct ShowPass : public Pass {
 | 
				
			||||||
		if (format != "ps" && format != "dot") {
 | 
							if (format != "ps" && format != "dot") {
 | 
				
			||||||
			int modcount = 0;
 | 
								int modcount = 0;
 | 
				
			||||||
			for (auto &mod_it : design->modules_) {
 | 
								for (auto &mod_it : design->modules_) {
 | 
				
			||||||
				if (mod_it.second->get_bool_attribute("\\blackbox"))
 | 
									if (mod_it.second->get_blackbox_attribute())
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
				if (mod_it.second->cells_.empty() && mod_it.second->connections().empty())
 | 
									if (mod_it.second->cells_.empty() && mod_it.second->connections().empty())
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -346,9 +346,9 @@ bool expand_module(RTLIL::Design *design, RTLIL::Module *module, bool flag_check
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		RTLIL::Module *mod = design->modules_[cell->type];
 | 
							RTLIL::Module *mod = design->modules_[cell->type];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (design->modules_.at(cell->type)->get_bool_attribute("\\blackbox")) {
 | 
							if (design->modules_.at(cell->type)->get_blackbox_attribute()) {
 | 
				
			||||||
			if (flag_simcheck)
 | 
								if (flag_simcheck)
 | 
				
			||||||
				log_error("Module `%s' referenced in module `%s' in cell `%s' is a blackbox module.\n",
 | 
									log_error("Module `%s' referenced in module `%s' in cell `%s' is a blackbox/whitebox module.\n",
 | 
				
			||||||
						cell->type.c_str(), module->name.c_str(), cell->name.c_str());
 | 
											cell->type.c_str(), module->name.c_str(), cell->name.c_str());
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -451,7 +451,7 @@ void hierarchy_worker(RTLIL::Design *design, std::set<RTLIL::Module*, IdString::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (indent == 0)
 | 
						if (indent == 0)
 | 
				
			||||||
		log("Top module:  %s\n", mod->name.c_str());
 | 
							log("Top module:  %s\n", mod->name.c_str());
 | 
				
			||||||
	else if (!mod->get_bool_attribute("\\blackbox"))
 | 
						else if (!mod->get_blackbox_attribute())
 | 
				
			||||||
		log("Used module: %*s%s\n", indent, "", mod->name.c_str());
 | 
							log("Used module: %*s%s\n", indent, "", mod->name.c_str());
 | 
				
			||||||
	used.insert(mod);
 | 
						used.insert(mod);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -491,7 +491,7 @@ void hierarchy_clean(RTLIL::Design *design, RTLIL::Module *top, bool purge_lib)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int del_counter = 0;
 | 
						int del_counter = 0;
 | 
				
			||||||
	for (auto mod : del_modules) {
 | 
						for (auto mod : del_modules) {
 | 
				
			||||||
		if (!purge_lib && mod->get_bool_attribute("\\blackbox"))
 | 
							if (!purge_lib && mod->get_blackbox_attribute())
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		log("Removing unused module `%s'.\n", mod->name.c_str());
 | 
							log("Removing unused module `%s'.\n", mod->name.c_str());
 | 
				
			||||||
		design->modules_.erase(mod->name);
 | 
							design->modules_.erase(mod->name);
 | 
				
			||||||
| 
						 | 
					@ -910,7 +910,7 @@ struct HierarchyPass : public Pass {
 | 
				
			||||||
			if (m == nullptr)
 | 
								if (m == nullptr)
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (m->get_bool_attribute("\\blackbox") && !cell->parameters.empty() && m->get_bool_attribute("\\dynports")) {
 | 
								if (m->get_blackbox_attribute() && !cell->parameters.empty() && m->get_bool_attribute("\\dynports")) {
 | 
				
			||||||
				IdString new_m_name = m->derive(design, cell->parameters, true);
 | 
									IdString new_m_name = m->derive(design, cell->parameters, true);
 | 
				
			||||||
				if (new_m_name.empty())
 | 
									if (new_m_name.empty())
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -75,7 +75,7 @@ struct UniquifyPass : public Pass {
 | 
				
			||||||
					if (tmod == nullptr)
 | 
										if (tmod == nullptr)
 | 
				
			||||||
						continue;
 | 
											continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					if (tmod->get_bool_attribute("\\blackbox"))
 | 
										if (tmod->get_blackbox_attribute())
 | 
				
			||||||
						continue;
 | 
											continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					if (tmod->get_bool_attribute("\\unique") && newname == tmod->name)
 | 
										if (tmod->get_bool_attribute("\\unique") && newname == tmod->name)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -664,7 +664,7 @@ struct DfflibmapPass : public Pass {
 | 
				
			||||||
		logmap_all();
 | 
							logmap_all();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (auto &it : design->modules_)
 | 
							for (auto &it : design->modules_)
 | 
				
			||||||
			if (design->selected(it.second) && !it.second->get_bool_attribute("\\blackbox"))
 | 
								if (design->selected(it.second) && !it.second->get_blackbox_attribute())
 | 
				
			||||||
				dfflibmap(design, it.second, prepare_mode);
 | 
									dfflibmap(design, it.second, prepare_mode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		cell_mappings.clear();
 | 
							cell_mappings.clear();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -472,7 +472,7 @@ struct TechmapWorker
 | 
				
			||||||
				RTLIL::Module *tpl = map->modules_[tpl_name];
 | 
									RTLIL::Module *tpl = map->modules_[tpl_name];
 | 
				
			||||||
				std::map<RTLIL::IdString, RTLIL::Const> parameters(cell->parameters.begin(), cell->parameters.end());
 | 
									std::map<RTLIL::IdString, RTLIL::Const> parameters(cell->parameters.begin(), cell->parameters.end());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (tpl->get_bool_attribute("\\blackbox"))
 | 
									if (tpl->get_blackbox_attribute())
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (!flatten_mode)
 | 
									if (!flatten_mode)
 | 
				
			||||||
| 
						 | 
					@ -1209,7 +1209,7 @@ struct FlattenPass : public Pass {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			dict<RTLIL::IdString, RTLIL::Module*> new_modules;
 | 
								dict<RTLIL::IdString, RTLIL::Module*> new_modules;
 | 
				
			||||||
			for (auto mod : vector<Module*>(design->modules()))
 | 
								for (auto mod : vector<Module*>(design->modules()))
 | 
				
			||||||
				if (used_modules[mod->name] || mod->get_bool_attribute("\\blackbox")) {
 | 
									if (used_modules[mod->name] || mod->get_blackbox_attribute()) {
 | 
				
			||||||
					new_modules[mod->name] = mod;
 | 
										new_modules[mod->name] = mod;
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					log("Deleting now unused module %s.\n", log_id(mod));
 | 
										log("Deleting now unused module %s.\n", log_id(mod));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue