add support for k6n10 factor family

Signed-off-by: Tarachand Pagarani <tpagarani@quicklogic.com>
diff --git a/ql-qlf-plugin/Makefile b/ql-qlf-plugin/Makefile
index e2fa3e1..4919037 100644
--- a/ql-qlf-plugin/Makefile
+++ b/ql-qlf-plugin/Makefile
@@ -18,6 +18,7 @@
 COMMON          = common
 QLF_K4N8_DIR    = qlf_k4n8
 QLF_K6N10_DIR   = qlf_k6n10
+QLF_K6N10F_DIR   = qlf_k6n10f
 PP3_DIR         = pp3
 VERILOG_MODULES = $(COMMON)/cells_sim.v         \
                   $(QLF_K4N8_DIR)/arith_map.v   \
@@ -30,6 +31,13 @@
                   $(QLF_K6N10_DIR)/ffs_map.v   \
                   $(QLF_K6N10_DIR)/dsp_map.v   \
                   $(QLF_K6N10_DIR)/lut_map.v   \
+                  $(QLF_K6N10F_DIR)/arith_map.v \
+                  $(QLF_K6N10F_DIR)/brams_map.v \
+                  $(QLF_K6N10F_DIR)/brams.txt   \
+                  $(QLF_K6N10F_DIR)/cells_sim.v \
+                  $(QLF_K6N10F_DIR)/ffs_map.v   \
+                  $(QLF_K6N10F_DIR)/dsp_map.v   \
+                  $(QLF_K6N10F_DIR)/lut_map.v   \
                   $(PP3_DIR)/abc9_map.v    \
                   $(PP3_DIR)/abc9_model.v  \
                   $(PP3_DIR)/abc9_unmap.v  \
diff --git a/ql-qlf-plugin/qlf_k6n10f/arith_map.v b/ql-qlf-plugin/qlf_k6n10f/arith_map.v
new file mode 100644
index 0000000..c2323d6
--- /dev/null
+++ b/ql-qlf-plugin/qlf_k6n10f/arith_map.v
@@ -0,0 +1,70 @@
+// Copyright (C) 2020-2021  The SymbiFlow Authors.
+//
+// Use of this source code is governed by a ISC-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/ISC
+//
+// SPDX-License-Identifier:ISC
+(* techmap_celltype = "$alu" *)
+module _80_quicklogic_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;
+	parameter _TECHMAP_CONSTVAL_CI_ = 0;
+	parameter _TECHMAP_CONSTMSK_CI_ = 0;
+
+	(* 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;
+
+	genvar i;
+
+	(* force_downto *)
+	//wire [Y_WIDTH-1:0] C = {CO, CI};
+	wire [Y_WIDTH:0] C;
+	(* force_downto *)
+	wire [Y_WIDTH-1:0] S  = {AA ^ BB};
+
+	generate
+	     adder_carry intermediate_adder (
+	       .cin     ( ),
+	       .cout    (C[0]),
+	       .p       (1'b0),
+	       .g       (CI),
+	       .sumout    ()
+	     );
+	endgenerate
+	genvar i;
+	generate for (i = 0; i < Y_WIDTH; i = i + 1) begin:slice
+		adder_carry  my_adder (
+			.cin(C[i]),
+			.g(AA[i]),
+			.p(S[i]),
+			.cout(C[i+1]),
+		        .sumout(Y[i])
+		);
+	end endgenerate
+	assign X = S;
+endmodule
+
diff --git a/ql-qlf-plugin/qlf_k6n10f/brams.txt b/ql-qlf-plugin/qlf_k6n10f/brams.txt
new file mode 100644
index 0000000..1664603
--- /dev/null
+++ b/ql-qlf-plugin/qlf_k6n10f/brams.txt
@@ -0,0 +1,64 @@
+
+bram $__QLF_FACTOR_BRAM36_TDP
+  init 1
+  abits 10     @a10d36
+  dbits 36     @a10d36
+  abits 11     @a11d18
+  dbits 18     @a11d18
+  abits 12     @a12d9
+  dbits  9     @a12d9
+  abits 13     @a13d4
+  dbits  4     @a13d4
+  abits 14     @a14d2
+  dbits  2     @a14d2
+  abits 15     @a15d1
+  dbits  1     @a15d1
+  groups 2
+  ports  1 1
+  wrmode 0 1
+  enable 1 4   @a10d36
+  enable 1 2   @a11d18
+  enable 1 1   @a12d9 @a13d4 @a14d2 @a15d1
+  transp 0 0
+  clocks 2 3
+  clkpol 2 3
+endbram
+
+bram $__QLF_FACTOR_BRAM18_TDP
+  init 1
+  abits 10     @a10d18
+  dbits 18     @a10d18
+  abits 11     @a11d9
+  dbits  9     @a11d9
+  abits 12     @a12d4
+  dbits  4     @a12d4
+  abits 13     @a13d2
+  dbits  2     @a13d2
+  abits 14     @a14d1
+  dbits  1     @a14d1
+  groups 2
+  ports  1 1
+  wrmode 0 1
+  enable 1 2   @a10d18
+  enable 1 1   @a11d9 @a12d4 @a13d2 @a14d1
+  transp 0 0
+  clocks 2 3
+  clkpol 2 3
+endbram
+
+
+match $__QLF_FACTOR_BRAM36_TDP
+  min bits 128
+  min efficiency 2
+  shuffle_enable B
+  make_transp
+  or_next_if_better
+endmatch
+
+match $__QLF_FACTOR_BRAM18_TDP
+  min bits 128
+  min efficiency 2
+  shuffle_enable B
+  make_transp
+endmatch
+
diff --git a/ql-qlf-plugin/qlf_k6n10f/brams_map.v b/ql-qlf-plugin/qlf_k6n10f/brams_map.v
new file mode 100644
index 0000000..be0b230
--- /dev/null
+++ b/ql-qlf-plugin/qlf_k6n10f/brams_map.v
@@ -0,0 +1,248 @@
+// Copyright (C) 2020-2021  The SymbiFlow Authors.
+//
+// Use of this source code is governed by a ISC-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/ISC
+//
+// SPDX-License-Identifier:ISC
+
+module \$__QLF_FACTOR_BRAM36_TDP (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN);
+	parameter CFG_ABITS = 10;
+	parameter CFG_DBITS = 36;
+	parameter CFG_ENABLE_B = 4;
+
+	parameter CLKPOL2 = 1;
+	parameter CLKPOL3 = 1;
+	parameter [36863:0] INIT = 36864'bx;
+
+	input CLK2;
+	input CLK3;
+
+	input [CFG_ABITS-1:0] A1ADDR;
+	output [CFG_DBITS-1:0] A1DATA;
+	input A1EN;
+
+	input [CFG_ABITS-1:0] B1ADDR;
+	input [CFG_DBITS-1:0] B1DATA;
+	input [CFG_ENABLE_B-1:0] B1EN;
+
+	wire [14:0] A1ADDR_15;
+	wire [14:0] B1ADDR_15; 
+	//wire [7:0] B1EN_8 = //B1EN;
+
+	wire [3:0] DIP, DOP;
+	wire [31:0] DI, DO;
+
+	wire [31:0] DOBDO;
+	wire [3:0] DOPBDOP;
+
+	//wire [2:0] WRITEDATAWIDTHB;
+	//wire [2:0] READDATAWIDTHA;
+	assign A1DATA = { DOP[3], DO[31:24], DOP[2], DO[23:16], DOP[1], DO[15: 8], DOP[0], DO[ 7: 0] };
+	assign { DIP[3], DI[31:24], DIP[2], DI[23:16], DIP[1], DI[15: 8], DIP[0], DI[ 7: 0] } = B1DATA;
+
+        assign A1ADDR_15[14:CFG_ABITS]  = 0;
+        assign A1ADDR_15[CFG_ABITS-1:0] = A1ADDR;
+        assign B1ADDR_15[14:CFG_ABITS]  = 0;
+        assign B1ADDR_15[CFG_ABITS-1:0] = B1ADDR;
+
+	/*if (CFG_DBITS == 1) begin
+	  assign WRITEDATAWIDTHB = 3'b000;
+	  assign READDATAWIDTHA = 3'b000;
+	end else if (CFG_DBITS == 2) begin
+          assign WRITEDATAWIDTHB = 3'b001;
+          assign READDATAWIDTHA = 3'b001;
+        end else if (CFG_DBITS > 2 && CFG_DBITS <= 4) begin
+          assign WRITEDATAWIDTHB = 3'b010;
+          assign READDATAWIDTHA = 3'b010;
+        end else if (CFG_DBITS > 4 && CFG_DBITS <= 9) begin
+          assign WRITEDATAWIDTHB = 3'b011;
+          assign READDATAWIDTHA = 3'b011;
+        end else if (CFG_DBITS > 9 && CFG_DBITS <= 18) begin
+          assign WRITEDATAWIDTHB = 3'b100;
+          assign READDATAWIDTHA = 3'b100;
+        end else if (CFG_DBITS > 18 && CFG_DBITS <= 36) begin
+          assign WRITEDATAWIDTHB = 3'b101;
+          assign READDATAWIDTHA = 3'b101;
+	end*/
+	generate if (CFG_DBITS > 8) begin
+		TDP_BRAM36 #(
+			//`include "brams_init_36.vh"
+                        .READ_WIDTH_A(CFG_DBITS),
+                        .READ_WIDTH_B(CFG_DBITS),
+                        .WRITE_WIDTH_A(CFG_DBITS),
+                        .WRITE_WIDTH_B(CFG_DBITS),
+		) _TECHMAP_REPLACE_ (
+			.WRITEDATAA(32'hFFFFFFFF),
+			.WRITEDATAAP(4'hF),
+			.READDATAA(DO[31:0]),
+			.READDATAAP(DOP[3:0]),
+			.ADDRA(A1ADDR_15),
+			.CLOCKA(CLK2),
+			.READENABLEA(A1EN),
+			.WRITEENABLEA(1'b0),
+			.BYTEENABLEA(4'b0),
+			//.WRITEDATAWIDTHA(3'b0),
+			//.READDATAWIDTHA(READDATAWIDTHA),
+
+			.WRITEDATAB(DI),
+			.WRITEDATABP(DIP),
+			.READDATAB(DOBDO),
+			.READDATABP(DOPBDOP),
+			.ADDRB(B1ADDR_15),
+			.CLOCKB(CLK3),
+			.READENABLEA(1'b0),
+			.WRITEENABLEB(1'b1),
+			.BYTEENABLEB(B1EN)
+			//.WRITEDATAWIDTHB(WRITEDATAWIDTHB),
+			//.READDATAWIDTHB(3'b0)
+		);
+	end else begin
+		TDP_BRAM36 #(
+			//`include "brams_init_32.vh"
+		) _TECHMAP_REPLACE_ (
+			.WRITEDATAA(32'hFFFFFFFF),
+			.WRITEDATAAP(4'hF),
+			.READDATAA(DO[31:0]),
+			.READDATAAP(DOP[3:0]),
+			.ADDRA(A1ADDR_15),
+			.CLOCKA(CLK2),
+			.READENABLEA(A1EN),
+			.WRITEENABLEA(1'b0),
+			.BYTEENABLEA(4'b0),
+			//.WRITEDATAWIDTHA(3'b0),
+			//.READDATAWIDTHA(READDATAWIDTHA),
+
+			.WRITEDATAB(DI),
+			.WRITEDATABP(DIP),
+			.READDATAB(DOBDO),
+			.READDATABP(DOPBDOP),
+			.ADDRB(B1ADDR_15),
+			.CLOCKB(CLK3),
+			.READENABLEB(1'b0),
+			.WRITEENABLEB(1'b1),
+			.BYTEENABLEB(B1EN)
+			//.WRITEDATAWIDTHB(WRITEDATAWIDTHB),
+			//.READDATAWIDTHB(3'b0)
+		);
+	end endgenerate
+endmodule
+
+// ------------------------------------------------------------------------
+
+module \$__QLF_FACTOR_BRAM18_TDP (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN);
+	parameter CFG_ABITS = 10;
+	parameter CFG_DBITS = 18;
+	parameter CFG_ENABLE_B = 2;
+
+	parameter CLKPOL2 = 1;
+	parameter CLKPOL3 = 1;
+	parameter [18431:0] INIT = 18432'bx;
+
+	input CLK2;
+	input CLK3;
+
+	input [CFG_ABITS-1:0] A1ADDR;
+	output [CFG_DBITS-1:0] A1DATA;
+	input A1EN;
+
+	input [CFG_ABITS-1:0] B1ADDR;
+	input [CFG_DBITS-1:0] B1DATA;
+	input [CFG_ENABLE_B-1:0] B1EN;
+
+	wire [13:0] A1ADDR_14;
+	wire [13:0] B1ADDR_14;
+	//wire [3:0] B1EN_4 = B1EN;
+
+	wire [1:0] DIP, DOP;
+	wire [15:0] DI, DO;
+
+	wire [15:0] DOBDO;
+	wire [1:0] DOPBDOP;
+
+	assign A1DATA = { DOP[1], DO[15: 8], DOP[0], DO[ 7: 0] };
+	assign { DIP[1], DI[15: 8], DIP[0], DI[ 7: 0] } = B1DATA;
+        
+        assign A1ADDR_14[13:CFG_ABITS]  = 0;
+        assign A1ADDR_14[CFG_ABITS-1:0] = A1ADDR;
+        assign B1ADDR_14[13:CFG_ABITS]  = 0;
+        assign B1ADDR_14[CFG_ABITS-1:0] = B1ADDR;
+
+	/*if (CFG_DBITS == 1) begin
+	  assign WRITEDATAWIDTHB = 3'b000;
+	  assign READDATAWIDTHA = 3'b000;
+	end else if (CFG_DBITS == 2) begin
+          assign WRITEDATAWIDTHB = 3'b001;
+          assign READDATAWIDTHA = 3'b001;
+        end else if (CFG_DBITS > 2 && CFG_DBITS <= 4) begin
+          assign WRITEDATAWIDTHB = 3'b010;
+          assign READDATAWIDTHA = 3'b010;
+        end else if (CFG_DBITS > 4 && CFG_DBITS <= 9) begin
+          assign WRITEDATAWIDTHB = 3'b011;
+          assign READDATAWIDTHA = 3'b011;
+        end else if (CFG_DBITS > 9 && CFG_DBITS <= 18) begin
+          //assign WRITEDATAWIDTHB = 3'b100;
+          assign READDATAWIDTHA = 3'b100;
+	end*/
+	generate if (CFG_DBITS > 8) begin
+		TDP_BRAM18 #(
+			//`include "brams_init_18.vh"
+                        .READ_WIDTH_A(CFG_DBITS),
+                        .READ_WIDTH_B(CFG_DBITS),
+                        .WRITE_WIDTH_A(CFG_DBITS),
+                        .WRITE_WIDTH_B(CFG_DBITS),
+		) _TECHMAP_REPLACE_ (
+			.WRITEDATAA(16'hFFFF),
+			.WRITEDATAAP(2'b11),
+			.READDATAA(DO[15:0]),
+			.READDATAAP(DOP[2:0]),
+			.ADDRA(A1ADDR_14),
+			.CLOCKA(CLK2),
+			.READENABLEA(A1EN),
+			.WRITEENABLEA(1'b0),
+			.BYTEENABLEA(2'b0),
+			//.WRITEDATAWIDTHA(3'b0),
+			//.READDATAWIDTHA(READDATAWIDTHA),
+
+			.WRITEDATAB(DI),
+			.WRITEDATABP(DIP),
+			.READDATAB(DOBDO),
+			.READDATABP(DOPBDOP),
+			.ADDRB(B1ADDR_14),
+			.CLOCKB(CLK3),
+			.READENABLEB(1'b0),
+			.WRITEENABLEB(1'b1),
+			.BYTEENABLEB(B1EN)
+			//.WRITEDATAWIDTHB(WRITEDATAWIDTHB),
+			//.READDATAWIDTHB(3'b0)
+		);
+	end else begin
+		TDP_BRAM18 #(
+			//`include "brams_init_16.vh"
+		) _TECHMAP_REPLACE_ (
+			.WRITEDATAA(16'hFFFF),
+			.WRITEDATAAP(2'b11),
+			.READDATAA(DO[15:0]),
+			.READDATAAP(DOP[2:0]),
+			.ADDRA(A1ADDR_14),
+			.CLOCKA(CLK2),
+			.READENABLEA(A1EN),
+			.WRITEENABLEA(1'b0),
+			.BYTEENABLEA(2'b0),
+			//.WRITEDATAWIDTHA(3'b0),
+		//	.READDATAWIDTHA(READDATAWIDTHA),
+
+			.WRITEDATAB(DI),
+			.WRITEDATABP(DIP),
+			.READDATAB(DOBDO),
+			.READDATABP(DOPBDOP),
+			.ADDRB(B1ADDR_14),
+			.CLOCKB(CLK3),
+			.READENABLEB(1'b0),
+			.WRITEENABLEB(1'b1),
+			.BYTEENABLEB(B1EN)
+			//.WRITEDATAWIDTHB(WRITEDATAWIDTHB),
+			//.READDATAWIDTHB(3'b0)
+		);
+	end endgenerate
+endmodule
diff --git a/ql-qlf-plugin/qlf_k6n10f/cells_sim.v b/ql-qlf-plugin/qlf_k6n10f/cells_sim.v
new file mode 100644
index 0000000..25fb1e0
--- /dev/null
+++ b/ql-qlf-plugin/qlf_k6n10f/cells_sim.v
@@ -0,0 +1,882 @@
+// Copyright (C) 2020-2021  The SymbiFlow Authors.
+//
+// Use of this source code is governed by a ISC-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/ISC
+//
+// SPDX-License-Identifier:ISC
+
+(* abc9_flop, lib_whitebox *)
+module sh_dff(
+    output reg Q,
+    input D,
+    (* clkbuf_sink *)
+    input C
+);
+    parameter [0:0] INIT = 1'b0;
+    initial Q = INIT;
+
+    always @(posedge C)
+            Q <= D;
+endmodule
+
+module MUXCY(output O, input CI, DI, S);
+  assign O = S ? CI : DI;
+endmodule
+
+module XORCY(output O, input CI, LI);
+  assign O = CI ^ LI;
+endmodule
+
+(* abc9_box, lib_blackbox *)
+module adder_carry(
+    output sumout,
+    output cout,
+    input p,
+    input g,
+    input cin
+);
+    assign sumout = p ^ cin;
+    assign cout = p ? cin : g;
+
+endmodule
+
+(* abc9_box, lib_whitebox *)
+module adder_lut5(
+   output lut5_out,
+   (* abc9_carry *)
+   output cout,
+   input [0:4] in,
+   (* abc9_carry *)
+   input cin
+);
+    parameter [0:15] LUT=0;
+    parameter IN2_IS_CIN = 0;
+
+    wire [0:4] li = (IN2_IS_CIN) ? {in[0], in[1], cin, in[3], in[4]} : {in[0], in[1], in[2], in[3],in[4]};
+
+    // Output function
+    wire [0:15] s1 = li[0] ?
+        {LUT[0], LUT[2], LUT[4], LUT[6], LUT[8], LUT[10], LUT[12], LUT[14], LUT[16], LUT[18], LUT[20], LUT[22], LUT[24], LUT[26], LUT[28], LUT[30]}:
+        {LUT[1], LUT[3], LUT[5], LUT[7], LUT[9], LUT[11], LUT[13], LUT[15], LUT[17], LUT[19], LUT[21], LUT[23], LUT[25], LUT[27], LUT[29], LUT[31]};
+
+    wire [0:7] s2 = li[1] ? {s1[0], s1[2], s1[4], s1[6], s1[8], s1[10], s1[12], s1[14]} :
+                            {s1[1], s1[3], s1[5], s1[7], s1[9], s1[11], s1[13], s1[15]};
+
+    wire [0:3] s3 = li[2] ? {s2[0], s2[2], s2[4], s2[6]} : {s2[1], s2[3], s2[5], s2[7]};
+    wire [0:1] s4 = li[3] ? {s3[0], s3[2]} : {s3[1], s3[3]};
+
+    assign lut5_out = li[4] ? s4[0] : s4[1];
+
+    // Carry out function
+    assign cout = (s3[2]) ? cin : s3[3];
+
+endmodule
+
+
+
+(* abc9_lut=1, lib_whitebox *)
+module frac_lut6(
+    input [0:5] in,
+    output [0:3] lut4_out,
+    output [0:1] lut5_out,
+    output lut6_out
+);
+    parameter [0:63] LUT = 0;
+    // Effective LUT input
+    wire [0:5] li = in;
+
+    // Output function
+    wire [0:31] s1 = li[0] ?
+    {LUT[0] , LUT[2] , LUT[4] , LUT[6] , LUT[8] , LUT[10], LUT[12], LUT[14], 
+     LUT[16], LUT[18], LUT[20], LUT[22], LUT[24], LUT[26], LUT[28], LUT[30],
+     LUT[32], LUT[34], LUT[36], LUT[38], LUT[40], LUT[42], LUT[44], LUT[46],
+     LUT[48], LUT[50], LUT[52], LUT[54], LUT[56], LUT[58], LUT[60], LUT[62]}:
+    {LUT[1] , LUT[3] , LUT[5] , LUT[7] , LUT[9] , LUT[11], LUT[13], LUT[15], 
+     LUT[17], LUT[19], LUT[21], LUT[23], LUT[25], LUT[27], LUT[29], LUT[31],
+     LUT[33], LUT[35], LUT[37], LUT[39], LUT[41], LUT[43], LUT[45], LUT[47],
+     LUT[49], LUT[51], LUT[53], LUT[55], LUT[57], LUT[59], LUT[61], LUT[63]};
+
+    wire [0:15] s2 = li[1] ?
+    {s1[0] , s1[2] , s1[4] , s1[6] , s1[8] , s1[10], s1[12], s1[14],
+     s1[16], s1[18], s1[20], s1[22], s1[24], s1[26], s1[28], s1[30]}:
+    {s1[1] , s1[3] , s1[5] , s1[7] , s1[9] , s1[11], s1[13], s1[15],
+     s1[17], s1[19], s1[21], s1[23], s1[25], s1[27], s1[29], s1[31]};
+
+    wire [0:7] s3 = li[2] ?
+    {s2[0], s2[2], s2[4], s2[6], s2[8], s2[10], s2[12], s2[14]}:
+    {s2[1], s2[3], s2[5], s2[7], s2[9], s2[11], s2[13], s2[15]};
+
+    wire [0:3] s4 = li[3] ? {s3[0], s3[2], s3[4], s3[6]}:
+                            {s3[1], s3[3], s3[5], s3[7]};
+
+    wire [0:1] s5 = li[4] ? {s4[0], s4[2]} : {s4[1], s4[3]};
+
+    assign lut4_out[0] = s4[0];
+    assign lut4_out[1] = s4[1];
+    assign lut4_out[2] = s4[2];
+    assign lut4_out[3] = s4[3];
+
+    assign lut5_out[0] = s0[0];
+    assign lut5_out[1] = s5[1];
+
+    assign lut6_out = li[5] ? s5[0] : s5[1];
+
+endmodule
+
+(* abc9_flop, lib_whitebox *)
+module dff(
+    output reg Q,
+    input D,
+    (* clkbuf_sink *)
+    (* invertible_pin = "IS_C_INVERTED" *)
+    input C
+);
+    parameter [0:0] INIT = 1'b0;
+    parameter [0:0] IS_C_INVERTED = 1'b0;
+    initial Q = INIT;
+    case(|IS_C_INVERTED)
+          1'b0:
+            always @(posedge C)
+                Q <= D;
+          1'b1:
+            always @(negedge C)
+                Q <= D;
+    endcase
+endmodule
+
+(* abc9_flop, lib_whitebox *)
+module dffr(
+    output reg Q,
+    input D,
+    input R,
+    (* clkbuf_sink *)
+    (* invertible_pin = "IS_C_INVERTED" *)
+    input C
+);
+    parameter [0:0] INIT = 1'b0;
+    parameter [0:0] IS_C_INVERTED = 1'b0;
+    initial Q = INIT;
+    case(|IS_C_INVERTED)
+          1'b0:
+            always @(posedge C or posedge R)
+                if (R)
+                        Q <= 1'b0;
+                else
+                        Q <= D;
+          1'b1:
+            always @(negedge C or posedge R)
+                if (R)
+                        Q <= 1'b0;
+                else
+                        Q <= D;
+    endcase
+endmodule
+
+(* abc9_flop, lib_whitebox *)
+module dffre(
+    output reg Q,
+    input D,
+    input R,
+    input E,
+    (* clkbuf_sink *)
+    (* invertible_pin = "IS_C_INVERTED" *)
+    input C
+);
+    parameter [0:0] INIT = 1'b0;
+    parameter [0:0] IS_C_INVERTED = 1'b0;
+    initial Q = INIT;
+    case(|IS_C_INVERTED)
+          1'b0:
+            always @(posedge C or posedge R)
+              if (R)
+                Q <= 1'b0;
+              else if(E)
+                Q <= D;
+          1'b1:
+            always @(negedge C or posedge R)
+              if (R)
+                Q <= 1'b0;
+              else if(E)
+                Q <= D;
+        endcase
+endmodule
+
+module dffs(
+    output reg Q,
+    input D,
+    (* clkbuf_sink *)
+    (* invertible_pin = "IS_C_INVERTED" *)
+    input C,
+    input S
+);
+    parameter [0:0] INIT = 1'b0;
+    parameter [0:0] IS_C_INVERTED = 1'b0;
+    initial Q = INIT;
+    case(|IS_C_INVERTED)
+          1'b0:
+            always @(posedge C or negedge S)
+              if (S)
+                Q <= 1'b1;
+              else
+                Q <= D;
+          1'b1:
+            always @(negedge C or negedge S)
+              if (S)
+                Q <= 1'b1;
+              else
+                Q <= D;
+        endcase
+endmodule
+
+module dffse(
+    output reg Q,
+    input D,
+    (* clkbuf_sink *)
+    (* invertible_pin = "IS_C_INVERTED" *)
+    input C,
+    input S,
+    input E,
+);
+    parameter [0:0] INIT = 1'b0;
+    parameter [0:0] IS_C_INVERTED = 1'b0;
+    initial Q = INIT;
+    case(|IS_C_INVERTED)
+          1'b0:
+            always @(posedge C or negedge S)
+              if (S)
+                Q <= 1'b1;
+              else if(E)
+                Q <= D;
+          1'b1:
+            always @(negedge C or negedge S)
+              if (S)
+                Q <= 1'b1;
+              else if(E)
+                Q <= D;
+        endcase
+endmodule
+
+module dffsr(
+    output reg Q,
+    input D,
+    (* clkbuf_sink *)
+    (* invertible_pin = "IS_C_INVERTED" *)
+    input C,
+    input R,
+    input S
+);
+    parameter [0:0] INIT = 1'b0;
+    parameter [0:0] IS_C_INVERTED = 1'b0;
+    initial Q = INIT;
+    case(|IS_C_INVERTED)
+          1'b0:
+            always @(posedge C or negedge S or negedge R)
+              if (S)
+                Q <= 1'b1;
+              else if (R)
+                Q <= 1'b0;
+              else
+                Q <= D;
+          1'b1:
+            always @(negedge C or negedge S or negedge R)
+              if (S)
+                Q <= 1'b1;
+              else if (R)
+                Q <= 1'b0;
+              else
+                Q <= D;
+        endcase
+endmodule
+
+/*
+module dffsre(
+    output reg Q,
+    input D,
+    (* clkbuf_sink *)
+    (* invertible_pin = "IS_C_INVERTED" *)
+    input C,
+    input E,
+    input R,
+    input S
+);
+    parameter [0:0] INIT = 1'b0;
+    parameter [0:0] IS_C_INVERTED = 1'b0;
+    initial Q = INIT;
+    case(|IS_C_INVERTED)
+          1'b0:
+            always @(posedge C or posedge S or posedge R)
+              if (S)
+                Q <= 1'b1;
+              else if (R)
+                Q <= 1'b0;
+              else if (E)
+                Q <= D;
+        endcase
+endmodule
+*/
+
+module dffsre(
+    output reg Q,
+    input D,
+    (* clkbuf_sink *)
+    input C,
+    input E,
+    input R,
+    input S
+);
+    parameter [0:0] INIT = 1'b0;
+    initial Q = INIT;
+
+        always @(posedge C or negedge S or negedge R)
+          if (!R)
+            Q <= 1'b0;
+          else if (!S)
+            Q <= 1'b1;
+          else if (E)
+            Q <= D;
+        
+endmodule
+
+module dffnsre(
+    output reg Q,
+    input D,
+    (* clkbuf_sink *)
+    input C,
+    input E,
+    input R,
+    input S
+);
+    parameter [0:0] INIT = 1'b0;
+    initial Q = INIT;
+
+        always @(negedge C or negedge S or negedge R)
+          if (!R)
+            Q <= 1'b0;
+          else if (!S)
+            Q <= 1'b1;
+          else if (E)
+            Q <= D;
+        
+endmodule
+
+/*
+(* abc9_flop, lib_whitebox *)
+module latchsre (
+    output reg Q,
+    input S,
+    input R,
+    input D,
+    input G,
+    input E
+);
+    parameter [0:0] INIT = 1'b0;
+    parameter [0:0] IS_C_INVERTED = 1'b0;
+    initial Q = INIT;
+    always @*
+            begin
+              if (R) Q <= 1'b0;
+              if (S) Q <= 1'b1;
+            else if (E && G) Q <= D;
+    end
+endmodule
+*/
+
+(* abc9_flop, lib_whitebox *)
+module latchsre (
+    output reg Q,
+    input S,
+    input R,
+    input D,
+    input G,
+    input E
+);
+    parameter [0:0] INIT = 1'b0;
+    initial Q = INIT;
+    always @*
+      begin
+        if (!R) 
+          Q <= 1'b0;
+        else if (!S) 
+          Q <= 1'b1;
+        else if (E && G) 
+          Q <= D;
+      end
+endmodule
+
+(* abc9_flop, lib_whitebox *)
+module latchnsre (
+    output reg Q,
+    input S,
+    input R,
+    input D,
+    input G,
+    input E
+);
+    parameter [0:0] INIT = 1'b0;
+    initial Q = INIT;
+    always @*
+      begin
+        if (!R) 
+          Q <= 1'b0;
+        else if (!S) 
+          Q <= 1'b1;
+        else if (E && !G) 
+          Q <= D;
+      end
+endmodule
+
+(* abc9_flop, lib_whitebox *)
+module scff(
+    output reg Q,
+    input D,
+    input clk
+);
+    parameter [0:0] INIT = 1'b0;
+    initial Q = INIT;
+
+    always @(posedge clk)
+            Q <= D;
+endmodule
+
+module DP_RAM16K (
+    input rclk, 
+    input wclk,
+    input wen,
+    input ren,
+    input[8:0] waddr,
+    input[8:0] raddr,
+    input[31:0] d_in,
+    input[31:0] wenb,
+    output[31:0] d_out );
+
+    _dual_port_sram memory_0 (
+                .wclk           (wclk),
+                .wen            (wen),
+                .waddr          (waddr),
+                .data_in        (d_in),
+                .rclk           (rclk),
+                .ren            (ren),
+                .raddr          (raddr),
+                .wenb		(wenb),
+                .d_out          (d_out) );
+
+endmodule
+
+module _dual_port_sram (
+    input wclk,
+    input wen,
+    input[8:0] waddr,
+    input[31:0] data_in,
+    input rclk,
+    input ren,
+    input[8:0] raddr,
+    input[31:0] wenb,
+    output[31:0] d_out );
+
+    // MODE 0:  512 x 32
+    // MODE 1: 1024 x 16
+    // MODE 2: 1024 x 8
+    // MODE 3: 2048 x 4
+        
+    integer i;
+    reg[31:0] ram[512:0];
+    reg[31:0] internal;
+    // The memory is self initialised
+        
+    initial begin
+            for (i=0;i<=512;i=i+1)
+            begin
+                ram[i] = 0;
+            end
+            internal = 31'b0; 
+    end
+    
+    wire [31:0] WMASK;
+
+    assign d_out = internal;
+    assign WMASK = wenb;
+
+    always @(posedge wclk) begin
+            if(!wen) begin
+              if (WMASK[ 0]) ram[waddr][ 0] <= data_in[ 0];
+              if (WMASK[ 1]) ram[waddr][ 1] <= data_in[ 1];
+              if (WMASK[ 2]) ram[waddr][ 2] <= data_in[ 2];
+              if (WMASK[ 3]) ram[waddr][ 3] <= data_in[ 3];
+              if (WMASK[ 4]) ram[waddr][ 4] <= data_in[ 4];
+              if (WMASK[ 5]) ram[waddr][ 5] <= data_in[ 5];
+              if (WMASK[ 6]) ram[waddr][ 6] <= data_in[ 6];
+              if (WMASK[ 7]) ram[waddr][ 7] <= data_in[ 7];
+              if (WMASK[ 8]) ram[waddr][ 8] <= data_in[ 8];
+              if (WMASK[ 9]) ram[waddr][ 9] <= data_in[ 9];
+              if (WMASK[10]) ram[waddr][10] <= data_in[10];
+              if (WMASK[11]) ram[waddr][11] <= data_in[11];
+              if (WMASK[12]) ram[waddr][12] <= data_in[12];
+              if (WMASK[13]) ram[waddr][13] <= data_in[13];
+              if (WMASK[14]) ram[waddr][14] <= data_in[14];
+              if (WMASK[15]) ram[waddr][15] <= data_in[15];
+              if (WMASK[16]) ram[waddr][16] <= data_in[16];
+              if (WMASK[17]) ram[waddr][17] <= data_in[17];
+              if (WMASK[18]) ram[waddr][18] <= data_in[18];
+              if (WMASK[19]) ram[waddr][19] <= data_in[19];
+              if (WMASK[20]) ram[waddr][20] <= data_in[20];
+              if (WMASK[21]) ram[waddr][21] <= data_in[21];
+              if (WMASK[22]) ram[waddr][22] <= data_in[22];
+              if (WMASK[23]) ram[waddr][23] <= data_in[23];
+              if (WMASK[24]) ram[waddr][24] <= data_in[24];
+              if (WMASK[25]) ram[waddr][25] <= data_in[25];
+              if (WMASK[26]) ram[waddr][26] <= data_in[26];
+              if (WMASK[27]) ram[waddr][27] <= data_in[27];
+              if (WMASK[28]) ram[waddr][28] <= data_in[28];
+              if (WMASK[29]) ram[waddr][29] <= data_in[29];
+              if (WMASK[30]) ram[waddr][30] <= data_in[30];
+              if (WMASK[31]) ram[waddr][31] <= data_in[31];
+            end
+    end
+
+    always @(posedge rclk) begin
+            if(!ren) begin
+              internal <= ram[raddr];
+            end
+    end
+endmodule
+
+module QL_DSP (
+    input CLK,
+    input [15:0] A, B, C, D,
+    output [31:0] O,
+    output CO // Currently unused, left in case we want to support signed operations in the future.
+);
+    parameter [0:0] A_REG = 0;
+    parameter [0:0] B_REG = 0;
+    parameter [0:0] C_REG = 0;
+    parameter [0:0] D_REG = 0;
+    parameter [0:0] ENABLE_DSP = 0;
+    parameter [0:0] A_SIGNED = 0;
+    parameter [0:0] B_SIGNED = 0;
+
+    wire [15:0] iA, iB, iC, iD;
+    wire [15:0] iF, iJ, iK, iG;
+
+    // Regs C and A, currently unused
+    reg [15:0] rC, rA;
+
+    assign iC = C_REG ? rC : C;
+    assign iA = A_REG ? rA : A;
+
+    // Regs B and D, currently unused
+    reg [15:0] rB, rD;
+
+    assign iB = B_REG ? rB : B;
+    assign iD = D_REG ? rD : D;
+
+    // Multiplier Stage
+    wire [15:0] p_Ah_Bh, p_Al_Bh, p_Ah_Bl, p_Al_Bl;
+    wire [15:0] Ah, Al, Bh, Bl;
+    assign Ah = {A_SIGNED ? {8{iA[15]}} : 8'b0, iA[15: 8]};
+    assign Al = {8'b0, iA[ 7: 0]};
+    assign Bh = {B_SIGNED ? {8{iB[15]}} : 8'b0, iB[15: 8]};
+    assign Bl = {8'b0, iB[ 7: 0]};
+    assign p_Ah_Bh = Ah * Bh; // F
+    assign p_Al_Bh = {8'b0, Al[7:0]} * Bh; // J
+    assign p_Ah_Bl = Ah * {8'b0, Bl[7:0]}; // K
+    assign p_Al_Bl = Al * Bl; // G
+
+    assign iF = p_Ah_Bh;
+    assign iJ = p_Al_Bh;
+
+    assign iK = p_Ah_Bl;
+    assign iG = p_Al_Bl;
+
+    // Adder Stage
+    wire [23:0] iK_e = {A_SIGNED ? {8{iK[15]}} : 8'b0, iK};
+    wire [23:0] iJ_e = {B_SIGNED ? {8{iJ[15]}} : 8'b0, iJ};
+    assign iL = iG + (iK_e << 8) + (iJ_e << 8) + (iF << 16);
+
+    // Output Stage
+    assign O = iL;
+
+endmodule
+
+
+module TDP_BRAM18 (
+    (* clkbuf_sink *)
+    input CLOCKA,
+    (* clkbuf_sink *)
+    input CLOCKB,
+    input READENABLEA,
+    input READENABLEB,
+    input [13:0] ADDRA,
+    input [13:0] ADDRB,
+    input [15:0] WRITEDATAA,
+    input [15:0] WRITEDATAB,
+    input [1:0] WRITEDATAAP,
+    input [1:0] WRITEDATABP,
+    input WRITEENABLEA,
+    input WRITEENABLEB,
+    input [1:0] BYTEENABLEA,
+    input [1:0] BYTEENABLEB,
+    //input [2:0] WRITEDATAWIDTHA,
+    //input [2:0] WRITEDATAWIDTHB,
+    //input [2:0] READDATAWIDTHA,
+    //input [2:0] READDATAWIDTHB,
+    output [15:0] READDATAA,
+    output [15:0] READDATAB,
+    output [1:0] READDATAAP,
+    output [1:0] READDATABP
+);
+    parameter INITP_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_10 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_11 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_12 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_13 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_14 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_15 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_16 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_17 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_18 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_19 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_20 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_21 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_22 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_23 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_24 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_25 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_26 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_27 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_28 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_29 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_30 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_31 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_32 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_33 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_34 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_35 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_36 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_37 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_38 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_39 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter integer READ_WIDTH_A = 0;
+    parameter integer READ_WIDTH_B = 0;
+    parameter integer WRITE_WIDTH_A = 0;
+    parameter integer WRITE_WIDTH_B = 0;
+
+endmodule
+
+module TDP_BRAM36 (
+    (* clkbuf_sink *)
+    input CLOCKA,
+    (* clkbuf_sink *)
+    input CLOCKB,
+    input READENABLEA,
+    input READENABLEB,
+    input [14:0] ADDRA,
+    input [14:0] ADDRB,
+    input [31:0] WRITEDATAA,
+    input [31:0] WRITEDATAB,
+    input [3:0] WRITEDATAAP,
+    input [3:0] WRITEDATABP,
+    input WRITEENABLEA,
+    input WRITEENABLEB,
+    input [3:0] BYTEENABLEA,
+    input [3:0] BYTEENABLEB,
+    //input [2:0] WRITEDATAWIDTHA,
+    //input [2:0] WRITEDATAWIDTHB,
+    //input [2:0] READDATAWIDTHA,
+    //input [2:0] READDATAWIDTHB,
+    output [31:0] READDATAA,
+    output [31:0] READDATAB,
+    output [3:0] READDATAAP,
+    output [3:0] READDATABP
+);
+    parameter INITP_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_10 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_11 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_12 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_13 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_14 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_15 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_16 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_17 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_18 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_19 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_20 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_21 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_22 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_23 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_24 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_25 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_26 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_27 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_28 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_29 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_30 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_31 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_32 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_33 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_34 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_35 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_36 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_37 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_38 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_39 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_40 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_41 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_42 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_43 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_44 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_45 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_46 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_47 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_48 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_49 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_4A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_4B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_4C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_4D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_4E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_4F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_50 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_51 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_52 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_53 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_54 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_55 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_56 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_57 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_58 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_59 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_5A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_5B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_5C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_5D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_5E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_5F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_60 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_61 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_62 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_63 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_64 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_65 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_66 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_67 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_68 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_69 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_6A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_6B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_6C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_6D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_6E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_6F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_70 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_71 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_72 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_73 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_74 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_75 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_76 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_77 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_78 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_79 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_7A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_7B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_7C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_7D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_7E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_7F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter integer READ_WIDTH_A = 0;
+    parameter integer READ_WIDTH_B = 0;
+    parameter integer WRITE_WIDTH_A = 0;
+    parameter integer WRITE_WIDTH_B = 0;
+
+endmodule
diff --git a/ql-qlf-plugin/qlf_k6n10f/dsp_map.v b/ql-qlf-plugin/qlf_k6n10f/dsp_map.v
new file mode 100644
index 0000000..4b8ae64
--- /dev/null
+++ b/ql-qlf-plugin/qlf_k6n10f/dsp_map.v
@@ -0,0 +1,27 @@
+// Copyright (C) 2020-2021  The SymbiFlow Authors.
+//
+// Use of this source code is governed by a ISC-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/ISC
+//
+// SPDX-License-Identifier:ISC
+
+module \$__MUL16X16 (input [15:0] A, input [15:0] B, output [31:0] Y);
+	parameter A_SIGNED = 0;
+	parameter B_SIGNED = 0;
+	parameter A_WIDTH = 0;
+	parameter B_WIDTH = 0;
+	parameter Y_WIDTH = 0;
+
+	QL_DSP #(
+		.A_REG(1'b0),
+		.B_REG(1'b0),
+		.C_REG(1'b0),
+		.D_REG(1'b0),
+		.ENABLE_DSP(1'b1),
+	) _TECHMAP_REPLACE_ (
+		.A(A),
+		.B(B),
+		.O(Y),
+	);
+endmodule
diff --git a/ql-qlf-plugin/qlf_k6n10f/ffs_map.v b/ql-qlf-plugin/qlf_k6n10f/ffs_map.v
new file mode 100644
index 0000000..3c5e9f0
--- /dev/null
+++ b/ql-qlf-plugin/qlf_k6n10f/ffs_map.v
@@ -0,0 +1,197 @@
+// Copyright (C) 2020-2021  The SymbiFlow Authors.
+//
+// Use of this source code is governed by a ISC-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/ISC
+//
+// SPDX-License-Identifier:ISC
+
+// Basic DFF
+
+module \$_DFF_P_ (D, C, Q);
+    input D;
+    input C;
+    output Q;
+    dffsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(1'b1), .R(1'b1), .S(1'b1));
+endmodule
+
+// Async reset
+module \$_DFF_PP0_ (D, C, R, Q);
+    input D;
+    input C;
+    input R;
+    output Q;
+    dffsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(1'b1), .R(!R), .S(1'b1));
+endmodule
+
+// Async set
+module \$_DFF_PP1_ (D, C, R, Q);
+    input D;
+    input C;
+    input R;
+    output Q;
+    dffsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(1'b1), .R(1'b1), .S(!R));
+endmodule
+
+// Async reset, enable
+
+module  \$_DFFE_PP0P_ (D, C, E, R, Q);
+    input D;
+    input C;
+    input E;
+    input R;
+    output Q;
+    dffsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(E), .R(!R), .S(1'b1));
+endmodule
+
+// Async set, enable
+
+module  \$_DFFE_PP1P_ (D, C, E, R, Q);
+    input D;
+    input C;
+    input E;
+    input R;
+    output Q;
+    dffsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(E), .R(1'b1), .S(!R));
+endmodule
+
+// Async set & reset
+
+module \$_DFFSR_PPP_ (D, C, R, S, Q);
+    input D;
+    input C;
+    input R;
+    input S;
+    output Q;
+    dffsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(1'b1), .R(!R), .S(!S));
+endmodule
+
+// Async set, reset & enable
+
+module \$_DFFSRE_PPPP_ (D, Q, C, E, R, S);
+    input D;
+    input C;
+    input E;
+    input R;
+    input S;
+    output Q;
+    dffsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(E), .R(!R), .S(!S));
+endmodule
+
+// Latch with async set and reset
+module  \$_DLATCHSR_PPP_ (input E, S, R, D, output Q);
+    latchsre _TECHMAP_REPLACE_ (.D(D), .Q(Q), .E(1'b1), .G(E),  .R(!R), .S(!S));
+endmodule
+
+module  \$_DLATCHSR_NPP_ (input E, S, R, D, output Q);
+    latchnsre _TECHMAP_REPLACE_ (.D(D), .Q(Q), .E(1'b1), .G(E),  .R(!R), .S(!S));
+endmodule
+
+// The following techmap operation are not performed right now
+// as Negative edge FF are not legalized in synth_quicklogic for qlf_k6n10
+// but in case we implement clock inversion in the future, the support is ready for it.
+
+module \$_DFF_N_ (D, C, Q);
+    input D;
+    input C;
+    output Q;
+    parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
+    dffnsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(1'b1), .R(1'b1), .S(1'b1));
+endmodule
+
+module \$_DFF_NP0_ (D, C, R, Q);
+    input D;
+    input C;
+    input R;
+    output Q;
+    parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
+    dffnsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(1'b1), .R(!R), .S(1'b1));
+endmodule
+
+module \$_DFF_NP1_ (D, C, R, Q);
+    input D;
+    input C;
+    input R;
+    output Q;
+    dffnsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(1'b1), .R(1'b1), .S(!R));
+endmodule
+
+module  \$_DFFE_NP0P_ (D, C, E, R, Q);
+    input D;
+    input C;
+    input E;
+    input R;
+    output Q;
+    parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
+    dffnsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(E), .R(!R), .S(1'b1));
+endmodule
+
+module  \$_DFFE_NP1P_ (D, C, E, R, Q);
+    input D;
+    input C;
+    input E;
+    input R;
+    output Q;
+    parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
+    dffnsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(E), .R(1'b1), .S(!R));
+endmodule
+
+module \$_DFFSR_NPP_ (D, C, R, S, Q);
+    input D;
+    input C;
+    input R;
+    input S;
+    output Q;
+    dffnsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(1'b1), .R(!R), .S(!S));
+endmodule
+
+module \$_DFFSRE_PPPP_ (D, C, E, R, S, Q);
+    input D;
+    input C;
+    input E;
+    input R;
+    input S;
+    output Q;
+    dffnsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(E), .R(!R), .S(!S));
+endmodule
+
+module \$__SHREG_DFF_P_ (D, Q, C);
+    input D;
+    input C;
+    output Q;
+
+    parameter DEPTH = 2;
+    reg [DEPTH-2:0] q;
+    genvar i;
+    generate for (i = 0; i < DEPTH; i = i + 1) begin: slice
+
+
+        // First in chain
+        generate if (i == 0) begin
+                 sh_dff #() shreg_beg (
+                    .Q(q[i]),
+                    .D(D),
+                    .C(C)
+                );
+        end endgenerate
+        // Middle in chain
+        generate if (i > 0 && i != DEPTH-1) begin
+                 sh_dff #() shreg_mid (
+                    .Q(q[i]),
+                    .D(q[i-1]),
+                    .C(C)
+                );
+        end endgenerate
+        // Last in chain
+        generate if (i == DEPTH-1) begin
+                 sh_dff #() shreg_end (
+                    .Q(Q),
+                    .D(q[i-1]),
+                    .C(C)
+                );
+        end endgenerate
+   end: slice
+   endgenerate
+
+endmodule
+
diff --git a/ql-qlf-plugin/qlf_k6n10f/lut_map.v b/ql-qlf-plugin/qlf_k6n10f/lut_map.v
new file mode 100644
index 0000000..5d8c421
--- /dev/null
+++ b/ql-qlf-plugin/qlf_k6n10f/lut_map.v
@@ -0,0 +1,31 @@
+// Copyright (C) 2020-2021  The SymbiFlow Authors.
+//
+// Use of this source code is governed by a ISC-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/ISC
+//
+// SPDX-License-Identifier:ISC
+
+`ifndef NO_LUT
+module \$lut (A, Y);
+    parameter WIDTH = 0;
+    parameter LUT = 0;
+
+    (* force_downto *)
+    input [WIDTH-1:0] A;
+    output Y;
+
+/*     generate
+	    if (WIDTH == 6) begin
+	       frac_lut6 #(.LUT(LUT)) _TECHMAP_REPLACE_ (.lut6_out(Y),.in(A));
+
+	    end else begin
+	       wire _TECHMAP_FAIL_ = 1;
+	    end
+    endgenerate */
+
+endmodule
+`endif
+
+
+
diff --git a/ql-qlf-plugin/synth_quicklogic.cc b/ql-qlf-plugin/synth_quicklogic.cc
index 241005d..62419f7 100644
--- a/ql-qlf-plugin/synth_quicklogic.cc
+++ b/ql-qlf-plugin/synth_quicklogic.cc
@@ -44,6 +44,7 @@
         log("        - pp3      : pp3 \n");
         log("        - qlf_k4n8 : qlf_k4n8 \n");
         log("        - qlf_k6n10: qlf_k6n10 \n");
+        log("        - qlf_k6n10f: qlf_k6n10f \n");
         log("\n");
         log("    -no_abc_opt\n");
         log("        By default most of ABC logic optimization features is\n");
@@ -166,7 +167,7 @@
         if (!design->full_selection())
             log_cmd_error("This command only operates on fully selected designs!\n");
 
-        if (family != "pp3" && family != "qlf_k4n8" && family != "qlf_k6n10")
+        if (family != "pp3" && family != "qlf_k4n8" && family != "qlf_k6n10" && family != "qlf_k6n10f")
             log_cmd_error("Invalid family specified: '%s'\n", family.c_str());
 
         if (family != "pp3") {
@@ -247,7 +248,7 @@
             run("opt_clean");
         }
 
-        if (check_label("map_bram", "(skip if -no_bram)") && (family == "qlf_k6n10" || family == "pp3") && inferBram) {
+        if (check_label("map_bram", "(skip if -no_bram)") && (family == "qlf_k6n10" || family == "qlf_k6n10f" || family == "pp3") && inferBram) {
             run("memory_bram -rules +/quicklogic/" + family + "/brams.txt");
             if (family == "pp3") {
                 run("pp3_braminit");
@@ -264,7 +265,7 @@
         }
 
         if (check_label("map_gates")) {
-            if (inferAdder && (family == "qlf_k4n8" || family == "qlf_k6n10")) {
+            if (inferAdder && (family == "qlf_k4n8" || family == "qlf_k6n10" || family == "qlf_k6n10f")) {
                 run("techmap -map +/techmap.v -map +/quicklogic/" + family + "/arith_map.v");
             } else {
                 run("techmap");
@@ -284,7 +285,7 @@
             if (family == "qlf_k4n8") {
                 run("shregmap -minlen 8 -maxlen 8");
                 run("dfflegalize -cell $_DFF_P_ 0 -cell $_DFF_P??_ 0 -cell $_DFF_N_ 0 -cell $_DFF_N??_ 0 -cell $_DFFSR_???_ 0");
-            } else if (family == "qlf_k6n10") {
+            } else if (family == "qlf_k6n10" || family == "qlf_k6n10f") {
                 run("dfflegalize -cell $_DFF_P_ 0 -cell $_DFF_PP?_ 0 -cell $_DFFE_PP?P_ 0 -cell $_DFFSR_PPP_ 0 -cell $_DFFSRE_PPPP_ 0 -cell "
                     "$_DLATCHSR_PPP_ 0");
                 //    In case we add clock inversion in the future.
@@ -308,7 +309,7 @@
 
         if (check_label("map_luts")) {
             if (abcOpt) {
-                if (family == "qlf_k6n10") {
+                if (family == "qlf_k6n10" || family == "qlf_k6n10f") {
                     run("abc -lut 6 ");
                 } else if (family == "qlf_k4n8") {
                     run("abc -lut 4 ");
@@ -337,7 +338,7 @@
             run("opt_lut");
         }
 
-        if (check_label("map_cells") && (family == "qlf_k6n10" || family == "pp3")) {
+        if (check_label("map_cells") && (family == "qlf_k6n10" || family == "pp3" || family == "qlf_k6n10f")) {
             std::string techMapArgs;
             techMapArgs = "-map +/quicklogic/" + family + "/lut_map.v";
             run("techmap " + techMapArgs);