mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	Adding Cyclone IV (E, GX), Arria 10, Cyclone V and LPM functions (ALTPLL and M9K); M9K is not finished yet. Achronix Speedster also in this commit. Both Arria10 and Speedster-i are still experimental due complexity, but you can experiment around those devices right now
This commit is contained in:
		
							parent
							
								
									c5b204d8d2
								
							
						
					
					
						commit
						cbaba62401
					
				
					 31 changed files with 2969 additions and 729 deletions
				
			
		
							
								
								
									
										6
									
								
								techlibs/achronix/Makefile.inc
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										6
									
								
								techlibs/achronix/Makefile.inc
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
 | 
			
		||||
OBJS += techlibs/achronix/synth_speedster.o
 | 
			
		||||
 | 
			
		||||
$(eval $(call add_share_file,share/achronix/speedster22i/,techlibs/achronix/speedster22i/cells_comb_speedster.v))
 | 
			
		||||
$(eval $(call add_share_file,share/achronix/speedster22i/,techlibs/achronix/speedster22i/cells_map_speedster.v))
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										65
									
								
								techlibs/achronix/speedster22i/cells_arith_speedster.v
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										65
									
								
								techlibs/achronix/speedster22i/cells_arith_speedster.v
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,65 @@
 | 
			
		|||
/*
 | 
			
		||||
 *  yosys -- Yosys Open SYnthesis Suite
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2012  Clifford Wolf <clifford@clifford.at>
 | 
			
		||||
 *
 | 
			
		||||
 *  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.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
// NOTE: This is still WIP.
 | 
			
		||||
(* techmap_celltype = "$alu" *)
 | 
			
		||||
module _80_altera_max10_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;
 | 
			
		||||
 | 
			
		||||
	input [A_WIDTH-1:0] A;
 | 
			
		||||
	input [B_WIDTH-1:0] B;
 | 
			
		||||
	output [Y_WIDTH-1:0] X, Y;
 | 
			
		||||
 | 
			
		||||
	input CI, BI;
 | 
			
		||||
	//output [Y_WIDTH-1:0] CO;
 | 
			
		||||
        output                 CO;
 | 
			
		||||
 | 
			
		||||
	wire _TECHMAP_FAIL_ = Y_WIDTH <= 4;
 | 
			
		||||
 | 
			
		||||
	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));
 | 
			
		||||
 | 
			
		||||
	wire [Y_WIDTH-1:0] AA = A_buf;
 | 
			
		||||
	wire [Y_WIDTH-1:0] BB = BI ? ~B_buf : B_buf;
 | 
			
		||||
	//wire [Y_WIDTH:0] C = {CO, CI};
 | 
			
		||||
        wire [Y_WIDTH+1:0] COx;
 | 
			
		||||
        wire [Y_WIDTH+1:0] C = {COx, CI};
 | 
			
		||||
    
 | 
			
		||||
	/* Start implementation */
 | 
			
		||||
	(* keep *) fiftyfivenm_lcell_comb #(.lut_mask(16'b0000_0000_1010_1010), .sum_lutc_input("cin")) carry_start (.cout(COx[0]), .dataa(C[0]), .datab(1'b1), .datac(1'b1), .datad(1'b1));
 | 
			
		||||
	
 | 
			
		||||
	genvar i;
 | 
			
		||||
	generate for (i = 0; i < Y_WIDTH; i = i + 1) begin: slice
 | 
			
		||||
	  if(i==Y_WIDTH-1) begin
 | 
			
		||||
	    (* keep *) fiftyfivenm_lcell_comb #(.lut_mask(16'b1111_0000_1110_0000), .sum_lutc_input("cin")) carry_end (.combout(COx[Y_WIDTH]), .dataa(1'b1), .datab(1'b1), .datac(1'b1), .datad(1'b1), .cin(C[Y_WIDTH]));
 | 
			
		||||
            assign CO = COx[Y_WIDTH];
 | 
			
		||||
          end
 | 
			
		||||
	  else
 | 
			
		||||
	    fiftyfivenm_lcell_comb #(.lut_mask(16'b1001_0110_1110_1000), .sum_lutc_input("cin")) arith_cell (.combout(Y[i]), .cout(COx[i+1]), .dataa(AA[i]), .datab(BB[i]), .datac(1'b1), .datad(1'b1), .cin(C[i+1]));
 | 
			
		||||
	  end: slice
 | 
			
		||||
	endgenerate
 | 
			
		||||
	/* End implementation */
 | 
			
		||||
	assign X = AA ^ BB;
 | 
			
		||||
   
 | 
			
		||||
endmodule  
 | 
			
		||||
							
								
								
									
										127
									
								
								techlibs/achronix/speedster22i/cells_comb_speedster.v
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										127
									
								
								techlibs/achronix/speedster22i/cells_comb_speedster.v
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,127 @@
 | 
			
		|||
/*
 | 
			
		||||
 *  yosys -- Yosys Open SYnthesis Suite
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2012  Clifford Wolf <clifford@clifford.at>
 | 
			
		||||
 *
 | 
			
		||||
 *  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 VCC (output V);
 | 
			
		||||
   assign V = 1'b1;
 | 
			
		||||
endmodule // VCC
 | 
			
		||||
 | 
			
		||||
module GND (output G);
 | 
			
		||||
   assign G = 1'b0;
 | 
			
		||||
endmodule // GND
 | 
			
		||||
 | 
			
		||||
/* Altera MAX10 devices Input Buffer Primitive */
 | 
			
		||||
module PADIN (output padout, input padin);
 | 
			
		||||
   assign padout = padin;
 | 
			
		||||
endmodule // fiftyfivenm_io_ibuf
 | 
			
		||||
 | 
			
		||||
/* Altera MAX10 devices Output Buffer Primitive */
 | 
			
		||||
module PADOUT (output padout, input padin, input oe);
 | 
			
		||||
   assign padout  = padin;
 | 
			
		||||
   assign oe = oe;
 | 
			
		||||
endmodule // fiftyfivenm_io_obuf
 | 
			
		||||
 | 
			
		||||
/* Altera MAX10 4-input non-fracturable LUT Primitive */
 | 
			
		||||
module LUT4 (output dout,
 | 
			
		||||
             input  din0, din1, din2, din3);
 | 
			
		||||
 | 
			
		||||
/* Internal parameters which define the behaviour
 | 
			
		||||
   of the LUT primitive.
 | 
			
		||||
   lut_mask define the lut function, can be expressed in 16-digit bin or hex.
 | 
			
		||||
   sum_lutc_input define the type of LUT (combinational | arithmetic).
 | 
			
		||||
   dont_touch for retiming || carry options.
 | 
			
		||||
   lpm_type for WYSIWYG */
 | 
			
		||||
 | 
			
		||||
parameter lut_function = 16'hFFFF;
 | 
			
		||||
//parameter dont_touch = "off";
 | 
			
		||||
//parameter lpm_type = "fiftyfivenm_lcell_comb";
 | 
			
		||||
//parameter sum_lutc_input = "datac";
 | 
			
		||||
 | 
			
		||||
reg [1:0] lut_type;
 | 
			
		||||
reg cout_rt;
 | 
			
		||||
reg combout_rt;
 | 
			
		||||
wire dataa_w;
 | 
			
		||||
wire datab_w;
 | 
			
		||||
wire datac_w;
 | 
			
		||||
wire datad_w;
 | 
			
		||||
wire cin_w;
 | 
			
		||||
 | 
			
		||||
assign dataa_w = din0;
 | 
			
		||||
assign datab_w = din1;
 | 
			
		||||
assign datac_w = din2;
 | 
			
		||||
assign datad_w = din3;
 | 
			
		||||
 | 
			
		||||
function lut_data;
 | 
			
		||||
input [15:0] mask;
 | 
			
		||||
input        dataa, datab, datac, datad;
 | 
			
		||||
reg [7:0]   s3;
 | 
			
		||||
reg [3:0]   s2;
 | 
			
		||||
reg [1:0]   s1;
 | 
			
		||||
  begin
 | 
			
		||||
       s3 = datad ? mask[15:8] : mask[7:0];
 | 
			
		||||
       s2 = datac ?   s3[7:4]  :   s3[3:0];
 | 
			
		||||
       s1 = datab ?   s2[3:2]  :   s2[1:0];
 | 
			
		||||
       lut_data = dataa ? s1[1] : s1[0];
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
initial begin
 | 
			
		||||
    /*if (sum_lutc_input == "datac")*/ lut_type = 0;
 | 
			
		||||
    /*else
 | 
			
		||||
    if (sum_lutc_input == "cin")   lut_type = 1;
 | 
			
		||||
    else begin
 | 
			
		||||
      $error("Error in sum_lutc_input. Parameter %s is not a valid value.\n", sum_lutc_input);
 | 
			
		||||
      $finish();
 | 
			
		||||
    end*/
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
always @(dataa_w or datab_w or datac_w or datad_w or cin_w) begin
 | 
			
		||||
    if (lut_type == 0) begin // logic function
 | 
			
		||||
        combout_rt = lut_data(lut_function, dataa_w, datab_w,
 | 
			
		||||
                            datac_w, datad_w);
 | 
			
		||||
    end
 | 
			
		||||
    else if (lut_type == 1) begin // arithmetic function
 | 
			
		||||
        combout_rt = lut_data(lut_function, dataa_w, datab_w,
 | 
			
		||||
                            cin_w, datad_w);
 | 
			
		||||
    end
 | 
			
		||||
    cout_rt = lut_data(lut_function, dataa_w, datab_w, cin_w, 'b0);
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
assign dout = combout_rt & 1'b1;
 | 
			
		||||
//assign cout = cout_rt & 1'b1;
 | 
			
		||||
 | 
			
		||||
endmodule // fiftyfivenm_lcell_comb
 | 
			
		||||
 | 
			
		||||
/* Altera MAX10 D Flip-Flop Primitive */
 | 
			
		||||
// TODO: Implement advanced simulation functions
 | 
			
		||||
module dffeas ( output q,
 | 
			
		||||
                input d, clk, clrn, prn, ena,
 | 
			
		||||
		input asdata, aload, sclr, sload );
 | 
			
		||||
 | 
			
		||||
parameter power_up="dontcare";
 | 
			
		||||
parameter is_wysiwyg="false";
 | 
			
		||||
  reg q;
 | 
			
		||||
 | 
			
		||||
  always @(posedge clk)
 | 
			
		||||
    q <= d;
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										88
									
								
								techlibs/achronix/speedster22i/cells_map_speedster.v
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										88
									
								
								techlibs/achronix/speedster22i/cells_map_speedster.v
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,88 @@
 | 
			
		|||
/*
 | 
			
		||||
 *  yosys -- Yosys Open SYnthesis Suite
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2012  Clifford Wolf <clifford@clifford.at>
 | 
			
		||||
 *
 | 
			
		||||
 *  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.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
// Normal mode DFF negedge clk, negedge reset
 | 
			
		||||
module  \$_DFF_N_ (input D, C, output Q);
 | 
			
		||||
   parameter WYSIWYG="TRUE";
 | 
			
		||||
   dffeas #(.is_wysiwyg(WYSIWYG)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(1'b1), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(1'b0), .sload(1'b0));
 | 
			
		||||
endmodule
 | 
			
		||||
// Normal mode DFF
 | 
			
		||||
module  \$_DFF_P_ (input D, C, output Q);
 | 
			
		||||
   parameter WYSIWYG="TRUE";
 | 
			
		||||
   dffeas #(.is_wysiwyg(WYSIWYG)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(1'b1), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(1'b0), .sload(1'b0));
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
// Async Active Low Reset DFF
 | 
			
		||||
module  \$_DFF_PN0_ (input D, C, R, output Q);
 | 
			
		||||
   parameter WYSIWYG="TRUE";
 | 
			
		||||
   dffeas #(.is_wysiwyg(WYSIWYG)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(R), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(1'b0), .sload(1'b0));
 | 
			
		||||
endmodule
 | 
			
		||||
// Async Active High Reset DFF
 | 
			
		||||
module  \$_DFF_PP0_ (input D, C, R, output Q);
 | 
			
		||||
   parameter WYSIWYG="TRUE";
 | 
			
		||||
   wire R_i = ~ R;
 | 
			
		||||
   dffeas #(.is_wysiwyg(WYSIWYG)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(R_i), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(1'b0), .sload(1'b0));
 | 
			
		||||
endmodule
 | 
			
		||||
// Async Active Low Reset DFF
 | 
			
		||||
module  \$_DFF_PN0_ (input D, C, R, output Q);
 | 
			
		||||
   parameter WYSIWYG="TRUE";
 | 
			
		||||
   dffeas #(.is_wysiwyg(WYSIWYG)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(R), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(1'b0), .sload(1'b0));
 | 
			
		||||
endmodule
 | 
			
		||||
/* */
 | 
			
		||||
module  \$__DFFE_PP0 (input D, C, E, R, output Q); 
 | 
			
		||||
   parameter WYSIWYG="TRUE";
 | 
			
		||||
   wire E_i = ~ E;
 | 
			
		||||
   dffeas #(.is_wysiwyg(WYSIWYG)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(R), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(E_i), .sload(1'b0));
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
// Input buffer map
 | 
			
		||||
module \$__inpad (input I, output O);
 | 
			
		||||
    PADIN _TECHMAP_REPLACE_ (.padout(O), .padin(I));
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
// Output buffer map
 | 
			
		||||
module \$__outpad (input I, output O);
 | 
			
		||||
    PADOUT _TECHMAP_REPLACE_ (.padout(O), .padin(I), .oe(1'b1));
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
// LUT Map
 | 
			
		||||
/* 0 -> datac
 | 
			
		||||
   1 -> cin */
 | 
			
		||||
module \$lut (A, Y);
 | 
			
		||||
   parameter WIDTH  = 0;
 | 
			
		||||
   parameter LUT    = 0;
 | 
			
		||||
   input [WIDTH-1:0] A;
 | 
			
		||||
   output 	     Y;
 | 
			
		||||
   generate
 | 
			
		||||
      if (WIDTH == 1) begin
 | 
			
		||||
	   assign Y = ~A[0]; // Not need to spend 1 logic cell for such an easy function
 | 
			
		||||
      end else
 | 
			
		||||
      if (WIDTH == 2) begin
 | 
			
		||||
              LUT4 #(.lut_function({4{LUT}})) _TECHMAP_REPLACE_ (.dout(Y), .din0(A[0]), .din1(A[1]), .din2(1'b0),.din3(1'b0));
 | 
			
		||||
      end else
 | 
			
		||||
      if(WIDTH == 3) begin
 | 
			
		||||
	      LUT4 #(.lut_function({2{LUT}})) _TECHMAP_REPLACE_ (.dout(Y), .din0(A[0]), .din1(A[1]), .din2(A[2]),.din3(1'b0));
 | 
			
		||||
      end else
 | 
			
		||||
      if(WIDTH == 4) begin
 | 
			
		||||
             LUT4 #(.lut_function(LUT)) _TECHMAP_REPLACE_ (.dout(Y), .din0(A[0]), .din1(A[1]), .din2(A[2]), .din3(A[3]));
 | 
			
		||||
      end else
 | 
			
		||||
	   wire _TECHMAP_FAIL_ = 1;
 | 
			
		||||
   endgenerate
 | 
			
		||||
endmodule //
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										188
									
								
								techlibs/achronix/synth_speedster.cc
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										188
									
								
								techlibs/achronix/synth_speedster.cc
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,188 @@
 | 
			
		|||
/*
 | 
			
		||||
 *  yosys -- Yosys Open SYnthesis Suite
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2012  Clifford Wolf <clifford@clifford.at>
 | 
			
		||||
 *
 | 
			
		||||
 *  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 SynthIntelPass : public ScriptPass {
 | 
			
		||||
  SynthIntelPass() : ScriptPass("synth_speedster", "synthesis for Acrhonix Speedster22i FPGAs.") { }
 | 
			
		||||
 | 
			
		||||
  virtual void help() YS_OVERRIDE
 | 
			
		||||
  {
 | 
			
		||||
    //   |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
 | 
			
		||||
    log("\n");
 | 
			
		||||
    log("    synth_speedster [options]\n");
 | 
			
		||||
    log("\n");
 | 
			
		||||
    log("This command runs synthesis for Achronix Speedster eFPGAs. This work is still experimental.\n");
 | 
			
		||||
    log("\n");
 | 
			
		||||
    log("    -top <module>\n");
 | 
			
		||||
    log("        use the specified module as top module (default='top')\n");
 | 
			
		||||
    log("\n");
 | 
			
		||||
    log("    -vout <file>\n");
 | 
			
		||||
    log("        write the design to the specified Verilog netlist file. writing of an\n");
 | 
			
		||||
    log("        output file 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("    -retime\n");
 | 
			
		||||
    log("        run 'abc' with -dff option\n");
 | 
			
		||||
    log("\n");
 | 
			
		||||
    log("\n");
 | 
			
		||||
    log("The following commands are executed by this synthesis command:\n");
 | 
			
		||||
    help_script();
 | 
			
		||||
    log("\n");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  string top_opt, family_opt, vout_file;
 | 
			
		||||
  bool retime, flatten;
 | 
			
		||||
 | 
			
		||||
  virtual void clear_flags() YS_OVERRIDE
 | 
			
		||||
  {
 | 
			
		||||
    top_opt = "-auto-top";
 | 
			
		||||
    vout_file = "";
 | 
			
		||||
    retime = false;
 | 
			
		||||
    flatten = true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void execute(std::vector<std::string> args, RTLIL::Design *design) YS_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] == "-vout" && argidx+1 < args.size()) {
 | 
			
		||||
          vout_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] == "-flatten") {
 | 
			
		||||
          flatten = true;
 | 
			
		||||
          continue;
 | 
			
		||||
        }
 | 
			
		||||
        if (args[argidx] == "-retime") {
 | 
			
		||||
          retime = true;
 | 
			
		||||
          continue;
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    extra_args(args, argidx, design);
 | 
			
		||||
 | 
			
		||||
    if (!design->full_selection())
 | 
			
		||||
      log_cmd_error("This comannd only operates on fully selected designs!\n");
 | 
			
		||||
 | 
			
		||||
    log_header(design, "Executing SYNTH_SPEEDSTER pass.\n");
 | 
			
		||||
    log_push();
 | 
			
		||||
 | 
			
		||||
    run_script(design, run_from, run_to);
 | 
			
		||||
 | 
			
		||||
    log_pop();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void script() YS_OVERRIDE
 | 
			
		||||
  {
 | 
			
		||||
    if (check_label("begin"))
 | 
			
		||||
      {
 | 
			
		||||
        run("read_verilog -sv -lib +/achronix/speedster22i/cells_comb_speedster.v");
 | 
			
		||||
        run(stringf("hierarchy -check %s", help_mode ? "-top <top>" : top_opt.c_str()));
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    if (flatten && check_label("flatten", "(unless -noflatten)"))
 | 
			
		||||
      {
 | 
			
		||||
        run("proc");
 | 
			
		||||
        run("flatten");
 | 
			
		||||
        run("tribuf -logic");
 | 
			
		||||
        run("deminout");
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    if (check_label("coarse"))
 | 
			
		||||
      {
 | 
			
		||||
        run("synth -run coarse");
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    if (check_label("fine"))
 | 
			
		||||
      {
 | 
			
		||||
        run("opt -fast -mux_undef -undriven -fine -full");
 | 
			
		||||
        run("memory_map");
 | 
			
		||||
        run("opt -undriven -fine");
 | 
			
		||||
        run("dffsr2dff");
 | 
			
		||||
        run("dff2dffe -direct-match $_DFF_*");
 | 
			
		||||
        run("opt -full");
 | 
			
		||||
        run("techmap -map +/techmap.v");
 | 
			
		||||
        run("opt -fast");
 | 
			
		||||
        run("clean -purge");
 | 
			
		||||
        run("setundef -undriven -zero");
 | 
			
		||||
        if (retime || help_mode)
 | 
			
		||||
          run("abc -markgroups -dff", "(only if -retime)");
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    if (check_label("map_luts"))
 | 
			
		||||
      {
 | 
			
		||||
        run("abc -luts 2:2,3,6:5,10,20" + string(retime ? " -dff" : ""));
 | 
			
		||||
        run("clean");
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    if (check_label("map_cells"))
 | 
			
		||||
      {
 | 
			
		||||
        run("iopadmap -bits -outpad $__outpad I:O -inpad $__inpad O:I");
 | 
			
		||||
        run("techmap -map +/achronix/speedster22i/cells_map_speedster.v");
 | 
			
		||||
        run("dffinit -ff dffeas Q INIT");
 | 
			
		||||
        run("clean -purge");
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    if (check_label("check"))
 | 
			
		||||
      {
 | 
			
		||||
        run("hierarchy -check");
 | 
			
		||||
        run("stat");
 | 
			
		||||
        run("check -noinit");
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    if (check_label("vout"))
 | 
			
		||||
      {
 | 
			
		||||
        if (!vout_file.empty() || help_mode)
 | 
			
		||||
          run(stringf("write_verilog -nodec -attr2comment -defparam -nohex -renameprefix yosys_ %s",
 | 
			
		||||
                      help_mode ? "<file-name>" : vout_file.c_str()));
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
} SynthIntelPass;
 | 
			
		||||
 | 
			
		||||
PRIVATE_NAMESPACE_END
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue