mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 13:29:12 +00:00 
			
		
		
		
	Bugfix in splitcells pass
Signed-off-by: Claire Xenia Wolf <claire@clairexen.net>
This commit is contained in:
		
							parent
							
								
									e151e44caa
								
							
						
					
					
						commit
						2895a66784
					
				
					 1 changed files with 13 additions and 5 deletions
				
			
		| 
						 | 
					@ -76,9 +76,14 @@ struct SplitcellsWorker
 | 
				
			||||||
		std::vector<int> slices;
 | 
							std::vector<int> slices;
 | 
				
			||||||
		slices.push_back(0);
 | 
							slices.push_back(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (int i = 1; i < GetSize(outsig); i++) {
 | 
							int width = GetSize(outsig);
 | 
				
			||||||
			auto &last_users = bit_users_db.at(outsig[slices.back()]);
 | 
							width = std::min(width, GetSize(cell->getPort(ID::A)));
 | 
				
			||||||
			auto &this_users = bit_users_db.at(outsig[i]);
 | 
							if (cell->hasPort(ID::B))
 | 
				
			||||||
 | 
								width = std::min(width, GetSize(cell->getPort(ID::B)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for (int i = 1; i < width; i++) {
 | 
				
			||||||
 | 
								auto &last_users = bit_users_db[outsig[slices.back()]];
 | 
				
			||||||
 | 
								auto &this_users = bit_users_db[outsig[i]];
 | 
				
			||||||
			if (last_users != this_users) slices.push_back(i);
 | 
								if (last_users != this_users) slices.push_back(i);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if (GetSize(slices) <= 1) return 0;
 | 
							if (GetSize(slices) <= 1) return 0;
 | 
				
			||||||
| 
						 | 
					@ -98,8 +103,11 @@ struct SplitcellsWorker
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			auto slice_signal = [&](SigSpec old_sig) -> SigSpec {
 | 
								auto slice_signal = [&](SigSpec old_sig) -> SigSpec {
 | 
				
			||||||
				SigSpec new_sig;
 | 
									SigSpec new_sig;
 | 
				
			||||||
				for (int i = 0; i < GetSize(old_sig); i += GetSize(outsig))
 | 
									for (int i = 0; i < GetSize(old_sig); i += GetSize(outsig)) {
 | 
				
			||||||
					new_sig.append(old_sig.extract(i+slice_lsb, slice_msb-slice_lsb+1));
 | 
										int offset = i+slice_lsb;
 | 
				
			||||||
 | 
										int length = std::min(GetSize(old_sig)-offset, slice_msb-slice_lsb+1);
 | 
				
			||||||
 | 
										new_sig.append(old_sig.extract(offset, length));
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
				return new_sig;
 | 
									return new_sig;
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue