mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	synth_gatemate: Initial implementation
Signed-off-by: Patrick Urban <patrick.urban@web.de>
This commit is contained in:
		
							parent
							
								
									b3e2001e1f
								
							
						
					
					
						commit
						240d289fff
					
				
					 29 changed files with 4053 additions and 0 deletions
				
			
		
							
								
								
									
										16
									
								
								techlibs/gatemate/Makefile.inc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								techlibs/gatemate/Makefile.inc
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,16 @@ | |||
| 
 | ||||
| OBJS += techlibs/gatemate/synth_gatemate.o | ||||
| OBJS += techlibs/gatemate/gatemate_bramopt.o | ||||
| 
 | ||||
| $(eval $(call add_share_file,share/gatemate,techlibs/gatemate/iob_map.v)) | ||||
| $(eval $(call add_share_file,share/gatemate,techlibs/gatemate/reg_map.v)) | ||||
| $(eval $(call add_share_file,share/gatemate,techlibs/gatemate/mux_map.v)) | ||||
| $(eval $(call add_share_file,share/gatemate,techlibs/gatemate/lut_map.v)) | ||||
| $(eval $(call add_share_file,share/gatemate,techlibs/gatemate/mul_map.v)) | ||||
| $(eval $(call add_share_file,share/gatemate,techlibs/gatemate/arith_map.v)) | ||||
| $(eval $(call add_share_file,share/gatemate,techlibs/gatemate/cells_sim.v)) | ||||
| $(eval $(call add_share_file,share/gatemate,techlibs/gatemate/cells_bb.v)) | ||||
| $(eval $(call add_share_file,share/gatemate,techlibs/gatemate/brams_map.v)) | ||||
| $(eval $(call add_share_file,share/gatemate,techlibs/gatemate/brams.txt)) | ||||
| $(eval $(call add_share_file,share/gatemate,techlibs/gatemate/brams_init_20.vh)) | ||||
| $(eval $(call add_share_file,share/gatemate,techlibs/gatemate/brams_init_40.vh)) | ||||
							
								
								
									
										69
									
								
								techlibs/gatemate/arith_map.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								techlibs/gatemate/arith_map.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,69 @@ | |||
| /* | ||||
|  *  yosys -- Yosys Open SYnthesis Suite | ||||
|  * | ||||
|  *  Copyright (C) 2021  Cologne Chip AG <support@colognechip.com> | ||||
|  * | ||||
|  *  Permission to use, copy, modify, and/or distribute this software for any | ||||
|  *  purpose with or without fee is hereby granted, provided that the above | ||||
|  *  copyright notice and this permission notice appear in all copies. | ||||
|  * | ||||
|  *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||||
|  *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| (* techmap_celltype = "$alu" *) | ||||
| module _80_gatemate_alu(A, B, CI, BI, X, Y, CO); | ||||
| 	parameter A_SIGNED = 0; | ||||
| 	parameter B_SIGNED = 0; | ||||
| 	parameter A_WIDTH = 1; | ||||
| 	parameter B_WIDTH = 1; | ||||
| 	parameter Y_WIDTH = 1; | ||||
| 
 | ||||
| 	(* force_downto *) | ||||
| 	input [A_WIDTH-1:0] A; | ||||
| 	(* force_downto *) | ||||
| 	input [B_WIDTH-1:0] B; | ||||
| 	(* force_downto *) | ||||
| 	output [Y_WIDTH-1:0] X, Y; | ||||
| 
 | ||||
| 	input CI, BI; | ||||
| 	(* force_downto *) | ||||
| 	output [Y_WIDTH-1:0] CO; | ||||
| 
 | ||||
| 	wire _TECHMAP_FAIL_ = Y_WIDTH <= 2; | ||||
| 
 | ||||
| 	(* force_downto *) | ||||
| 	wire [Y_WIDTH-1:0] A_buf, B_buf; | ||||
| 	\$pos #(.A_SIGNED(A_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(Y_WIDTH)) A_conv (.A(A), .Y(A_buf)); | ||||
| 	\$pos #(.A_SIGNED(B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(Y_WIDTH)) B_conv (.A(B), .Y(B_buf)); | ||||
| 
 | ||||
| 	(* force_downto *) | ||||
| 	wire [Y_WIDTH-1:0] AA = A_buf; | ||||
| 	(* force_downto *) | ||||
| 	wire [Y_WIDTH-1:0] BB = BI ? ~B_buf : B_buf; | ||||
| 	(* force_downto *) | ||||
| 	wire [Y_WIDTH-1:0] C = {CO, CI}; | ||||
| 
 | ||||
| 	genvar i; | ||||
| 	generate | ||||
| 		for (i = 0; i < Y_WIDTH; i = i + 1) | ||||
| 		begin: slice | ||||
| 			CC_ADDF addf_i ( | ||||
| 				.A(AA[i]), | ||||
| 				.B(BB[i]), | ||||
| 				.CI(C[i]), | ||||
| 				.CO(CO[i]), | ||||
| 				.S(Y[i]) | ||||
| 			); | ||||
| 		end | ||||
| 	endgenerate | ||||
| 
 | ||||
| 	assign X = AA ^ BB; | ||||
| 
 | ||||
| endmodule | ||||
							
								
								
									
										280
									
								
								techlibs/gatemate/brams.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										280
									
								
								techlibs/gatemate/brams.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,280 @@ | |||
| bram $__CC_BRAM_CASCADE | ||||
|   init 1 | ||||
|   abits 16 @a16d1 | ||||
|   dbits 1  @a16d1 | ||||
|   groups 2 | ||||
|   ports 1 1 | ||||
|   wrmode 1 0 | ||||
|   enable 1 1 @a16d1 | ||||
|   transp 0 0 | ||||
|   clocks 2 3 | ||||
|   clkpol 2 3 | ||||
| endbram | ||||
| 
 | ||||
| bram $__CC_BRAM_40K_SDP | ||||
|   init 1 | ||||
|   abits 9  @a9d80 | ||||
|   dbits 80 @a9d80 | ||||
|   groups 2 | ||||
|   ports 1 1 | ||||
|   wrmode 1 0 | ||||
|   enable 80 1 @a9d80 | ||||
|   transp 0 0 | ||||
|   clocks 2 3 | ||||
|   clkpol 2 3 | ||||
| endbram | ||||
| 
 | ||||
| bram $__CC_BRAM_20K_SDP | ||||
|   init 1 | ||||
|   abits 9  @a9d40 | ||||
|   dbits 40 @a9d40 | ||||
|   groups 2 | ||||
|   ports 1 1 | ||||
|   wrmode 1 0 | ||||
|   enable 40 1 @a9d40 | ||||
|   transp 0 0 | ||||
|   clocks 2 3 | ||||
|   clkpol 2 3 | ||||
| endbram | ||||
| 
 | ||||
| bram $__CC_BRAM_40K_TDP | ||||
|   init 1 | ||||
|   abits 10 @a10d40 | ||||
|   dbits 40 @a10d40 | ||||
|   abits 11 @a11d20 | ||||
|   dbits 20 @a11d20 | ||||
|   abits 12 @a12d10 | ||||
|   dbits 10 @a12d10 | ||||
|   abits 13 @a13d5 | ||||
|   dbits 5  @a13d5 | ||||
|   abits 14 @a14d2 | ||||
|   dbits 2  @a14d2 | ||||
|   abits 15 @a15d1 | ||||
|   dbits 1  @a15d1 | ||||
|   groups 2 | ||||
|   ports 1 1 | ||||
|   wrmode 1 0 | ||||
|   enable 40 1 @a10d40 | ||||
|   enable 20 1 @a11d20 | ||||
|   enable 10 1 @a12d10 | ||||
|   enable 5 1  @a13d5 | ||||
|   enable 2 1  @a14d2 | ||||
|   enable 1 1  @a15d1 | ||||
|   transp 0 0 | ||||
|   clocks 2 3 | ||||
|   clkpol 2 3 | ||||
| endbram | ||||
| 
 | ||||
| bram $__CC_BRAM_20K_TDP | ||||
|   init 1 | ||||
|   abits 10 @a10d20 | ||||
|   dbits 20 @a10d20 | ||||
|   abits 11 @a11d10 | ||||
|   dbits 10 @a11d10 | ||||
|   abits 12 @a12d5 | ||||
|   dbits 5  @a12d5 | ||||
|   abits 13 @a13d2 | ||||
|   dbits 2  @a13d2 | ||||
|   abits 14 @a14d1 | ||||
|   dbits 1  @a14d1 | ||||
|   groups 2 | ||||
|   ports 1 1 | ||||
|   wrmode 1 0 | ||||
|   enable 20 1 @a10d20 | ||||
|   enable 10 1 @a11d10 | ||||
|   enable 5 1  @a12d5 | ||||
|   enable 2 1  @a13d2 | ||||
|   enable 1 1  @a14d1 | ||||
|   transp 0 0 | ||||
|   clocks 2 3 | ||||
|   clkpol 2 3 | ||||
| endbram | ||||
| 
 | ||||
| match $__CC_BRAM_CASCADE | ||||
|   # implicitly requested RAM or ROM | ||||
|   attribute !syn_ramstyle syn_ramstyle=auto | ||||
|   attribute !syn_romstyle syn_romstyle=auto | ||||
|   attribute !ram_block | ||||
|   attribute !rom_block | ||||
|   attribute !logic_block | ||||
|   min bits 512 | ||||
|   min efficiency 5 | ||||
|   shuffle_enable A | ||||
|   make_transp | ||||
|   or_next_if_better | ||||
| endmatch | ||||
| 
 | ||||
| match $__CC_BRAM_CASCADE | ||||
|   # explicitly requested RAM | ||||
|   attribute syn_ramstyle=block_ram ram_block | ||||
|   attribute !syn_romstyle | ||||
|   attribute !rom_block | ||||
|   attribute !logic_block | ||||
|   min wports 1 | ||||
|   shuffle_enable A | ||||
|   make_transp | ||||
|   or_next_if_better | ||||
| endmatch | ||||
| 
 | ||||
| match $__CC_BRAM_CASCADE | ||||
|   # explicitly requested ROM | ||||
|   attribute syn_romstyle=ebr rom_block | ||||
|   attribute !syn_ramstyle | ||||
|   attribute !ram_block | ||||
|   attribute !logic_block | ||||
|   max wports 0 | ||||
|   shuffle_enable A | ||||
|   make_transp | ||||
|   or_next_if_better | ||||
| endmatch | ||||
| 
 | ||||
| match $__CC_BRAM_40K_SDP | ||||
|   # implicitly requested RAM or ROM | ||||
|   attribute !syn_ramstyle syn_ramstyle=auto | ||||
|   attribute !syn_romstyle syn_romstyle=auto | ||||
|   attribute !ram_block | ||||
|   attribute !rom_block | ||||
|   attribute !logic_block | ||||
|   min bits 512 | ||||
|   min efficiency 5 | ||||
|   shuffle_enable A | ||||
|   make_transp | ||||
|   or_next_if_better | ||||
| endmatch | ||||
| 
 | ||||
| match $__CC_BRAM_40K_SDP | ||||
|   # explicitly requested RAM | ||||
|   attribute syn_ramstyle=block_ram ram_block | ||||
|   attribute !syn_romstyle | ||||
|   attribute !rom_block | ||||
|   attribute !logic_block | ||||
|   min wports 1 | ||||
|   shuffle_enable A | ||||
|   make_transp | ||||
|   or_next_if_better | ||||
| endmatch | ||||
| 
 | ||||
| match $__CC_BRAM_40K_SDP | ||||
|   # explicitly requested ROM | ||||
|   attribute syn_romstyle=ebr rom_block | ||||
|   attribute !syn_ramstyle | ||||
|   attribute !ram_block | ||||
|   attribute !logic_block | ||||
|   max wports 0 | ||||
|   shuffle_enable A | ||||
|   make_transp | ||||
|   or_next_if_better | ||||
| endmatch | ||||
| 
 | ||||
| match $__CC_BRAM_20K_SDP | ||||
|   # implicitly requested RAM or ROM | ||||
|   attribute !syn_ramstyle syn_ramstyle=auto | ||||
|   attribute !syn_romstyle syn_romstyle=auto | ||||
|   attribute !ram_block | ||||
|   attribute !rom_block | ||||
|   attribute !logic_block | ||||
|   min bits 512 | ||||
|   min efficiency 5 | ||||
|   shuffle_enable A | ||||
|   make_transp | ||||
|   or_next_if_better | ||||
| endmatch | ||||
| 
 | ||||
| match $__CC_BRAM_20K_SDP | ||||
|   # explicitly requested RAM | ||||
|   attribute syn_ramstyle=block_ram ram_block | ||||
|   attribute !syn_romstyle | ||||
|   attribute !rom_block | ||||
|   attribute !logic_block | ||||
|   min wports 1 | ||||
|   shuffle_enable A | ||||
|   make_transp | ||||
|   or_next_if_better | ||||
| endmatch | ||||
| 
 | ||||
| match $__CC_BRAM_20K_SDP | ||||
|   # explicitly requested ROM | ||||
|   attribute syn_romstyle=ebr rom_block | ||||
|   attribute !syn_ramstyle | ||||
|   attribute !ram_block | ||||
|   attribute !logic_block | ||||
|   max wports 0 | ||||
|   shuffle_enable A | ||||
|   make_transp | ||||
|   or_next_if_better | ||||
| endmatch | ||||
| 
 | ||||
| match $__CC_BRAM_40K_TDP | ||||
|   # implicitly requested RAM or ROM | ||||
|   attribute !syn_ramstyle syn_ramstyle=auto | ||||
|   attribute !syn_romstyle syn_romstyle=auto | ||||
|   attribute !ram_block | ||||
|   attribute !rom_block | ||||
|   attribute !logic_block | ||||
|   min bits 512 | ||||
|   min efficiency 5 | ||||
|   shuffle_enable A | ||||
|   make_transp | ||||
|   or_next_if_better | ||||
| endmatch | ||||
| 
 | ||||
| match $__CC_BRAM_40K_TDP | ||||
|   # explicitly requested RAM | ||||
|   attribute syn_ramstyle=block_ram ram_block | ||||
|   attribute !syn_romstyle | ||||
|   attribute !rom_block | ||||
|   attribute !logic_block | ||||
|   min wports 1 | ||||
|   shuffle_enable A | ||||
|   make_transp | ||||
|   or_next_if_better | ||||
| endmatch | ||||
| 
 | ||||
| match $__CC_BRAM_40K_TDP | ||||
|   # explicitly requested ROM | ||||
|   attribute syn_romstyle=ebr rom_block | ||||
|   attribute !syn_ramstyle | ||||
|   attribute !ram_block | ||||
|   attribute !logic_block | ||||
|   max wports 0 | ||||
|   shuffle_enable A | ||||
|   make_transp | ||||
|   or_next_if_better | ||||
| endmatch | ||||
| 
 | ||||
| match $__CC_BRAM_20K_TDP | ||||
|   # implicitly requested RAM or ROM | ||||
|   attribute !syn_ramstyle syn_ramstyle=auto | ||||
|   attribute !syn_romstyle syn_romstyle=auto | ||||
|   attribute !ram_block | ||||
|   attribute !rom_block | ||||
|   attribute !logic_block | ||||
|   min bits 512 | ||||
|   min efficiency 5 | ||||
|   shuffle_enable A | ||||
|   make_transp | ||||
|   or_next_if_better | ||||
| endmatch | ||||
| 
 | ||||
| match $__CC_BRAM_20K_TDP | ||||
|   # explicitly requested RAM | ||||
|   attribute syn_ramstyle=block_ram ram_block | ||||
|   attribute !syn_romstyle | ||||
|   attribute !rom_block | ||||
|   attribute !logic_block | ||||
|   min wports 1 | ||||
|   shuffle_enable A | ||||
|   make_transp | ||||
|   or_next_if_better | ||||
| endmatch | ||||
| 
 | ||||
| match $__CC_BRAM_20K_TDP | ||||
|   # explicitly requested ROM | ||||
|   attribute syn_romstyle=ebr rom_block | ||||
|   attribute !syn_ramstyle | ||||
|   attribute !ram_block | ||||
|   attribute !logic_block | ||||
|   max wports 0 | ||||
|   shuffle_enable A | ||||
|   make_transp | ||||
| endmatch | ||||
							
								
								
									
										64
									
								
								techlibs/gatemate/brams_init_20.vh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								techlibs/gatemate/brams_init_20.vh
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,64 @@ | |||
| .INIT_00(permute_init(INIT[  0*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_01(permute_init(INIT[  1*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_02(permute_init(INIT[  2*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_03(permute_init(INIT[  3*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_04(permute_init(INIT[  4*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_05(permute_init(INIT[  5*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_06(permute_init(INIT[  6*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_07(permute_init(INIT[  7*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_08(permute_init(INIT[  8*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_09(permute_init(INIT[  9*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_0A(permute_init(INIT[ 10*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_0B(permute_init(INIT[ 11*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_0C(permute_init(INIT[ 12*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_0D(permute_init(INIT[ 13*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_0E(permute_init(INIT[ 14*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_0F(permute_init(INIT[ 15*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_10(permute_init(INIT[ 16*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_11(permute_init(INIT[ 17*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_12(permute_init(INIT[ 18*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_13(permute_init(INIT[ 19*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_14(permute_init(INIT[ 20*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_15(permute_init(INIT[ 21*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_16(permute_init(INIT[ 22*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_17(permute_init(INIT[ 23*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_18(permute_init(INIT[ 24*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_19(permute_init(INIT[ 25*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_1A(permute_init(INIT[ 26*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_1B(permute_init(INIT[ 27*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_1C(permute_init(INIT[ 28*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_1D(permute_init(INIT[ 29*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_1E(permute_init(INIT[ 30*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_1F(permute_init(INIT[ 31*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_20(permute_init(INIT[ 32*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_21(permute_init(INIT[ 33*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_22(permute_init(INIT[ 34*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_23(permute_init(INIT[ 35*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_24(permute_init(INIT[ 36*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_25(permute_init(INIT[ 37*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_26(permute_init(INIT[ 38*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_27(permute_init(INIT[ 39*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_28(permute_init(INIT[ 40*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_29(permute_init(INIT[ 41*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_2A(permute_init(INIT[ 42*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_2B(permute_init(INIT[ 43*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_2C(permute_init(INIT[ 44*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_2D(permute_init(INIT[ 45*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_2E(permute_init(INIT[ 46*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_2F(permute_init(INIT[ 47*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_30(permute_init(INIT[ 48*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_31(permute_init(INIT[ 49*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_32(permute_init(INIT[ 50*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_33(permute_init(INIT[ 51*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_34(permute_init(INIT[ 52*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_35(permute_init(INIT[ 53*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_36(permute_init(INIT[ 54*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_37(permute_init(INIT[ 55*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_38(permute_init(INIT[ 56*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_39(permute_init(INIT[ 57*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_3A(permute_init(INIT[ 58*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_3B(permute_init(INIT[ 59*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_3C(permute_init(INIT[ 60*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_3D(permute_init(INIT[ 61*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_3E(permute_init(INIT[ 62*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_3F(permute_init(INIT[ 63*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
							
								
								
									
										128
									
								
								techlibs/gatemate/brams_init_40.vh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								techlibs/gatemate/brams_init_40.vh
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,128 @@ | |||
| .INIT_00(permute_init(INIT[  0*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_01(permute_init(INIT[  1*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_02(permute_init(INIT[  2*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_03(permute_init(INIT[  3*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_04(permute_init(INIT[  4*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_05(permute_init(INIT[  5*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_06(permute_init(INIT[  6*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_07(permute_init(INIT[  7*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_08(permute_init(INIT[  8*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_09(permute_init(INIT[  9*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_0A(permute_init(INIT[ 10*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_0B(permute_init(INIT[ 11*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_0C(permute_init(INIT[ 12*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_0D(permute_init(INIT[ 13*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_0E(permute_init(INIT[ 14*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_0F(permute_init(INIT[ 15*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_10(permute_init(INIT[ 16*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_11(permute_init(INIT[ 17*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_12(permute_init(INIT[ 18*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_13(permute_init(INIT[ 19*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_14(permute_init(INIT[ 20*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_15(permute_init(INIT[ 21*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_16(permute_init(INIT[ 22*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_17(permute_init(INIT[ 23*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_18(permute_init(INIT[ 24*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_19(permute_init(INIT[ 25*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_1A(permute_init(INIT[ 26*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_1B(permute_init(INIT[ 27*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_1C(permute_init(INIT[ 28*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_1D(permute_init(INIT[ 29*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_1E(permute_init(INIT[ 30*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_1F(permute_init(INIT[ 31*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_20(permute_init(INIT[ 32*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_21(permute_init(INIT[ 33*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_22(permute_init(INIT[ 34*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_23(permute_init(INIT[ 35*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_24(permute_init(INIT[ 36*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_25(permute_init(INIT[ 37*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_26(permute_init(INIT[ 38*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_27(permute_init(INIT[ 39*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_28(permute_init(INIT[ 40*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_29(permute_init(INIT[ 41*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_2A(permute_init(INIT[ 42*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_2B(permute_init(INIT[ 43*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_2C(permute_init(INIT[ 44*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_2D(permute_init(INIT[ 45*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_2E(permute_init(INIT[ 46*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_2F(permute_init(INIT[ 47*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_30(permute_init(INIT[ 48*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_31(permute_init(INIT[ 49*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_32(permute_init(INIT[ 50*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_33(permute_init(INIT[ 51*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_34(permute_init(INIT[ 52*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_35(permute_init(INIT[ 53*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_36(permute_init(INIT[ 54*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_37(permute_init(INIT[ 55*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_38(permute_init(INIT[ 56*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_39(permute_init(INIT[ 57*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_3A(permute_init(INIT[ 58*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_3B(permute_init(INIT[ 59*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_3C(permute_init(INIT[ 60*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_3D(permute_init(INIT[ 61*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_3E(permute_init(INIT[ 62*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_3F(permute_init(INIT[ 63*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_40(permute_init(INIT[ 64*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_41(permute_init(INIT[ 65*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_42(permute_init(INIT[ 66*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_43(permute_init(INIT[ 67*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_44(permute_init(INIT[ 68*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_45(permute_init(INIT[ 69*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_46(permute_init(INIT[ 70*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_47(permute_init(INIT[ 71*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_48(permute_init(INIT[ 72*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_49(permute_init(INIT[ 73*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_4A(permute_init(INIT[ 74*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_4B(permute_init(INIT[ 75*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_4C(permute_init(INIT[ 76*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_4D(permute_init(INIT[ 77*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_4E(permute_init(INIT[ 78*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_4F(permute_init(INIT[ 79*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_50(permute_init(INIT[ 80*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_51(permute_init(INIT[ 81*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_52(permute_init(INIT[ 82*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_53(permute_init(INIT[ 83*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_54(permute_init(INIT[ 84*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_55(permute_init(INIT[ 85*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_56(permute_init(INIT[ 86*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_57(permute_init(INIT[ 87*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_58(permute_init(INIT[ 88*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_59(permute_init(INIT[ 89*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_5A(permute_init(INIT[ 90*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_5B(permute_init(INIT[ 91*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_5C(permute_init(INIT[ 92*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_5D(permute_init(INIT[ 93*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_5E(permute_init(INIT[ 94*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_5F(permute_init(INIT[ 95*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_60(permute_init(INIT[ 96*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_61(permute_init(INIT[ 97*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_62(permute_init(INIT[ 98*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_63(permute_init(INIT[ 99*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_64(permute_init(INIT[100*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_65(permute_init(INIT[101*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_66(permute_init(INIT[102*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_67(permute_init(INIT[103*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_68(permute_init(INIT[104*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_69(permute_init(INIT[105*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_6A(permute_init(INIT[106*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_6B(permute_init(INIT[107*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_6C(permute_init(INIT[108*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_6D(permute_init(INIT[109*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_6E(permute_init(INIT[110*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_6F(permute_init(INIT[111*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_70(permute_init(INIT[112*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_71(permute_init(INIT[113*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_72(permute_init(INIT[114*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_73(permute_init(INIT[115*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_74(permute_init(INIT[116*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_75(permute_init(INIT[117*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_76(permute_init(INIT[118*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_77(permute_init(INIT[119*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_78(permute_init(INIT[120*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_79(permute_init(INIT[121*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_7A(permute_init(INIT[122*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_7B(permute_init(INIT[123*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_7C(permute_init(INIT[124*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_7D(permute_init(INIT[125*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_7E(permute_init(INIT[126*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
| .INIT_7F(permute_init(INIT[127*INIT_CHUNK_SIZE +: INIT_CHUNK_SIZE])), | ||||
							
								
								
									
										539
									
								
								techlibs/gatemate/brams_map.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										539
									
								
								techlibs/gatemate/brams_map.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,539 @@ | |||
| /* | ||||
|  *  yosys -- Yosys Open SYnthesis Suite | ||||
|  * | ||||
|  *  Copyright (C) 2021  Cologne Chip AG <support@colognechip.com> | ||||
|  * | ||||
|  *  Permission to use, copy, modify, and/or distribute this software for any | ||||
|  *  purpose with or without fee is hereby granted, provided that the above | ||||
|  *  copyright notice and this permission notice appear in all copies. | ||||
|  * | ||||
|  *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||||
|  *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| module \$__CC_BRAM_20K_SDP (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN); | ||||
| 
 | ||||
| 	parameter CFG_ABITS = 14; | ||||
| 	parameter CFG_DBITS = 40; | ||||
| 	parameter CFG_ENABLE_A = 1; | ||||
| 	parameter CFG_ENABLE_B = 1; | ||||
| 
 | ||||
| 	parameter CLKPOL2 = 1; | ||||
| 	parameter CLKPOL3 = 1; | ||||
| 
 | ||||
| 	// 512 x 40 bit
 | ||||
| 	parameter [20479:0] INIT = 20480'b0; | ||||
| 
 | ||||
| 	input CLK2; | ||||
| 	input CLK3; | ||||
| 
 | ||||
| 	// write side of the memory
 | ||||
| 	input [15:0] A1ADDR; | ||||
| 	input [39:0] A1DATA; | ||||
| 	input [39:0] A1EN; | ||||
| 
 | ||||
| 	// read side of the memory
 | ||||
| 	input [15:0] B1ADDR; | ||||
| 	output [39:0] B1DATA; | ||||
| 	input [0:0] B1EN; | ||||
| 
 | ||||
| 	// unconnected signals
 | ||||
| 	wire ECC_1B_ERR, ECC_2B_ERR; | ||||
| 
 | ||||
| 	// internal signals
 | ||||
| 	wire [15:0] ADDRA = {A1ADDR, 7'b0}; | ||||
| 	wire [15:0] ADDRB = {B1ADDR, 7'b0}; | ||||
| 
 | ||||
| 	localparam INIT_CHUNK_SIZE = (CFG_DBITS <= 2) ? 256 : 320; | ||||
| 
 | ||||
| 	function [319:0] permute_init; | ||||
| 		input [INIT_CHUNK_SIZE-1:0] chunk; | ||||
| 		integer i; | ||||
| 		begin | ||||
| 			if (CFG_DBITS <= 2) begin | ||||
| 				for (i = 0; i < 64; i = i + 1) begin | ||||
| 					if (^chunk[i * 4 +: 4] === 1'bx) begin | ||||
| 						permute_init[i * 5 +: 5] = 5'b0; | ||||
| 					end | ||||
| 					else begin | ||||
| 						permute_init[i * 5 +: 5] = {1'b0, chunk[i * 4 +: 4]}; | ||||
| 					end | ||||
| 				end | ||||
| 			end else begin | ||||
| 				permute_init = chunk; | ||||
| 			end | ||||
| 		end | ||||
| 	endfunction | ||||
| 
 | ||||
| 	CC_BRAM_20K #( | ||||
| 		`include "brams_init_20.vh" | ||||
| 		.LOC("UNPLACED"), | ||||
| 		.A_RD_WIDTH(0), .B_RD_WIDTH(CFG_DBITS), | ||||
| 		.A_WR_WIDTH(CFG_DBITS), .B_WR_WIDTH(0), | ||||
| 		.RAM_MODE("SDP"), | ||||
| 		.A_WR_MODE("NO_CHANGE"), .B_WR_MODE("NO_CHANGE"), | ||||
| 		.A_CLK_INV(!CLKPOL2), .B_CLK_INV(!CLKPOL3), | ||||
| 		.A_EN_INV(1'b0), .B_EN_INV(1'b0), | ||||
| 		.A_WE_INV(1'b0), .B_WE_INV(1'b0), | ||||
| 		.A_DO_REG(1'b0), .B_DO_REG(1'b0), | ||||
| 		.ECC_EN(1'b0) | ||||
| 	) _TECHMAP_REPLACE_ ( | ||||
| 		.A_DO(B1DATA[19:0]), | ||||
| 		.B_DO(B1DATA[39:20]), | ||||
| 		.ECC_1B_ERR(ECC_1B_ERR), | ||||
| 		.ECC_2B_ERR(ECC_2B_ERR), | ||||
| 		.A_CLK(CLK2), | ||||
| 		.B_CLK(CLK3), | ||||
| 		.A_EN(1'b1), | ||||
| 		.B_EN(B1EN), | ||||
| 		.A_WE(1'b1), | ||||
| 		.B_WE(1'b0), | ||||
| 		.A_ADDR(ADDRA), | ||||
| 		.B_ADDR(ADDRB), | ||||
| 		.A_DI(A1DATA[19:0]), | ||||
| 		.B_DI(A1DATA[39:20]), | ||||
| 		.A_BM(A1EN[19:0]), | ||||
| 		.B_BM(A1EN[39:20]) | ||||
| 	); | ||||
| 
 | ||||
| endmodule | ||||
| 
 | ||||
| 
 | ||||
| module \$__CC_BRAM_40K_SDP (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN); | ||||
| 
 | ||||
| 	parameter CFG_ABITS = 15; | ||||
| 	parameter CFG_DBITS = 80; | ||||
| 	parameter CFG_ENABLE_A = 1; | ||||
| 	parameter CFG_ENABLE_B = 1; | ||||
| 
 | ||||
| 	parameter CLKPOL2 = 1; | ||||
| 	parameter CLKPOL3 = 1; | ||||
| 
 | ||||
| 	// 512 x 80 bit
 | ||||
| 	parameter [40959:0] INIT = 40960'b0; | ||||
| 
 | ||||
| 	input CLK2; | ||||
| 	input CLK3; | ||||
| 
 | ||||
| 	// write side of the memory
 | ||||
| 	input [15:0] A1ADDR; | ||||
| 	input [79:0] A1DATA; | ||||
| 	input [79:0] A1EN; | ||||
| 
 | ||||
| 	// read side of the memory
 | ||||
| 	input [15:0] B1ADDR; | ||||
| 	output [79:0] B1DATA; | ||||
| 	input [0:0] B1EN; | ||||
| 
 | ||||
| 	// unconnected signals
 | ||||
| 	wire A_ECC_1B_ERR, B_ECC_1B_ERR, A_ECC_2B_ERR, B_ECC_2B_ERR; | ||||
| 
 | ||||
| 	// internal signals
 | ||||
| 	wire [15:0] ADDRA = {A1ADDR, 7'b0}; | ||||
| 	wire [15:0] ADDRB = {B1ADDR, 7'b0}; | ||||
| 
 | ||||
| 	localparam INIT_CHUNK_SIZE = (CFG_DBITS <= 2) ? 256 : 320; | ||||
| 
 | ||||
| 	function [319:0] permute_init; | ||||
| 		input [INIT_CHUNK_SIZE-1:0] chunk; | ||||
| 		integer i; | ||||
| 		begin | ||||
| 			if (CFG_DBITS <= 2) begin | ||||
| 				for (i = 0; i < 64; i = i + 1) begin | ||||
| 					if (^chunk[i * 4 +: 4] === 1'bx) begin | ||||
| 						permute_init[i * 5 +: 5] = 5'b0; | ||||
| 					end | ||||
| 					else begin | ||||
| 						permute_init[i * 5 +: 5] = {1'b0, chunk[i * 4 +: 4]}; | ||||
| 					end | ||||
| 				end | ||||
| 			end else begin | ||||
| 				permute_init = chunk; | ||||
| 			end | ||||
| 		end | ||||
| 	endfunction | ||||
| 
 | ||||
| 	CC_BRAM_40K #( | ||||
| 		`include "brams_init_40.vh" | ||||
| 		.LOC("UNPLACED"), | ||||
| 		.CAS("NONE"), | ||||
| 		.A_RD_WIDTH(0), .B_RD_WIDTH(CFG_DBITS), | ||||
| 		.A_WR_WIDTH(CFG_DBITS), .B_WR_WIDTH(0), | ||||
| 		.RAM_MODE("SDP"), | ||||
| 		.A_WR_MODE("NO_CHANGE"), .B_WR_MODE("NO_CHANGE"), | ||||
| 		.A_CLK_INV(!CLKPOL2), .B_CLK_INV(!CLKPOL3), | ||||
| 		.A_EN_INV(1'b0), .B_EN_INV(1'b0), | ||||
| 		.A_WE_INV(1'b0), .B_WE_INV(1'b0), | ||||
| 		.A_DO_REG(1'b0), .B_DO_REG(1'b0), | ||||
| 		.A_ECC_EN(1'b0), .B_ECC_EN(1'b0) | ||||
| 	) _TECHMAP_REPLACE_ ( | ||||
| 		.A_DO(B1DATA[39:0]), | ||||
| 		.B_DO(B1DATA[79:40]), | ||||
| 		.A_ECC_1B_ERR(A_ECC_1B_ERR), | ||||
| 		.B_ECC_1B_ERR(B_ECC_1B_ERR), | ||||
| 		.A_ECC_2B_ERR(A_ECC_2B_ERR), | ||||
| 		.B_ECC_2B_ERR(B_ECC_2B_ERR), | ||||
| 		.A_CLK(CLK2), | ||||
| 		.B_CLK(CLK3), | ||||
| 		.A_EN(1'b1), | ||||
| 		.B_EN(B1EN), | ||||
| 		.A_WE(1'b1), | ||||
| 		.B_WE(1'b0), | ||||
| 		.A_ADDR(ADDRA), | ||||
| 		.B_ADDR(ADDRB), | ||||
| 		.A_DI(A1DATA[39:0]), | ||||
| 		.B_DI(A1DATA[79:40]), | ||||
| 		.A_BM(A1EN[39:0]), | ||||
| 		.B_BM(A1EN[79:40]) | ||||
| 	); | ||||
| 
 | ||||
| endmodule | ||||
| 
 | ||||
| 
 | ||||
| module \$__CC_BRAM_20K_TDP (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN); | ||||
| 
 | ||||
| 	parameter CFG_ABITS = 14; | ||||
| 	parameter CFG_DBITS = 20; | ||||
| 	parameter CFG_ENABLE_A = 1; | ||||
| 	parameter CFG_ENABLE_B = 1; | ||||
| 
 | ||||
| 	parameter CLKPOL2 = 1; | ||||
| 	parameter CLKPOL3 = 1; | ||||
| 
 | ||||
| 	// 512 x 40 bit
 | ||||
| 	parameter [20479:0] INIT = 20480'b0; | ||||
| 
 | ||||
| 	input CLK2; | ||||
| 	input CLK3; | ||||
| 
 | ||||
| 	// write side of the memory
 | ||||
| 	input [15:0] A1ADDR; | ||||
| 	input [19:0] A1DATA; | ||||
| 	input [19:0] A1EN; | ||||
| 
 | ||||
| 	// read side of the memory
 | ||||
| 	input [15:0] B1ADDR; | ||||
| 	output [19:0] B1DATA; | ||||
| 	input [0:0] B1EN; | ||||
| 
 | ||||
| 	// unconnected signals
 | ||||
| 	wire [19:0] A_DO; | ||||
| 	wire ECC_1B_ERR, ECC_2B_ERR; | ||||
| 
 | ||||
| 	localparam INIT_CHUNK_SIZE = (CFG_DBITS <= 2) ? 256 : 320; | ||||
| 
 | ||||
| 	function [319:0] permute_init; | ||||
| 		input [INIT_CHUNK_SIZE-1:0] chunk; | ||||
| 		integer i; | ||||
| 		begin | ||||
| 			if (CFG_DBITS <= 2) begin | ||||
| 				for (i = 0; i < 64; i = i + 1) begin | ||||
| 					if (^chunk[i * 4 +: 4] === 1'bx) begin | ||||
| 						permute_init[i * 5 +: 5] = 5'b0; | ||||
| 					end | ||||
| 					else begin | ||||
| 						permute_init[i * 5 +: 5] = {1'b0, chunk[i * 4 +: 4]}; | ||||
| 					end | ||||
| 				end | ||||
| 			end else begin | ||||
| 				permute_init = chunk; | ||||
| 			end | ||||
| 		end | ||||
| 	endfunction | ||||
| 
 | ||||
| 	// internal signals
 | ||||
| 	generate | ||||
| 		wire [15:0] ADDRA; | ||||
| 		wire [15:0] ADDRB; | ||||
| 
 | ||||
| 		if (CFG_DBITS == 1) begin: blk | ||||
| 			assign ADDRA = {A1ADDR[13:5], 1'b0, A1ADDR[4:0], 1'b0}; | ||||
| 			assign ADDRB = {B1ADDR[13:5], 1'b0, B1ADDR[4:0], 1'b0}; | ||||
| 		end | ||||
| 		else if (CFG_DBITS == 2) begin: blk | ||||
| 			assign ADDRA = {A1ADDR[12:4], 1'b0, A1ADDR[3:0], 2'b0}; | ||||
| 			assign ADDRB = {B1ADDR[12:4], 1'b0, B1ADDR[3:0], 2'b0}; | ||||
| 		end | ||||
| 		else if (CFG_DBITS == 5) begin: blk | ||||
| 			assign ADDRA = {A1ADDR[11:3], 1'b0, A1ADDR[2:0], 3'b0}; | ||||
| 			assign ADDRB = {B1ADDR[11:3], 1'b0, B1ADDR[2:0], 3'b0}; | ||||
| 		end | ||||
| 		else if (CFG_DBITS == 10) begin: blk | ||||
| 			assign ADDRA = {A1ADDR[10:2], 1'b0, A1ADDR[1:0], 4'b0}; | ||||
| 			assign ADDRB = {B1ADDR[10:2], 1'b0, B1ADDR[1:0], 4'b0}; | ||||
| 		end | ||||
| 		else if (CFG_DBITS == 20) begin: blk | ||||
| 			assign ADDRA = {A1ADDR[9:1], 1'b0, A1ADDR[0], 5'b0}; | ||||
| 			assign ADDRB = {B1ADDR[9:1], 1'b0, B1ADDR[0], 5'b0}; | ||||
| 		end | ||||
| 
 | ||||
| 		CC_BRAM_20K #( | ||||
| 			`include "brams_init_20.vh" | ||||
| 			.LOC("UNPLACED"), | ||||
| 			.A_RD_WIDTH(0), .B_RD_WIDTH(CFG_DBITS), | ||||
| 			.A_WR_WIDTH(CFG_DBITS), .B_WR_WIDTH(0), | ||||
| 			.RAM_MODE("TDP"), | ||||
| 			.A_WR_MODE("NO_CHANGE"), .B_WR_MODE("NO_CHANGE"), | ||||
| 			.A_CLK_INV(!CLKPOL2), .B_CLK_INV(!CLKPOL3), | ||||
| 			.A_EN_INV(1'b0), .B_EN_INV(1'b0), | ||||
| 			.A_WE_INV(1'b0), .B_WE_INV(1'b0), | ||||
| 			.A_DO_REG(1'b0), .B_DO_REG(1'b0), | ||||
| 			.ECC_EN(1'b0) | ||||
| 		) _TECHMAP_REPLACE_ ( | ||||
| 			.A_DO(A_DO), | ||||
| 			.B_DO(B1DATA), | ||||
| 			.ECC_1B_ERR(ECC_1B_ERR), | ||||
| 			.ECC_2B_ERR(ECC_2B_ERR), | ||||
| 			.A_CLK(CLK2), | ||||
| 			.B_CLK(CLK3), | ||||
| 			.A_EN(1'b1), | ||||
| 			.B_EN(B1EN), | ||||
| 			.A_WE(1'b1), | ||||
| 			.B_WE(1'b0), | ||||
| 			.A_ADDR(ADDRA), | ||||
| 			.B_ADDR(ADDRB), | ||||
| 			.A_DI(A1DATA), | ||||
| 			.B_DI(20'b0), | ||||
| 			.A_BM(A1EN), | ||||
| 			.B_BM(20'b0) | ||||
| 		); | ||||
| 	endgenerate | ||||
| 
 | ||||
| endmodule | ||||
| 
 | ||||
| 
 | ||||
| module \$__CC_BRAM_40K_TDP (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN); | ||||
| 
 | ||||
| 	parameter CFG_ABITS = 15; | ||||
| 	parameter CFG_DBITS = 40; | ||||
| 	parameter CFG_ENABLE_A = 1; | ||||
| 	parameter CFG_ENABLE_B = 1; | ||||
| 
 | ||||
| 	parameter CLKPOL2 = 1; | ||||
| 	parameter CLKPOL3 = 1; | ||||
| 
 | ||||
| 	// 512 x 80 bit
 | ||||
| 	parameter [40959:0] INIT = 40960'b0; | ||||
| 
 | ||||
| 	input CLK2; | ||||
| 	input CLK3; | ||||
| 
 | ||||
| 	// write side of the memory
 | ||||
| 	input [15:0] A1ADDR; | ||||
| 	input [39:0] A1DATA; | ||||
| 	input [39:0] A1EN; | ||||
| 
 | ||||
| 	// read side of the memory
 | ||||
| 	input [15:0] B1ADDR; | ||||
| 	output [39:0] B1DATA; | ||||
| 	input [0:0] B1EN; | ||||
| 
 | ||||
| 	// unconnected signals
 | ||||
| 	wire [39:0] A_DO; | ||||
| 	wire A_ECC_1B_ERR, B_ECC_1B_ERR, A_ECC_2B_ERR, B_ECC_2B_ERR; | ||||
| 
 | ||||
| 	localparam INIT_CHUNK_SIZE = (CFG_DBITS <= 2) ? 256 : 320; | ||||
| 
 | ||||
| 	function [319:0] permute_init; | ||||
| 		input [INIT_CHUNK_SIZE-1:0] chunk; | ||||
| 		integer i; | ||||
| 		begin | ||||
| 			if (CFG_DBITS <= 2) begin | ||||
| 				for (i = 0; i < 64; i = i + 1) begin | ||||
| 					permute_init[i * 5 +: 5] = {1'b0, chunk[i * 4 +: 4]} & 5'b11111; | ||||
| 				end | ||||
| 			end else begin | ||||
| 				permute_init = chunk; | ||||
| 			end | ||||
| 		end | ||||
| 	endfunction | ||||
| 
 | ||||
| 	generate | ||||
| 		wire [15:0] ADDRA; | ||||
| 		wire [15:0] ADDRB; | ||||
| 
 | ||||
| 		if (CFG_DBITS == 1) begin | ||||
| 			assign ADDRA = {A1ADDR, 1'b0}; | ||||
| 			assign ADDRB = {B1ADDR, 1'b0}; | ||||
| 		end | ||||
| 		else if (CFG_DBITS == 2) begin | ||||
| 			assign ADDRA = {A1ADDR, 2'b0}; | ||||
| 			assign ADDRB = {B1ADDR, 2'b0}; | ||||
| 		end | ||||
| 		else if (CFG_DBITS == 5) begin | ||||
| 			assign ADDRA = {A1ADDR, 3'b0}; | ||||
| 			assign ADDRB = {B1ADDR, 3'b0}; | ||||
| 		end | ||||
| 		else if (CFG_DBITS == 10) begin | ||||
| 			assign ADDRA = {A1ADDR, 4'b0}; | ||||
| 			assign ADDRB = {B1ADDR, 4'b0}; | ||||
| 		end | ||||
| 		else if (CFG_DBITS == 20) begin | ||||
| 			assign ADDRA = {A1ADDR, 5'b0}; | ||||
| 			assign ADDRB = {B1ADDR, 5'b0}; | ||||
| 		end | ||||
| 		else if (CFG_DBITS == 40) begin | ||||
| 			assign ADDRA = {A1ADDR, 6'b0}; | ||||
| 			assign ADDRB = {B1ADDR, 6'b0}; | ||||
| 		end | ||||
| 
 | ||||
| 		CC_BRAM_40K #( | ||||
| 			`include "brams_init_40.vh" | ||||
| 			.LOC("UNPLACED"), | ||||
| 			.CAS("NONE"), | ||||
| 			.A_RD_WIDTH(0), .B_RD_WIDTH(CFG_DBITS), | ||||
| 			.A_WR_WIDTH(CFG_DBITS), .B_WR_WIDTH(0), | ||||
| 			.RAM_MODE("TDP"), | ||||
| 			.A_WR_MODE("NO_CHANGE"), .B_WR_MODE("NO_CHANGE"), | ||||
| 			.A_CLK_INV(!CLKPOL2), .B_CLK_INV(!CLKPOL3), | ||||
| 			.A_EN_INV(1'b0), .B_EN_INV(1'b0), | ||||
| 			.A_WE_INV(1'b0), .B_WE_INV(1'b0), | ||||
| 			.A_DO_REG(1'b0), .B_DO_REG(1'b0), | ||||
| 			.A_ECC_EN(1'b0), .B_ECC_EN(1'b0) | ||||
| 		) _TECHMAP_REPLACE_ ( | ||||
| 			.A_DO(A_DO), | ||||
| 			.B_DO(B1DATA), | ||||
| 			.A_ECC_1B_ERR(A_ECC_1B_ERR), | ||||
| 			.B_ECC_1B_ERR(B_ECC_1B_ERR), | ||||
| 			.A_ECC_2B_ERR(A_ECC_2B_ERR), | ||||
| 			.B_ECC_2B_ERR(B_ECC_2B_ERR), | ||||
| 			.A_CLK(CLK2), | ||||
| 			.B_CLK(CLK3), | ||||
| 			.A_EN(1'b1), | ||||
| 			.B_EN(B1EN), | ||||
| 			.A_WE(1'b1), | ||||
| 			.B_WE(1'b0), | ||||
| 			.A_ADDR(ADDRA), | ||||
| 			.B_ADDR(ADDRB), | ||||
| 			.A_DI(A1DATA), | ||||
| 			.B_DI(40'b0), | ||||
| 			.A_BM(A1EN), | ||||
| 			.B_BM(40'b0) | ||||
| 		); | ||||
| 	endgenerate | ||||
| 
 | ||||
| endmodule | ||||
| 
 | ||||
| 
 | ||||
| module \$__CC_BRAM_CASCADE (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN); | ||||
| 
 | ||||
| 	parameter CFG_ABITS = 16; | ||||
| 	parameter CFG_DBITS = 1; | ||||
| 	parameter CFG_ENABLE_A = 1; | ||||
| 	parameter CFG_ENABLE_B = 1; | ||||
| 
 | ||||
| 	parameter CLKPOL2 = 1; | ||||
| 	parameter CLKPOL3 = 1; | ||||
| 
 | ||||
| 	// 64K x 1
 | ||||
| 	parameter [65535:0] INIT = 65535'b0; | ||||
| 
 | ||||
| 	input CLK2; | ||||
| 	input CLK3; | ||||
| 
 | ||||
| 	// write side of the memory
 | ||||
| 	input [15:0] A1ADDR; | ||||
| 	input [39:0] A1DATA; | ||||
| 	input [39:0] A1EN; | ||||
| 
 | ||||
| 	// read side of the memory
 | ||||
| 	input [15:0] B1ADDR; | ||||
| 	output [39:0] B1DATA; | ||||
| 	input [0:0] B1EN; | ||||
| 
 | ||||
| 	// cascade signals
 | ||||
| 	wire A_CAS, B_CAS; | ||||
| 
 | ||||
| 	// unconnected signals
 | ||||
| 	wire [39:0] A_UP_DO, A_LO_DO, B_LO_DO; | ||||
| 	wire A_ECC_1B_ERR, B_ECC_1B_ERR, A_ECC_2B_ERR, B_ECC_2B_ERR; | ||||
| 
 | ||||
| 	localparam INIT_CHUNK_SIZE = 256; | ||||
| 
 | ||||
| 	function [319:0] permute_init; | ||||
| 		input [INIT_CHUNK_SIZE-1:0] chunk; | ||||
| 		integer i; | ||||
| 		begin | ||||
| 			for (i = 0; i < 64; i = i + 1) begin | ||||
| 				permute_init[i * 5 +: 5] = {1'b0, chunk[i * 4 +: 4]} & 5'b11111; | ||||
| 			end | ||||
| 		end | ||||
| 	endfunction | ||||
| 
 | ||||
| 	generate | ||||
| 		CC_BRAM_40K #( | ||||
| 			`include "brams_init_40.vh" | ||||
| 			.LOC("UNPLACED"), | ||||
| 			.CAS("UPPER"), | ||||
| 			.A_RD_WIDTH(0), .B_RD_WIDTH(CFG_DBITS), | ||||
| 			.A_WR_WIDTH(CFG_DBITS), .B_WR_WIDTH(0), | ||||
| 			.RAM_MODE("TDP"), | ||||
| 			.A_WR_MODE("NO_CHANGE"), .B_WR_MODE("NO_CHANGE"), | ||||
| 			.A_CLK_INV(!CLKPOL2), .B_CLK_INV(!CLKPOL3), | ||||
| 			.A_EN_INV(1'b0), .B_EN_INV(1'b0), | ||||
| 			.A_WE_INV(1'b0), .B_WE_INV(1'b0), | ||||
| 			.A_DO_REG(1'b0), .B_DO_REG(1'b0), | ||||
| 			.A_ECC_EN(1'b0), .B_ECC_EN(1'b0) | ||||
| 		) upper_cell ( | ||||
| 			.A_CI(A_CAS), | ||||
| 			.B_CI(B_CAS), | ||||
| 			.A_DO(A_UP_DO), | ||||
| 			.B_DO(B1DATA), | ||||
| 			.A_ECC_1B_ERR(A_ECC_1B_ERR), | ||||
| 			.B_ECC_1B_ERR(B_ECC_1B_ERR), | ||||
| 			.A_ECC_2B_ERR(A_ECC_2B_ERR), | ||||
| 			.B_ECC_2B_ERR(B_ECC_2B_ERR), | ||||
| 			.A_CLK(CLK2), | ||||
| 			.B_CLK(CLK3), | ||||
| 			.A_EN(1'b1), | ||||
| 			.B_EN(B1EN), | ||||
| 			.A_WE(1'b1), | ||||
| 			.B_WE(1'b0), | ||||
| 			.A_ADDR(A1ADDR), | ||||
| 			.B_ADDR(B1ADDR), | ||||
| 			.A_DI(A1DATA), | ||||
| 			.B_DI(40'b0), | ||||
| 			.A_BM(A1EN), | ||||
| 			.B_BM(40'b0) | ||||
| 		); | ||||
| 
 | ||||
| 		CC_BRAM_40K #( | ||||
| 			`include "brams_init_40.vh" | ||||
| 			.LOC("UNPLACED"), | ||||
| 			.CAS("LOWER"), | ||||
| 			.A_RD_WIDTH(0), .B_RD_WIDTH(CFG_DBITS), | ||||
| 			.A_WR_WIDTH(CFG_DBITS), .B_WR_WIDTH(0), | ||||
| 			.RAM_MODE("TDP"), | ||||
| 			.A_WR_MODE("NO_CHANGE"), .B_WR_MODE("NO_CHANGE"), | ||||
| 			.A_CLK_INV(!CLKPOL2), .B_CLK_INV(!CLKPOL3), | ||||
| 			.A_EN_INV(1'b0), .B_EN_INV(1'b0), | ||||
| 			.A_WE_INV(1'b0), .B_WE_INV(1'b0), | ||||
| 			.A_DO_REG(1'b0), .B_DO_REG(1'b0), | ||||
| 			.A_ECC_EN(1'b0), .B_ECC_EN(1'b0) | ||||
| 		) lower_cell ( | ||||
| 			.A_CI(1'b1), | ||||
| 			.B_CI(), | ||||
| 			.A_CO(A_CAS), | ||||
| 			.B_CO(B_CAS), | ||||
| 			.A_CLK(CLK2), | ||||
| 			.B_CLK(CLK3), | ||||
| 			.A_EN(1'b1), | ||||
| 			.B_EN(B1EN), | ||||
| 			.A_WE(1'b1), | ||||
| 			.B_WE(1'b0), | ||||
| 			.A_ADDR(A1ADDR), | ||||
| 			.B_ADDR(B1ADDR), | ||||
| 			.A_DI(A1DATA), | ||||
| 			.B_DI(40'b0), | ||||
| 			.A_BM(A1EN), | ||||
| 			.B_BM(40'b0) | ||||
| 		); | ||||
| 	endgenerate | ||||
| 
 | ||||
| endmodule | ||||
							
								
								
									
										124
									
								
								techlibs/gatemate/cells_bb.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								techlibs/gatemate/cells_bb.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,124 @@ | |||
| /* | ||||
|  *  yosys -- Yosys Open SYnthesis Suite | ||||
|  * | ||||
|  *  Copyright (C) 2021  Cologne Chip AG <support@colognechip.com> | ||||
|  * | ||||
|  *  Permission to use, copy, modify, and/or distribute this software for any | ||||
|  *  purpose with or without fee is hereby granted, provided that the above | ||||
|  *  copyright notice and this permission notice appear in all copies. | ||||
|  * | ||||
|  *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||||
|  *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| (* blackbox *) | ||||
| module CC_PLL #( | ||||
| 	parameter REF_CLK = "", // e.g. "10.0"
 | ||||
| 	parameter OUT_CLK = "", // e.g. "50.0"
 | ||||
| 	parameter PERF_MD = "", // LOWPOWER, ECONOMY, SPEED
 | ||||
| 	parameter LOW_JITTER = 1, | ||||
| 	parameter CI_FILTER_CONST = 2, | ||||
| 	parameter CP_FILTER_CONST = 4 | ||||
| )( | ||||
| 	input  CLK_REF, CLK_FEEDBACK, USR_CLK_REF, | ||||
| 	input  USR_LOCKED_STDY_RST, | ||||
| 	output USR_PLL_LOCKED_STDY, USR_PLL_LOCKED, | ||||
| 	output CLK270, CLK180, CLK90, CLK0, CLK_REF_OUT | ||||
| ); | ||||
| endmodule | ||||
| 
 | ||||
| (* blackbox *) | ||||
| module CC_PLL_ADV #( | ||||
| 	parameter [95:0] PLL_CFG_A = 96'bx, | ||||
| 	parameter [95:0] PLL_CFG_B = 96'bx | ||||
| )( | ||||
| 	input  CLK_REF, CLK_FEEDBACK, USR_CLK_REF, | ||||
| 	input  USR_LOCKED_STDY_RST, USR_SEL_A_B, | ||||
| 	output USR_PLL_LOCKED_STDY, USR_PLL_LOCKED, | ||||
| 	output CLK270, CLK180, CLK90, CLK0, CLK_REF_OUT | ||||
| ); | ||||
| endmodule | ||||
| 
 | ||||
| (* blackbox *) | ||||
| module CC_SERDES #( | ||||
| 	parameter SERDES_CFG = "" | ||||
| )( | ||||
| 	input [63:0] TX_DATA_I, | ||||
| 	input TX_RESET_I, | ||||
| 	input TX_PCS_RESET_I, | ||||
| 	input TX_PMA_RESET_I, | ||||
| 	input PLL_RESET_I, | ||||
| 	input TX_POWERDOWN_N_I, | ||||
| 	input TX_POLARITY_I, | ||||
| 	input [2:0] TX_PRBS_SEL_I, | ||||
| 	input TX_PRBS_FORCE_ERR_I, | ||||
| 	input TX_8B10B_EN_I, | ||||
| 	input [7:0] TX_8B10B_BYPASS_I, | ||||
| 	input [7:0] TX_CHAR_IS_K_I, | ||||
| 	input [7:0] TX_CHAR_DISPMODE_I, | ||||
| 	input [7:0] TX_CHAR_DISPVAL_I, | ||||
| 	input TX_ELEC_IDLE_I, | ||||
| 	input TX_DETECT_RX_I, | ||||
| 	input [2:0] LOOPBACK_I, | ||||
| 	input CLK_CORE_TX_I, | ||||
| 	input CLK_CORE_RX_I, | ||||
| 	input RX_RESET_I, | ||||
| 	input RX_PMA_RESET_I, | ||||
| 	input RX_EQA_RESET_I, | ||||
| 	input RX_CDR_RESET_I, | ||||
| 	input RX_PCS_RESET_I, | ||||
| 	input RX_BUF_RESET_I, | ||||
| 	input RX_POWERDOWN_N_I, | ||||
| 	input RX_POLARITY_I, | ||||
| 	input [2:0] RX_PRBS_SEL_I, | ||||
| 	input RX_PRBS_CNT_RESET_I, | ||||
| 	input RX_8B10B_EN_I, | ||||
| 	input [7:0] RX_8B10B_BYPASS_I, | ||||
| 	input RX_EN_EI_DETECTOR_I, | ||||
| 	input RX_COMMA_DETECT_EN_I, | ||||
| 	input RX_SLIDE_I, | ||||
| 	input RX_MCOMMA_ALIGN_I, | ||||
| 	input RX_PCOMMA_ALIGN_I, | ||||
| 	input CLK_REG_I, | ||||
| 	input REGFILE_WE_I, | ||||
| 	input REGFILE_EN_I, | ||||
| 	input [7:0] REGFILE_ADDR_I, | ||||
| 	input [15:0] REGFILE_DI_I, | ||||
| 	input [15:0] REGFILE_MASK_I, | ||||
| 	output [63:0] RX_DATA_O, | ||||
| 	output [7:0] RX_NOT_IN_TABLE_O, | ||||
| 	output [7:0] RX_CHAR_IS_COMMA_O, | ||||
| 	output [7:0] RX_CHAR_IS_K_O, | ||||
| 	output [7:0] RX_DISP_ERR_O, | ||||
| 	output RX_DETECT_DONE_O, | ||||
| 	output RX_PRESENT_O, | ||||
| 	output TX_BUF_ERR_O, | ||||
| 	output TX_RESETDONE_O, | ||||
| 	output RX_PRBS_ERR_O, | ||||
| 	output RX_BUF_ERR_O, | ||||
| 	output RX_BYTE_IS_ALIGNED_O, | ||||
| 	output RX_BYTE_REALIGN_O, | ||||
| 	output RX_RESETDONE_O, | ||||
| 	output RX_EI_EN_O, | ||||
| 	output CLK_CORE_RX_O, | ||||
| 	output CLK_CORE_PLL_O, | ||||
| 	output [15:0] REGFILE_DO_O, | ||||
| 	output REGFILE_RDY_O | ||||
| ); | ||||
| endmodule | ||||
| 
 | ||||
| (* blackbox *) (* keep *) | ||||
| module CC_CFG_CTRL( | ||||
| 	input [7:0] DATA, | ||||
| 	input CLK, | ||||
| 	input EN, | ||||
| 	input RECFG, | ||||
| 	input VALID | ||||
| ); | ||||
| endmodule | ||||
							
								
								
									
										1574
									
								
								techlibs/gatemate/cells_sim.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1574
									
								
								techlibs/gatemate/cells_sim.v
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										150
									
								
								techlibs/gatemate/gatemate_bramopt.cc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										150
									
								
								techlibs/gatemate/gatemate_bramopt.cc
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,150 @@ | |||
| /*
 | ||||
|  *  yosys -- Yosys Open SYnthesis Suite | ||||
|  * | ||||
|  *  Copyright (C) 2021  Cologne Chip AG <support@colognechip.com> | ||||
|  * | ||||
|  *  Permission to use, copy, modify, and/or distribute this software for any | ||||
|  *  purpose with or without fee is hereby granted, provided that the above | ||||
|  *  copyright notice and this permission notice appear in all copies. | ||||
|  * | ||||
|  *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||||
|  *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| #include "kernel/yosys.h" | ||||
| #include "kernel/sigtools.h" | ||||
| 
 | ||||
| USING_YOSYS_NAMESPACE | ||||
| PRIVATE_NAMESPACE_BEGIN | ||||
| 
 | ||||
| bool binary_pred(SigBit s1, SigBit s2) | ||||
| { | ||||
| 	return s1 == s2; | ||||
| } | ||||
| 
 | ||||
| static void proc_glwren(Module *module) | ||||
| { | ||||
| 	std::vector<Cell*> ram_cells; | ||||
| 
 | ||||
| 	// Gather RAM cells
 | ||||
| 	for (auto cell : module->cells()) | ||||
| 	{ | ||||
| 		if (cell->type.in(ID(CC_DPSRAM_20K), ID(CC_DPSRAM_40K))) { | ||||
| 			ram_cells.push_back(cell); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// Convert bitmask signals
 | ||||
| 	for (auto cell : ram_cells) | ||||
| 	{ | ||||
| 		std::vector<SigBit> mska = cell->getPort(ID(A_BM)).to_sigbit_vector(); | ||||
| 		std::vector<SigBit> mskb = cell->getPort(ID(B_BM)).to_sigbit_vector(); | ||||
| 
 | ||||
| 		// Remove State::S0 from vectors
 | ||||
| 		mska.erase(std::remove_if(mska.begin(), mska.end(), [](const SigBit & sb){return (sb == State::S0);}), mska.end()); | ||||
| 		mskb.erase(std::remove_if(mskb.begin(), mskb.end(), [](const SigBit & sb){return (sb == State::S0);}), mskb.end()); | ||||
| 
 | ||||
| 		if (mska.size() + mskb.size() == 0) { | ||||
| 			break; | ||||
| 		} | ||||
| 
 | ||||
| 		if (cell->getParam(ID(RAM_MODE)).decode_string() == "SDP") | ||||
| 		{ | ||||
| 			std::vector<SigBit> msk; | ||||
| 			msk.insert(msk.end(), mska.begin(), mska.end()); | ||||
| 			msk.insert(msk.end(), mskb.begin(), mskb.end()); | ||||
| 
 | ||||
| 			if (std::equal(msk.begin() + 1, msk.end(), msk.begin(), binary_pred)) | ||||
| 			{ | ||||
| 				if ((cell->getPort(ID(A_WE)) == State::S1) && (cell->getPort(ID(B_WE)) == State::S0)) | ||||
| 				{ | ||||
| 					cell->setPort(ID(A_WE), msk[0]); | ||||
| 					cell->setPort(ID(B_WE), Const(0, 1)); | ||||
| 					// Set bitmask bits to _1_
 | ||||
| 					cell->setPort(ID(A_BM), Const(State::S1, mska.size())); | ||||
| 					cell->setPort(ID(B_BM), Const(State::S1, mskb.size())); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		else // RAM_MODE == "TDP"
 | ||||
| 		{ | ||||
| 			if (std::equal(mska.begin() + 1, mska.end(), mska.begin(), binary_pred)) | ||||
| 			{ | ||||
| 				if (cell->getPort(ID(A_WE)) == State::S1) | ||||
| 				{ | ||||
| 					// Signals are all equal
 | ||||
| 					cell->setPort(ID(A_WE), mska[0]); | ||||
| 					cell->setPort(ID(A_BM), Const(State::S1, mska.size())); | ||||
| 				} | ||||
| 			} | ||||
| 			if (std::equal(mskb.begin() + 1, mskb.end(), mskb.begin(), binary_pred)) | ||||
| 			{ | ||||
| 				if (cell->getPort(ID(B_WE)) == State::S1) | ||||
| 				{ | ||||
| 					cell->setPort(ID(B_WE), mskb[0]); | ||||
| 					// Set bitmask bits to _1_
 | ||||
| 					cell->setPort(ID(B_BM), Const(State::S1, mskb.size())); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| struct GateMateBramOptPass : public Pass { | ||||
| 	GateMateBramOptPass() : Pass("gatemate_bramopt", "GateMate: optimize block RAM cells") { } | ||||
| 	void help() override | ||||
| 	{ | ||||
| 		//   |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
 | ||||
| 		log("\n"); | ||||
| 		log("    gatemate_bramopt [options] [selection]\n"); | ||||
| 		log("\n"); | ||||
| 		log("This pass processes all CC_BRAM_20K and CC_BRAM_40K cells and tries to"); | ||||
| 		log("convert its enable bitmask wires to a single global enable signal."); | ||||
| 		log("\n"); | ||||
| 		log("    -noglwren\n"); | ||||
| 		log("        do not convert bitmasks to single global write enable signals.\n"); | ||||
| 		log("\n"); | ||||
| 	} | ||||
| 
 | ||||
| 	bool noglwren; | ||||
| 
 | ||||
| 	void clear_flags() override | ||||
| 	{ | ||||
| 		noglwren = false; | ||||
| 	} | ||||
| 
 | ||||
| 	void execute(std::vector<std::string> args, RTLIL::Design *design) override | ||||
| 	{ | ||||
| 		log_header(design, "Executing GATEMATE_BRAMOPT pass (optimize block RAM).\n"); | ||||
| 
 | ||||
| 		size_t argidx; | ||||
| 		for (argidx = 1; argidx < args.size(); argidx++) | ||||
| 		{ | ||||
| 			if (args[argidx] == "-noglwren") { | ||||
| 				noglwren = true; | ||||
| 				continue; | ||||
| 			} | ||||
| 			break; | ||||
| 		} | ||||
| 		extra_args(args, argidx, design); | ||||
| 
 | ||||
| 		Module *module = design->top_module(); | ||||
| 
 | ||||
| 		if (module == nullptr) | ||||
| 		{ | ||||
| 			log_cmd_error("No top module found.\n"); | ||||
| 		} | ||||
| 
 | ||||
| 		if (!noglwren) { | ||||
| 			proc_glwren(module); | ||||
| 		} | ||||
| 	} | ||||
| } GateMateBramOptPass; | ||||
| 
 | ||||
| PRIVATE_NAMESPACE_END | ||||
							
								
								
									
										88
									
								
								techlibs/gatemate/iob_map.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								techlibs/gatemate/iob_map.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,88 @@ | |||
| /* | ||||
|  *  yosys -- Yosys Open SYnthesis Suite | ||||
|  * | ||||
|  *  Copyright (C) 2021  Cologne Chip AG <support@colognechip.com> | ||||
|  * | ||||
|  *  Permission to use, copy, modify, and/or distribute this software for any | ||||
|  *  purpose with or without fee is hereby granted, provided that the above | ||||
|  *  copyright notice and this permission notice appear in all copies. | ||||
|  * | ||||
|  *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||||
|  *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| module \$__inpad (input I, output Y); | ||||
| 	CC_IBUF /*#( | ||||
| 		.PIN_NAME("UNPLACED"), | ||||
| 		.V_IO("UNDEFINED"), | ||||
| 		.PULLUP(1'bx), | ||||
| 		.PULLDOWN(1'bx), | ||||
| 		.KEEPER(1'bx), | ||||
| 		.SCHMITT_TRIGGER(1'bx), | ||||
| 		.DELAY_IBF(4'bx), | ||||
| 		.FF_IBF(1'bx) | ||||
| 	)*/ _TECHMAP_REPLACE_ ( | ||||
| 		.I(I), | ||||
| 		.Y(Y) | ||||
| 	); | ||||
| endmodule | ||||
| 
 | ||||
| module \$__outpad (input A, output O); | ||||
| 	CC_OBUF /*#( | ||||
| 		.PIN_NAME("UNPLACED"), | ||||
| 		.V_IO("UNDEFINED"), | ||||
| 		.SLEW("UNDEFINED"), | ||||
| 		.DRIVE(1'bx), | ||||
| 		.DELAY_OBF(4'bx), | ||||
| 		.FF_OBF(1'bx) | ||||
| 	)*/ _TECHMAP_REPLACE_ ( | ||||
| 		.A(A), | ||||
| 		.O(O) | ||||
| 	); | ||||
| endmodule | ||||
| 
 | ||||
| module \$__toutpad (input A, input OE, output O); | ||||
| 	CC_TOBUF /*#( | ||||
| 		.PIN_NAME("UNPLACED"), | ||||
| 		.V_IO("UNDEFINED"), | ||||
| 		.SLEW("UNDEFINED"), | ||||
| 		.DRIVE(1'bx), | ||||
| 		.PULLUP(1'bx), | ||||
| 		.PULLDOWN(1'bx), | ||||
| 		.KEEPER(1'bx), | ||||
| 		.DELAY_OBF(4'bx), | ||||
| 		.FF_OBF(1'bx) | ||||
| 	)*/ _TECHMAP_REPLACE_ ( | ||||
| 		.A(A), | ||||
| 		.T(~OE), | ||||
| 		.O(O) | ||||
| 	); | ||||
| endmodule | ||||
| 
 | ||||
| module \$__tinoutpad (input A, input OE, inout IO, output Y); | ||||
| 	CC_IOBUF /*#( | ||||
| 		.PIN_NAME("UNPLACED"), | ||||
| 		.V_IO("UNDEFINED"), | ||||
| 		.SLEW("UNDEFINED"), | ||||
| 		.DRIVE(1'bx), | ||||
| 		.PULLUP(1'bx), | ||||
| 		.PULLDOWN(1'bx), | ||||
| 		.KEEPER(1'bx), | ||||
| 		.SCHMITT_TRIGGER(1'bx), | ||||
| 		.DELAY_IBF(4'bx), | ||||
| 		.DELAY_OBF(4'bx), | ||||
| 		.FF_IBF(1'bx), | ||||
| 		.FF_OBF(1'bx) | ||||
| 	)*/ _TECHMAP_REPLACE_ ( | ||||
| 		.A(A), | ||||
| 		.T(~OE), | ||||
| 		.IO(IO), | ||||
| 		.Y(Y) | ||||
| 	); | ||||
| endmodule | ||||
							
								
								
									
										45
									
								
								techlibs/gatemate/lut_map.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								techlibs/gatemate/lut_map.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,45 @@ | |||
| /* | ||||
|  *  yosys -- Yosys Open SYnthesis Suite | ||||
|  * | ||||
|  *  Copyright (C) 2021  Cologne Chip AG <support@colognechip.com> | ||||
|  * | ||||
|  *  Permission to use, copy, modify, and/or distribute this software for any | ||||
|  *  purpose with or without fee is hereby granted, provided that the above | ||||
|  *  copyright notice and this permission notice appear in all copies. | ||||
|  * | ||||
|  *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||||
|  *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| module \$lut (A, Y); | ||||
| 	parameter WIDTH = 0; | ||||
| 	parameter LUT = 0; | ||||
| 
 | ||||
| 	(* force_downto *) | ||||
| 	input [WIDTH-1:0] A; | ||||
| 	output Y; | ||||
| 
 | ||||
| 	generate | ||||
| 		if (WIDTH == 1) begin | ||||
| 			CC_LUT1 #(.INIT(LUT)) _TECHMAP_REPLACE_ (.O(Y), .I0(A[0])); | ||||
| 		end | ||||
| 		else if (WIDTH == 2) begin | ||||
| 			CC_LUT2 #(.INIT(LUT)) _TECHMAP_REPLACE_ (.O(Y), .I0(A[0]), .I1(A[1])); | ||||
| 		end | ||||
| 		else if (WIDTH == 3) begin | ||||
| 			CC_LUT3 #(.INIT(LUT)) _TECHMAP_REPLACE_ (.O(Y), .I0(A[0]), .I1(A[1]), .I2(A[2])); | ||||
| 		end | ||||
| 		else if (WIDTH == 4) begin | ||||
| 			CC_LUT4 #(.INIT(LUT)) _TECHMAP_REPLACE_ (.O(Y), .I0(A[0]), .I1(A[1]), .I2(A[2]), .I3(A[3])); | ||||
| 		end | ||||
| 		else begin | ||||
| 			wire _TECHMAP_FAIL_ = 1; | ||||
| 		end | ||||
| 	endgenerate | ||||
| endmodule | ||||
							
								
								
									
										79
									
								
								techlibs/gatemate/mul_map.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								techlibs/gatemate/mul_map.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,79 @@ | |||
| /* | ||||
|  *  yosys -- Yosys Open SYnthesis Suite | ||||
|  * | ||||
|  *  Copyright (C) 2021  Cologne Chip AG <support@colognechip.com> | ||||
|  * | ||||
|  *  Permission to use, copy, modify, and/or distribute this software for any | ||||
|  *  purpose with or without fee is hereby granted, provided that the above | ||||
|  *  copyright notice and this permission notice appear in all copies. | ||||
|  * | ||||
|  *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||||
|  *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| `define MAX(a,b) (a > b ? a : b) | ||||
| `define MIN(a,b) (a < b ? a : b) | ||||
| 
 | ||||
| (* techmap_celltype = "$mul $__mul" *) | ||||
| module \$__MULMXN (A, B, Y); | ||||
| 
 | ||||
| 	parameter A_SIGNED = 0; | ||||
| 	parameter B_SIGNED = 0; | ||||
| 	parameter A_WIDTH = 1; | ||||
| 	parameter B_WIDTH = 1; | ||||
| 	parameter Y_WIDTH = 1; | ||||
| 
 | ||||
| 	(* force_downto *) | ||||
| 	input [A_WIDTH-1:0] A; | ||||
| 	(* force_downto *) | ||||
| 	input [B_WIDTH-1:0] B; | ||||
| 	(* force_downto *) | ||||
| 	output [Y_WIDTH-1:0] Y; | ||||
| 
 | ||||
| 	localparam MAXWIDTH = `MAX(A_WIDTH, B_WIDTH) + ((A_SIGNED || B_SIGNED) ? 0 : 1); | ||||
| 
 | ||||
| 	generate | ||||
| 		if (A_SIGNED) begin: blkA | ||||
| 			wire signed [MAXWIDTH-1:0] Aext = $signed(A); | ||||
| 		end | ||||
| 		else begin: blkA | ||||
| 			wire [MAXWIDTH-1:0] Aext = A; | ||||
| 		end | ||||
| 		if (B_SIGNED) begin: blkB | ||||
| 			wire signed [MAXWIDTH-1:0] Bext = $signed(B); | ||||
| 		end | ||||
| 		else begin: blkB | ||||
| 			wire [MAXWIDTH-1:0] Bext = B; | ||||
| 		end | ||||
| 
 | ||||
| 		if (A_WIDTH >= B_WIDTH) begin | ||||
| 			CC_MULT #( | ||||
| 				.A_WIDTH(MAXWIDTH), | ||||
| 				.B_WIDTH(MAXWIDTH), | ||||
| 				.P_WIDTH(`MIN(Y_WIDTH,MAXWIDTH+MAXWIDTH)), | ||||
| 			) _TECHMAP_REPLACE_ ( | ||||
| 				.A(blkA.Aext), | ||||
| 				.B(blkB.Bext), | ||||
| 				.P(Y) | ||||
| 			); | ||||
| 		end | ||||
| 		else begin // swap A,B
 | ||||
| 			CC_MULT #( | ||||
| 				.A_WIDTH(MAXWIDTH), | ||||
| 				.B_WIDTH(MAXWIDTH), | ||||
| 				.P_WIDTH(`MIN(Y_WIDTH,MAXWIDTH+MAXWIDTH)), | ||||
| 			) _TECHMAP_REPLACE_ ( | ||||
| 				.A(blkB.Bext), | ||||
| 				.B(blkA.Aext), | ||||
| 				.P(Y) | ||||
| 			); | ||||
| 		end | ||||
| 	endgenerate | ||||
| 
 | ||||
| endmodule | ||||
							
								
								
									
										56
									
								
								techlibs/gatemate/mux_map.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								techlibs/gatemate/mux_map.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,56 @@ | |||
| /* | ||||
|  *  yosys -- Yosys Open SYnthesis Suite | ||||
|  * | ||||
|  *  Copyright (C) 2021  Cologne Chip AG <support@colognechip.com> | ||||
|  * | ||||
|  *  Permission to use, copy, modify, and/or distribute this software for any | ||||
|  *  purpose with or without fee is hereby granted, provided that the above | ||||
|  *  copyright notice and this permission notice appear in all copies. | ||||
|  * | ||||
|  *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||||
|  *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| module \$_MUX8_ (A, B, C, D, E, F, G, H, S, T, U, Y); | ||||
| 	input  A, B, C, D, E, F, G, H, S, T, U; | ||||
| 	output Y; | ||||
| 
 | ||||
| 	CC_MX8 _TECHMAP_REPLACE_ ( | ||||
| 		.D0(A), .D1(B), .D2(C), .D3(D), | ||||
| 		.D4(E), .D5(F), .D6(G), .D7(H), | ||||
| 		.S0(S), .S1(T), .S2(U), | ||||
| 		.Y(Y) | ||||
| 	); | ||||
| 
 | ||||
| endmodule | ||||
| 
 | ||||
| module \$_MUX4_ (A, B, C, D, S, T, Y); | ||||
| 	input  A, B, C, D, S, T; | ||||
| 	output Y; | ||||
| 
 | ||||
| 	CC_MX4 _TECHMAP_REPLACE_ ( | ||||
| 		.D0(A), .D1(B), .D2(C), .D3(D), | ||||
| 		.S0(S), .S1(T), | ||||
| 		.Y(Y) | ||||
| 	); | ||||
| 
 | ||||
| endmodule | ||||
| 
 | ||||
| /* | ||||
| module \$_MUX_ (A, B, S, Y); | ||||
| 	input  A, B, S; | ||||
| 	output Y; | ||||
| 
 | ||||
| 	CC_MX2 _TECHMAP_REPLACE_ ( | ||||
| 		.D0(A), .D1(B), .S0(S), | ||||
| 		.Y(Y) | ||||
| 	); | ||||
| 
 | ||||
| endmodule | ||||
| */ | ||||
							
								
								
									
										108
									
								
								techlibs/gatemate/reg_map.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								techlibs/gatemate/reg_map.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,108 @@ | |||
| /* | ||||
|  *  yosys -- Yosys Open SYnthesis Suite | ||||
|  * | ||||
|  *  Copyright (C) 2021  Cologne Chip AG <support@colognechip.com> | ||||
|  * | ||||
|  *  Permission to use, copy, modify, and/or distribute this software for any | ||||
|  *  purpose with or without fee is hereby granted, provided that the above | ||||
|  *  copyright notice and this permission notice appear in all copies. | ||||
|  * | ||||
|  *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||||
|  *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| (* techmap_celltype = "$_DFF_[NP]_" *) | ||||
| module \$_DFF_x_ (input D, C, output Q); | ||||
| 
 | ||||
| 	parameter _TECHMAP_CELLTYPE_ = ""; | ||||
| 
 | ||||
| 	CC_DFF #( | ||||
| 		.CLK_INV((_TECHMAP_CELLTYPE_[15:8] == "N")), | ||||
| 		.EN_INV(1'b0), | ||||
| 		.SR_INV(1'b0), | ||||
| 		.SR_VAL(1'b0) | ||||
| 	) _TECHMAP_REPLACE_ (.D(D), .EN(1'b1), .CLK(C), .SR(1'b0), .Q(Q)); | ||||
| 
 | ||||
| 	wire _TECHMAP_REMOVEINIT_Q_ = 1'b1; | ||||
| 
 | ||||
| endmodule | ||||
| 
 | ||||
| (* techmap_celltype = "$_DFF_[NP][NP][01]_" *) | ||||
| module \$_DFF_xxx_ (input D, C, R, output Q); | ||||
| 
 | ||||
| 	parameter _TECHMAP_CELLTYPE_ = ""; | ||||
| 
 | ||||
| 	CC_DFF #( | ||||
| 		.CLK_INV(_TECHMAP_CELLTYPE_[31:24] == "N"), | ||||
| 		.EN_INV(1'b0), | ||||
| 		.SR_INV(_TECHMAP_CELLTYPE_[23:16] == "N"), | ||||
| 		.SR_VAL(_TECHMAP_CELLTYPE_[15:8] == "1") | ||||
| 	) _TECHMAP_REPLACE_ (.D(D), .EN(1'b1), .CLK(C), .SR(R), .Q(Q)); | ||||
| 
 | ||||
| 	wire _TECHMAP_REMOVEINIT_Q_ = 1'b1; | ||||
| 
 | ||||
| endmodule | ||||
| 
 | ||||
| (* techmap_celltype = "$_DFFE_[NP][NP]_" *) | ||||
| module \$_DFFE_xx_ (input D, C, E, output Q); | ||||
| 
 | ||||
| 	parameter _TECHMAP_CELLTYPE_ = ""; | ||||
| 
 | ||||
| 	CC_DFF #( | ||||
| 		.CLK_INV(_TECHMAP_CELLTYPE_[23:16] == "N"), | ||||
| 		.EN_INV(_TECHMAP_CELLTYPE_[15:8] == "N"), | ||||
| 		.SR_INV(1'b0), | ||||
| 		.SR_VAL(1'b0) | ||||
| 	) _TECHMAP_REPLACE_ (.D(D), .EN(E), .CLK(C), .SR(1'b0), .Q(Q)); | ||||
| 
 | ||||
| 	wire _TECHMAP_REMOVEINIT_Q_ = 1'b1; | ||||
| 
 | ||||
| endmodule | ||||
| 
 | ||||
| (* techmap_celltype = "$_DFFE_[NP][NP][01][NP]_" *) | ||||
| module \$_DFFE_xxxx_ (input D, C, R, E, output Q); | ||||
| 
 | ||||
| 	parameter _TECHMAP_CELLTYPE_ = ""; | ||||
| 
 | ||||
| 	CC_DFF #( | ||||
| 		.CLK_INV(_TECHMAP_CELLTYPE_[39:32] == "N"), | ||||
| 		.EN_INV(_TECHMAP_CELLTYPE_[15:8] == "N"), | ||||
| 		.SR_INV(_TECHMAP_CELLTYPE_[31:24] == "N"), | ||||
| 		.SR_VAL(_TECHMAP_CELLTYPE_[23:16] == "1") | ||||
| 	) _TECHMAP_REPLACE_ (.D(D), .EN(E), .CLK(C), .SR(R), .Q(Q)); | ||||
| 
 | ||||
| 	wire _TECHMAP_REMOVEINIT_Q_ = 1'b1; | ||||
| 
 | ||||
| endmodule | ||||
| 
 | ||||
| (* techmap_celltype = "$_DLATCH_[NP]_" *) | ||||
| module \$_DLATCH_x_ (input E, D, output Q); | ||||
| 
 | ||||
| 	parameter _TECHMAP_CELLTYPE_ = ""; | ||||
| 
 | ||||
| 	CC_DLT #( | ||||
| 		.G_INV(_TECHMAP_CELLTYPE_[15:8] == "N"), | ||||
| 		.SR_INV(1'b0), | ||||
| 		.SR_VAL(1'b0) | ||||
| 	) _TECHMAP_REPLACE_ (.D(D), .G(E), .SR(1'b0), .Q(Q)); | ||||
| 
 | ||||
| endmodule | ||||
| 
 | ||||
| (* techmap_celltype = "$_DLATCH_[NP][NP][01]_" *) | ||||
| module \$_DLATCH_xxx_ (input E, R, D, output Q); | ||||
| 
 | ||||
| 	parameter _TECHMAP_CELLTYPE_ = ""; | ||||
| 
 | ||||
| 	CC_DLT #( | ||||
| 		.G_INV(_TECHMAP_CELLTYPE_[31:24] == "N"), | ||||
| 		.SR_INV(_TECHMAP_CELLTYPE_[23:16] == "N"), | ||||
| 		.SR_VAL(_TECHMAP_CELLTYPE_[15:8] == "1") | ||||
| 	) _TECHMAP_REPLACE_ (.D(D), .G(E), .SR(R), .Q(Q)); | ||||
| 
 | ||||
| endmodule | ||||
							
								
								
									
										396
									
								
								techlibs/gatemate/synth_gatemate.cc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										396
									
								
								techlibs/gatemate/synth_gatemate.cc
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,396 @@ | |||
| /*
 | ||||
|  *  yosys -- Yosys Open SYnthesis Suite | ||||
|  * | ||||
|  *  Copyright (C) 2021  Cologne Chip AG <support@colognechip.com> | ||||
|  * | ||||
|  *  Permission to use, copy, modify, and/or distribute this software for any | ||||
|  *  purpose with or without fee is hereby granted, provided that the above | ||||
|  *  copyright notice and this permission notice appear in all copies. | ||||
|  * | ||||
|  *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||||
|  *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| #include "kernel/register.h" | ||||
| #include "kernel/celltypes.h" | ||||
| #include "kernel/rtlil.h" | ||||
| #include "kernel/log.h" | ||||
| 
 | ||||
| USING_YOSYS_NAMESPACE | ||||
| PRIVATE_NAMESPACE_BEGIN | ||||
| 
 | ||||
| struct SynthGateMatePass : public ScriptPass | ||||
| { | ||||
| 	SynthGateMatePass() : ScriptPass("synth_gatemate", "synthesis for Cologne Chip GateMate FPGAs") { } | ||||
| 
 | ||||
| 	void help() override | ||||
| 	{ | ||||
| 		//   |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
 | ||||
| 		log("\n"); | ||||
| 		log("    synth_gatemate [options]\n"); | ||||
| 		log("\n"); | ||||
| 		log("This command runs synthesis for Cologne Chip AG GateMate FPGAs.\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -top <module>\n"); | ||||
| 		log("        use the specified module as top module.\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -vlog <file>\n"); | ||||
| 		log("        write the design to the specified verilog file. Writing of an output\n"); | ||||
| 		log("        file is omitted if this parameter is not specified.\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -blif <file>\n"); | ||||
| 		log("        write the design to the specified BLIF file. Writing of an output file\n"); | ||||
| 		log("        is omitted if this parameter is not specified.\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -edif <file>\n"); | ||||
| 		log("        write the design to the specified EDIF file. Writing of an output file\n"); | ||||
| 		log("        is omitted if this parameter is not specified.\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -json <file>\n"); | ||||
| 		log("        write the design to the specified JSON file. Writing of an output file\n"); | ||||
| 		log("        is omitted if this parameter is not specified.\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -run <from_label>:<to_label>\n"); | ||||
| 		log("        only run the commands between the labels (see below). An empty\n"); | ||||
| 		log("        from label is synonymous to 'begin', and empty to label is\n"); | ||||
| 		log("        synonymous to the end of the command list.\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -noflatten\n"); | ||||
| 		log("        do not flatten design before synthesis.\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -nobram\n"); | ||||
| 		log("        do not use CC_BRAM_20K or CC_BRAM_40K cells in output netlist.\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -noaddf\n"); | ||||
| 		log("        do not use CC_ADDF full adder cells in output netlist.\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -nomult\n"); | ||||
| 		log("        do not use CC_MULT multiplier cells in output netlist.\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -nomx8, -nomx4\n"); | ||||
| 		log("        do not use CC_MX{8,4} multiplexer cells in output netlist.\n"); | ||||
| 		log("\n");; | ||||
| 		log("    -dff\n"); | ||||
| 		log("        run 'abc'/'abc9' with -dff option\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -retime\n"); | ||||
| 		log("        run 'abc' with '-dff -D 1' options\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -noiopad\n"); | ||||
| 		log("        disable I/O buffer insertion (useful for hierarchical or \n"); | ||||
| 		log("        out-of-context flows).\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -noclkbuf\n"); | ||||
| 		log("        disable automatic clock buffer insertion.\n"); | ||||
| 		log("\n"); | ||||
| 		log("The following commands are executed by this synthesis command:\n"); | ||||
| 		help_script(); | ||||
| 		log("\n"); | ||||
| 	} | ||||
| 
 | ||||
| 	string top_opt, vlog_file, blif_file, edif_file, json_file; | ||||
| 	bool noflatten, nobram, noaddf, nomult, nomx4, nomx8, dff, retime, noiopad, noclkbuf; | ||||
| 
 | ||||
| 	void clear_flags() override | ||||
| 	{ | ||||
| 		top_opt = "-auto-top"; | ||||
| 		vlog_file = ""; | ||||
| 		blif_file = ""; | ||||
| 		edif_file = ""; | ||||
| 		json_file = ""; | ||||
| 		noflatten = false; | ||||
| 		nobram = false; | ||||
| 		noaddf = false; | ||||
| 		nomult = false; | ||||
| 		nomx4 = false; | ||||
| 		nomx8 = false; | ||||
| 		dff = false; | ||||
| 		retime = false; | ||||
| 		noiopad = false; | ||||
| 		noclkbuf = false; | ||||
| 	} | ||||
| 
 | ||||
| 	void execute(std::vector<std::string> args, RTLIL::Design *design) override | ||||
| 	{ | ||||
| 		string run_from, run_to; | ||||
| 		clear_flags(); | ||||
| 
 | ||||
| 		size_t argidx; | ||||
| 		for (argidx = 1; argidx < args.size(); argidx++) | ||||
| 		{ | ||||
| 			if (args[argidx] == "-top" && argidx+1 < args.size()) { | ||||
| 				top_opt = "-top " + args[++argidx]; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-vlog" && argidx+1 < args.size()) { | ||||
| 				vlog_file = args[++argidx]; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-blif" && argidx+1 < args.size()) { | ||||
| 				blif_file = args[++argidx]; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-edif" && argidx+1 < args.size()) { | ||||
| 				edif_file = args[++argidx]; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-json" && argidx+1 < args.size()) { | ||||
| 				json_file = args[++argidx]; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-run" && argidx+1 < args.size()) { | ||||
| 				size_t pos = args[argidx+1].find(':'); | ||||
| 				if (pos == std::string::npos) | ||||
| 					break; | ||||
| 				run_from = args[++argidx].substr(0, pos); | ||||
| 				run_to = args[argidx].substr(pos+1); | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-noflatten") { | ||||
| 				noflatten = true; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-nobram") { | ||||
| 				nobram = true; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-noaddf") { | ||||
| 				noaddf = true; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-nomult") { | ||||
| 				nomult = true; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-nomx4") { | ||||
| 				nomx4 = true; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-nomx8") { | ||||
| 				nomx8 = true; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-dff") { | ||||
| 				dff = true; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-retime") { | ||||
| 				retime = true; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-noiopad") { | ||||
| 				noiopad = true; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-noclkbuf") { | ||||
| 				noclkbuf = true; | ||||
| 				continue; | ||||
| 			} | ||||
| 			break; | ||||
| 		} | ||||
| 		extra_args(args, argidx, design); | ||||
| 
 | ||||
| 		if (!design->full_selection()) { | ||||
| 			log_cmd_error("This command only operates on fully selected designs!\n"); | ||||
| 		} | ||||
| 
 | ||||
| 		log_header(design, "Executing SYNTH_GATEMATE pass.\n"); | ||||
| 		log_push(); | ||||
| 
 | ||||
| 		run_script(design, run_from, run_to); | ||||
| 
 | ||||
| 		log_pop(); | ||||
| 	} | ||||
| 
 | ||||
| 	void script() override | ||||
| 	{ | ||||
| 		if (check_label("begin")) | ||||
| 		{ | ||||
| 			run("read_verilog -lib -specify +/gatemate/cells_sim.v +/gatemate/cells_bb.v"); | ||||
| 			run(stringf("hierarchy -check %s", help_mode ? "-top <top>" : top_opt.c_str())); | ||||
| 		} | ||||
| 
 | ||||
| 		if (check_label("prepare")) | ||||
| 		{ | ||||
| 			run("proc"); | ||||
| 			if (!noflatten) { | ||||
| 				run("flatten"); | ||||
| 			} | ||||
| 			run("tribuf -logic"); | ||||
| 			run("deminout"); | ||||
| 			run("opt_expr"); | ||||
| 			run("opt_clean"); | ||||
| 			run("check"); | ||||
| 			run("opt -nodffe -nosdff"); | ||||
| 			run("fsm"); | ||||
| 			run("opt"); | ||||
| 			run("wreduce"); | ||||
| 			run("peepopt"); | ||||
| 			run("opt_clean"); | ||||
| 			run("share"); | ||||
| 			run("techmap -map +/cmp2lut.v -D LUT_WIDTH=4"); | ||||
| 			run("opt_expr"); | ||||
| 			run("opt_clean"); | ||||
| 		} | ||||
| 
 | ||||
| 		if (check_label("map_mult", "(skip if '-nomult')")) | ||||
| 		{ | ||||
| 			if (!nomult) { | ||||
| 				run("techmap -map +/gatemate/mul_map.v"); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if (check_label("coarse")) | ||||
| 		{ | ||||
| 			run("alumacc"); | ||||
| 			run("opt"); | ||||
| 			run("memory -nomap"); | ||||
| 			run("opt_clean"); | ||||
| 		} | ||||
| 
 | ||||
| 		if (check_label("map_bram", "(skip if '-nobram')")) | ||||
| 		{ | ||||
| 			if (!nobram) { | ||||
| 				run("memory_bram -rules +/gatemate/brams.txt"); | ||||
| 				run("setundef -zero -params " | ||||
| 					"t:$__CC_BRAM_CASCADE " | ||||
| 					"t:$__CC_BRAM_40K_SDP t:$__CC_BRAM_20K_SDP " | ||||
| 					"t:$__CC_BRAM_20K_TDP t:$__CC_BRAM_40K_TDP " | ||||
| 				); | ||||
| 				run("techmap -map +/gatemate/brams_map.v"); | ||||
| 				run("gatemate_bramopt"); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if (check_label("map_ffram")) | ||||
| 		{ | ||||
| 			run("opt -fast -mux_undef -undriven -fine"); | ||||
| 			run("memory_map"); | ||||
| 			run("opt -undriven -fine"); | ||||
| 		} | ||||
| 
 | ||||
| 		if (check_label("map_addf", "(skip if '-noaddf')")) | ||||
| 		{ | ||||
| 			std::string techmap_args = ""; | ||||
| 			if (!noaddf) { | ||||
| 				techmap_args += " -map +/gatemate/arith_map.v"; | ||||
| 			} | ||||
| 			run("techmap -map +/techmap.v " + techmap_args); | ||||
| 			run("opt -fast"); | ||||
| 			if (retime) { | ||||
| 				run("abc -dff -D 1", "(only if -retime)"); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if (check_label("map_io", "(skip if '-noiopad')")) | ||||
| 		{ | ||||
| 			if (!noiopad) { | ||||
| 				run("iopadmap -bits " | ||||
| 					"-inpad $__inpad Y:I " | ||||
| 					"-outpad $__outpad A:O " | ||||
| 					"-toutpad $__toutpad OE:A:O " | ||||
| 					"-tinoutpad $__tinoutpad OE:Y:A:IO" | ||||
| 				); | ||||
| 				run("techmap -map +/gatemate/iob_map.v"); | ||||
| 				run("clean"); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if (check_label("map_regs")) | ||||
| 		{ | ||||
| 			run("opt_clean"); | ||||
| 			run("dfflegalize -cell $_DFF_?_ 0 -cell $_DFF_???_ 0 " | ||||
| 				"-cell $_DFFE_??_ 0 -cell $_DFFE_????_ 0 " | ||||
| 				"-cell $_DLATCH_?_ x -cell $_DLATCH_???_ x" | ||||
| 			); | ||||
| 			run("techmap -map +/gatemate/reg_map.v"); | ||||
| 			run("opt_expr -mux_undef"); | ||||
| 			run("simplemap"); | ||||
| 			run("opt_clean"); | ||||
| 		} | ||||
| 
 | ||||
| 		if (check_label("map_muxs")) | ||||
| 		{ | ||||
| 			run("abc -g simple"); // optimize design before muxcover
 | ||||
| 			std::string muxcover_args; | ||||
| 			if (!nomx4) { | ||||
| 				muxcover_args += stringf(" -mux4"); | ||||
| 			} | ||||
| 			if (!nomx8) { | ||||
| 				muxcover_args += stringf(" -mux8"); | ||||
| 			} | ||||
| 			run("muxcover " + muxcover_args); | ||||
| 			run("opt -full"); | ||||
| 			run("techmap -map +/gatemate/mux_map.v"); | ||||
| 		} | ||||
| 
 | ||||
| 		if (check_label("map_luts")) | ||||
| 		{ | ||||
| 			std::string abc_args = " -dress -lut 4"; | ||||
| 			if (dff) { | ||||
| 				abc_args += " -dff"; | ||||
| 			} | ||||
| 			run("abc " + abc_args); | ||||
| 			run("clean"); | ||||
| 		} | ||||
| 
 | ||||
| 		if (check_label("map_cells")) | ||||
| 		{ | ||||
| 			run("techmap -map +/gatemate/lut_map.v"); | ||||
| 			run("clean"); | ||||
| 		} | ||||
| 
 | ||||
| 		if (check_label("map_bufg", "(skip if '-noclkbuf')")) | ||||
| 		{ | ||||
| 			if (!noclkbuf) { | ||||
| 				run("clkbufmap -buf CC_BUFG O:I"); | ||||
| 				run("clean"); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if (check_label("check")) | ||||
| 		{ | ||||
| 			run("hierarchy -check"); | ||||
| 			run("stat -width"); | ||||
| 			run("check -noinit"); | ||||
| 			run("blackbox =A:whitebox"); | ||||
| 		} | ||||
| 
 | ||||
| 		if (check_label("vlog")) | ||||
| 		{ | ||||
| 			run("opt_clean -purge"); | ||||
| 			if (!vlog_file.empty() || help_mode) { | ||||
| 				run(stringf("write_verilog -noattr %s", help_mode ? "<file-name>" : vlog_file.c_str())); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if (check_label("edif")) | ||||
| 		{ | ||||
| 			if (!edif_file.empty() || help_mode) { | ||||
| 				run(stringf("write_edif %s", help_mode ? "<file-name>" : edif_file.c_str())); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if (check_label("json")) | ||||
| 		{ | ||||
| 			if (!json_file.empty() || help_mode) { | ||||
| 				run(stringf("write_json %s", help_mode ? "<file-name>" : json_file.c_str())); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if (check_label("blif")) | ||||
| 		{ | ||||
| 			if (!blif_file.empty() || help_mode) { | ||||
| 				run(stringf("write_blif %s", edif_file.c_str())); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } SynthGateMatePass; | ||||
| 
 | ||||
| PRIVATE_NAMESPACE_END | ||||
							
								
								
									
										9
									
								
								tests/arch/gatemate/add_sub.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								tests/arch/gatemate/add_sub.ys
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,9 @@ | |||
| read_verilog ../common/add_sub.v | ||||
| hierarchy -top top | ||||
| proc | ||||
| equiv_opt -assert -map +/gatemate/cells_sim.v synth_gatemate -noiopad # equivalency check | ||||
| design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) | ||||
| cd top # Constrain all select calls below inside the top module | ||||
| select -assert-count 8 t:CC_ADDF | ||||
| select -assert-count 4 t:CC_LUT1 | ||||
| select -assert-none t:CC_ADDF t:CC_LUT1 %% t:* %D | ||||
							
								
								
									
										43
									
								
								tests/arch/gatemate/adffs.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								tests/arch/gatemate/adffs.ys
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,43 @@ | |||
| read_verilog ../common/adffs.v | ||||
| design -save read | ||||
| 
 | ||||
| hierarchy -top adff | ||||
| proc | ||||
| equiv_opt -async2sync -assert -map +/gatemate/cells_sim.v synth_gatemate -noiopad # equivalency check | ||||
| design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) | ||||
| cd adff # Constrain all select calls below inside the top module | ||||
| select -assert-count 1 t:CC_BUFG | ||||
| select -assert-count 1 t:CC_DFF | ||||
| select -assert-none t:CC_BUFG t:CC_DFF %% t:* %D | ||||
| 
 | ||||
| design -load read | ||||
| hierarchy -top adffn | ||||
| proc | ||||
| equiv_opt -async2sync -assert -map +/gatemate/cells_sim.v synth_gatemate -noiopad # equivalency check | ||||
| design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) | ||||
| cd adffn # Constrain all select calls below inside the top module | ||||
| select -assert-count 1 t:CC_BUFG | ||||
| select -assert-count 1 t:CC_DFF | ||||
| select -assert-none t:CC_BUFG t:CC_DFF %% t:* %D | ||||
| 
 | ||||
| design -load read | ||||
| hierarchy -top dffs | ||||
| proc | ||||
| equiv_opt -async2sync -assert -map +/gatemate/cells_sim.v synth_gatemate -noiopad # equivalency check | ||||
| design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) | ||||
| cd dffs # Constrain all select calls below inside the top module | ||||
| select -assert-count 1 t:CC_BUFG | ||||
| select -assert-count 1 t:CC_DFF | ||||
| select -assert-count 1 t:CC_LUT2 | ||||
| select -assert-none t:CC_BUFG t:CC_DFF t:CC_LUT2 %% t:* %D | ||||
| 
 | ||||
| design -load read | ||||
| hierarchy -top ndffnr | ||||
| proc | ||||
| equiv_opt -async2sync -assert -map +/gatemate/cells_sim.v synth_gatemate -noiopad # equivalency check | ||||
| design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) | ||||
| cd ndffnr # Constrain all select calls below inside the top module | ||||
| select -assert-count 1 t:CC_BUFG | ||||
| select -assert-count 1 t:CC_DFF | ||||
| select -assert-count 1 t:CC_LUT2 | ||||
| select -assert-none t:CC_BUFG t:CC_DFF t:CC_LUT2 %% t:* %D | ||||
							
								
								
									
										12
									
								
								tests/arch/gatemate/counter.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								tests/arch/gatemate/counter.ys
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | |||
| read_verilog ../common/counter.v | ||||
| hierarchy -top top | ||||
| proc | ||||
| flatten | ||||
| equiv_opt -assert -async2sync -map +/gatemate/cells_sim.v synth_gatemate -noiopad # equivalency check | ||||
| design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) | ||||
| cd top # Constrain all select calls below inside the top module | ||||
| 
 | ||||
| select -assert-count 8 t:CC_ADDF | ||||
| select -assert-count 1 t:CC_BUFG | ||||
| select -assert-count 8 t:CC_DFF | ||||
| select -assert-none t:CC_ADDF t:CC_BUFG t:CC_DFF %% t:* %D | ||||
							
								
								
									
										21
									
								
								tests/arch/gatemate/dffs.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								tests/arch/gatemate/dffs.ys
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | |||
| read_verilog ../common/dffs.v | ||||
| design -save read | ||||
| 
 | ||||
| hierarchy -top dff | ||||
| proc | ||||
| equiv_opt -assert -async2sync -map +/gatemate/cells_sim.v synth_gatemate -noiopad # equivalency check | ||||
| design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) | ||||
| cd dff # Constrain all select calls below inside the top module | ||||
| select -assert-count 1 t:CC_BUFG | ||||
| select -assert-count 1 t:CC_DFF | ||||
| select -assert-none t:CC_BUFG t:CC_DFF %% t:* %D | ||||
| 
 | ||||
| design -load read | ||||
| hierarchy -top dffe | ||||
| proc | ||||
| equiv_opt -assert -async2sync -map +/gatemate/cells_sim.v synth_gatemate -noiopad # equivalency check | ||||
| design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) | ||||
| cd dffe # Constrain all select calls below inside the top module | ||||
| select -assert-count 1 t:CC_BUFG | ||||
| select -assert-count 1 t:CC_DFF | ||||
| select -assert-none t:CC_BUFG t:CC_DFF %% t:* %D | ||||
							
								
								
									
										20
									
								
								tests/arch/gatemate/fsm.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								tests/arch/gatemate/fsm.ys
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | |||
| read_verilog ../common/fsm.v | ||||
| hierarchy -top fsm | ||||
| proc | ||||
| flatten | ||||
| 
 | ||||
| equiv_opt -run :prove -map +/gatemate/cells_sim.v synth_gatemate -noiopad | ||||
| async2sync | ||||
| miter -equiv -make_assert -flatten gold gate miter | ||||
| stat | ||||
| sat -verify -prove-asserts -show-public -set-at 1 in_reset 1 -seq 20 -prove-skip 1 miter | ||||
| 
 | ||||
| design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) | ||||
| cd fsm # Constrain all select calls below inside the top module | ||||
| 
 | ||||
| select -assert-count 1 t:CC_BUFG | ||||
| select -assert-count 6 t:CC_DFF | ||||
| select -assert-count 3 t:CC_LUT2 | ||||
| select -assert-count 4 t:CC_LUT3 | ||||
| select -assert-count 8 t:CC_LUT4 | ||||
| select -assert-none t:CC_BUFG t:CC_DFF t:CC_LUT2 t:CC_LUT3 t:CC_LUT4 %% t:* %D | ||||
							
								
								
									
										29
									
								
								tests/arch/gatemate/latches.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								tests/arch/gatemate/latches.ys
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,29 @@ | |||
| read_verilog ../common/latches.v | ||||
| design -save read | ||||
| 
 | ||||
| hierarchy -top latchp | ||||
| proc | ||||
| equiv_opt -async2sync -assert -map +/gatemate/cells_sim.v synth_gatemate -noiopad # equivalency check | ||||
| design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) | ||||
| cd latchp # Constrain all select calls below inside the top module | ||||
| select -assert-count 1 t:CC_DLT | ||||
| select -assert-none t:CC_DLT %% t:* %D | ||||
| 
 | ||||
| design -load read | ||||
| hierarchy -top latchn | ||||
| proc | ||||
| equiv_opt -async2sync -assert -map +/gatemate/cells_sim.v synth_gatemate -noiopad # equivalency check | ||||
| design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) | ||||
| cd latchn # Constrain all select calls below inside the top module | ||||
| select -assert-count 1 t:CC_DLT | ||||
| select -assert-none t:CC_DLT %% t:* %D | ||||
| 
 | ||||
| design -load read | ||||
| hierarchy -top latchsr | ||||
| proc | ||||
| equiv_opt -async2sync -assert -map +/gatemate/cells_sim.v synth_gatemate -noiopad # equivalency check | ||||
| design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) | ||||
| cd latchsr # Constrain all select calls below inside the top module | ||||
| select -assert-count 1 t:CC_DLT | ||||
| select -assert-count 2 t:CC_LUT3 | ||||
| select -assert-none t:CC_DLT t:CC_LUT3 %% t:* %D | ||||
							
								
								
									
										10
									
								
								tests/arch/gatemate/logic.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								tests/arch/gatemate/logic.ys
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | |||
| read_verilog ../common/logic.v | ||||
| hierarchy -top top | ||||
| proc | ||||
| equiv_opt -assert -map +/gatemate/cells_sim.v synth_gatemate -noiopad # equivalency check | ||||
| design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) | ||||
| cd top # Constrain all select calls below inside the top module | ||||
| select -assert-count 1 t:CC_LUT1 | ||||
| select -assert-count 6 t:CC_LUT2 | ||||
| select -assert-count 2 t:CC_LUT4 | ||||
| select -assert-none t:CC_LUT1 t:CC_LUT2 t:CC_LUT4 %% t:* %D | ||||
							
								
								
									
										34
									
								
								tests/arch/gatemate/memory.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								tests/arch/gatemate/memory.ys
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,34 @@ | |||
| # 512 x 40 bit -> CC_BRAM_20K SDP RAM | ||||
| read_verilog ../common/blockram.v | ||||
| chparam -set ADDRESS_WIDTH 9 -set DATA_WIDTH 40 sync_ram_sdp | ||||
| synth_gatemate -top sync_ram_sdp -noiopad | ||||
| cd sync_ram_sdp | ||||
| select -assert-count 1 t:CC_BUFG | ||||
| select -assert-count 1 t:CC_BRAM_20K | ||||
| 
 | ||||
| # 512 x 80 bit -> CC_BRAM_40K SDP RAM | ||||
| design -reset | ||||
| read_verilog ../common/blockram.v | ||||
| chparam -set ADDRESS_WIDTH 9 -set DATA_WIDTH 80 sync_ram_sdp | ||||
| synth_gatemate -top sync_ram_sdp -noiopad | ||||
| cd sync_ram_sdp | ||||
| select -assert-count 1 t:CC_BUFG | ||||
| select -assert-count 1 t:CC_BRAM_40K | ||||
| 
 | ||||
| # 512 x 40 bit -> CC_BRAM_20K SDP ROM | ||||
| design -reset | ||||
| read_verilog ../common/blockrom.v | ||||
| chparam -set ADDRESS_WIDTH 9 -set DATA_WIDTH 40 sync_rom | ||||
| synth_gatemate -top sync_rom -noiopad | ||||
| cd sync_rom | ||||
| select -assert-count 1 t:CC_BUFG | ||||
| select -assert-count 1 t:CC_BRAM_20K | ||||
| 
 | ||||
| # 512 x 80 bit -> CC_BRAM_40K SDP ROM | ||||
| design -reset | ||||
| read_verilog ../common/blockrom.v | ||||
| chparam -set ADDRESS_WIDTH 9 -set DATA_WIDTH 80 sync_rom | ||||
| synth_gatemate -top sync_rom -noiopad | ||||
| cd sync_rom | ||||
| select -assert-count 1 t:CC_BUFG | ||||
| select -assert-count 1 t:CC_BRAM_40K | ||||
							
								
								
									
										79
									
								
								tests/arch/gatemate/mul.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								tests/arch/gatemate/mul.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,79 @@ | |||
| 
 | ||||
| module mul_plain(a, b, p); | ||||
| 
 | ||||
|     parameter M = 6; | ||||
|     parameter N = 6; | ||||
| 
 | ||||
|     input wire [M-1:0] a; | ||||
|     input wire [N-1:0] b; | ||||
|     output wire [M+N-1:0] p; | ||||
| 
 | ||||
|     assign p = a * b; | ||||
| 
 | ||||
| endmodule | ||||
| 
 | ||||
| module mul_signed_async (clk, rst, en, a, b, p); | ||||
| 
 | ||||
|     parameter M = 8; | ||||
|     parameter N = 6; | ||||
| 
 | ||||
|     input wire signed clk, rst, en; | ||||
|     input wire signed [M-1:0] a; | ||||
|     input wire signed [N-1:0] b; | ||||
|     output reg signed [M+N-1:0] p; | ||||
| 
 | ||||
|     reg signed [M-1:0] a_reg; | ||||
|     reg signed [N-1:0] b_reg; | ||||
| 
 | ||||
|     // signed M*N multiplier with
 | ||||
|     // - input and output pipeline registers
 | ||||
|     // - asynchronous reset (active high)
 | ||||
|     // - clock enable (active high)
 | ||||
|     always @(posedge clk or posedge rst) | ||||
|     begin | ||||
|         if (rst) begin | ||||
|             a_reg <= 0; | ||||
|             b_reg <= 0; | ||||
|             p <= 0; | ||||
|         end | ||||
|         else if (en) begin | ||||
|             a_reg <= a; | ||||
|             b_reg <= b; | ||||
|             p <= a_reg * b_reg; | ||||
|         end | ||||
|     end | ||||
| 
 | ||||
| endmodule | ||||
| 
 | ||||
| module mul_unsigned_sync (clk, rst, en, a, b, p); | ||||
| 
 | ||||
|     parameter M = 6; | ||||
|     parameter N = 3; | ||||
| 
 | ||||
|     input wire clk, rst, en; | ||||
|     input wire [M-1:0] a; | ||||
|     input wire [N-1:0] b; | ||||
|     output reg [M+N-1:0] p; | ||||
| 
 | ||||
|     reg [M-1:0] a_reg; | ||||
|     reg [N-1:0] b_reg; | ||||
| 
 | ||||
|     // unsigned M*N multiplier with
 | ||||
|     // - input and output pipeline registers
 | ||||
|     // - synchronous reset (active high)
 | ||||
|     // - clock enable (active high)
 | ||||
|     always @(posedge clk) | ||||
|     begin | ||||
|         if (rst) begin | ||||
|             a_reg <= 0; | ||||
|             b_reg <= 0; | ||||
|             p <= 0; | ||||
|         end | ||||
|         else if (en) begin | ||||
|             a_reg <= a; | ||||
|             b_reg <= b; | ||||
|             p <= a_reg * b_reg; | ||||
|         end | ||||
|     end | ||||
| 
 | ||||
| endmodule | ||||
							
								
								
									
										33
									
								
								tests/arch/gatemate/mul.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								tests/arch/gatemate/mul.ys
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,33 @@ | |||
| read_verilog mul.v | ||||
| design -save read | ||||
| 
 | ||||
| hierarchy -top mul_plain | ||||
| proc | ||||
| equiv_opt -assert -map +/gatemate/cells_sim.v synth_gatemate -noiopad # equivalency check | ||||
| design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) | ||||
| cd mul_plain # Constrain all select calls below inside the top module | ||||
| select -assert-count 1 t:CC_MULT | ||||
| select -assert-none t:CC_MULT %% t:* %D | ||||
| 
 | ||||
| design -load read | ||||
| hierarchy -top mul_signed_async | ||||
| proc | ||||
| equiv_opt -assert -async2sync -map +/gatemate/cells_sim.v synth_gatemate -noiopad # equivalency check | ||||
| design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) | ||||
| cd mul_signed_async # Constrain all select calls below inside the top module | ||||
| select -assert-count 1 t:CC_MULT | ||||
| select -assert-count 1 t:CC_BUFG | ||||
| select -assert-count 28 t:CC_DFF | ||||
| select -assert-none t:CC_MULT t:CC_BUFG t:CC_DFF %% t:* %D | ||||
| 
 | ||||
| design -load read | ||||
| hierarchy -top mul_unsigned_sync | ||||
| proc | ||||
| equiv_opt -assert -async2sync -map +/gatemate/cells_sim.v synth_gatemate -noiopad # equivalency check | ||||
| design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) | ||||
| cd mul_unsigned_sync # Constrain all select calls below inside the top module | ||||
| select -assert-count 1 t:CC_MULT | ||||
| select -assert-count 1 t:CC_BUFG | ||||
| select -assert-count 18 t:CC_LUT4 | ||||
| select -assert-count 18 t:CC_DFF | ||||
| select -assert-none t:CC_MULT t:CC_BUFG t:CC_LUT4 t:CC_DFF %% t:* %D | ||||
							
								
								
									
										20
									
								
								tests/arch/gatemate/mux.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								tests/arch/gatemate/mux.ys
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | |||
| read_verilog ../common/mux.v | ||||
| design -save read | ||||
| 
 | ||||
| design -load read | ||||
| hierarchy -top mux4 | ||||
| proc | ||||
| equiv_opt -assert -map +/gatemate/cells_sim.v synth_gatemate -noiopad # equivalency check | ||||
| design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) | ||||
| cd mux4 # Constrain all select calls below inside the top module | ||||
| select -assert-count 1 t:CC_MX4 | ||||
| select -assert-none t:CC_MX4 %% t:* %D | ||||
| 
 | ||||
| design -load read | ||||
| hierarchy -top mux8 | ||||
| proc | ||||
| equiv_opt -assert -map +/gatemate/cells_sim.v synth_gatemate -noiopad # equivalency check | ||||
| design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) | ||||
| cd mux8 # Constrain all select calls below inside the top module | ||||
| select -assert-count 1 t:CC_MX8 | ||||
| select -assert-none t:CC_MX8 %% t:* %D | ||||
							
								
								
									
										4
									
								
								tests/arch/gatemate/run-test.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										4
									
								
								tests/arch/gatemate/run-test.sh
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,4 @@ | |||
| #!/usr/bin/env bash | ||||
| set -eu | ||||
| source ../../gen-tests-makefile.sh | ||||
| run_tests --yosys-scripts --bash --yosys-args "-w 'Yosys has only limited support for tri-state logic at the moment.'" | ||||
							
								
								
									
										10
									
								
								tests/arch/gatemate/shifter.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								tests/arch/gatemate/shifter.ys
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | |||
| read_verilog ../common/shifter.v | ||||
| hierarchy -top top | ||||
| proc | ||||
| flatten | ||||
| equiv_opt -assert -async2sync -map +/gatemate/cells_sim.v synth_gatemate -noiopad # equivalency check | ||||
| design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) | ||||
| cd top # Constrain all select calls below inside the top module | ||||
| select -assert-count 1 t:CC_BUFG | ||||
| select -assert-count 8 t:CC_DFF | ||||
| select -assert-none t:CC_BUFG t:CC_DFF %% t:* %D | ||||
							
								
								
									
										13
									
								
								tests/arch/gatemate/tribuf.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								tests/arch/gatemate/tribuf.ys
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,13 @@ | |||
| read_verilog ../common/tribuf.v | ||||
| hierarchy -top tristate | ||||
| proc | ||||
| tribuf | ||||
| flatten | ||||
| synth | ||||
| equiv_opt -assert -map +/gatemate/cells_sim.v -map +/simcells.v synth_gatemate # equivalency check | ||||
| design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) | ||||
| cd tristate # Constrain all select calls below inside the top module | ||||
| select -assert-count 2 t:CC_IBUF | ||||
| select -assert-count 1 t:CC_LUT1 | ||||
| select -assert-count 1 t:CC_TOBUF | ||||
| select -assert-none t:CC_IBUF t:CC_LUT1 t:CC_TOBUF %% t:* %D | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue