mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 11:42:30 +00:00 
			
		
		
		
	Add "hierarchy -chparam" support for non-verific top modules
Signed-off-by: Clifford Wolf <clifford@clifford.at>
This commit is contained in:
		
							parent
							
								
									eb21bf3651
								
							
						
					
					
						commit
						ec39cfd0ad
					
				
					 1 changed files with 35 additions and 12 deletions
				
			
		|  | @ -592,8 +592,8 @@ struct HierarchyPass : public Pass { | ||||||
| 		log("\n"); | 		log("\n"); | ||||||
| 		log("    -nokeep_asserts\n"); | 		log("    -nokeep_asserts\n"); | ||||||
| 		log("        per default this pass sets the \"keep\" attribute on all modules\n"); | 		log("        per default this pass sets the \"keep\" attribute on all modules\n"); | ||||||
| 		log("        that directly or indirectly contain one or more $assert cells. This\n"); | 		log("        that directly or indirectly contain one or more formal properties.\n"); | ||||||
| 		log("        option disables this behavior.\n"); | 		log("        This option disables this behavior.\n"); | ||||||
| 		log("\n"); | 		log("\n"); | ||||||
| 		log("    -top <module>\n"); | 		log("    -top <module>\n"); | ||||||
| 		log("        use the specified top module to build the design hierarchy. Modules\n"); | 		log("        use the specified top module to build the design hierarchy. Modules\n"); | ||||||
|  | @ -722,14 +722,7 @@ struct HierarchyPass : public Pass { | ||||||
| 			if (args[argidx] == "-top") { | 			if (args[argidx] == "-top") { | ||||||
| 				if (++argidx >= args.size()) | 				if (++argidx >= args.size()) | ||||||
| 					log_cmd_error("Option -top requires an additional argument!\n"); | 					log_cmd_error("Option -top requires an additional argument!\n"); | ||||||
| 				top_mod = design->modules_.count(RTLIL::escape_id(args[argidx])) ? design->modules_.at(RTLIL::escape_id(args[argidx])) : NULL; | 				load_top_mod = args[argidx]; | ||||||
| 				if (top_mod == NULL && design->modules_.count("$abstract" + RTLIL::escape_id(args[argidx]))) { |  | ||||||
| 					dict<RTLIL::IdString, RTLIL::Const> empty_parameters; |  | ||||||
| 					design->modules_.at("$abstract" + RTLIL::escape_id(args[argidx]))->derive(design, empty_parameters); |  | ||||||
| 					top_mod = design->modules_.count(RTLIL::escape_id(args[argidx])) ? design->modules_.at(RTLIL::escape_id(args[argidx])) : NULL; |  | ||||||
| 				} |  | ||||||
| 				if (top_mod == NULL) |  | ||||||
| 					load_top_mod = args[argidx]; |  | ||||||
| 				continue; | 				continue; | ||||||
| 			} | 			} | ||||||
| 			if (args[argidx] == "-auto-top") { | 			if (args[argidx] == "-auto-top") { | ||||||
|  | @ -750,7 +743,37 @@ struct HierarchyPass : public Pass { | ||||||
| 		} | 		} | ||||||
| 		extra_args(args, argidx, design, false); | 		extra_args(args, argidx, design, false); | ||||||
| 
 | 
 | ||||||
| 		if (!load_top_mod.empty()) { | 		if (!load_top_mod.empty()) | ||||||
|  | 		{ | ||||||
|  | 			IdString top_name = RTLIL::escape_id(load_top_mod); | ||||||
|  | 			IdString abstract_id = "$abstract" + RTLIL::escape_id(load_top_mod); | ||||||
|  | 			top_mod = design->module(top_name); | ||||||
|  | 
 | ||||||
|  | 			dict<RTLIL::IdString, RTLIL::Const> top_parameters; | ||||||
|  | 			for (auto ¶ : parameters) { | ||||||
|  | 				SigSpec sig_value; | ||||||
|  | 				if (!RTLIL::SigSpec::parse(sig_value, NULL, para.second)) | ||||||
|  | 					log_cmd_error("Can't decode value '%s'!\n", para.second.c_str()); | ||||||
|  | 				top_parameters[RTLIL::escape_id(para.first)] = sig_value.as_const(); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if (top_mod == nullptr && design->module(abstract_id)) | ||||||
|  | 				top_mod = design->module(design->module(abstract_id)->derive(design, top_parameters)); | ||||||
|  | 			else if (top_mod != nullptr && !top_parameters.empty()) | ||||||
|  | 				top_mod = design->module(top_mod->derive(design, top_parameters)); | ||||||
|  | 
 | ||||||
|  | 			if (top_mod != nullptr && top_mod->name != top_name) { | ||||||
|  | 				Module *m = top_mod->clone(); | ||||||
|  | 				m->name = top_name; | ||||||
|  | 				Module *old_mod = design->module(top_name); | ||||||
|  | 				if (old_mod) | ||||||
|  | 					design->remove(old_mod); | ||||||
|  | 				design->add(m); | ||||||
|  | 				top_mod = m; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (top_mod == nullptr && !load_top_mod.empty()) { | ||||||
| #ifdef YOSYS_ENABLE_VERIFIC | #ifdef YOSYS_ENABLE_VERIFIC | ||||||
| 			if (verific_import_pending) { | 			if (verific_import_pending) { | ||||||
| 				verific_import(design, parameters, load_top_mod); | 				verific_import(design, parameters, load_top_mod); | ||||||
|  | @ -863,7 +886,7 @@ struct HierarchyPass : public Pass { | ||||||
| 			std::map<RTLIL::Module*, bool> cache; | 			std::map<RTLIL::Module*, bool> cache; | ||||||
| 			for (auto mod : design->modules()) | 			for (auto mod : design->modules()) | ||||||
| 				if (set_keep_assert(cache, mod)) { | 				if (set_keep_assert(cache, mod)) { | ||||||
| 					log("Module %s directly or indirectly contains $assert cells -> setting \"keep\" attribute.\n", log_id(mod)); | 					log("Module %s directly or indirectly contains formal properties -> setting \"keep\" attribute.\n", log_id(mod)); | ||||||
| 					mod->set_bool_attribute("\\keep"); | 					mod->set_bool_attribute("\\keep"); | ||||||
| 				} | 				} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue