mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	box_derive: add -apply
This commit is contained in:
		
							parent
							
								
									ba4f9f5f67
								
							
						
					
					
						commit
						b735f2f1d3
					
				
					 2 changed files with 64 additions and 13 deletions
				
			
		|  | @ -51,6 +51,9 @@ struct BoxDerivePass : Pass { | |||
| 		log("        replaces the internal Yosys naming scheme in which the names of derived\n"); | ||||
| 		log("        modules start with '$paramod$')\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -apply\n"); | ||||
| 		log("        use the derived modules\n"); | ||||
| 		log("\n"); | ||||
| 	} | ||||
| 	void execute(std::vector<std::string> args, RTLIL::Design *d) override | ||||
| 	{ | ||||
|  | @ -59,11 +62,14 @@ struct BoxDerivePass : Pass { | |||
| 		size_t argidx; | ||||
| 		IdString naming_attr; | ||||
| 		IdString base_name; | ||||
| 		bool apply_mode = false; | ||||
| 		for (argidx = 1; argidx < args.size(); argidx++) { | ||||
| 			if (args[argidx] == "-naming_attr" && argidx + 1 < args.size()) | ||||
| 				naming_attr = RTLIL::escape_id(args[++argidx]); | ||||
| 			else if (args[argidx] == "-base" && argidx + 1 < args.size()) | ||||
| 				base_name = RTLIL::escape_id(args[++argidx]); | ||||
| 			else if (args[argidx] == "-apply") | ||||
| 				apply_mode = true; | ||||
| 			else | ||||
| 				break; | ||||
| 		} | ||||
|  | @ -90,24 +96,29 @@ struct BoxDerivePass : Pass { | |||
| 
 | ||||
| 				auto index = std::make_pair(base->name, cell->parameters); | ||||
| 
 | ||||
| 				if (cell->parameters.empty() || done.count(index)) | ||||
| 				if (cell->parameters.empty()) | ||||
| 					continue; | ||||
| 
 | ||||
| 				IdString derived_type = base->derive(d, cell->parameters); | ||||
| 				Module *derived = d->module(derived_type); | ||||
| 				log_assert(derived && "Failed to derive module\n"); | ||||
| 				log_debug("derived %s\n", derived_type); | ||||
| 				if (!done.count(index)) { | ||||
| 					IdString derived_type = base->derive(d, cell->parameters); | ||||
| 					Module *derived = d->module(derived_type); | ||||
| 					log_assert(derived && "Failed to derive module\n"); | ||||
| 					log("derived %s\n", derived_type); | ||||
| 
 | ||||
| 				if (!naming_attr.empty() && derived->has_attribute(naming_attr)) { | ||||
| 					IdString new_name = RTLIL::escape_id(derived->get_string_attribute(naming_attr)); | ||||
| 					if (!new_name.isPublic()) | ||||
| 						log_error("Derived module %s cannot be renamed to private name %s.\n", | ||||
| 								  log_id(derived), log_id(new_name)); | ||||
| 					derived->attributes.erase(naming_attr); | ||||
| 					d->rename(derived, new_name); | ||||
| 					if (!naming_attr.empty() && derived->has_attribute(naming_attr)) { | ||||
| 						IdString new_name = RTLIL::escape_id(derived->get_string_attribute(naming_attr)); | ||||
| 						if (!new_name.isPublic()) | ||||
| 							log_error("Derived module %s cannot be renamed to private name %s.\n", | ||||
| 									  log_id(derived), log_id(new_name)); | ||||
| 						derived->attributes.erase(naming_attr); | ||||
| 						d->rename(derived, new_name); | ||||
| 					} | ||||
| 
 | ||||
| 					done[index] = derived; | ||||
| 				} | ||||
| 
 | ||||
| 				done[index] = derived; | ||||
| 				if (apply_mode) | ||||
| 					cell->type = done[index]->name; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  |  | |||
|  | @ -34,6 +34,7 @@ module top; | |||
| endmodule | ||||
| EOF | ||||
| 
 | ||||
| design -save before | ||||
| box_derive -naming_attr final_name top | ||||
| 
 | ||||
| select -assert-mod-count 1 =aa1 | ||||
|  | @ -48,6 +49,45 @@ select -assert-mod-count 1 =cc1 | |||
| select -assert-mod-count 0 =cc2 | ||||
| select -assert-mod-count 0 =cc3 | ||||
| 
 | ||||
| # no instances of the new derived modules | ||||
| # you could use wildcards like t:aa* here - if that wasn't just broken | ||||
| select -assert-count 0 t:aa1 t:aa2 t:aa3 | ||||
| select -assert-count 0 t:bb1 t:bb2 t:bb3 | ||||
| select -assert-count 0 t:cc1 t:cc2 t:cc3 | ||||
| 
 | ||||
| design -load before | ||||
| 
 | ||||
| # same command but with -apply | ||||
| box_derive -apply -naming_attr final_name top | ||||
| 
 | ||||
| # same derived modules created as without -apply | ||||
| select -assert-mod-count 1 =aa1 | ||||
| select -assert-mod-count 1 =aa2 | ||||
| select -assert-mod-count 0 =aa3 | ||||
| 
 | ||||
| select -assert-mod-count 1 =bb1 | ||||
| select -assert-mod-count 0 =bb2 | ||||
| select -assert-mod-count 1 =bb3 | ||||
| 
 | ||||
| select -assert-mod-count 1 =cc1 | ||||
| select -assert-mod-count 0 =cc2 | ||||
| select -assert-mod-count 0 =cc3 | ||||
| 
 | ||||
| # but we have instances of the new derived modules | ||||
| select -assert-count 1 t:aa1 | ||||
| select -assert-count 1 t:aa2 | ||||
| select -assert-count 0 t:aa3 | ||||
| 
 | ||||
| select -assert-count 1 t:bb1 | ||||
| select -assert-count 0 t:bb2 | ||||
| select -assert-count 1 t:bb3 | ||||
| 
 | ||||
| select -assert-count 2 t:cc1 | ||||
| select -assert-count 0 t:cc2 | ||||
| select -assert-count 0 t:cc3 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| # we are expecting the original aa, bb, cc modules | ||||
| # and 5 specializations generated by box_derive | ||||
| select -assert-mod-count 8 =A:whitebox | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue