Merge pull request #257 from antmicro/k6n10f_dsp_coeff_params

QuickLogic k6n10f DSP FIR coeffs as params
diff --git a/ql-qlf-plugin/ql-dsp-simd.cc b/ql-qlf-plugin/ql-dsp-simd.cc
index 1bd0850..f84c458 100644
--- a/ql-qlf-plugin/ql-dsp-simd.cc
+++ b/ql-qlf-plugin/ql-dsp-simd.cc
@@ -76,6 +76,9 @@
       std::make_pair("z_o", "z"), std::make_pair("dly_b_o", "dly_b"),
     };
 
+    // DSP parameters
+    const std::vector<std::string> m_DspParams = {"COEFF_0", "COEFF_1", "COEFF_2", "COEFF_3"};
+
     // Source DSP cell type (SISD)
     const RTLIL::IdString m_SisdDspType = RTLIL::escape_id("dsp_t1_10x9x32");
     // Target DSP cell type for the SIMD mode
@@ -193,6 +196,17 @@
                         simd->setPort(dport, sigspec);
                     }
 
+                    // Set parameters
+                    for (const auto &it : m_DspParams) {
+                        auto val_a = dsp_a->getParam(RTLIL::escape_id(it));
+                        auto val_b = dsp_b->getParam(RTLIL::escape_id(it));
+
+                        std::vector<RTLIL::State> bits;
+                        bits.insert(bits.end(), val_a.begin(), val_a.end());
+                        bits.insert(bits.end(), val_b.begin(), val_b.end());
+                        simd->setParam(RTLIL::escape_id(it), RTLIL::Const(bits));
+                    }
+
                     // Enable the fractured mode by connecting the control
                     // port.
                     simd->setPort(RTLIL::escape_id("f_mode"), RTLIL::S1);
diff --git a/ql-qlf-plugin/qlf_k6n10f/cells_sim.v b/ql-qlf-plugin/qlf_k6n10f/cells_sim.v
index 43b3ba2..296fc81 100644
--- a/ql-qlf-plugin/qlf_k6n10f/cells_sim.v
+++ b/ql-qlf-plugin/qlf_k6n10f/cells_sim.v
@@ -706,13 +706,14 @@
     input  [5:0]  shift_right,
     input         round,
     input         subtract,
-    input         register_inputs,
-    input  [19:0] coeff_0,
-    input  [19:0] coeff_1,
-    input  [19:0] coeff_2,
-    input  [19:0] coeff_3
+    input         register_inputs
 );
 
+    parameter [19:0] COEFF_0 = 20'd0;
+    parameter [19:0] COEFF_1 = 20'd0;
+    parameter [19:0] COEFF_2 = 20'd0;
+    parameter [19:0] COEFF_3 = 20'd0;
+
 endmodule
 
 (* blackbox *) // TODO: add sim model
@@ -737,12 +738,14 @@
     input  [5:0]  shift_right_i,
     input         round_i,
     input         subtract_i,
-    input         register_inputs_i,
-    input  [19:0] coeff_0_i,
-    input  [19:0] coeff_1_i,
-    input  [19:0] coeff_2_i,
-    input  [19:0] coeff_3_i
+    input         register_inputs_i
 );
+
+    parameter [19:0] COEFF_0 = 20'd0;
+    parameter [19:0] COEFF_1 = 20'd0;
+    parameter [19:0] COEFF_2 = 20'd0;
+    parameter [19:0] COEFF_3 = 20'd0;
+
 endmodule
 
 (* blackbox *) // TODO: add sim model
@@ -767,10 +770,12 @@
     input  [5:0]  shift_right_i,
     input         round_i,
     input         subtract_i,
-    input         register_inputs_i,
-    input  [ 9:0] coeff_0_i,
-    input  [ 9:0] coeff_1_i,
-    input  [ 9:0] coeff_2_i,
-    input  [ 9:0] coeff_3_i
+    input         register_inputs_i
 );
+
+    parameter [9:0] COEFF_0 = 10'd0;
+    parameter [9:0] COEFF_1 = 10'd0;
+    parameter [9:0] COEFF_2 = 10'd0;
+    parameter [9:0] COEFF_3 = 10'd0;
+
 endmodule
diff --git a/ql-qlf-plugin/qlf_k6n10f/dsp_final_map.v b/ql-qlf-plugin/qlf_k6n10f/dsp_final_map.v
index 5fe905c..b8423e5 100644
--- a/ql-qlf-plugin/qlf_k6n10f/dsp_final_map.v
+++ b/ql-qlf-plugin/qlf_k6n10f/dsp_final_map.v
@@ -26,14 +26,20 @@
     input  [5:0]  shift_right_i,
     input         round_i,
     input         subtract_i,
-    input         register_inputs_i,
-    input  [19:0] coeff_0_i,
-    input  [19:0] coeff_1_i,
-    input  [19:0] coeff_2_i,
-    input  [19:0] coeff_3_i
+    input         register_inputs_i
 );
 
-    QL_DSP2 _TECHMAP_REPLACE_ (
+    parameter [19:0] COEFF_0 = 20'd0;
+    parameter [19:0] COEFF_1 = 20'd0;
+    parameter [19:0] COEFF_2 = 20'd0;
+    parameter [19:0] COEFF_3 = 20'd0;
+
+    QL_DSP2 # (
+        .COEFF_0            (COEFF_0),
+        .COEFF_1            (COEFF_1),
+        .COEFF_2            (COEFF_2),
+        .COEFF_3            (COEFF_3)
+    ) _TECHMAP_REPLACE_ (
         .a                  (a_i),
         .b                  (b_i),
         .acc_fir            (acc_fir_i),
@@ -54,11 +60,7 @@
         .shift_right        (shift_right_i),
         .round              (round_i),
         .subtract           (subtract_i),
-        .register_inputs    (register_inputs_i),
-        .coeff_0            (coeff_0_i),
-        .coeff_1            (coeff_1_i),
-        .coeff_2            (coeff_2_i),
-        .coeff_3            (coeff_3_i)
+        .register_inputs    (register_inputs_i)
     );
 
 endmodule
@@ -91,10 +93,20 @@
     input  [ 9:0] coeff_3_i
 );
 
+    parameter [9:0] COEFF_0 = 10'd0;
+    parameter [9:0] COEFF_1 = 10'd0;
+    parameter [9:0] COEFF_2 = 10'd0;
+    parameter [9:0] COEFF_3 = 10'd0;
+
     wire [37:0] z;
     wire [17:0] dly_b;
 
-    QL_DSP2 _TECHMAP_REPLACE_ (
+    QL_DSP2 # (
+        .COEFF_0            ({10'd0, COEFF_0}),
+        .COEFF_1            ({10'd0, COEFF_1}),
+        .COEFF_2            ({10'd0, COEFF_2}),
+        .COEFF_3            ({10'd0, COEFF_3})
+    ) _TECHMAP_REPLACE_ (
         .a                  ({10'd0, a_i}),
         .b                  ({ 9'd0, b_i}),
         .acc_fir            (acc_fir_i),
@@ -115,11 +127,7 @@
         .shift_right        (shift_right_i),
         .round              (round_i),
         .subtract           (subtract_i),
-        .register_inputs    (register_inputs_i),
-        .coeff_0            ({10'd0, coeff_0_i}),
-        .coeff_1            ({10'd0, coeff_1_i}),
-        .coeff_2            ({10'd0, coeff_2_i}),
-        .coeff_3            ({10'd0, coeff_3_i})
+        .register_inputs    (register_inputs_i)
     );
 
     assign z_o = z[18:0];
diff --git a/ql-qlf-plugin/qlf_k6n10f/dsp_map.v b/ql-qlf-plugin/qlf_k6n10f/dsp_map.v
index 054d82a..e10df2a 100644
--- a/ql-qlf-plugin/qlf_k6n10f/dsp_map.v
+++ b/ql-qlf-plugin/qlf_k6n10f/dsp_map.v
@@ -41,11 +41,7 @@
         .shift_right_i      (6'd0),
         .round_i            (1'b0),
         .subtract_i         (1'b0),
-        .register_inputs_i  (1'b0),
-        .coeff_0_i          (20'd0),
-        .coeff_1_i          (20'd0),
-        .coeff_2_i          (20'd0),
-        .coeff_3_i          (20'd0)
+        .register_inputs_i  (1'b0)
     );
 
     assign Y = z;
@@ -87,11 +83,7 @@
         .shift_right_i      (6'd0),
         .round_i            (1'b0),
         .subtract_i         (1'b0),
-        .register_inputs_i  (1'b0),
-        .coeff_0_i          (10'd0),
-        .coeff_1_i          (10'd0),
-        .coeff_2_i          (10'd0),
-        .coeff_3_i          (10'd0)
+        .register_inputs_i  (1'b0)
     );
 
     assign Y = z;