mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	Add aliases for common sets of gate types to "abc -g"
This commit is contained in:
		
							parent
							
								
									dca3b3cd5f
								
							
						
					
					
						commit
						fad52abf70
					
				
					 1 changed files with 74 additions and 2 deletions
				
			
		|  | @ -1314,10 +1314,21 @@ struct AbcPass : public Pass { | ||||||
| 		// log("        (ignored when used with -liberty or -lut)\n");
 | 		// log("        (ignored when used with -liberty or -lut)\n");
 | ||||||
| 		// log("\n");
 | 		// log("\n");
 | ||||||
| 		log("    -g type1,type2,...\n"); | 		log("    -g type1,type2,...\n"); | ||||||
| 		log("        Map the the specified list of gate types. Supported gates types are:\n"); | 		log("        Map to the specified list of gate types. Supported gates types are:\n"); | ||||||
| 		log("        AND, NAND, OR, NOR, XOR, XNOR, ANDNOT, ORNOT, MUX, AOI3, OAI3, AOI4, OAI4.\n"); | 		log("        AND, NAND, OR, NOR, XOR, XNOR, ANDNOT, ORNOT, MUX, AOI3, OAI3, AOI4, OAI4.\n"); | ||||||
| 		log("        (The NOT gate is always added to this list automatically.)\n"); | 		log("        (The NOT gate is always added to this list automatically.)\n"); | ||||||
| 		log("\n"); | 		log("\n"); | ||||||
|  | 		log("        The following aliases can be used to reference common sets of gate types:\n"); | ||||||
|  | 		log("          simple: AND OR XOR MUX\n"); | ||||||
|  | 		log("          cmos2: NAND NOR\n"); | ||||||
|  | 		log("          cmos3: NAND NOR AOI3 OAI3\n"); | ||||||
|  | 		log("          cmos: NAND NOR AOI3 OAI3 AOI4 OAI4\n"); | ||||||
|  | 		log("          gates: AND NAND OR NOR XOR XNOR ANDNOT ORNOT\n"); | ||||||
|  | 		log("          aig: AND NAND OR NOR ANDNOT ORNOT\n"); | ||||||
|  | 		log("\n"); | ||||||
|  | 		log("        Prefix a gate type with a '-' to remove it from the list. For example\n"); | ||||||
|  | 		log("        the arguments 'AND,OR,XOR' and 'simple,-MUX' are equivalent.\n"); | ||||||
|  | 		log("\n"); | ||||||
| 		log("    -dff\n"); | 		log("    -dff\n"); | ||||||
| 		log("        also pass $_DFF_?_ and $_DFFE_??_ cells through ABC. modules with many\n"); | 		log("        also pass $_DFF_?_ and $_DFFE_??_ cells through ABC. modules with many\n"); | ||||||
| 		log("        clock domains are automatically partitioned in clock domains and each\n"); | 		log("        clock domains are automatically partitioned in clock domains and each\n"); | ||||||
|  | @ -1480,6 +1491,12 @@ struct AbcPass : public Pass { | ||||||
| 			} | 			} | ||||||
| 			if (arg == "-g" && argidx+1 < args.size()) { | 			if (arg == "-g" && argidx+1 < args.size()) { | ||||||
| 				for (auto g : split_tokens(args[++argidx], ",")) { | 				for (auto g : split_tokens(args[++argidx], ",")) { | ||||||
|  | 					vector<string> gate_list; | ||||||
|  | 					bool remove_gates = false; | ||||||
|  | 					if (GetSize(g) > 0 && g[0] == '-') { | ||||||
|  | 						remove_gates = true; | ||||||
|  | 						g = g.substr(1); | ||||||
|  | 					} | ||||||
| 					if (g == "AND") goto ok_gate; | 					if (g == "AND") goto ok_gate; | ||||||
| 					if (g == "NAND") goto ok_gate; | 					if (g == "NAND") goto ok_gate; | ||||||
| 					if (g == "OR") goto ok_gate; | 					if (g == "OR") goto ok_gate; | ||||||
|  | @ -1493,9 +1510,64 @@ struct AbcPass : public Pass { | ||||||
| 					if (g == "OAI3") goto ok_gate; | 					if (g == "OAI3") goto ok_gate; | ||||||
| 					if (g == "AOI4") goto ok_gate; | 					if (g == "AOI4") goto ok_gate; | ||||||
| 					if (g == "OAI4") goto ok_gate; | 					if (g == "OAI4") goto ok_gate; | ||||||
|  | 					if (g == "simple") { | ||||||
|  | 						gate_list.push_back("AND"); | ||||||
|  | 						gate_list.push_back("OR"); | ||||||
|  | 						gate_list.push_back("XOR"); | ||||||
|  | 						gate_list.push_back("MUX"); | ||||||
|  | 						goto ok_alias; | ||||||
|  | 					} | ||||||
|  | 					if (g == "cmos2") { | ||||||
|  | 						gate_list.push_back("NAND"); | ||||||
|  | 						gate_list.push_back("NOR"); | ||||||
|  | 						goto ok_alias; | ||||||
|  | 					} | ||||||
|  | 					if (g == "cmos3") { | ||||||
|  | 						gate_list.push_back("NAND"); | ||||||
|  | 						gate_list.push_back("NOR"); | ||||||
|  | 						gate_list.push_back("AOI3"); | ||||||
|  | 						gate_list.push_back("OAI3"); | ||||||
|  | 						goto ok_alias; | ||||||
|  | 					} | ||||||
|  | 					if (g == "cmos4") { | ||||||
|  | 						gate_list.push_back("NAND"); | ||||||
|  | 						gate_list.push_back("NOR"); | ||||||
|  | 						gate_list.push_back("AOI3"); | ||||||
|  | 						gate_list.push_back("OAI3"); | ||||||
|  | 						gate_list.push_back("AOI4"); | ||||||
|  | 						gate_list.push_back("OAI4"); | ||||||
|  | 						goto ok_alias; | ||||||
|  | 					} | ||||||
|  | 					if (g == "gates") { | ||||||
|  | 						gate_list.push_back("AND"); | ||||||
|  | 						gate_list.push_back("NAND"); | ||||||
|  | 						gate_list.push_back("OR"); | ||||||
|  | 						gate_list.push_back("NOR"); | ||||||
|  | 						gate_list.push_back("XOR"); | ||||||
|  | 						gate_list.push_back("XNOR"); | ||||||
|  | 						gate_list.push_back("ANDNOT"); | ||||||
|  | 						gate_list.push_back("ORNOT"); | ||||||
|  | 						goto ok_alias; | ||||||
|  | 					} | ||||||
|  | 					if (g == "aig") { | ||||||
|  | 						gate_list.push_back("AND"); | ||||||
|  | 						gate_list.push_back("NAND"); | ||||||
|  | 						gate_list.push_back("OR"); | ||||||
|  | 						gate_list.push_back("NOR"); | ||||||
|  | 						gate_list.push_back("ANDNOT"); | ||||||
|  | 						gate_list.push_back("ORNOT"); | ||||||
|  | 						goto ok_alias; | ||||||
|  | 					} | ||||||
| 					cmd_error(args, argidx, stringf("Unsupported gate type: %s", g.c_str())); | 					cmd_error(args, argidx, stringf("Unsupported gate type: %s", g.c_str())); | ||||||
| 				ok_gate: | 				ok_gate: | ||||||
| 					enabled_gates.insert(g); | 					gate_list.push_back(g); | ||||||
|  | 				ok_alias: | ||||||
|  | 					for (auto gate : gate_list) { | ||||||
|  | 						if (remove_gates) | ||||||
|  | 							enabled_gates.erase(gate); | ||||||
|  | 						else | ||||||
|  | 							enabled_gates.insert(gate); | ||||||
|  | 					} | ||||||
| 				} | 				} | ||||||
| 				continue; | 				continue; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue