Added "is_inferred" attribute to all inferred k6n10f DSPs to distinguish them from manually inserted ones.
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
diff --git a/ql-qlf-plugin/ql-dsp-io-regs.cc b/ql-qlf-plugin/ql-dsp-io-regs.cc
index 5772513..3ea2a12 100644
--- a/ql-qlf-plugin/ql-dsp-io-regs.cc
+++ b/ql-qlf-plugin/ql-dsp-io-regs.cc
@@ -82,6 +82,15 @@
std::string cell_type = cell.second->type.str();
if (cell_type == RTLIL::escape_id("QL_DSP2") || cell_type == RTLIL::escape_id("QL_DSP3")) {
auto dsp = cell.second;
+
+ // If the cell does not have the "is_inferred" attribute set
+ // then don't touch it.
+ if (!dsp->has_attribute(RTLIL::escape_id("is_inferred")) ||
+ dsp->get_bool_attribute(RTLIL::escape_id("is_inferred")) == false)
+ {
+ continue;
+ }
+
bool del_clk = true;
bool use_dsp_cfg_params = (cell_type == RTLIL::escape_id("QL_DSP3"));
diff --git a/ql-qlf-plugin/ql-dsp-macc.cc b/ql-qlf-plugin/ql-dsp-macc.cc
index 7f865b5..4fdfff1 100644
--- a/ql-qlf-plugin/ql-dsp-macc.cc
+++ b/ql-qlf-plugin/ql-dsp-macc.cc
@@ -131,6 +131,9 @@
// Add the DSP cell
RTLIL::Cell *cell = pm.module->addCell(RTLIL::escape_id(name), type);
+ // Set attributes
+ cell->set_bool_attribute(RTLIL::escape_id("is_inferred"), true);
+
// Get input/output data signals
RTLIL::SigSpec sig_a;
RTLIL::SigSpec sig_b;
diff --git a/ql-qlf-plugin/ql-dsp-simd.cc b/ql-qlf-plugin/ql-dsp-simd.cc
index b2935a9..dfa3e38 100644
--- a/ql-qlf-plugin/ql-dsp-simd.cc
+++ b/ql-qlf-plugin/ql-dsp-simd.cc
@@ -261,6 +261,16 @@
simd->setParam(RTLIL::escape_id("MODE_BITS"), RTLIL::Const(mode_bits));
log_assert(mode_bits.size() == mode_bits_size);
+ // Handle the "is_inferred" attribute. If one of the fragments
+ // is not inferred mark the whole DSP as not inferred
+ bool is_inferred_a = dsp_a->has_attribute(RTLIL::escape_id("is_inferred")) ?
+ dsp_a->get_bool_attribute(RTLIL::escape_id("is_inferred")) : false;
+ bool is_inferred_b = dsp_b->has_attribute(RTLIL::escape_id("is_inferred")) ?
+ dsp_b->get_bool_attribute(RTLIL::escape_id("is_inferred")) : false;
+
+ simd->set_bool_attribute(RTLIL::escape_id("is_inferred"),
+ is_inferred_a && is_inferred_b);
+
// Mark DSP parts for removal
cellsToRemove.push_back(dsp_a);
cellsToRemove.push_back(dsp_b);
diff --git a/ql-qlf-plugin/qlf_k6n10f/dsp_map.v b/ql-qlf-plugin/qlf_k6n10f/dsp_map.v
index bbfc494..bb9f052 100644
--- a/ql-qlf-plugin/qlf_k6n10f/dsp_map.v
+++ b/ql-qlf-plugin/qlf_k6n10f/dsp_map.v
@@ -34,6 +34,7 @@
{{(18 - B_WIDTH){1'b0}}, B};
generate if (`USE_DSP_CFG_PARAMS == 0) begin
+ (* is_inferred=1 *)
dsp_t1_20x18x64_cfg_ports _TECHMAP_REPLACE_ (
.a_i (a),
.b_i (b),
@@ -53,6 +54,7 @@
.register_inputs_i (1'b0)
);
end else begin
+ (* is_inferred=1 *)
dsp_t1_20x18x64_cfg_params #(
.OUTPUT_SELECT (3'd0),
.SATURATE_ENABLE (1'b0),
@@ -98,6 +100,7 @@
{{( 9 - B_WIDTH){1'b0}}, B};
generate if (`USE_DSP_CFG_PARAMS == 0) begin
+ (* is_inferred=1 *)
dsp_t1_10x9x32_cfg_ports _TECHMAP_REPLACE_ (
.a_i (a),
.b_i (b),
@@ -117,6 +120,7 @@
.register_inputs_i (1'b0)
);
end else begin
+ (* is_inferred=1 *)
dsp_t1_10x9x32_cfg_params #(
.OUTPUT_SELECT (3'd0),
.SATURATE_ENABLE (1'b0),