mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 11:42:30 +00:00 
			
		
		
		
	coolrunner2: Generate a feed-through AND term when necessary
This commit is contained in:
		
							parent
							
								
									6775177171
								
							
						
					
					
						commit
						fa04366f38
					
				
					 1 changed files with 30 additions and 12 deletions
				
			
		|  | @ -161,19 +161,16 @@ struct Coolrunner2SopPass : public Pass { | ||||||
| 						// Special P-term handling
 | 						// Special P-term handling
 | ||||||
| 						if (is_special_pterm) | 						if (is_special_pterm) | ||||||
| 						{ | 						{ | ||||||
| 							if (!has_invert) | 							if (!has_invert || special_pterm_can_invert) | ||||||
| 							{ | 							{ | ||||||
| 								// Can connect the P-term directly to the special term sinks
 | 								// Can connect the P-term directly to the special term sinks
 | ||||||
| 								for (auto x : special_pterms_inv[sop_output]) { | 								for (auto x : special_pterms_inv[sop_output]) | ||||||
| 									log("%s %s", std::get<0>(x)->name.c_str(), std::get<1>(x).c_str()); |  | ||||||
| 									std::get<0>(x)->setPort(std::get<1>(x), *intermed_wires.begin()); | 									std::get<0>(x)->setPort(std::get<1>(x), *intermed_wires.begin()); | ||||||
| 								} | 								for (auto x : special_pterms_no_inv[sop_output]) | ||||||
| 								for (auto x : special_pterms_no_inv[sop_output]) { |  | ||||||
| 									log("%s %s", std::get<0>(x)->name.c_str(), std::get<1>(x).c_str()); |  | ||||||
| 									std::get<0>(x)->setPort(std::get<1>(x), *intermed_wires.begin()); | 									std::get<0>(x)->setPort(std::get<1>(x), *intermed_wires.begin()); | ||||||
| 								} |  | ||||||
| 							} | 							} | ||||||
| 							else | 
 | ||||||
|  | 							if (has_invert) | ||||||
| 							{ | 							{ | ||||||
| 								if (special_pterm_can_invert) | 								if (special_pterm_can_invert) | ||||||
| 								{ | 								{ | ||||||
|  | @ -184,10 +181,19 @@ struct Coolrunner2SopPass : public Pass { | ||||||
| 								} | 								} | ||||||
| 								else | 								else | ||||||
| 								{ | 								{ | ||||||
| 									// Need to construct a set of feed-through terms
 | 									// Need to construct a feed-through term
 | ||||||
|  | 									auto feedthrough_out = module->addWire(NEW_ID); | ||||||
|  | 									auto feedthrough_cell = module->addCell(NEW_ID, "\\ANDTERM"); | ||||||
|  | 									feedthrough_cell->setParam("\\TRUE_INP", 1); | ||||||
|  | 									feedthrough_cell->setParam("\\COMP_INP", 0); | ||||||
|  | 									feedthrough_cell->setPort("\\OUT", feedthrough_out); | ||||||
|  | 									feedthrough_cell->setPort("\\IN", sop_output); | ||||||
|  | 									feedthrough_cell->setPort("\\IN_B", SigSpec()); | ||||||
| 
 | 
 | ||||||
| 									// XXX TODO
 | 									for (auto x : special_pterms_inv[sop_output]) | ||||||
| 									log_assert(!"not implemented yet"); | 										std::get<0>(x)->setPort(std::get<1>(x), feedthrough_out); | ||||||
|  | 									for (auto x : special_pterms_no_inv[sop_output]) | ||||||
|  | 										std::get<0>(x)->setPort(std::get<1>(x), feedthrough_out); | ||||||
| 								} | 								} | ||||||
| 							} | 							} | ||||||
| 						} | 						} | ||||||
|  | @ -211,7 +217,19 @@ struct Coolrunner2SopPass : public Pass { | ||||||
| 
 | 
 | ||||||
| 						if (is_special_pterm) | 						if (is_special_pterm) | ||||||
| 						{ | 						{ | ||||||
| 							// Need to construct a set of feed-through terms
 | 							// Need to construct a feed-through term
 | ||||||
|  | 							auto feedthrough_out = module->addWire(NEW_ID); | ||||||
|  | 							auto feedthrough_cell = module->addCell(NEW_ID, "\\ANDTERM"); | ||||||
|  | 							feedthrough_cell->setParam("\\TRUE_INP", 1); | ||||||
|  | 							feedthrough_cell->setParam("\\COMP_INP", 0); | ||||||
|  | 							feedthrough_cell->setPort("\\OUT", feedthrough_out); | ||||||
|  | 							feedthrough_cell->setPort("\\IN", sop_output); | ||||||
|  | 							feedthrough_cell->setPort("\\IN_B", SigSpec()); | ||||||
|  | 
 | ||||||
|  | 							for (auto x : special_pterms_inv[sop_output]) | ||||||
|  | 								std::get<0>(x)->setPort(std::get<1>(x), feedthrough_out); | ||||||
|  | 							for (auto x : special_pterms_no_inv[sop_output]) | ||||||
|  | 								std::get<0>(x)->setPort(std::get<1>(x), feedthrough_out); | ||||||
| 						} | 						} | ||||||
| 					} | 					} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue