mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 13:29:12 +00:00 
			
		
		
		
	Merge pull request #949 from YosysHQ/clifford/pmux2shimprove
Add full_pmux feature to pmux2shiftx
This commit is contained in:
		
						commit
						1d538ff1ec
					
				
					 2 changed files with 24 additions and 3 deletions
				
			
		| 
						 | 
					@ -369,6 +369,7 @@ struct Pmux2ShiftxPass : public Pass {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				dict<SigSpec, pool<int>> seldb;
 | 
									dict<SigSpec, pool<int>> seldb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									SigSpec A = cell->getPort("\\A");
 | 
				
			||||||
				SigSpec B = cell->getPort("\\B");
 | 
									SigSpec B = cell->getPort("\\B");
 | 
				
			||||||
				SigSpec S = sigmap(cell->getPort("\\S"));
 | 
									SigSpec S = sigmap(cell->getPort("\\S"));
 | 
				
			||||||
				for (int i = 0; i < GetSize(S); i++)
 | 
									for (int i = 0; i < GetSize(S); i++)
 | 
				
			||||||
| 
						 | 
					@ -419,6 +420,8 @@ struct Pmux2ShiftxPass : public Pass {
 | 
				
			||||||
						choices[val] = i;
 | 
											choices[val] = i;
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										bool full_pmux = GetSize(choices) == GetSize(S);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// TBD: also find choices that are using signals that are subsets of the bits in "sig"
 | 
										// TBD: also find choices that are using signals that are subsets of the bits in "sig"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					if (!verbose)
 | 
										if (!verbose)
 | 
				
			||||||
| 
						 | 
					@ -634,7 +637,21 @@ struct Pmux2ShiftxPass : public Pass {
 | 
				
			||||||
					log("    range density: %d%%\n", range_density);
 | 
										log("    range density: %d%%\n", range_density);
 | 
				
			||||||
					log("    absolute density: %d%%\n", absolute_density);
 | 
										log("    absolute density: %d%%\n", absolute_density);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					bool full_case = (min_choice == 0) && (max_choice == (1 << GetSize(sig))-1) && (max_choice+1 == GetSize(choices));
 | 
										if (full_pmux) {
 | 
				
			||||||
 | 
											int full_density = 100*GetSize(choices) / (1 << GetSize(sig));
 | 
				
			||||||
 | 
											log("    full density: %d%%\n", full_density);
 | 
				
			||||||
 | 
											if (full_density < min_density) {
 | 
				
			||||||
 | 
												full_pmux = false;
 | 
				
			||||||
 | 
											} else {
 | 
				
			||||||
 | 
												min_choice = 0;
 | 
				
			||||||
 | 
												max_choice = (1 << GetSize(sig))-1;
 | 
				
			||||||
 | 
												log("    update to full case.\n");
 | 
				
			||||||
 | 
												log("    new min choice: %d\n", min_choice);
 | 
				
			||||||
 | 
												log("    new max choice: %d\n", max_choice);
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										bool full_case = (min_choice == 0) && (max_choice == (1 << GetSize(sig))-1) && (full_pmux || max_choice+1 == GetSize(choices));
 | 
				
			||||||
					log("    full case: %s\n", full_case ? "true" : "false");
 | 
										log("    full case: %s\n", full_case ? "true" : "false");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// check density percentages
 | 
										// check density percentages
 | 
				
			||||||
| 
						 | 
					@ -677,6 +694,10 @@ struct Pmux2ShiftxPass : public Pass {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// create data signal
 | 
										// create data signal
 | 
				
			||||||
					SigSpec data(State::Sx, (max_choice+1)*extwidth);
 | 
										SigSpec data(State::Sx, (max_choice+1)*extwidth);
 | 
				
			||||||
 | 
										if (full_pmux) {
 | 
				
			||||||
 | 
											for (int i = 0; i <= max_choice; i++)
 | 
				
			||||||
 | 
												data.replace(i*extwidth, A);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
					for (auto &it : perm_choices) {
 | 
										for (auto &it : perm_choices) {
 | 
				
			||||||
						int position = it.first.as_int()*extwidth;
 | 
											int position = it.first.as_int()*extwidth;
 | 
				
			||||||
						int data_index = it.second;
 | 
											int data_index = it.second;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,8 +9,8 @@ opt
 | 
				
			||||||
stat
 | 
					stat
 | 
				
			||||||
# show -width
 | 
					# show -width
 | 
				
			||||||
select -assert-count 1 t:$sub
 | 
					select -assert-count 1 t:$sub
 | 
				
			||||||
select -assert-count 2 t:$mux
 | 
					select -assert-count 1 t:$mux
 | 
				
			||||||
select -assert-count 2 t:$shift
 | 
					select -assert-count 1 t:$shift
 | 
				
			||||||
select -assert-count 3 t:$shiftx
 | 
					select -assert-count 3 t:$shiftx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
design -stash gate
 | 
					design -stash gate
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue