Merge pull request #130 from antmicro/add-new-write-edif-backend
ql: edif: add padding to LUT INITs
diff --git a/README.md b/README.md
index 4721300..0e3fc84 100644
--- a/README.md
+++ b/README.md
@@ -63,6 +63,7 @@
The plugin adds the following command:
* synth_quicklogic
+* ql_dsp
Detailed help on the supported command(s) can be obtained by running `help <command_name>` in Yosys.
diff --git a/ql-qlf-plugin/Makefile b/ql-qlf-plugin/Makefile
index 9886c83..e2fa3e1 100644
--- a/ql-qlf-plugin/Makefile
+++ b/ql-qlf-plugin/Makefile
@@ -16,44 +16,44 @@
include ../Makefile_plugin.common
COMMON = common
-QLF_K4N8_DIR = ql-qlf-k4n8
-QLF_K6N10_DIR = ql-qlf-k6n10
+QLF_K4N8_DIR = qlf_k4n8
+QLF_K6N10_DIR = qlf_k6n10
PP3_DIR = pp3
-VERILOG_MODULES = $(COMMON)/cells_sim.v \
- $(QLF_K4N8_DIR)/qlf_k4n8_arith_map.v \
- $(QLF_K4N8_DIR)/qlf_k4n8_cells_sim.v \
- $(QLF_K4N8_DIR)/qlf_k4n8_ffs_map.v \
- $(QLF_K6N10_DIR)/qlf_k6n10_arith_map.v \
- $(QLF_K6N10_DIR)/qlf_k6n10_brams_map.v \
- $(QLF_K6N10_DIR)/qlf_k6n10_brams.txt \
- $(QLF_K6N10_DIR)/qlf_k6n10_cells_sim.v \
- $(QLF_K6N10_DIR)/qlf_k6n10_ffs_map.v \
- $(QLF_K6N10_DIR)/qlf_k6n10_dsp_map.v \
- $(QLF_K6N10_DIR)/qlf_k6n10_lut_map.v \
- $(PP3_DIR)/pp3_abc9_map.v \
- $(PP3_DIR)/pp3_abc9_model.v \
- $(PP3_DIR)/pp3_abc9_unmap.v \
- $(PP3_DIR)/pp3_cells_map.v \
- $(PP3_DIR)/pp3_cells_sim.v \
- $(PP3_DIR)/pp3_ffs_map.v \
- $(PP3_DIR)/pp3_latches_map.v \
- $(PP3_DIR)/pp3_lut_map.v \
- $(PP3_DIR)/pp3_lutdefs.txt \
- $(PP3_DIR)/pp3_brams_sim.v \
- $(PP3_DIR)/pp3_brams_map.v \
- $(PP3_DIR)/pp3_brams.txt \
- $(PP3_DIR)/pp3_bram_init_8_16.vh \
- $(PP3_DIR)/pp3_bram_init_32.vh \
- $(PP3_DIR)/pp3_qlal4s3b_sim.v \
- $(PP3_DIR)/pp3_mult_sim.v \
- $(PP3_DIR)/pp3_qlal3_sim.v \
+VERILOG_MODULES = $(COMMON)/cells_sim.v \
+ $(QLF_K4N8_DIR)/arith_map.v \
+ $(QLF_K4N8_DIR)/cells_sim.v \
+ $(QLF_K4N8_DIR)/ffs_map.v \
+ $(QLF_K6N10_DIR)/arith_map.v \
+ $(QLF_K6N10_DIR)/brams_map.v \
+ $(QLF_K6N10_DIR)/brams.txt \
+ $(QLF_K6N10_DIR)/cells_sim.v \
+ $(QLF_K6N10_DIR)/ffs_map.v \
+ $(QLF_K6N10_DIR)/dsp_map.v \
+ $(QLF_K6N10_DIR)/lut_map.v \
+ $(PP3_DIR)/abc9_map.v \
+ $(PP3_DIR)/abc9_model.v \
+ $(PP3_DIR)/abc9_unmap.v \
+ $(PP3_DIR)/cells_map.v \
+ $(PP3_DIR)/cells_sim.v \
+ $(PP3_DIR)/ffs_map.v \
+ $(PP3_DIR)/latches_map.v \
+ $(PP3_DIR)/lut_map.v \
+ $(PP3_DIR)/lutdefs.txt \
+ $(PP3_DIR)/brams_sim.v \
+ $(PP3_DIR)/brams_map.v \
+ $(PP3_DIR)/brams.txt \
+ $(PP3_DIR)/bram_init_8_16.vh \
+ $(PP3_DIR)/bram_init_32.vh \
+ $(PP3_DIR)/qlal4s3b_sim.v \
+ $(PP3_DIR)/mult_sim.v \
+ $(PP3_DIR)/qlal3_sim.v \
retrieve-pmgen:=$(shell mkdir -p pmgen && wget -nc -O pmgen/pmgen.py https://raw.githubusercontent.com/SymbiFlow/yosys/master%2Bwip/passes/pmgen/pmgen.py)
pre-build:=$(shell python3 pmgen/pmgen.py -o pmgen/ql-dsp-pm.h -p ql_dsp ql_dsp.pmg)
install_modules: $(VERILOG_MODULES)
- $(foreach f,$^,install -D $(f) $(DATA_DIR)/quicklogic/$(notdir $(f));)
+ $(foreach f,$^,install -D $(f) $(DATA_DIR)/quicklogic/$(f);)
install: install_modules
diff --git a/ql-qlf-plugin/pp3/pp3_abc9_map.v b/ql-qlf-plugin/pp3/abc9_map.v
similarity index 100%
rename from ql-qlf-plugin/pp3/pp3_abc9_map.v
rename to ql-qlf-plugin/pp3/abc9_map.v
diff --git a/ql-qlf-plugin/pp3/pp3_abc9_model.v b/ql-qlf-plugin/pp3/abc9_model.v
similarity index 100%
rename from ql-qlf-plugin/pp3/pp3_abc9_model.v
rename to ql-qlf-plugin/pp3/abc9_model.v
diff --git a/ql-qlf-plugin/pp3/pp3_abc9_unmap.v b/ql-qlf-plugin/pp3/abc9_unmap.v
similarity index 100%
rename from ql-qlf-plugin/pp3/pp3_abc9_unmap.v
rename to ql-qlf-plugin/pp3/abc9_unmap.v
diff --git a/ql-qlf-plugin/pp3/pp3_bram_init_32.vh b/ql-qlf-plugin/pp3/bram_init_32.vh
similarity index 100%
rename from ql-qlf-plugin/pp3/pp3_bram_init_32.vh
rename to ql-qlf-plugin/pp3/bram_init_32.vh
diff --git a/ql-qlf-plugin/pp3/pp3_bram_init_8_16.vh b/ql-qlf-plugin/pp3/bram_init_8_16.vh
similarity index 100%
rename from ql-qlf-plugin/pp3/pp3_bram_init_8_16.vh
rename to ql-qlf-plugin/pp3/bram_init_8_16.vh
diff --git a/ql-qlf-plugin/pp3/pp3_brams.txt b/ql-qlf-plugin/pp3/brams.txt
similarity index 100%
rename from ql-qlf-plugin/pp3/pp3_brams.txt
rename to ql-qlf-plugin/pp3/brams.txt
diff --git a/ql-qlf-plugin/pp3/pp3_brams_map.v b/ql-qlf-plugin/pp3/brams_map.v
similarity index 99%
rename from ql-qlf-plugin/pp3/pp3_brams_map.v
rename to ql-qlf-plugin/pp3/brams_map.v
index 7e34cd3..1941a3d 100644
--- a/ql-qlf-plugin/pp3/pp3_brams_map.v
+++ b/ql-qlf-plugin/pp3/brams_map.v
@@ -71,7 +71,7 @@
generate
if (CFG_DBITS <= 16) begin
ram8k_2x1_cell_macro #(
- `include "pp3_bram_init_32.vh"
+ `include "bram_init_32.vh"
) _TECHMAP_REPLACE_ (
.A1_0(B1ADDR),
.A1_1(GND),
@@ -138,7 +138,7 @@
);
end else if (CFG_DBITS <= 32) begin
ram8k_2x1_cell_macro #(
- `include "pp3_bram_init_32.vh"
+ `include "bram_init_32.vh"
) _TECHMAP_REPLACE_ (
.A1_0(B1ADDR),
.A1_1(GND),
@@ -287,7 +287,7 @@
end
ram8k_2x1_cell_macro #(
- `include "pp3_bram_init_8_16.vh"
+ `include "bram_init_8_16.vh"
) _TECHMAP_REPLACE_ (
.A1_0(B1ADDR_11),
.A1_1(GND),
diff --git a/ql-qlf-plugin/pp3/pp3_brams_sim.v b/ql-qlf-plugin/pp3/brams_sim.v
similarity index 99%
rename from ql-qlf-plugin/pp3/pp3_brams_sim.v
rename to ql-qlf-plugin/pp3/brams_sim.v
index 4d1822a..2795852 100644
--- a/ql-qlf-plugin/pp3/pp3_brams_sim.v
+++ b/ql-qlf-plugin/pp3/brams_sim.v
@@ -2129,7 +2129,7 @@
endgenerate
ram8k_2x1_cell_macro #(
- `include "pp3_bram_init_8_16.vh"
+ `include "bram_init_8_16.vh"
.INIT_FILE(INIT_FILE),
.data_width_int(data_width_int),
.data_depth_int(data_depth_int)
@@ -2332,7 +2332,7 @@
if (data_width_int <= 16) begin
ram8k_2x1_cell_macro #(
- `include "pp3_bram_init_8_16.vh"
+ `include "bram_init_8_16.vh"
.INIT_FILE(INIT_FILE),
.data_width_int(data_width_int),
.data_depth_int(data_depth_int)
@@ -2409,7 +2409,7 @@
end else if (data_width_int > 16) begin
ram8k_2x1_cell_macro #(
- `include "pp3_bram_init_32.vh"
+ `include "bram_init_32.vh"
.INIT_FILE(INIT_FILE),
.data_width_int(data_width_int),
.data_depth_int(data_depth_int)
diff --git a/ql-qlf-plugin/pp3/pp3_cells_map.v b/ql-qlf-plugin/pp3/cells_map.v
similarity index 100%
rename from ql-qlf-plugin/pp3/pp3_cells_map.v
rename to ql-qlf-plugin/pp3/cells_map.v
diff --git a/ql-qlf-plugin/pp3/pp3_cells_sim.v b/ql-qlf-plugin/pp3/cells_sim.v
similarity index 98%
rename from ql-qlf-plugin/pp3/pp3_cells_sim.v
rename to ql-qlf-plugin/pp3/cells_sim.v
index abf6e3a..e498d4e 100644
--- a/ql-qlf-plugin/pp3/pp3_cells_sim.v
+++ b/ql-qlf-plugin/pp3/cells_sim.v
@@ -479,11 +479,11 @@
endmodule
// Include simulation models of QLAL4S3B eFPGA interface
-`include "pp3_qlal4s3b_sim.v"
+`include "qlal4s3b_sim.v"
// Include simulation models for QLAL3 hard blocks
-`include "pp3_qlal3_sim.v"
+`include "qlal3_sim.v"
// Include BRAM and FIFO simulation models
-`include "pp3_brams_sim.v"
+`include "brams_sim.v"
// Include MULT simulation models
-`include "pp3_mult_sim.v"
+`include "mult_sim.v"
diff --git a/ql-qlf-plugin/pp3/pp3_ffs_map.v b/ql-qlf-plugin/pp3/ffs_map.v
similarity index 100%
rename from ql-qlf-plugin/pp3/pp3_ffs_map.v
rename to ql-qlf-plugin/pp3/ffs_map.v
diff --git a/ql-qlf-plugin/pp3/pp3_latches_map.v b/ql-qlf-plugin/pp3/latches_map.v
similarity index 100%
rename from ql-qlf-plugin/pp3/pp3_latches_map.v
rename to ql-qlf-plugin/pp3/latches_map.v
diff --git a/ql-qlf-plugin/pp3/pp3_lut_map.v b/ql-qlf-plugin/pp3/lut_map.v
similarity index 100%
rename from ql-qlf-plugin/pp3/pp3_lut_map.v
rename to ql-qlf-plugin/pp3/lut_map.v
diff --git a/ql-qlf-plugin/pp3/pp3_lutdefs.txt b/ql-qlf-plugin/pp3/lutdefs.txt
similarity index 100%
rename from ql-qlf-plugin/pp3/pp3_lutdefs.txt
rename to ql-qlf-plugin/pp3/lutdefs.txt
diff --git a/ql-qlf-plugin/pp3/pp3_mult_sim.v b/ql-qlf-plugin/pp3/mult_sim.v
similarity index 100%
rename from ql-qlf-plugin/pp3/pp3_mult_sim.v
rename to ql-qlf-plugin/pp3/mult_sim.v
diff --git a/ql-qlf-plugin/pp3/pp3_qlal3_sim.v b/ql-qlf-plugin/pp3/qlal3_sim.v
similarity index 100%
rename from ql-qlf-plugin/pp3/pp3_qlal3_sim.v
rename to ql-qlf-plugin/pp3/qlal3_sim.v
diff --git a/ql-qlf-plugin/pp3/pp3_qlal4s3b_sim.v b/ql-qlf-plugin/pp3/qlal4s3b_sim.v
similarity index 100%
rename from ql-qlf-plugin/pp3/pp3_qlal4s3b_sim.v
rename to ql-qlf-plugin/pp3/qlal4s3b_sim.v
diff --git a/ql-qlf-plugin/ql-qlf-k4n8/qlf_k4n8_arith_map.v b/ql-qlf-plugin/qlf_k4n8/arith_map.v
similarity index 100%
rename from ql-qlf-plugin/ql-qlf-k4n8/qlf_k4n8_arith_map.v
rename to ql-qlf-plugin/qlf_k4n8/arith_map.v
diff --git a/ql-qlf-plugin/ql-qlf-k4n8/qlf_k4n8_cells_sim.v b/ql-qlf-plugin/qlf_k4n8/cells_sim.v
similarity index 100%
rename from ql-qlf-plugin/ql-qlf-k4n8/qlf_k4n8_cells_sim.v
rename to ql-qlf-plugin/qlf_k4n8/cells_sim.v
diff --git a/ql-qlf-plugin/ql-qlf-k4n8/qlf_k4n8_ffs_map.v b/ql-qlf-plugin/qlf_k4n8/ffs_map.v
similarity index 100%
rename from ql-qlf-plugin/ql-qlf-k4n8/qlf_k4n8_ffs_map.v
rename to ql-qlf-plugin/qlf_k4n8/ffs_map.v
diff --git a/ql-qlf-plugin/ql-qlf-k6n10/qlf_k6n10_arith_map.v b/ql-qlf-plugin/qlf_k6n10/arith_map.v
similarity index 66%
rename from ql-qlf-plugin/ql-qlf-k6n10/qlf_k6n10_arith_map.v
rename to ql-qlf-plugin/qlf_k6n10/arith_map.v
index 2d8dee5..6b275d3 100644
--- a/ql-qlf-plugin/ql-qlf-k6n10/qlf_k6n10_arith_map.v
+++ b/ql-qlf-plugin/qlf_k6n10/arith_map.v
@@ -38,10 +38,30 @@
endgenerate
wire [Y_WIDTH: 0 ] CARRY;
- assign CARRY[0] = CI;
+
+ // Due to VPR limitations regarding IO connexion to carry chain,
+ // we generate the carry chain input signal using an intermediate adder
+ // since we can connect a & b from io pads, but not cin & cout
+ generate
+ adder intermediate_adder (
+ .cin ( ),
+ .cout (CARRY[0]),
+ .a (CI ),
+ .b (CI ),
+ .sumout ( )
+ );
+
+ adder first_adder (
+ .cin (CARRY[0]),
+ .cout (CARRY[1]),
+ .a (AA[0] ),
+ .b (BB[0] ),
+ .sumout (Y[0] )
+ );
+ endgenerate
genvar i;
- generate for (i = 0; i < Y_WIDTH - 1; i = i+1) begin:gen3
+ generate for (i = 1; i < Y_WIDTH - 1; i = i+1) begin:gen3
adder my_adder (
.cin (CARRY[i] ),
.cout (CARRY[i+1]),
@@ -50,19 +70,6 @@
.sumout (Y[i] )
);
end endgenerate
-
- generate if ((Y_WIDTH -1) % 20 == 0) begin:gen4
- assign Y[Y_WIDTH-1] = CARRY[Y_WIDTH-1];
- end else begin:gen5
- adder my_adder (
- .cin (CARRY[Y_WIDTH - 1]),
- .cout (CARRY[Y_WIDTH] ),
- .a (1'b0 ),
- .b (1'b0 ),
- .sumout (Y[Y_WIDTH -1] )
- );
- end
- endgenerate
assign X = AA ^ BB;
endmodule
diff --git a/ql-qlf-plugin/ql-qlf-k6n10/qlf_k6n10_brams.txt b/ql-qlf-plugin/qlf_k6n10/brams.txt
similarity index 100%
rename from ql-qlf-plugin/ql-qlf-k6n10/qlf_k6n10_brams.txt
rename to ql-qlf-plugin/qlf_k6n10/brams.txt
diff --git a/ql-qlf-plugin/ql-qlf-k6n10/qlf_k6n10_brams_map.v b/ql-qlf-plugin/qlf_k6n10/brams_map.v
similarity index 100%
rename from ql-qlf-plugin/ql-qlf-k6n10/qlf_k6n10_brams_map.v
rename to ql-qlf-plugin/qlf_k6n10/brams_map.v
diff --git a/ql-qlf-plugin/ql-qlf-k6n10/qlf_k6n10_cells_sim.v b/ql-qlf-plugin/qlf_k6n10/cells_sim.v
similarity index 99%
rename from ql-qlf-plugin/ql-qlf-k6n10/qlf_k6n10_cells_sim.v
rename to ql-qlf-plugin/qlf_k6n10/cells_sim.v
index 36872ce..ad22df3 100644
--- a/ql-qlf-plugin/ql-qlf-k6n10/qlf_k6n10_cells_sim.v
+++ b/ql-qlf-plugin/qlf_k6n10/cells_sim.v
@@ -63,7 +63,7 @@
assign lut4_out[2] = s4[2];
assign lut4_out[3] = s4[3];
- assign lut5_out[0] = s0[0];
+ assign lut5_out[0] = s5[0];
assign lut5_out[1] = s5[1];
assign lut6_out = li[5] ? s5[0] : s5[1];
@@ -182,7 +182,7 @@
(* invertible_pin = "IS_C_INVERTED" *)
input C,
input S,
- input E,
+ input E
);
parameter [0:0] INIT = 1'b0;
parameter [0:0] IS_C_INVERTED = 1'b0;
diff --git a/ql-qlf-plugin/ql-qlf-k6n10/qlf_k6n10_dsp_map.v b/ql-qlf-plugin/qlf_k6n10/dsp_map.v
similarity index 100%
rename from ql-qlf-plugin/ql-qlf-k6n10/qlf_k6n10_dsp_map.v
rename to ql-qlf-plugin/qlf_k6n10/dsp_map.v
diff --git a/ql-qlf-plugin/ql-qlf-k6n10/qlf_k6n10_ffs_map.v b/ql-qlf-plugin/qlf_k6n10/ffs_map.v
similarity index 100%
rename from ql-qlf-plugin/ql-qlf-k6n10/qlf_k6n10_ffs_map.v
rename to ql-qlf-plugin/qlf_k6n10/ffs_map.v
diff --git a/ql-qlf-plugin/ql-qlf-k6n10/qlf_k6n10_lut_map.v b/ql-qlf-plugin/qlf_k6n10/lut_map.v
similarity index 100%
rename from ql-qlf-plugin/ql-qlf-k6n10/qlf_k6n10_lut_map.v
rename to ql-qlf-plugin/qlf_k6n10/lut_map.v
diff --git a/ql-qlf-plugin/synth_quicklogic.cc b/ql-qlf-plugin/synth_quicklogic.cc
index 4a9abc5..36c3afe 100644
--- a/ql-qlf-plugin/synth_quicklogic.cc
+++ b/ql-qlf-plugin/synth_quicklogic.cc
@@ -190,9 +190,9 @@
{
if (check_label("begin")) {
std::string readVelArgs;
- readVelArgs = " +/quicklogic/" + family + "_cells_sim.v";
+ readVelArgs = " +/quicklogic/" + family + "/cells_sim.v";
- run("read_verilog -lib -specify +/quicklogic/cells_sim.v" + readVelArgs);
+ run("read_verilog -lib -specify +/quicklogic/common/cells_sim.v" + readVelArgs);
run(stringf("hierarchy -check %s", help_mode ? "-top <top>" : top_opt.c_str()));
}
@@ -221,7 +221,7 @@
run("memory_dff");
run("wreduce t:$mul");
run("techmap -map +/mul2dsp.v -map +/quicklogic/" + family +
- "_dsp_map.v -D DSP_A_MAXWIDTH=16 -D DSP_B_MAXWIDTH=16 "
+ "/dsp_map.v -D DSP_A_MAXWIDTH=16 -D DSP_B_MAXWIDTH=16 "
"-D DSP_A_MINWIDTH=2 -D DSP_B_MINWIDTH=2 -D DSP_Y_MINWIDTH=11 "
"-D DSP_NAME=$__MUL16X16",
"(if -no_dsp)");
@@ -245,11 +245,11 @@
}
if (check_label("map_bram", "(skip if -no_bram)") && (family == "qlf_k6n10" || family == "pp3") && inferBram) {
- run("memory_bram -rules +/quicklogic/" + family + "_brams.txt");
+ run("memory_bram -rules +/quicklogic/" + family + "/brams.txt");
if (family == "pp3") {
run("pp3_braminit");
}
- run("techmap -map +/quicklogic/" + family + "_brams_map.v");
+ run("techmap -map +/quicklogic/" + family + "/brams_map.v");
}
if (check_label("map_ffram")) {
@@ -262,7 +262,7 @@
if (check_label("map_gates")) {
if (inferAdder && (family == "qlf_k4n8" || family == "qlf_k6n10")) {
- run("techmap -map +/techmap.v -map +/quicklogic/" + family + "_arith_map.v");
+ run("techmap -map +/techmap.v -map +/quicklogic/" + family + "/arith_map.v");
} else {
run("techmap");
}
@@ -289,9 +289,9 @@
// $_DLATCH_SRPPP_ 0");
} else if (family == "pp3") {
run("dfflegalize -cell $_DFFSRE_PPPP_ 0 -cell $_DLATCH_?_ x");
- run("techmap -map +/quicklogic/" + family + "_cells_map.v");
+ run("techmap -map +/quicklogic/" + family + "/cells_map.v");
}
- std::string techMapArgs = " -map +/techmap.v -map +/quicklogic/" + family + "_ffs_map.v";
+ std::string techMapArgs = " -map +/techmap.v -map +/quicklogic/" + family + "/ffs_map.v";
if (!noffmap) {
run("techmap " + techMapArgs);
}
@@ -310,14 +310,14 @@
} else if (family == "qlf_k4n8") {
run("abc -lut 4 ");
} else if (family == "pp3") {
- run("techmap -map +/quicklogic/" + family + "_latches_map.v");
+ run("techmap -map +/quicklogic/" + family + "/latches_map.v");
if (abc9) {
- run("read_verilog -lib -specify -icells +/quicklogic/" + family + "_abc9_model.v");
- run("techmap -map +/quicklogic/" + family + "_abc9_map.v");
+ run("read_verilog -lib -specify -icells +/quicklogic/" + family + "/abc9_model.v");
+ run("techmap -map +/quicklogic/" + family + "/abc9_map.v");
run("abc9 -maxlut 4 -dff");
- run("techmap -map +/quicklogic/" + family + "_abc9_unmap.v");
+ run("techmap -map +/quicklogic/" + family + "/abc9_unmap.v");
} else {
- std::string lutDefs = "+/quicklogic/" + family + "_lutdefs.txt";
+ std::string lutDefs = "+/quicklogic/" + family + "/lutdefs.txt";
rewrite_filename(lutDefs);
std::string abcArgs = "+read_lut," + lutDefs +
@@ -336,7 +336,7 @@
if (check_label("map_cells") && (family == "qlf_k6n10" || family == "pp3")) {
std::string techMapArgs;
- techMapArgs = "-map +/quicklogic/" + family + "_lut_map.v";
+ techMapArgs = "-map +/quicklogic/" + family + "/lut_map.v";
run("techmap " + techMapArgs);
run("clean");
}
diff --git a/ql-qlf-plugin/tests/dffs/dffs.tcl b/ql-qlf-plugin/tests/dffs/dffs.tcl
index 9b1941c..d96b3e6 100644
--- a/ql-qlf-plugin/tests/dffs/dffs.tcl
+++ b/ql-qlf-plugin/tests/dffs/dffs.tcl
@@ -8,7 +8,7 @@
# DFF
hierarchy -top my_dff
yosys proc
-equiv_opt -assert -map +/quicklogic/qlf_k4n8_cells_sim.v synth_quicklogic -family qlf_k4n8 -top my_dff
+equiv_opt -assert -map +/quicklogic/qlf_k4n8/cells_sim.v synth_quicklogic -family qlf_k4n8 -top my_dff
design -load postopt
yosys cd my_dff
stat
@@ -163,7 +163,7 @@
# DFF
hierarchy -top my_dff
yosys proc
-equiv_opt -assert -map +/quicklogic/qlf_k6n10_cells_sim.v synth_quicklogic -family qlf_k6n10 -top my_dff
+equiv_opt -assert -map +/quicklogic/qlf_k6n10/cells_sim.v synth_quicklogic -family qlf_k6n10 -top my_dff
design -load postopt
yosys cd my_dff
stat
@@ -412,7 +412,7 @@
# DFF
hierarchy -top my_dff
yosys proc
-equiv_opt -async2sync -assert -map +/quicklogic/pp3_cells_sim.v synth_quicklogic -family pp3 -top my_dff
+equiv_opt -async2sync -assert -map +/quicklogic/pp3/cells_sim.v synth_quicklogic -family pp3 -top my_dff
design -load postopt
yosys cd my_dff
stat
@@ -427,7 +427,7 @@
design -load read
hierarchy -top my_dffe
yosys proc
-equiv_opt -async2sync -assert -map +/quicklogic/pp3_cells_sim.v synth_quicklogic -family pp3 -top my_dffe
+equiv_opt -async2sync -assert -map +/quicklogic/pp3/cells_sim.v synth_quicklogic -family pp3 -top my_dffe
design -load postopt
yosys cd my_dffe
stat
@@ -441,7 +441,7 @@
design -load read
hierarchy -top my_dffr_p
yosys proc
-equiv_opt -async2sync -assert -map +/quicklogic/pp3_cells_sim.v synth_quicklogic -family pp3 -top my_dffr_p
+equiv_opt -async2sync -assert -map +/quicklogic/pp3/cells_sim.v synth_quicklogic -family pp3 -top my_dffr_p
design -load postopt
yosys cd my_dffr_p
stat
@@ -458,7 +458,7 @@
design -load read
hierarchy -top my_dffr_n
yosys proc
-equiv_opt -async2sync -assert -map +/quicklogic/pp3_cells_sim.v synth_quicklogic -family pp3 -top my_dffr_n
+equiv_opt -async2sync -assert -map +/quicklogic/pp3/cells_sim.v synth_quicklogic -family pp3 -top my_dffr_n
design -load postopt
yosys cd my_dffr_n
stat
@@ -476,7 +476,7 @@
design -load read
hierarchy -top my_dffs_clk_p
yosys proc
-equiv_opt -async2sync -assert -map +/quicklogic/pp3_cells_sim.v synth_quicklogic -family pp3 -top my_dffs_clk_p
+equiv_opt -async2sync -assert -map +/quicklogic/pp3/cells_sim.v synth_quicklogic -family pp3 -top my_dffs_clk_p
design -load postopt
yosys cd my_dffs_clk_p
stat
@@ -494,7 +494,7 @@
design -load read
hierarchy -top my_dffs_clk_n
yosys proc
-equiv_opt -async2sync -assert -map +/quicklogic/pp3_cells_sim.v synth_quicklogic -family pp3 -top my_dffs_clk_n
+equiv_opt -async2sync -assert -map +/quicklogic/pp3/cells_sim.v synth_quicklogic -family pp3 -top my_dffs_clk_n
design -load postopt
yosys cd my_dffs_clk_n
stat
diff --git a/ql-qlf-plugin/tests/fsm/fsm.tcl b/ql-qlf-plugin/tests/fsm/fsm.tcl
index d6d72e2..2e09677 100644
--- a/ql-qlf-plugin/tests/fsm/fsm.tcl
+++ b/ql-qlf-plugin/tests/fsm/fsm.tcl
@@ -9,7 +9,7 @@
yosys proc
flatten
-equiv_opt -run :prove -map +/quicklogic/pp3_cells_sim.v synth_quicklogic -family pp3
+equiv_opt -run :prove -map +/quicklogic/pp3/cells_sim.v synth_quicklogic -family pp3
async2sync
miter -equiv -make_assert -flatten gold gate miter
sat -verify -prove-asserts -show-public -set-at 1 in_reset 1 -seq 20 -prove-skip 1 miter
diff --git a/ql-qlf-plugin/tests/full_adder/full_adder.tcl b/ql-qlf-plugin/tests/full_adder/full_adder.tcl
index 3093086..9c5a402 100644
--- a/ql-qlf-plugin/tests/full_adder/full_adder.tcl
+++ b/ql-qlf-plugin/tests/full_adder/full_adder.tcl
@@ -6,7 +6,7 @@
read_verilog -icells -DWIDTH=4 $::env(DESIGN_TOP).v
hierarchy -check -top full_adder
yosys proc
-equiv_opt -assert -map +/quicklogic/qlf_k4n8_cells_sim.v synth_quicklogic -family qlf_k4n8
+equiv_opt -assert -map +/quicklogic/qlf_k4n8/cells_sim.v synth_quicklogic -family qlf_k4n8
design -reset
@@ -14,24 +14,29 @@
read_verilog -icells -DWIDTH=4 $::env(DESIGN_TOP).v
hierarchy -check -top subtractor
yosys proc
-equiv_opt -assert -map +/quicklogic/qlf_k4n8_cells_sim.v synth_quicklogic -family qlf_k4n8
+equiv_opt -assert -map +/quicklogic/qlf_k4n8/cells_sim.v synth_quicklogic -family qlf_k4n8
design -reset
+
# Equivalence check for adder synthesis for qlf-k6n10
read_verilog -icells -DWIDTH=4 $::env(DESIGN_TOP).v
hierarchy -check -top full_adder
yosys proc
-equiv_opt -assert -map +/quicklogic/qlf_k6n10_cells_sim.v synth_quicklogic -family qlf_k6n10
+synth_quicklogic -family qlf_k6n10
+yosys cd full_adder
+stat
+select -assert-count 5 t:adder
design -reset
-#TODO: Fix equivalence check for substractor design with qlf_k6n10 device
-
-## Equivalence check for subtractor synthesis
-#read_verilog -icells -DWIDTH=4 $::env(DESIGN_TOP).v
-#hierarchy -check -top subtractor
-#yosys proc
-#equiv_opt -assert -map +/quicklogic/qlf_k6n10_cells_sim.v synth_quicklogic -family qlf_k6n10
+# Equivalence check for subtractor synthesis for qlf-k6n10
+read_verilog -icells -DWIDTH=4 $::env(DESIGN_TOP).v
+hierarchy -check -top subtractor
+yosys proc
+synth_quicklogic -family qlf_k6n10
+yosys cd subtractor
+stat
+select -assert-count 5 t:adder
design -reset
@@ -39,7 +44,7 @@
read_verilog -icells -DWIDTH=4 $::env(DESIGN_TOP).v
hierarchy -check -top full_adder
yosys proc
-equiv_opt -assert -map +/quicklogic/pp3_cells_sim.v synth_quicklogic -family pp3
+equiv_opt -assert -map +/quicklogic/pp3/cells_sim.v synth_quicklogic -family pp3
design -load postopt
yosys cd full_adder
@@ -58,7 +63,7 @@
read_verilog -icells -DWIDTH=4 $::env(DESIGN_TOP).v
hierarchy -check -top subtractor
yosys proc
-equiv_opt -assert -map +/quicklogic/pp3_cells_sim.v synth_quicklogic -family pp3
+equiv_opt -assert -map +/quicklogic/pp3/cells_sim.v synth_quicklogic -family pp3
design -load postopt
yosys cd subtractor
diff --git a/ql-qlf-plugin/tests/logic/logic.tcl b/ql-qlf-plugin/tests/logic/logic.tcl
index 6bfb7cb..0e10db5 100644
--- a/ql-qlf-plugin/tests/logic/logic.tcl
+++ b/ql-qlf-plugin/tests/logic/logic.tcl
@@ -6,7 +6,7 @@
read_verilog $::env(DESIGN_TOP).v
hierarchy -top top
yosys proc
-equiv_opt -assert -map +/quicklogic/qlf_k4n8_cells_sim.v synth_quicklogic -family qlf_k4n8
+equiv_opt -assert -map +/quicklogic/qlf_k4n8/cells_sim.v synth_quicklogic -family qlf_k4n8
design -load postopt
yosys cd top
@@ -19,7 +19,7 @@
read_verilog $::env(DESIGN_TOP).v
hierarchy -top top
yosys proc
-equiv_opt -assert -map +/quicklogic/qlf_k6n10_cells_sim.v synth_quicklogic -family qlf_k6n10
+equiv_opt -assert -map +/quicklogic/qlf_k6n10/cells_sim.v synth_quicklogic -family qlf_k6n10
design -load postopt
yosys cd top
@@ -32,7 +32,7 @@
read_verilog $::env(DESIGN_TOP).v
hierarchy -top top
yosys proc
-equiv_opt -assert -map +/quicklogic/pp3_cells_sim.v synth_quicklogic -family pp3
+equiv_opt -assert -map +/quicklogic/pp3/cells_sim.v synth_quicklogic -family pp3
design -load postopt
yosys cd top
diff --git a/ql-qlf-plugin/tests/logic/logic.ys b/ql-qlf-plugin/tests/logic/logic.ys
index c7f0cd5..037896c 100644
--- a/ql-qlf-plugin/tests/logic/logic.ys
+++ b/ql-qlf-plugin/tests/logic/logic.ys
@@ -2,7 +2,7 @@
read_verilog ./logic.v
hierarchy -top top
proc
-equiv_opt -assert -map +/quicklogic/qlf_k4n8_cells_sim.v synth_quicklogic -family qlf_k4n8
+equiv_opt -assert -map +/quicklogic/qlf_k4n8/cells_sim.v synth_quicklogic -family qlf_k4n8
design -load postopt
cd top
diff --git a/ql-qlf-plugin/tests/mux/mux.tcl b/ql-qlf-plugin/tests/mux/mux.tcl
index 260e242..47a1e1b 100644
--- a/ql-qlf-plugin/tests/mux/mux.tcl
+++ b/ql-qlf-plugin/tests/mux/mux.tcl
@@ -7,7 +7,7 @@
hierarchy -top mux2
yosys proc
-equiv_opt -assert -map +/quicklogic/pp3_cells_sim.v synth_quicklogic -family pp3
+equiv_opt -assert -map +/quicklogic/pp3/cells_sim.v synth_quicklogic -family pp3
design -load postopt
yosys cd mux2
select -assert-count 1 t:LUT3
@@ -19,7 +19,7 @@
design -load read
hierarchy -top mux4
yosys proc
-equiv_opt -assert -map +/quicklogic/pp3_cells_sim.v synth_quicklogic -family pp3
+equiv_opt -assert -map +/quicklogic/pp3/cells_sim.v synth_quicklogic -family pp3
design -load postopt
yosys cd mux4
select -assert-count 3 t:LUT3
@@ -31,7 +31,7 @@
design -load read
hierarchy -top mux8
yosys proc
-equiv_opt -assert -map +/quicklogic/pp3_cells_sim.v synth_quicklogic -family pp3
+equiv_opt -assert -map +/quicklogic/pp3/cells_sim.v synth_quicklogic -family pp3
design -load postopt
yosys cd mux8
select -assert-count 1 t:LUT1
@@ -45,7 +45,7 @@
design -load read
hierarchy -top mux16
yosys proc
-equiv_opt -assert -map +/quicklogic/pp3_cells_sim.v synth_quicklogic -family pp3
+equiv_opt -assert -map +/quicklogic/pp3/cells_sim.v synth_quicklogic -family pp3
design -load postopt
yosys cd mux16
select -assert-count 1 t:LUT3
diff --git a/ql-qlf-plugin/tests/qlf_k6n10_bram/bram.ys b/ql-qlf-plugin/tests/qlf_k6n10_bram/bram.ys
index 5539004..20228ca 100644
--- a/ql-qlf-plugin/tests/qlf_k6n10_bram/bram.ys
+++ b/ql-qlf-plugin/tests/qlf_k6n10_bram/bram.ys
@@ -8,7 +8,7 @@
hierarchy -top BRAM_32x512
proc
memory
-equiv_opt -assert -map +/quicklogic/qlf_k6n10_cells_sim.v synth_quicklogic -family qlf_k6n10 -top BRAM_32x512
+equiv_opt -assert -map +/quicklogic/qlf_k6n10/cells_sim.v synth_quicklogic -family qlf_k6n10 -top BRAM_32x512
design -load postopt
cd BRAM_32x512
stat
@@ -19,7 +19,7 @@
hierarchy -top BRAM_32x512
proc
memory
-equiv_opt -assert -map +/quicklogic/qlf_k6n10_cells_sim.v synth_quicklogic -family qlf_k6n10 -top BRAM_16x1024
+equiv_opt -assert -map +/quicklogic/qlf_k6n10/cells_sim.v synth_quicklogic -family qlf_k6n10 -top BRAM_16x1024
design -load postopt
cd BRAM_16x1024
stat
@@ -30,7 +30,7 @@
hierarchy -top BRAM_8x2048
proc
memory
-equiv_opt -assert -map +/quicklogic/qlf_k6n10_cells_sim.v synth_quicklogic -family qlf_k6n10 -top BRAM_8x2048
+equiv_opt -assert -map +/quicklogic/qlf_k6n10/cells_sim.v synth_quicklogic -family qlf_k6n10 -top BRAM_8x2048
design -load postopt
cd BRAM_8x2048
stat
@@ -41,7 +41,7 @@
hierarchy -top BRAM_4x4096
proc
memory
-equiv_opt -assert -map +/quicklogic/qlf_k6n10_cells_sim.v synth_quicklogic -family qlf_k6n10 -top BRAM_4x4096
+equiv_opt -assert -map +/quicklogic/qlf_k6n10/cells_sim.v synth_quicklogic -family qlf_k6n10 -top BRAM_4x4096
design -load postopt
cd BRAM_4x4096
stat
diff --git a/ql-qlf-plugin/tests/tribuf/tribuf.tcl b/ql-qlf-plugin/tests/tribuf/tribuf.tcl
index 067e7fd..acee086 100644
--- a/ql-qlf-plugin/tests/tribuf/tribuf.tcl
+++ b/ql-qlf-plugin/tests/tribuf/tribuf.tcl
@@ -9,7 +9,7 @@
tribuf
flatten
synth
-equiv_opt -assert -map +/quicklogic/pp3_cells_sim.v -map +/simcells.v synth_quicklogic -family pp3
+equiv_opt -assert -map +/quicklogic/pp3/cells_sim.v -map +/simcells.v synth_quicklogic -family pp3
design -load postopt
yosys cd tristate
select -assert-count 2 t:inpad
diff --git a/xdc-plugin/tests/Makefile b/xdc-plugin/tests/Makefile
index 363cbfe..f96a6f1 100644
--- a/xdc-plugin/tests/Makefile
+++ b/xdc-plugin/tests/Makefile
@@ -8,12 +8,14 @@
# counter - basic test for IOSTANDARD, SLEW, DRIVE, IN_TERM properties
# counter-dict - basic test using XDC -dict for IOSTANDARD, SLEW, DRIVE, IN_TERM properties
+# package_pins-dict-space - basic test for variable whitespace between PACKAGE_PINs and IOSTANDARD
# port_indexes - like counter but bus port indices are passes without curly braces
# io_loc_pairs - test for LOC property being set on IOBUFs as the IO_LOC_PAIRS parameter
# minilitex_ddr_arty - litex design with more types of IOBUFS including differential
# package_pins - test for PACKAGE_PIN property being set on IOBUFs as the IO_LOC_PAIRS parameter
TESTS = counter \
counter-dict \
+ package_pins-dict-space \
port_indexes \
io_loc_pairs \
minilitex_ddr_arty \
@@ -34,3 +36,4 @@
io_loc_pairs_verify = $(call json_test,io_loc_pairs)
minilitex_ddr_arty_verify = $(call json_test,minilitex_ddr_arty)
package_pins_verify = $(call json_test,package_pins)
+package_pins-dict-space_verify = $(call json_test,package_pins-dict-space)
diff --git a/xdc-plugin/tests/package_pins-dict-space/package_pins-dict-space.golden.json b/xdc-plugin/tests/package_pins-dict-space/package_pins-dict-space.golden.json
new file mode 100644
index 0000000..2e9102d
--- /dev/null
+++ b/xdc-plugin/tests/package_pins-dict-space/package_pins-dict-space.golden.json
@@ -0,0 +1,47 @@
+{
+ "OBUFTDS_2": {
+ "IOSTANDARD": "DIFF_SSTL135",
+ "IO_LOC_PAIRS": "signal_p:N2,signal_n:N1",
+ "SLEW": "FAST"
+ },
+ "OBUF_6": {
+ "DRIVE": "12",
+ "IOSTANDARD": "LVCMOS33",
+ "IO_LOC_PAIRS": "led[0]:D10",
+ "SLEW": "SLOW"
+ },
+ "OBUF_7": {
+ "IN_TERM": "UNTUNED_SPLIT_40",
+ "IOSTANDARD": "SSTL135",
+ "IO_LOC_PAIRS": "led[1]:A9",
+ "SLEW": "FAST"
+ },
+ "OBUF_OUT": {
+ "IN_TERM": "UNTUNED_SPLIT_50",
+ "IOSTANDARD": "LVCMOS33",
+ "IO_LOC_PAIRS": "out_a:E3",
+ "SLEW": "FAST"
+ },
+ "bottom_inst.OBUF_10": {
+ "IOSTANDARD": "LVCMOS18",
+ "IO_LOC_PAIRS": "out_b[0]:C2",
+ "SLEW": "SLOW"
+ },
+ "bottom_inst.OBUF_11": {
+ "DRIVE": "4",
+ "IOSTANDARD": "LVCMOS25",
+ "IO_LOC_PAIRS": "out_b[1]:R2",
+ "SLEW": "FAST"
+ },
+ "bottom_inst.OBUF_9": {
+ "IOSTANDARD": "DIFF_SSTL135",
+ "IO_LOC_PAIRS": "led[2]:M6",
+ "SLEW": "FAST"
+ },
+ "bottom_intermediate_inst.OBUF_8": {
+ "DRIVE": "16",
+ "IOSTANDARD": "SSTL135",
+ "IO_LOC_PAIRS": "led[3]:N4",
+ "SLEW": "SLOW"
+ }
+}
\ No newline at end of file
diff --git a/xdc-plugin/tests/package_pins-dict-space/package_pins-dict-space.tcl b/xdc-plugin/tests/package_pins-dict-space/package_pins-dict-space.tcl
new file mode 100644
index 0000000..7303563
--- /dev/null
+++ b/xdc-plugin/tests/package_pins-dict-space/package_pins-dict-space.tcl
@@ -0,0 +1,15 @@
+yosys -import
+if { [info procs get_ports] == {} } { plugin -i design_introspection }
+if { [info procs read_xdc] == {} } { plugin -i xdc }
+yosys -import ;# ingest plugin commands
+
+read_verilog $::env(DESIGN_TOP).v
+# -flatten is used to ensure that the output eblif has only one module.
+# Some of symbiflow expects eblifs with only one module.
+synth_xilinx -flatten -abc9 -nosrl -noclkbuf -nodsp
+
+#Read the design constraints
+read_xdc -part_json [file dirname [info script]]/../xc7a35tcsg324-1.json $::env(DESIGN_TOP).xdc
+
+# Write the design in JSON format.
+write_json [test_output_path "package_pins-dict-space.json"]
diff --git a/xdc-plugin/tests/package_pins-dict-space/package_pins-dict-space.v b/xdc-plugin/tests/package_pins-dict-space/package_pins-dict-space.v
new file mode 100644
index 0000000..d4d172d
--- /dev/null
+++ b/xdc-plugin/tests/package_pins-dict-space/package_pins-dict-space.v
@@ -0,0 +1,111 @@
+// 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 top (
+ input clk,
+ output [3:0] led,
+ inout out_a,
+ output [1:0] out_b,
+ output signal_p,
+ output signal_n
+);
+
+ wire LD6, LD7, LD8, LD9;
+ wire inter_wire, inter_wire_2;
+ localparam BITS = 1;
+ localparam LOG2DELAY = 25;
+
+ reg [BITS+LOG2DELAY-1:0] counter = 0;
+
+ always @(posedge clk) begin
+ counter <= counter + 1;
+ end
+ assign led[1] = inter_wire;
+ assign inter_wire = inter_wire_2;
+ assign {LD9, LD8, LD7, LD6} = counter >> LOG2DELAY;
+ OBUFTDS OBUFTDS_2 (
+ .I (LD6),
+ .O (signal_p),
+ .OB(signal_n),
+ .T (1'b1)
+ );
+ OBUF #(
+ .IOSTANDARD("LVCMOS33"),
+ .SLEW("SLOW")
+ ) OBUF_6 (
+ .I(LD6),
+ .O(led[0])
+ );
+ OBUF #(
+ .IOSTANDARD("LVCMOS33"),
+ .SLEW("SLOW")
+ ) OBUF_7 (
+ .I(LD7),
+ .O(inter_wire_2)
+ );
+ OBUF #(
+ .IOSTANDARD("LVCMOS33"),
+ .SLEW("SLOW")
+ ) OBUF_OUT (
+ .I(LD7),
+ .O(out_a)
+ );
+ bottom bottom_inst (
+ .I (LD8),
+ .O (led[2]),
+ .OB(out_b)
+ );
+ bottom_intermediate bottom_intermediate_inst (
+ .I(LD9),
+ .O(led[3])
+ );
+endmodule
+
+module bottom_intermediate (
+ input I,
+ output O
+);
+ wire bottom_intermediate_wire;
+ assign O = bottom_intermediate_wire;
+ OBUF #(
+ .IOSTANDARD("LVCMOS33"),
+ .SLEW("SLOW")
+ ) OBUF_8 (
+ .I(I),
+ .O(bottom_intermediate_wire)
+ );
+endmodule
+
+module bottom (
+ input I,
+ output [1:0] OB,
+ output O
+);
+ OBUF #(
+ .IOSTANDARD("LVCMOS33"),
+ .SLEW("SLOW")
+ ) OBUF_9 (
+ .I(I),
+ .O(O)
+ );
+ OBUF #(
+ .IOSTANDARD("LVCMOS33"),
+ .SLEW("SLOW")
+ ) OBUF_10 (
+ .I(I),
+ .O(OB[0])
+ );
+ OBUF #(
+ .IOSTANDARD("LVCMOS33"),
+ .SLEW("SLOW")
+ ) OBUF_11 (
+ .I(I),
+ .O(OB[1])
+ );
+endmodule
+
diff --git a/xdc-plugin/tests/package_pins-dict-space/package_pins-dict-space.xdc b/xdc-plugin/tests/package_pins-dict-space/package_pins-dict-space.xdc
new file mode 100644
index 0000000..70453d1
--- /dev/null
+++ b/xdc-plugin/tests/package_pins-dict-space/package_pins-dict-space.xdc
@@ -0,0 +1,29 @@
+#OBUF_6
+set_property PACKAGE_PIN D10 [get_ports {led[0]}]
+set_property DRIVE 12 [get_ports {led[0]}]
+#OBUF_7
+set_property -dict { PACKAGE_PIN A9 IOSTANDARD SSTL135 } [get_ports {led[1]}]
+set_property IN_TERM UNTUNED_SPLIT_40 [get_ports led[1]]
+set_property SLEW FAST [get_ports led[1]]
+#OBUF_OUT
+set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33} [get_ports out_a]
+set_property IN_TERM UNTUNED_SPLIT_50 [get_ports out_a]
+set_property SLEW FAST [get_ports out_a]
+#bottom_inst.OBUF_10
+set_property -dict {PACKAGE_PIN C2 IOSTANDARD LVCMOS18} [get_ports {out_b[0]}]
+set_property SLEW SLOW [get_ports {out_b[0]}]
+#bottom_inst.OBUF_11
+set_property -dict { PACKAGE_PIN R2 IOSTANDARD LVCMOS25 } [get_ports {out_b[1]}]
+set_property DRIVE 4 [get_ports {out_b[1]}]
+set_property SLEW FAST [get_ports {out_b[1]}]
+#bottom_inst.OBUF_9
+set_property -dict {PACKAGE_PIN M6 IOSTANDARD DIFF_SSTL135} [get_ports {led[2]}]
+set_property SLEW FAST [get_ports {led[2]}]
+#bottom_intermediate_inst.OBUF_8
+set_property -dict {PACKAGE_PIN N4 IOSTANDARD SSTL135} [get_ports {led[3]}]
+set_property DRIVE 16 [get_ports {led[3]}]
+#OBUFTDS_2
+set_property -dict {PACKAGE_PIN N2 IOSTANDARD DIFF_SSTL135} [get_ports signal_p]
+set_property PACKAGE_PIN N1 [get_ports signal_n]
+set_property SLEW FAST [get_ports signal_p]
+
diff --git a/xdc-plugin/xdc.cc b/xdc-plugin/xdc.cc
index 2e935ea..387d191 100644
--- a/xdc-plugin/xdc.cc
+++ b/xdc-plugin/xdc.cc
@@ -136,7 +136,9 @@
std::vector<std::string> tokens;
std::string intermediate;
while (getline(args_stream, intermediate, ' ')) {
- tokens.push_back(intermediate);
+ if (intermediate != "\0") {
+ tokens.push_back(intermediate);
+ }
}
if (tokens.size() % 2 != 0) {
log_cmd_error("Invalid number of dict parameters: %lu.\n", tokens.size());