mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	Merge pull request #718 from whitequark/gate2lut
gate2lut: new techlib, for converting Yosys gates to FPGA LUTs
This commit is contained in:
		
						commit
						728a251a95
					
				
					 12 changed files with 151 additions and 4 deletions
				
			
		|  | @ -25,5 +25,6 @@ $(eval $(call add_share_file,share,techlibs/common/techmap.v)) | |||
| $(eval $(call add_share_file,share,techlibs/common/pmux2mux.v)) | ||||
| $(eval $(call add_share_file,share,techlibs/common/adff2dff.v)) | ||||
| $(eval $(call add_share_file,share,techlibs/common/dff2ff.v)) | ||||
| $(eval $(call add_share_file,share,techlibs/common/gate2lut.v)) | ||||
| $(eval $(call add_share_file,share,techlibs/common/cells.lib)) | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										87
									
								
								techlibs/common/gate2lut.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								techlibs/common/gate2lut.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,87 @@ | |||
| (* techmap_celltype = "$_NOT_" *) | ||||
| module _90_lut_not (A, Y); | ||||
|     input A; | ||||
|     output Y; | ||||
| 
 | ||||
|     wire [`LUT_WIDTH-1:0] AA; | ||||
|     assign AA = {A}; | ||||
| 
 | ||||
|     \$lut #( | ||||
|         .WIDTH(`LUT_WIDTH), | ||||
|         .LUT(4'b01) | ||||
|     ) lut ( | ||||
|         .A(AA), | ||||
|         .Y(Y) | ||||
|     ); | ||||
| endmodule | ||||
| 
 | ||||
| (* techmap_celltype = "$_OR_" *) | ||||
| module _90_lut_or (A, B, Y); | ||||
|     input A, B; | ||||
|     output Y; | ||||
| 
 | ||||
|     wire [`LUT_WIDTH-1:0] AA; | ||||
|     assign AA = {B, A}; | ||||
| 
 | ||||
|     \$lut #( | ||||
|         .WIDTH(`LUT_WIDTH), | ||||
|         .LUT(4'b1110) | ||||
|     ) lut ( | ||||
|         .A(AA), | ||||
|         .Y(Y) | ||||
|     ); | ||||
| endmodule | ||||
| 
 | ||||
| (* techmap_celltype = "$_AND_" *) | ||||
| module _90_lut_and (A, B, Y); | ||||
|     input A, B; | ||||
|     output Y; | ||||
| 
 | ||||
|     wire [`LUT_WIDTH-1:0] AA; | ||||
|     assign AA = {B, A}; | ||||
| 
 | ||||
|     \$lut #( | ||||
|         .WIDTH(`LUT_WIDTH), | ||||
|         .LUT(4'b1000) | ||||
|     ) lut ( | ||||
|         .A(AA), | ||||
|         .Y(Y) | ||||
|     ); | ||||
| endmodule | ||||
| 
 | ||||
| (* techmap_celltype = "$_XOR_" *) | ||||
| module _90_lut_xor (A, B, Y); | ||||
|     input A, B; | ||||
|     output Y; | ||||
| 
 | ||||
|     wire [`LUT_WIDTH-1:0] AA; | ||||
|     assign AA = {B, A}; | ||||
| 
 | ||||
|     \$lut #( | ||||
|         .WIDTH(`LUT_WIDTH), | ||||
|         .LUT(4'b0110) | ||||
|     ) lut ( | ||||
|         .A(AA), | ||||
|         .Y(Y) | ||||
|     ); | ||||
| endmodule | ||||
| 
 | ||||
| (* techmap_celltype = "$_MUX_" *) | ||||
| module _90_lut_mux (A, B, S, Y); | ||||
|     input A, B, S; | ||||
|     output Y; | ||||
| 
 | ||||
|     wire [`LUT_WIDTH-1:0] AA; | ||||
|     assign AA = {S, B, A}; | ||||
| 
 | ||||
|     \$lut #( | ||||
|         .WIDTH(`LUT_WIDTH), | ||||
|         //     A 1010 1010 | ||||
|         //     B 1100 1100 | ||||
|         //     S 1111 0000 | ||||
|         .LUT(8'b_1100_1010) | ||||
|     ) lut ( | ||||
|         .A(AA), | ||||
|         .Y(Y) | ||||
|     ); | ||||
| endmodule | ||||
|  | @ -465,7 +465,7 @@ endmodule | |||
| //- | ||||
| //-     $_SR_NP_ (S, R, Q) | ||||
| //- | ||||
| //- A set-reset latch with negative polarity SET and positive polarioty RESET. | ||||
| //- A set-reset latch with negative polarity SET and positive polarity RESET. | ||||
| //- | ||||
| //- Truth table:    S R | Q | ||||
| //-                -----+--- | ||||
|  | @ -489,7 +489,7 @@ endmodule | |||
| //- | ||||
| //-     $_SR_PN_ (S, R, Q) | ||||
| //- | ||||
| //- A set-reset latch with positive polarity SET and negative polarioty RESET. | ||||
| //- A set-reset latch with positive polarity SET and negative polarity RESET. | ||||
| //- | ||||
| //- Truth table:    S R | Q | ||||
| //-                -----+--- | ||||
|  |  | |||
|  | @ -79,6 +79,9 @@ struct SynthIce40Pass : public ScriptPass | |||
| 		log("    -nobram\n"); | ||||
| 		log("        do not use SB_RAM40_4K* cells in output netlist\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -noabc\n"); | ||||
| 		log("        use built-in Yosys LUT techmapping instead of abc\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -abc2\n"); | ||||
| 		log("        run two passes of 'abc' for slightly improved logic density\n"); | ||||
| 		log("\n"); | ||||
|  | @ -93,7 +96,7 @@ struct SynthIce40Pass : public ScriptPass | |||
| 	} | ||||
| 
 | ||||
| 	string top_opt, blif_file, edif_file, json_file; | ||||
| 	bool nocarry, nodffe, nobram, flatten, retime, relut, abc2, vpr; | ||||
| 	bool nocarry, nodffe, nobram, flatten, retime, relut, noabc, abc2, vpr; | ||||
| 	int min_ce_use; | ||||
| 
 | ||||
| 	void clear_flags() YS_OVERRIDE | ||||
|  | @ -109,6 +112,7 @@ struct SynthIce40Pass : public ScriptPass | |||
| 		flatten = true; | ||||
| 		retime = false; | ||||
| 		relut = false; | ||||
| 		noabc = false; | ||||
| 		abc2 = false; | ||||
| 		vpr = false; | ||||
| 	} | ||||
|  | @ -177,6 +181,10 @@ struct SynthIce40Pass : public ScriptPass | |||
| 				nobram = true; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-noabc") { | ||||
| 				noabc = true; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-abc2") { | ||||
| 				abc2 = true; | ||||
| 				continue; | ||||
|  | @ -265,7 +273,13 @@ struct SynthIce40Pass : public ScriptPass | |||
| 				run("ice40_opt", "(only if -abc2)"); | ||||
| 			} | ||||
| 			run("techmap -map +/ice40/latches_map.v"); | ||||
| 			run("abc -lut 4"); | ||||
| 			if (noabc || help_mode) { | ||||
| 				run("simplemap", "                               (only if -noabc)"); | ||||
| 				run("techmap -map +/gate2lut.v -D LUT_WIDTH=4", "(only if -noabc)"); | ||||
| 			} | ||||
| 			if (!noabc) { | ||||
| 				run("abc -lut 4", "(skip if -noabc)"); | ||||
| 			} | ||||
| 			run("clean"); | ||||
| 			if (relut || help_mode) { | ||||
| 				run("ice40_unlut", "                            (only if -relut)"); | ||||
|  |  | |||
							
								
								
									
										1
									
								
								tests/lut/.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								tests/lut/.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| *.log | ||||
							
								
								
									
										13
									
								
								tests/lut/check_map.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								tests/lut/check_map.ys
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,13 @@ | |||
| design -save preopt | ||||
| 
 | ||||
| simplemap | ||||
| techmap -map +/gate2lut.v -D LUT_WIDTH=4 | ||||
| select -assert-count 1 t:$lut | ||||
| design -stash postopt | ||||
| 
 | ||||
| design -copy-from preopt -as preopt top | ||||
| design -copy-from postopt -as postopt top | ||||
| equiv_make preopt postopt equiv | ||||
| prep -flatten -top equiv | ||||
| equiv_induct | ||||
| equiv_status -assert | ||||
							
								
								
									
										5
									
								
								tests/lut/map_and.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								tests/lut/map_and.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | |||
| module top(...); | ||||
|     input a, b; | ||||
|     output y; | ||||
|     assign y = a&b; | ||||
| endmodule | ||||
							
								
								
									
										5
									
								
								tests/lut/map_mux.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								tests/lut/map_mux.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | |||
| module top(...); | ||||
|     input a, b, s; | ||||
|     output y; | ||||
|     assign y = s?a:b; | ||||
| endmodule | ||||
							
								
								
									
										5
									
								
								tests/lut/map_not.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								tests/lut/map_not.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | |||
| module top(...); | ||||
|     input a; | ||||
|     output y; | ||||
|     assign y = ~a; | ||||
| endmodule | ||||
							
								
								
									
										5
									
								
								tests/lut/map_or.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								tests/lut/map_or.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | |||
| module top(...); | ||||
|     input a, b; | ||||
|     output y; | ||||
|     assign y = a|b; | ||||
| endmodule | ||||
							
								
								
									
										5
									
								
								tests/lut/map_xor.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								tests/lut/map_xor.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | |||
| module top(...); | ||||
|     input a, b; | ||||
|     output y; | ||||
|     assign y = a^b; | ||||
| endmodule | ||||
							
								
								
									
										6
									
								
								tests/lut/run-test.sh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								tests/lut/run-test.sh
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | |||
| #!/bin/bash | ||||
| set -e | ||||
| for x in *.v; do | ||||
|   echo "Running $x.." | ||||
|   ../../yosys -q -s check_map.ys -l ${x%.v}.log $x | ||||
| done | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue