diff --git a/utils/update_arch_timings.py b/utils/update_arch_timings.py
index 7aec657e48..a1daa0f218 100755
--- a/utils/update_arch_timings.py
+++ b/utils/update_arch_timings.py
@@ -114,7 +114,7 @@ def find_timings(timings, bel, location, site, bels, corner, speed_type):
def get_timing(cell, delay, corner, speed_type):
"""
- Gets timing for a particular cornet case. If not fount then chooses
+ Gets timing for a particular corner case. If not found then chooses
the next best one.
"""
entries = cell[delay]['delay_paths'][corner.lower()]
@@ -189,7 +189,9 @@ def get_bel_timings(element, timings, bels, corner, speed_type):
bel = pb_chain[-1]
location = pb_chain[-2]
site = remove_site_number(pb_chain[1])
-
+
+
+
result = find_timings(
timings, bel, location, site, bels, corner, speed_type
)
diff --git a/xilinx/common/primitives/dsp48e1/CMakeLists.txt b/xilinx/common/primitives/dsp48e1/CMakeLists.txt
index 4e58dff22d..25d4df8062 100644
--- a/xilinx/common/primitives/dsp48e1/CMakeLists.txt
+++ b/xilinx/common/primitives/dsp48e1/CMakeLists.txt
@@ -1,17 +1,20 @@
-add_subdirectory(nreg)
-add_subdirectory(alu)
-add_subdirectory(alumode_mux)
-add_subdirectory(carryinsel_logic)
-add_subdirectory(carryinsel_mux)
-add_subdirectory(creg_mux)
-add_subdirectory(dual_ad_preadder)
-add_subdirectory(dual_b_reg)
-add_subdirectory(inmode_mux)
-add_subdirectory(mult25x18)
-add_subdirectory(mult_mux)
-add_subdirectory(opmode_mux)
-add_subdirectory(xmux)
-add_subdirectory(ymux)
-add_subdirectory(zmux)
-add_file_target(FILE dsp48e1.sim.v SCANNER_TYPE verilog)
-v2x(NAME dsp48e1 SRCS dsp48e1.sim.v)
+#add_subdirectory(nreg)
+#add_subdirectory(alu)
+#add_subdirectory(alumode_mux)
+#add_subdirectory(carryinsel_logic)
+#add_subdirectory(carryinsel_mux)
+#add_subdirectory(creg_mux)
+#add_subdirectory(dual_ad_preadder)
+#add_subdirectory(dual_b_reg)
+#add_subdirectory(inmode_mux)
+#add_subdirectory(mult25x18)
+#add_subdirectory(mult_mux)
+#add_subdirectory(opmode_mux)
+#add_subdirectory(xmux)
+#add_subdirectory(ymux)
+#add_subdirectory(zmux)
+#add_file_target(FILE dsp48e1.sim.v SCANNER_TYPE verilog)
+#v2x(NAME dsp48e1 SRCS dsp48e1.sim.v)
+
+add_file_target(FILE dsp48e1.model.xml SCANNER_TYPE xml)
+add_file_target(FILE dsp48e1.pb_type.xml SCANNER_TYPE xml)
diff --git a/xilinx/common/primitives/dsp48e1/dsp48e1.model.xml b/xilinx/common/primitives/dsp48e1/dsp48e1.model.xml
new file mode 100644
index 0000000000..8148752720
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dsp48e1.model.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dsp48e1.pb_type.xml b/xilinx/common/primitives/dsp48e1/dsp48e1.pb_type.xml
new file mode 100644
index 0000000000..889baa4cb8
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dsp48e1.pb_type.xml
@@ -0,0 +1,481 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+AREG_0=AREG_0
+AREG_2=AREG_2
+A_INPUT[0]=A_INPUT
+BREG_0=BREG_0
+BREG_2=BREG_2
+B_INPUT[0]=B_INPUT
+MASK[47:0]=MASK
+ZADREG[0]=ADREG
+ZALUMODEREG[0]=ALUMODEREG
+ZAREG_2_ACASCREG_1=ACASCREG
+ZBREG_2_BCASCREG_1=BCASCREG
+ZCARRAYINREG[0]=CARRAYINREG
+ZCARRYINSELREG[0]=CARRYINSELREG
+ZDREG[0]=DREG
+ZINMODEREG[0]=INMODEREG
+ZMREG[0]=MREG
+ZOPMODEREG[0]=OPMODEREG
+ZPREG[0]=PREG
+ZCREG[0]=CREG
+ZIS_ALUMODE_INVERTED[3:0]=IS_ALUMODE_INVERTED
+ZIS_INMODE_INVERTED[4:0]=IS_INMODE_INVERTED
+ZIS_OPMODE_INVERTED[6:0]=IS_OPMODE_INVERTED
+ZIS_CLK_INVERTED=IS_CLK_INVERTED
+ZIS_CARRYIN_INVERTED=IS_CARRYIN_INVERTED
+USE_SIMD_FOUR12_TWO24=USE_SIMD_FOUR12_TWO24
+USE_SIMD_FOUR12=USE_SIMD_FOUR12
+USE_DPORT[0]=USE_DPORT
+SEL_MASK_ROUNDING_MODE1=SEL_MASK_ROUNDING_MODE1
+SEL_MASK_ROUNDING_MODE2=SEL_MASK_ROUNDING_MODE2
+SEL_MASK_C=SEL_MASK_C
+PATTERN[47:0]=PATTERN
+AUTORESET_PATDET_RESET=AUTORESET_PATDET_RESET
+AUTORESET_PATDET_RESET_NOT_MATCH=AUTORESET_PATDET_RESET_NOT_MATCH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_ad_preadder/a1reg/a1reg.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/a1reg/a1reg.pb_type.xml
new file mode 100644
index 0000000000..1122ce80cb
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/a1reg/a1reg.pb_type.xml
@@ -0,0 +1,730 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_ad_preadder/a1reg/reg.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/a1reg/reg.pb_type.xml
new file mode 100644
index 0000000000..8118dafdfd
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/a1reg/reg.pb_type.xml
@@ -0,0 +1,9 @@
+
+
+ .subckt REG
+
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_ad_preadder/a1reg_mux/a1reg_mux.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/a1reg_mux/a1reg_mux.pb_type.xml
new file mode 100644
index 0000000000..1e6c2ad513
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/a1reg_mux/a1reg_mux.pb_type.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+ bel
+ routing
+
+A1REG_MUX.BYPASS = A1REG_MUX.BYPASS
+A1REG_MUX.REG = A1REG_MUX.REG
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_ad_preadder/a2reg/a2reg.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/a2reg/a2reg.pb_type.xml
new file mode 100644
index 0000000000..1122ce80cb
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/a2reg/a2reg.pb_type.xml
@@ -0,0 +1,730 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_ad_preadder/a2reg/reg.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/a2reg/reg.pb_type.xml
new file mode 100644
index 0000000000..8118dafdfd
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/a2reg/reg.pb_type.xml
@@ -0,0 +1,9 @@
+
+
+ .subckt REG
+
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_ad_preadder/a2reg_mux/a2reg_mux.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/a2reg_mux/a2reg_mux.pb_type.xml
new file mode 100644
index 0000000000..a99e9cc307
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/a2reg_mux/a2reg_mux.pb_type.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+ bel
+ routing
+
+A2REG_MUX.BYPASS = A2REG_MUX.BYPASS
+A2REG_MUX.REG = A2REG_MUX.REG
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_ad_preadder/adreg/adreg.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/adreg/adreg.pb_type.xml
new file mode 100644
index 0000000000..719b341a08
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/adreg/adreg.pb_type.xml
@@ -0,0 +1,610 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_ad_preadder/adreg/nreg.sim.v b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/adreg/nreg.sim.v
new file mode 100644
index 0000000000..8d79ceaa3f
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/adreg/nreg.sim.v
@@ -0,0 +1,23 @@
+`ifndef DSP48_NREG_NREG
+`define DSP48_NREG_NREG
+
+`include "reg.sim.v"
+
+module NREG(D, Q, CLK, CE, RESET);
+ parameter NBITS = 25;
+
+ input wire [NBITS-1:0] D;
+ output reg [NBITS-1:0] Q;
+ input wire CLK;
+ input wire CE;
+ input wire RESET;
+
+ genvar ii;
+
+ for (ii=0; ii
+
+ .subckt REG
+
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_ad_preadder/adreg/reg.sim.v b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/adreg/reg.sim.v
new file mode 100644
index 0000000000..608df8a59e
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/adreg/reg.sim.v
@@ -0,0 +1,20 @@
+`ifndef DSP48_NREG_REG
+`define DSP48_NREG_REG
+
+module REG (D, Q, CLK, CE, RESET);
+ input wire D;
+ input wire CLK;
+ input wire CE;
+ input wire RESET;
+ output reg Q;
+
+ always @(posedge CLK) begin
+ if (~RESET)
+ Q <= 1'b0;
+ else if (CE)
+ Q <= D;
+ end
+
+endmodule // REG
+
+`endif // `ifndef DSP48_NREG_REG
diff --git a/xilinx/common/primitives/dsp48e1/dual_ad_preadder/adreg_mux/adreg_mux.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/adreg_mux/adreg_mux.pb_type.xml
new file mode 100644
index 0000000000..a0f862d80d
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/adreg_mux/adreg_mux.pb_type.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+ bel
+ routing
+
+ADREG_MUX.BYPASS = ADREG_MUX.BYPASS
+ADREG_MUX.REG = ADREG_MUX.REG
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_ad_preadder/ain_mux/ain_mux.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/ain_mux/ain_mux.pb_type.xml
new file mode 100644
index 0000000000..62c598a245
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/ain_mux/ain_mux.pb_type.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+ bel
+ routing
+
+AIN_MUX.A = AIN_MUX.A
+AIN_MUX.ACIN = AIN_MUX.ACIN
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_ad_preadder/amult_mux/amult_mux.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/amult_mux/amult_mux.pb_type.xml
new file mode 100644
index 0000000000..bd383036ee
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/amult_mux/amult_mux.pb_type.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+ bel
+ routing
+
+AMULT_MUX.A = AMULT_MUX.A
+AMULT_MUX.ADDER_OUT = AMULT_MUX.ADDER_OUT
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_ad_preadder/acout_mux/CMakeLists.txt b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/aout_mux/CMakeLists.txt
similarity index 100%
rename from xilinx/common/primitives/dsp48e1/dual_ad_preadder/acout_mux/CMakeLists.txt
rename to xilinx/common/primitives/dsp48e1/dual_ad_preadder/aout_mux/CMakeLists.txt
diff --git a/xilinx/common/primitives/dsp48e1/dual_ad_preadder/aout_mux/acout_mux.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/aout_mux/acout_mux.pb_type.xml
new file mode 100644
index 0000000000..58b90b07f9
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/aout_mux/acout_mux.pb_type.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+ bel
+ routing
+
+AOUT_MUX.I0 = AOUT_MUX.I0
+AOUT_MUX.I1 = AOUT_MUX.I1
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_ad_preadder/dreg/dreg.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/dreg/dreg.pb_type.xml
new file mode 100644
index 0000000000..719b341a08
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/dreg/dreg.pb_type.xml
@@ -0,0 +1,610 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_ad_preadder/dreg/nreg.sim.v b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/dreg/nreg.sim.v
new file mode 100644
index 0000000000..8d79ceaa3f
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/dreg/nreg.sim.v
@@ -0,0 +1,23 @@
+`ifndef DSP48_NREG_NREG
+`define DSP48_NREG_NREG
+
+`include "reg.sim.v"
+
+module NREG(D, Q, CLK, CE, RESET);
+ parameter NBITS = 25;
+
+ input wire [NBITS-1:0] D;
+ output reg [NBITS-1:0] Q;
+ input wire CLK;
+ input wire CE;
+ input wire RESET;
+
+ genvar ii;
+
+ for (ii=0; ii
+
+ .subckt REG
+
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_ad_preadder/dreg/reg.sim.v b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/dreg/reg.sim.v
new file mode 100644
index 0000000000..608df8a59e
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/dreg/reg.sim.v
@@ -0,0 +1,20 @@
+`ifndef DSP48_NREG_REG
+`define DSP48_NREG_REG
+
+module REG (D, Q, CLK, CE, RESET);
+ input wire D;
+ input wire CLK;
+ input wire CE;
+ input wire RESET;
+ output reg Q;
+
+ always @(posedge CLK) begin
+ if (~RESET)
+ Q <= 1'b0;
+ else if (CE)
+ Q <= D;
+ end
+
+endmodule // REG
+
+`endif // `ifndef DSP48_NREG_REG
diff --git a/xilinx/common/primitives/dsp48e1/dual_ad_preadder/dreg_mux/dreg_mux.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/dreg_mux/dreg_mux.pb_type.xml
new file mode 100644
index 0000000000..3ce4028cb5
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/dreg_mux/dreg_mux.pb_type.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+ bel
+ routing
+
+DREG_MUX.BYPASS = DREG_MUX.BYPASS
+DREG_MUX.REG = DREG_MUX.REG
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_ad_preadder/dual_ad_preadder.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/dual_ad_preadder.pb_type.xml
new file mode 100644
index 0000000000..670b129254
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_ad_preadder/dual_ad_preadder.pb_type.xml
@@ -0,0 +1,38 @@
+
+ .subckt DUAL_AD_PREADDER
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_b_reg/b1reg/b1reg.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_b_reg/b1reg/b1reg.pb_type.xml
new file mode 100644
index 0000000000..dc0587c95c
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_b_reg/b1reg/b1reg.pb_type.xml
@@ -0,0 +1,442 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_b_reg/b1reg/reg.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_b_reg/b1reg/reg.pb_type.xml
new file mode 100644
index 0000000000..8118dafdfd
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_b_reg/b1reg/reg.pb_type.xml
@@ -0,0 +1,9 @@
+
+
+ .subckt REG
+
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_b_reg/b1reg_mux/b1reg_mux.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_b_reg/b1reg_mux/b1reg_mux.pb_type.xml
new file mode 100644
index 0000000000..4595cef1ea
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_b_reg/b1reg_mux/b1reg_mux.pb_type.xml
@@ -0,0 +1,22 @@
+
+
+ bel
+ routing
+
+
+
+
+
+
+
+
+ bel
+ routing
+
+B1REG_MUX.BYPASS = B1REG_MUX.BYPASS
+B1REG_MUX.REG = B1REG_MUX.REG
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_b_reg/b2reg/b1reg.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_b_reg/b2reg/b1reg.pb_type.xml
new file mode 100644
index 0000000000..dc0587c95c
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_b_reg/b2reg/b1reg.pb_type.xml
@@ -0,0 +1,442 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_b_reg/b2reg/reg.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_b_reg/b2reg/reg.pb_type.xml
new file mode 100644
index 0000000000..8118dafdfd
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_b_reg/b2reg/reg.pb_type.xml
@@ -0,0 +1,9 @@
+
+
+ .subckt REG
+
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_b_reg/b2reg_mux/b2reg_mux.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_b_reg/b2reg_mux/b2reg_mux.pb_type.xml
new file mode 100644
index 0000000000..9901582df4
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_b_reg/b2reg_mux/b2reg_mux.pb_type.xml
@@ -0,0 +1,22 @@
+
+
+ bel
+ routing
+
+
+
+
+
+
+
+
+ bel
+ routing
+
+B2REG_MUX.BYPASS = B2REG_MUX.BYPASS
+B2REG_MUX.REG = B2REG_MUX.REG
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_b_reg/bin_mux/bin_mux.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_b_reg/bin_mux/bin_mux.pb_type.xml
new file mode 100644
index 0000000000..f22668a832
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_b_reg/bin_mux/bin_mux.pb_type.xml
@@ -0,0 +1,22 @@
+
+
+ bel
+ routing
+
+
+
+
+
+
+
+
+ bel
+ routing
+
+BIN_MUX.B = BIN_MUX.B
+BIN_MUX.BCIN = BIN_MUX.BCIN
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_b_reg/bmult_mux/bmult_mux.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_b_reg/bmult_mux/bmult_mux.pb_type.xml
new file mode 100644
index 0000000000..86fb324004
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_b_reg/bmult_mux/bmult_mux.pb_type.xml
@@ -0,0 +1,19 @@
+
+
+ bel
+ mux
+
+ .subckt BMULT_MUX
+
+
+
+
+
+
+
+ bel
+ logic
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_b_reg/bc_mux/CMakeLists.txt b/xilinx/common/primitives/dsp48e1/dual_b_reg/bout_mux/CMakeLists.txt
similarity index 100%
rename from xilinx/common/primitives/dsp48e1/dual_b_reg/bc_mux/CMakeLists.txt
rename to xilinx/common/primitives/dsp48e1/dual_b_reg/bout_mux/CMakeLists.txt
diff --git a/xilinx/common/primitives/dsp48e1/dual_b_reg/bout_mux/bout_mux.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_b_reg/bout_mux/bout_mux.pb_type.xml
new file mode 100644
index 0000000000..ddf966ab2f
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_b_reg/bout_mux/bout_mux.pb_type.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+ bel
+ routing
+
+BOUT_MUX.B1REG = BOUT_MUX.B1REG
+BOUT_MUX.B2 = BOUT_MUX.B2
+
+
+
+
+
diff --git a/xilinx/common/primitives/dsp48e1/dual_b_reg/dual_b_reg.pb_type.xml b/xilinx/common/primitives/dsp48e1/dual_b_reg/dual_b_reg.pb_type.xml
new file mode 100644
index 0000000000..1263ca21f4
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dual_b_reg/dual_b_reg.pb_type.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/xilinx/common/utils/.gdb_history b/xilinx/common/utils/.gdb_history
new file mode 100644
index 0000000000..0e6970a866
--- /dev/null
+++ b/xilinx/common/utils/.gdb_history
@@ -0,0 +1,2 @@
+exit()
+file prjxray_tile_import.py
diff --git a/xilinx/common/utils/prjxray_arch_import.py b/xilinx/common/utils/prjxray_arch_import.py
index 3a41f3e9cf..b5ba8cc164 100644
--- a/xilinx/common/utils/prjxray_arch_import.py
+++ b/xilinx/common/utils/prjxray_arch_import.py
@@ -521,11 +521,14 @@ def is_in_roi(conn, roi, tile_pkey):
"IBUFDS_GTE2": ("Y", 2),
"IPAD": (None, None),
"OPAD": (None, None),
+ "DSP48E1": (None, None),
+ "TIEOFF": (None, None)
}
def make_prefix(site, x, y, from_site_name=False):
""" Make tile FASM prefix for a given site. """
+
if from_site_name:
site_type, _ = site.split('_')
else:
@@ -540,6 +543,8 @@ def make_prefix(site, x, y, from_site_name=False):
elif prefix_required[0] == 'XY':
mod_x, mod_y = prefix_required[1]
return site_type, '{}_X{}Y{}'.format(site_type, x % mod_x, y % mod_y)
+ elif site_type == 'DSP48E1':
+ return site_type, '{}.{}_{}'.format("DSP48", "DSP", y % 2)
elif prefix_required[0] is None:
return site_type, None
else:
@@ -607,7 +612,7 @@ def create_capacity_prefix(c, tile_prefix, tile_pkey, tile_capacity):
(tile_pkey, )
)
- NO_SITE_TYPE_PREFIX = ["SLICEL", "SLICEM", "IBUFDS_GTE2"]
+ NO_SITE_TYPE_PREFIX = ["SLICEL", "SLICEM", "IBUFDS_GTE2", "DSP48E1"]
prefixes = []
diff --git a/xilinx/common/utils/prjxray_db_cache.py b/xilinx/common/utils/prjxray_db_cache.py
index 5d916f8df5..57d330eabb 100644
--- a/xilinx/common/utils/prjxray_db_cache.py
+++ b/xilinx/common/utils/prjxray_db_cache.py
@@ -73,6 +73,7 @@ def _progress(self, status, remaining, total):
Prints database copy progress.
"""
if self.bar is None:
- self.bar = ProgressBar(max_value=total)
+ self.bar = ProgressBar(maxval=total)
+ self.bar.start()
else:
self.bar.update(total - remaining)
diff --git a/xilinx/common/utils/prjxray_physical_tile_import.py b/xilinx/common/utils/prjxray_physical_tile_import.py
index ca53435f41..6ad2c60867 100755
--- a/xilinx/common/utils/prjxray_physical_tile_import.py
+++ b/xilinx/common/utils/prjxray_physical_tile_import.py
@@ -78,7 +78,8 @@ def add_direct_mappings(tile_xml, site_xml, eq_pb_type_xml):
def add_equivalent_sites(tile_xml, equivalent_sites):
""" Used to add to the tag the equivalent tiles associated with it."""
-
+ if equivalent_sites=="":
+ return
pb_types = equivalent_sites.split(',')
equivalent_sites_xml = ET.SubElement(tile_xml, 'equivalent_sites')
diff --git a/xilinx/common/utils/prjxray_tile_import.py b/xilinx/common/utils/prjxray_tile_import.py
index 36407bd64e..5f81ad5168 100755
--- a/xilinx/common/utils/prjxray_tile_import.py
+++ b/xilinx/common/utils/prjxray_tile_import.py
@@ -332,10 +332,12 @@ def x_filter_func(site):
if site.type not in site_type_count:
site_type_count[site.type] = 0
site_prefixes[site.type] = []
-
+
cells_idx[idx] = site_type_count[site.type]
site_type_count[site.type] += 1
-
+
+ '''print(cells_idx[idx]," ",site_type_count[site.type]," ",site.type)'''
+
site_coords = args.site_coords.upper()
if site_coords == 'X':
site_prefix = '{}_X{}'.format(site.type, site.x)
@@ -352,6 +354,8 @@ def x_filter_func(site):
site_instance = site_type_instances[site.type][cells_idx[idx]]
idx += 1
+
+ '''print(site_instance)'''
if (site.type, site_instance) not in models_added:
models_added.add((site.type, site_instance))
@@ -374,11 +378,12 @@ def x_filter_func(site):
for outputs in root_element.iter('output'):
ports[outputs.attrib['name']] = int(outputs.attrib['num_pins'])
- assert site_instance not in site_type_ports, (
+ '''assert site_instance not in site_type_ports, (
site_instance, site_type_ports.keys()
)
+ print(site_instance)'''
site_type_ports[site_instance] = ports
-
+
attrib = dict(root_element.attrib)
include_xml = ET.SubElement(pb_type_xml, 'pb_type', attrib)
ET.SubElement(
@@ -1393,7 +1398,7 @@ def main():
parser.add_argument('--tile', help="""Tile to generate for""")
parser.add_argument(
- '--site_directory', help="""Diretory where sites are defined"""
+ '--site_directory', help="""Directory where sites are defined"""
)
parser.add_argument(
diff --git a/xilinx/xc7/archs/artix7/devices/xc7a50t-virt/CMakeLists.txt b/xilinx/xc7/archs/artix7/devices/xc7a50t-virt/CMakeLists.txt
index 3848af91c6..ad6053979e 100644
--- a/xilinx/xc7/archs/artix7/devices/xc7a50t-virt/CMakeLists.txt
+++ b/xilinx/xc7/archs/artix7/devices/xc7a50t-virt/CMakeLists.txt
@@ -26,6 +26,8 @@ add_xc_device_define_type(
GTP_CHANNEL_2
GTP_CHANNEL_3
PCIE_BOT
+ DSP_L
+ DSP_R
PB_TYPES
SLICEL
SLICEM
@@ -43,4 +45,6 @@ add_xc_device_define_type(
IPAD
OPAD
PCIE_2_1
+ DSP48E1
+ TIEOFF
)
diff --git a/xilinx/xc7/archs/artix7/tiles/CMakeLists.txt b/xilinx/xc7/archs/artix7/tiles/CMakeLists.txt
index b258dc9594..fa312d98cd 100644
--- a/xilinx/xc7/archs/artix7/tiles/CMakeLists.txt
+++ b/xilinx/xc7/archs/artix7/tiles/CMakeLists.txt
@@ -25,6 +25,10 @@ add_subdirectory(pcie_bot)
add_subdirectory(mmcme2_adv)
add_subdirectory(cmt_top_l_lower_b)
add_subdirectory(cmt_top_r_lower_b)
+add_subdirectory(dsp_l)
+add_subdirectory(dsp_r)
+add_subdirectory(dsp48e1)
+add_subdirectory(tieoff)
set(IOPAD_SITES IOB33 IDELAYE2 ILOGICE3 OLOGICE3)
set(IOPAD_S_SITES IOB33S IDELAYE2 ILOGICE3 OLOGICE3)
diff --git a/xilinx/xc7/archs/artix7/tiles/dsp48e1/CMakeLists.txt b/xilinx/xc7/archs/artix7/tiles/dsp48e1/CMakeLists.txt
new file mode 100644
index 0000000000..39cb5a9f54
--- /dev/null
+++ b/xilinx/xc7/archs/artix7/tiles/dsp48e1/CMakeLists.txt
@@ -0,0 +1,7 @@
+project_ray_tile(
+ ARCH artix7
+ TILE DSP48E1
+ SITE_AS_TILE
+ SITE_TYPES DSP48E1/DSP48E1
+ EQUIVALENT_SITES DSP48E1
+ )
diff --git a/xilinx/xc7/archs/artix7/tiles/dsp_l/CMakeLists.txt b/xilinx/xc7/archs/artix7/tiles/dsp_l/CMakeLists.txt
new file mode 100644
index 0000000000..b6522ed01f
--- /dev/null
+++ b/xilinx/xc7/archs/artix7/tiles/dsp_l/CMakeLists.txt
@@ -0,0 +1,5 @@
+project_ray_tile_capacity(
+ ARCH artix7
+ TILE DSP_L
+ SITE_TYPES DSP48E1/DSP48E1 DSP48E1/DSP48E1 TIEOFF/TIEOFF
+ )
diff --git a/xilinx/xc7/archs/artix7/tiles/dsp_r/CMakeLists.txt b/xilinx/xc7/archs/artix7/tiles/dsp_r/CMakeLists.txt
new file mode 100644
index 0000000000..31f260040b
--- /dev/null
+++ b/xilinx/xc7/archs/artix7/tiles/dsp_r/CMakeLists.txt
@@ -0,0 +1,5 @@
+project_ray_tile_capacity(
+ ARCH artix7
+ TILE DSP_R
+ SITE_TYPES DSP48E1/DSP48E1 DSP48E1/DSP48E1 TIEOFF/TIEOFF
+ )
diff --git a/xilinx/xc7/archs/artix7/tiles/tieoff/CMakeLists.txt b/xilinx/xc7/archs/artix7/tiles/tieoff/CMakeLists.txt
new file mode 100644
index 0000000000..7361df52de
--- /dev/null
+++ b/xilinx/xc7/archs/artix7/tiles/tieoff/CMakeLists.txt
@@ -0,0 +1,7 @@
+project_ray_tile(
+ ARCH artix7
+ TILE TIEOFF
+ SITE_AS_TILE
+ SITE_TYPES TIEOFF/TIEOFF
+ EQUIVALENT_SITES TIEOFF
+ )
diff --git a/xilinx/xc7/bels.json b/xilinx/xc7/bels.json
index 91b85ca607..6b38c0469b 100644
--- a/xilinx/xc7/bels.json
+++ b/xilinx/xc7/bels.json
@@ -297,5 +297,53 @@
"OLOGICE3_TFF_SAMEEDGE.OLOGICE3"
]
}
+ },
+ "DSP": {
+ "DSP": {
+ "DSP48": [
+ "DSP48E1_ADREG_0_AREG_0_A_INPUT_DIRECT_MREG_0_PREG_1_USE_DPORT_TRUE_USE_MULT_DYNAMIC_USE_PATTERN_DETECT_NO_PATDET.DSP48E1",
+ "DSP48E1_BREG_0_B_INPUT_DIRECT_MREG_0_PREG_1_USE_MULT_DYNAMIC_USE_PATTERN_DETECT_NO_PATDET.DSP48E1",
+ "DSP48E1_CREG_0_PREG_1_USE_PATTERN_DETECT_NO_PATDET.DSP48E1",
+ "DSP48E1_ADREG_0_DREG_0_MREG_0_PREG_1_USE_DPORT_TRUE_USE_MULT_DYNAMIC_USE_PATTERN_DETECT_NO_PATDET.DSP48E1",
+ "DSP48E1_OPMODEREG_0_PREG_1_USE_PATTERN_DETECT_NO_PATDET.DSP48E1",
+ "DSP48E1_ALUMODEREG_0_PREG_1_USE_PATTERN_DETECT_NO_PATDET.DSP48E1",
+ "DSP48E1_CARRYINREG_0_PREG_1_USE_PATTERN_DETECT_NO_PATDET.DSP48E1",
+ "DSP48E1_CARRYINSELREG_0_PREG_1_USE_PATTERN_DETECT_NO_PATDET.DSP48E1",
+ "DSP48E1_INMODEREG_0_MREG_0_PREG_1_USE_DPORT_FALSE_USE_MULT_DYNAMIC_USE_PATTERN_DETECT_NO_PATDET.DSP48E1",
+ "DSP48E1_AREG_2.DSP48E1",
+ "DSP48E1_BREG_2.DSP48E1",
+ "DSP48E1_CREG_1.DSP48E1",
+ "DSP48E1_DREG_1.DSP48E1",
+ "DSP48E1_MREG_1.DSP48E1",
+ "DSP48E1_PREG_1.DSP48E1",
+ "DSP48E1_ADREG_1.DSP48E1",
+ "DSP48E1_ALUMODEREG_1.DSP48E1",
+ "DSP48E1_CARRYINSELREG_1.DSP48E1",
+ "DSP48E1_CARRYINREG_1.DSP48E1",
+ "DSP48E1_INMODEREG_1.DSP48E1",
+ "DSP48E1_ADREG_0_AREG_0_A_INPUT_CASCADE_MREG_0_PREG_1_USE_DPORT_TRUE_USE_MULT_MULTIPLY_USE_PATTERN_DETECT_NO_PATDET.DSP48E1",
+ "DSP48E1_BREG_0_B_INPUT_CASCADE_MREG_0_PREG_1_USE_MULT_DYNAMIC_USE_PATTERN_DETECT_NO_PATDET.DSP48E1",
+ "DSP48E1_PREG_1_USE_PATTERN_DETECT_NO_PATDET.DSP48E1",
+ "DSP48E1_ACASCREG_2_AREG_2.DSP48E1",
+ "DSP48E1_BCASCREG_2_BREG_2.DSP48E1",
+ "DSP48E1_BREG_1_MREG_0_PREG_0_USE_MULT_MULTIPLY.DSP48E1",
+ "DSP48E1_ACASCREG_0_A_INPUT_CASCADE.DSP48E1",
+ "DSP48E1_ACASCREG_0_A_INPUT_DIRECT.DSP48E1",
+ "DSP48E1_ADREG_0_AREG_0_A_INPUT_CASCADE_MREG_0_PREG_0_USE_DPORT_TRUE_USE_MULT_MULTIPLY.DSP48E1",
+ "DSP48E1_ADREG_0_AREG_0_A_INPUT_DIRECT_MREG_0_PREG_0_USE_DPORT_TRUE_USE_MULT_MULTIPLY.DSP48E1",
+ "DSP48E1_ADREG_0_DREG_0_MREG_0_PREG_0_USE_DPORT_TRUE_USE_MULT_MULTIPLY.DSP48E1",
+ "DSP48E1_ADREG_0_INMODEREG_0_MREG_0_PREG_0_USE_DPORT_TRUE_USE_MULT_MULTIPLY.DSP48E1",
+ "DSP48E1_ALUMODEREG_0_PREG_0.DSP48E1",
+ "DSP48E1_BCASCREG_0_B_INPUT_CASCADE.DSP48E1",
+ "DSP48E1_BCASCREG_0_B_INPUT_DIRECT.DSP48E1",
+ "DSP48E1_BREG_0_B_INPUT_CASCADE_MREG_0_PREG_0_USE_MULT_DYNAMIC.DSP48E1",
+ "DSP48E1_BREG_0_B_INPUT_DIRECT_MREG_0_PREG_0_USE_MULT_DYNAMIC.DSP48E1",
+ "DSP48E1_CARRYINREG_0_PREG_0.DSP48E1",
+ "DSP48E1_CARRYINSELREG_0_PREG_0.DSP48E1",
+ "DSP48E1_CREG_0_PREG_0.DSP48E1",
+ "DSP48E1_OPMODEREG_0_PREG_0.DSP48E1",
+ "DSP48E1_PREG_0.DSP48E1"
+ ]
+ }
}
}
diff --git a/xilinx/xc7/techmap/cells_map.v b/xilinx/xc7/techmap/cells_map.v
index 4cc339a149..b236f3c1a8 100644
--- a/xilinx/xc7/techmap/cells_map.v
+++ b/xilinx/xc7/techmap/cells_map.v
@@ -10793,3 +10793,324 @@ module PCIE_2_1 (
.USERRSTN(USERRSTN)
);
endmodule
+
+
+module DSP48E1 (
+ output [29:0] ACOUT,
+ output [17:0] BCOUT,
+ output reg CARRYCASCOUT,
+ output reg [3:0] CARRYOUT,
+ output reg MULTSIGNOUT,
+ output OVERFLOW,
+ output reg signed [47:0] P,
+ output reg PATTERNBDETECT,
+ output reg PATTERNDETECT,
+ output [47:0] PCOUT,
+ output UNDERFLOW,
+ input signed [29:0] A,
+ input [29:0] ACIN,
+ input [3:0] ALUMODE,
+ input signed [17:0] B,
+ input [17:0] BCIN,
+ input [47:0] C,
+ input CARRYCASCIN,
+ input CARRYIN,
+ input [2:0] CARRYINSEL,
+ input CEA1,
+ input CEA2,
+ input CEAD,
+ input CEALUMODE,
+ input CEB1,
+ input CEB2,
+ input CEC,
+ input CECARRYIN,
+ input CECTRL,
+ input CED,
+ input CEINMODE,
+ input CEM,
+ input CEP,
+ (* clkbuf_sink *) input CLK,
+ input [24:0] D,
+ input [4:0] INMODE,
+ input MULTSIGNIN,
+ input [6:0] OPMODE,
+ input [47:0] PCIN,
+ input RSTA,
+ input RSTALLCARRYIN,
+ input RSTALUMODE,
+ input RSTB,
+ input RSTC,
+ input RSTCTRL,
+ input RSTD,
+ input RSTINMODE,
+ input RSTM,
+ input RSTP
+);
+ parameter integer ACASCREG = 1;
+ parameter integer ADREG = 1;
+ parameter integer ALUMODEREG = 1;
+ parameter integer AREG = 1;
+ parameter AUTORESET_PATDET = "NO_RESET";
+ parameter A_INPUT = "DIRECT";
+ parameter integer BCASCREG = 1;
+ parameter integer BREG = 1;
+ parameter B_INPUT = "DIRECT";
+ parameter integer CARRYINREG = 1;
+ parameter integer CARRYINSELREG = 1;
+ parameter integer CREG = 1;
+ parameter integer DREG = 1;
+ parameter integer INMODEREG = 1;
+ parameter integer MREG = 1;
+ parameter integer OPMODEREG = 1;
+ parameter integer PREG = 1;
+ parameter SEL_MASK = "MASK";
+ parameter SEL_PATTERN = "PATTERN";
+ parameter USE_DPORT = "FALSE";
+ parameter USE_MULT = "MULTIPLY";
+ parameter USE_PATTERN_DETECT = "NO_PATDET";
+ parameter USE_SIMD = "ONE48";
+ parameter [47:0] MASK = 48'h3FFFFFFFFFFF;
+ parameter [47:0] PATTERN = 48'h000000000000;
+ parameter [3:0] IS_ALUMODE_INVERTED = 4'b0;
+ parameter [0:0] IS_CARRYIN_INVERTED = 1'b0;
+ parameter [0:0] IS_CLK_INVERTED = 1'b0;
+ parameter [4:0] IS_INMODE_INVERTED = 5'b0;
+ parameter [6:0] IS_OPMODE_INVERTED = 7'b0;
+
+ // DRC CHECKS. See DSP48E1 documentation for more info.
+ // USE_PATTERN_DETECT, USE_MULT AND SEL_PATTERN parameters are always set as their default value as these are not present in the segbits database.
+
+ case (A_INPUT)
+ "DIRECT", "CASCADE" : ;
+ default : begin
+ $error("A_INPUT on DSP48E1 instance is set to an illegal value. Valid options for this parameter are DIRECT or CASCADE");
+ end
+ endcase
+ case (B_INPUT)
+ "DIRECT", "CASCADE" : ;
+ default : begin
+ $error("B_INPUT on DSP48E1 instance is set to an illegal value. Valid options for this parameter are DIRECT or CASCADE");
+ end
+ endcase
+ case (AREG)
+ 0, 1, 2 : ;
+ default : begin
+ $error("AREG on DSP48E1 instance is set to an illegal value. Valid options for this parameter are 0, 1 or 2");
+ end
+ endcase
+ case (AREG)
+ 0 : if(AREG != ACASCREG) begin
+ $error("ACASCREG on DSP48E1 instance is set to an illegal value. ACASCREG has to be set to 0 when AREG is 0");
+ end
+ 1 : if(AREG != ACASCREG) begin
+ $error("ACASCREG on DSP48E1 instance is set to an illegal value. ACASCREG has to be set to 1 when AREG is 1");
+ end
+ 2 : if((AREG != ACASCREG) && ((AREG-1) != ACASCREG)) begin
+ $error("ACASCREG on DSP48E1 instance is set to an illegal value. ACASCREG has to be set to either 2 or 1 when AREG is 2");
+ end
+ default : ;
+ endcase
+ case (BREG)
+ 0, 1, 2 : ;
+ default : begin
+ $error("BREG on DSP48E1 instance is set to an illegal value. Valid options for this parameter are 0, 1 or 2");
+ end
+ endcase
+ case (BREG)
+ 0 : if(BREG != BCASCREG) begin
+ $error("BCASCREG on DSP48E1 instance is set to an illegal value. BCASCREG has to be set to 0 when attribute BREG is 0");
+ end
+ 1 : if(BREG != BCASCREG) begin
+ $error("BCASCREG on DSP48E1 instance is set to an illegal value. BCASCREG has to be set to 1 when attribute BREG is 1");
+ end
+ 2 : if((BREG != BCASCREG) && ((BREG-1) != BCASCREG)) begin
+ $error("BCASCREG on DSP48E1 instance is set to an illegal value. BCASCREG has to be set to either 2 or 1 when attribute BREG is 2");
+ end
+ default : ;
+ endcase
+ case (ALUMODEREG)
+ 0, 1 : ;
+ default : begin
+ $error("ALUMODEREG on DSP48E1 instance is set to an illegal value. Valid options for this parameter are 0 or 1");
+ end
+ endcase
+ case (CARRYINREG)
+ 0, 1 : ;
+ default : begin
+ $error("CARRYINREG on DSP48E1 instance is set to an illegal value. Valid options for this parameter are 0 or 1");
+ end
+ endcase
+ case (CARRYINSELREG)
+ 0, 1 : ;
+ default : begin
+ $error("CARRYINSELREG on DSP48E1 instance is set to an illegal value. Valid options for this parameter are 0 or 1");
+ end
+ endcase
+ case (CREG)
+ 0, 1 : ;
+ default : begin
+ $error("CREG on DSP48E1 instance is set to an illegal value. Valid options for this parameter are 0 or 1");
+ end
+ endcase
+ case (OPMODEREG)
+ 0, 1 : ;
+ default : begin
+ $error("OPMODEREG on DSP48E1 instance is set to an illegal value. Valid options for this parameter are 0 or 1");
+ end
+ endcase
+ case (USE_MULT)
+ "NONE", "MULTIPLY", "DYNAMIC" : ;
+ default : begin
+ $error("USE_MULT on DSP48E1 instance is set to an illegal value. Valid options for this parameter are MULTIPLY, DYNAMIC or NONE");
+ end
+ endcase
+ case (USE_PATTERN_DETECT)
+ "PATDET", "NO_PATDET" : ;
+ default : begin
+ $error("USE_PATTERN_DETECT on DSP48E1 instance is set to an illegal value. Valid options for this parameter are PATDET or NO_PATDET");
+ end
+ endcase
+ case (AUTORESET_PATDET)
+ "NO_RESET", "RESET_MATCH", "RESET_NOT_MATCH" : ;
+ default : begin
+ $error("AUTORESET_PATDET on DSP48E1 instance is set to an illegal value. Valid options for this parameter are NO_RESET, RESET_MATCH or RESET_NOT_MATCH");
+ end
+ endcase
+ case(SEL_PATTERN)
+ "PATTERN", "C" : ;
+ default : begin
+ $error("SEL_PATTERN on DSP48E1 instance is set to an illegal value. Valid options for this parameter are PATTERN or C");
+ end
+ endcase
+ case(SEL_MASK)
+ "MASK", "C", "ROUNDING_MODE1", "ROUNDING_MODE2" : ;
+ default : begin
+ $error("SEL_MASK on DSP48E1 instance is set to an illegal value. Valid options for this parameter are MASK, C, ROUNDING_MODE1 or ROUNDING_MODE2");
+ end
+ endcase
+ case (MREG)
+ 0, 1 : ;
+ default : begin
+ $error("MREG on DSP48E1 instance is set to an illegal value. Valid options for this parameter are 0 or 1");
+ end
+ endcase
+ case (PREG)
+ 0, 1 : ;
+ default : begin
+ $error("PREG on DSP48E1 instance is set to an illegal value. Valid options for this parameter are 0 or 1");
+ end
+ endcase
+ case (ADREG)
+ 0, 1 : ;
+ default : begin
+ $error("ADREG on DSP48E1 instance is set to an illegal value. Valid options for this parameter are 0 or 1");
+ end
+ endcase
+ case (DREG)
+ 0, 1 : ;
+ default : begin
+ $error("DREG on DSP48E1 instance is set to an illegal value. Valid options for this parameter are 0 or 1");
+ end
+ endcase
+ case (INMODEREG)
+ 0, 1 : ;
+ default : begin
+ $error("INMODEREG on DSP48E1 instance is set to an illegal value. Valid options for this parameter are 0 or 1");
+ end
+ endcase
+ case (USE_DPORT)
+ "TRUE", "FALSE" : ;
+ default : begin
+ $error("USE_DPORT on DSP48E1 instance is set to an illegal value. Valid options for this parameter are TRUE or FALSE");
+ end
+ endcase
+
+ DSP48E1_VPR #(
+
+ .AREG_0(AREG==0),
+ .BREG_0(BREG==0),
+ .AREG_2(AREG==2),
+ .BREG_2(BREG==2),
+ .MASK(MASK),
+ .ADREG(ADREG[0]),
+ .ALUMODEREG(ALUMODEREG[0]),
+ .ACASCREG(AREG==2 && ACASCREG==1),
+ .BCASCREG(BREG==2 && BCASCREG==1),
+ .CARRYINREG(CARRYINREG[0]),
+ .CARRYINSELREG(CARRYINSELREG[0]),
+ .DREG(DREG[0]),
+ .INMODEREG(INMODEREG[0]),
+ .IS_ALUMODE_INVERTED(IS_ALUMODE_INVERTED),
+ .IS_INMODE_INVERTED(IS_INMODE_INVERTED),
+ .IS_OPMODE_INVERTED(IS_OPMODE_INVERTED),
+ .MREG(MREG[0]),
+ .OPMODEREG(OPMODEREG[0]),
+ .PREG(PREG[0]),
+ .CREG(CREG[0]),
+ .A_INPUT(A_INPUT == "CASCADE"),
+ .B_INPUT(B_INPUT == "CASCADE"),
+ .USE_DPORT(USE_DPORT == "TRUE"),
+ .USE_SIMD_FOUR12(USE_SIMD == "FOUR12"),
+ .USE_SIMD_FOUR12_TWO24(USE_SIMD == "TWO24"),
+ .AUTORESET_PATDET_RESET(AUTORESET_PATDET == "RESET_MATCH"),
+ .AUTORESET_PATDET_RESET_NOT_MATCH(AUTORESET_PATDET == "RESET_NOT_MATCH"),
+ .PATTERN(PATTERN),
+ .SEL_MASK_ROUNDING_MODE1(SEL_MASK == "ROUNDING_MODE1"),
+ .SEL_MASK_ROUNDING_MODE2(SEL_MASK == "ROUNDING_MODE2"),
+ .SEL_MASK_C(SEL_MASK == "C"),
+ .IS_CARRYIN_INVERTED(IS_CARRYIN_INVERTED),
+ .IS_CLK_INVERTED(IS_CLK_INVERTED)
+
+ ) _TECHMAP_REPLACE_ (
+ .ACOUT(ACOUT),
+ .BCOUT(BCOUT),
+ .CARRYCASCOUT(CARRYCASCOUT),
+ .CARRYOUT(CARRYOUT),
+ .MULTSIGNOUT(MULTSIGNOUT),
+ .OVERFLOW(OVERFLOW),
+ .P(P),
+ .PATTERNBDETECT(PATTERNBDETECT),
+ .PATTERNDETECT(PATTERNDETECT),
+ .PCOUT(PCOUT),
+ .UNDERFLOW(UNDERFLOW),
+ .A(A),
+// .ACIN(ACIN),
+ .ALUMODE(ALUMODE),
+ .B(B),
+// .BCIN(BCIN),
+ .C(C),
+// .CARRYCASCIN(CARRYCASCIN),
+ .CARRYIN(CARRYIN),
+ .CARRYINSEL(CARRYINSEL),
+ .CEA1(CEA1),
+ .CEA2(CEA2),
+ .CEAD(CEAD),
+ .CEALUMODE(CEALUMODE),
+ .CEB1(CEB1),
+ .CEB2(CEB2),
+ .CEC(CEC),
+ .CECARRYIN(CECARRYIN),
+ .CECTRL(CECTRL),
+ .CED(CED),
+ .CEINMODE(CEINMODE),
+ .CEM(CEM),
+ .CEP(CEP),
+ .CLK(CLK),
+ .D(D),
+ .INMODE(INMODE),
+// .MULTSIGNIN(MULTSIGNIN),
+ .OPMODE(OPMODE),
+// .PCIN(PCIN),
+ .RSTA(RSTA),
+ .RSTALLCARRYIN(RSTALLCARRYIN),
+ .RSTALUMODE(RSTALUMODE),
+ .RSTB(RSTB),
+ .RSTC(RSTC),
+ .RSTCTRL(RSTCTRL),
+ .RSTD(RSTD),
+ .RSTINMODE(RSTINMODE),
+ .RSTM(RSTM),
+ .RSTP(RSTP)
+ );
+
+endmodule
diff --git a/xilinx/xc7/techmap/cells_sim.v b/xilinx/xc7/techmap/cells_sim.v
index a06ebbe5e8..e25ca25026 100644
--- a/xilinx/xc7/techmap/cells_sim.v
+++ b/xilinx/xc7/techmap/cells_sim.v
@@ -3575,3 +3575,89 @@ module PCIE_2_1_VPR (
parameter [4:0] VC0_TX_LASTPACKET = 5'd0;
parameter [1:0] CFG_ECRC_ERR_CPLSTAT = 2'd0;
endmodule
+
+module DSP48E1_VPR (
+ input [29:0] A,
+ input [17:0] B,
+ input [47:0] C,
+ input [24:0] D,
+ input [6:0] OPMODE,
+ input [3:0] ALUMODE,
+ input CARRYIN,
+ input [2:0] CARRYINSEL,
+ input [4:0] INMODE,
+ input CEA1,
+ input CEA2,
+ input CEB1,
+ input CEB2,
+ input CEC,
+ input CED,
+ input CEM,
+ input CEP,
+ input CEAD,
+ input CEALUMODE,
+ input CECTRL,
+ input CECARRYIN,
+ input CEINMODE,
+ input RSTA,
+ input RSTB,
+ input RSTC,
+ input RSTD,
+ input RSTM,
+ input RSTP,
+ input RSTCTRL,
+ input RSTALLCARRYIN,
+ input RSTALUMODE,
+ input RSTINMODE,
+ input CLK,
+ input [29:0] ACIN,
+ input [17:0] BCIN,
+ input [47:0] PCIN,
+ input CARRYCASCIN,
+ input MULTSIGNIN,
+ output [29:0] ACOUT,
+ output [17:0] BCOUT,
+ output [47:0] PCOUT,
+ output [47:0] P,
+ output [3:0] CARRYOUT,
+ output CARRYCASCOUT,
+ output MULTSIGNOUT,
+ output PATTERNDETECT,
+ output PATTERNBDETECT,
+ output OVERFLOW,
+ output UNDERFLOW,
+);
+ parameter AREG_0 = 1'b0;
+ parameter BREG_0 = 1'b0;
+ parameter AREG_2 = 1'b0;
+ parameter BREG_2 = 1'b0;
+ parameter MASK = 48'b000000000000000000000000000000000000000000000000;
+ parameter PATTERN = 48'b000000000000000000000000000000000000000000000000;
+ parameter ADREG = 1'b0;
+ parameter ALUMODEREG = 1'b0;
+ parameter ACASCREG = 1'b0;
+ parameter BCASCREG = 1'b0;
+ parameter CARRYINREG = 1'b0;
+ parameter CARRYINSELREG = 1'b0;
+ parameter DREG = 1'b0;
+ parameter INMODEREG = 1'b0;
+ parameter MREG = 1'b0;
+ parameter OPMODEREG = 1'b0;
+ parameter PREG = 1'b0;
+ parameter CREG = 1'b0;
+ parameter A_INPUT = 1'b0;
+ parameter B_INPUT = 1'b0;
+ parameter USE_DPORT = 1'b0;
+ parameter USE_SIMD_FOUR12 = 1'b0;
+ parameter USE_SIMD_FOUR12_TWO24 = 1'b0;
+ parameter AUTORESET_PATDET_RESET = 1'b0;
+ parameter AUTORESET_PATDET_RESET_NOT_MATCH = 1'b0;
+ parameter SEL_MASK_ROUNDING_MODE1 = 1'b0;
+ parameter SEL_MASK_ROUNDING_MODE2 = 1'b0;
+ parameter SEL_MASK_C = 1'b0;
+ parameter [3:0] IS_ALUMODE_INVERTED = 4'b0;
+ parameter [4:0] IS_INMODE_INVERTED = 5'b0;
+ parameter [6:0] IS_OPMODE_INVERTED = 7'b0;
+ parameter IS_CARRYIN_INVERTED = 1'b0;
+ parameter IS_CLK_INVERTED = 1'b0;
+endmodule
diff --git a/xilinx/xc7/tests/CMakeLists.txt b/xilinx/xc7/tests/CMakeLists.txt
index 4408f5ae44..244d6f1070 100644
--- a/xilinx/xc7/tests/CMakeLists.txt
+++ b/xilinx/xc7/tests/CMakeLists.txt
@@ -45,6 +45,7 @@ add_subdirectory(gtp_common)
add_subdirectory(gtp_channel)
add_subdirectory(pcie)
add_subdirectory(pcie_complex)
+add_subdirectory(dsp)
# Tests with dependencies
set(COUNTER_SRC ${f4pga-arch-defs_SOURCE_DIR}/xilinx/xc7/tests/counter)
diff --git a/xilinx/xc7/tests/dsp/CMakeLists.txt b/xilinx/xc7/tests/dsp/CMakeLists.txt
new file mode 100644
index 0000000000..527b4dc11b
--- /dev/null
+++ b/xilinx/xc7/tests/dsp/CMakeLists.txt
@@ -0,0 +1,9 @@
+add_file_target(FILE dsp.xdc)
+add_file_target(FILE top.v SCANNER_TYPE verilog)
+add_fpga_target(
+ NAME dsp
+ BOARD arty-full
+ SOURCES top.v
+ INPUT_XDC_FILES dsp.xdc
+ EXPLICIT_ADD_FILE_TARGET
+)
diff --git a/xilinx/xc7/tests/dsp/dsp.xdc b/xilinx/xc7/tests/dsp/dsp.xdc
new file mode 100644
index 0000000000..e9cae4acbb
--- /dev/null
+++ b/xilinx/xc7/tests/dsp/dsp.xdc
@@ -0,0 +1,60 @@
+set_property PACKAGE_PIN G16 [get_ports {A[23]}]
+set_property PACKAGE_PIN C17 [get_ports {A[9]}]
+set_property PACKAGE_PIN J17 [get_ports {A[4]}]
+set_property PACKAGE_PIN A15 [get_ports {B[9]}]
+set_property PACKAGE_PIN U14 [get_ports {OUT[6]}]
+set_property PACKAGE_PIN H17 [get_ports {A[14]}]
+set_property PACKAGE_PIN J15 [get_ports {A[1]}]
+set_property PACKAGE_PIN A14 [get_ports {B[6]}]
+set_property PACKAGE_PIN U13 [get_ports {OUT[3]}]
+set_property PACKAGE_PIN C16 [get_ports {A[10]}]
+set_property PACKAGE_PIN U11 [get_ports {OUT[11]}]
+set_property PACKAGE_PIN J13 [get_ports {A[15]}]
+set_property PACKAGE_PIN E18 [get_ports {A[8]}]
+set_property PACKAGE_PIN U17 [get_ports {OUT[16]}]
+set_property PACKAGE_PIN R10 [get_ports {OUT[0]}]
+set_property PACKAGE_PIN E17 [get_ports {A[18]}]
+set_property PACKAGE_PIN K15 [get_ports {A[2]}]
+set_property PACKAGE_PIN D15 [get_ports {B[1]}]
+set_property PACKAGE_PIN V12 [get_ports {OUT[9]}]
+set_property PACKAGE_PIN F15 [get_ports {A[22]}]
+set_property PACKAGE_PIN H14 [get_ports {A[20]}]
+set_property PACKAGE_PIN H15 [get_ports {A[11]}]
+set_property PACKAGE_PIN A18 [get_ports {B[4]}]
+set_property PACKAGE_PIN E15 [get_ports {B[3]}]
+set_property PACKAGE_PIN T10 [get_ports {OUT[1]}]
+set_property PACKAGE_PIN F14 [get_ports {B[14]}]
+set_property PACKAGE_PIN D13 [get_ports {B[12]}]
+set_property PACKAGE_PIN E16 [get_ports {B[2]}]
+set_property PACKAGE_PIN F16 [get_ports {A[21]}]
+set_property PACKAGE_PIN G17 [get_ports {A[13]}]
+set_property PACKAGE_PIN B18 [get_ports {B[5]}]
+set_property PACKAGE_PIN C15 [get_ports {B[0]}]
+set_property PACKAGE_PIN B11 [get_ports {B[17]}]
+set_property PACKAGE_PIN V10 [get_ports {OUT[8]}]
+set_property PACKAGE_PIN K13 [get_ports {A[16]}]
+set_property PACKAGE_PIN D18 [get_ports {A[7]}]
+set_property PACKAGE_PIN B16 [get_ports {B[11]}]
+set_property PACKAGE_PIN V17 [get_ports {OUT[13]}]
+set_property PACKAGE_PIN V11 [get_ports {OUT[7]}]
+set_property PACKAGE_PIN J14 [get_ports {A[12]}]
+set_property PACKAGE_PIN K16 [get_ports {A[0]}]
+set_property PACKAGE_PIN F13 [get_ports {B[15]}]
+set_property PACKAGE_PIN T11 [get_ports {OUT[12]}]
+set_property PACKAGE_PIN D12 [get_ports {B[13]}]
+set_property PACKAGE_PIN G18 [get_ports {A[6]}]
+set_property PACKAGE_PIN U18 [get_ports {OUT[15]}]
+set_property PACKAGE_PIN G14 [get_ports {A[19]}]
+set_property PACKAGE_PIN D17 [get_ports {A[17]}]
+set_property PACKAGE_PIN B17 [get_ports {B[10]}]
+set_property PACKAGE_PIN A16 [get_ports {B[8]}]
+set_property PACKAGE_PIN A13 [get_ports {B[7]}]
+set_property PACKAGE_PIN U16 [get_ports {OUT[14]}]
+set_property PACKAGE_PIN H16 [get_ports {A[24]}]
+set_property PACKAGE_PIN U12 [get_ports {OUT[10]}]
+set_property PACKAGE_PIN F18 [get_ports {A[5]}]
+set_property PACKAGE_PIN V14 [get_ports {OUT[5]}]
+set_property PACKAGE_PIN T13 [get_ports {OUT[4]}]
+set_property PACKAGE_PIN A11 [get_ports {B[16]}]
+set_property PACKAGE_PIN T9 [get_ports {OUT[2]}]
+set_property PACKAGE_PIN J18 [get_ports {A[3]}]
diff --git a/xilinx/xc7/tests/dsp/top.v b/xilinx/xc7/tests/dsp/top.v
new file mode 100644
index 0000000000..9ac53419f0
--- /dev/null
+++ b/xilinx/xc7/tests/dsp/top.v
@@ -0,0 +1,81 @@
+`timescale 1ns / 1ps
+// Structural instantiation of dsp48e1 block in 25x18 multiplier mode using pipelining registers(A1,A2,B1,B2).
+module top
+ (
+ A,
+ B,
+ OUT
+ );
+
+
+ (* IOSTANDARD = "LVCMOS33" *) input wire [24:0] A;
+ (* IOSTANDARD = "LVCMOS33" *) input wire [17:0] B;
+ (* IOSTANDARD = "LVCMOS33" *) output wire [16:0] OUT;
+
+
+ DSP48E1 #(
+ .AREG(2'b10),
+ .BREG(2'b10),
+ .MASK(48'b111110111111101111111111100001111011110111111101),
+ .ADREG(1'b0),
+ .ALUMODEREG(1'b0),
+ .ACASCREG(1'b1),
+ .BCASCREG(1'b1),
+ .CARRYINREG(1'b0),
+ .CARRYINSELREG(1'b0),
+ .DREG(1'b0),
+ .INMODEREG(1'b0),
+ .IS_ALUMODE_INVERTED(4'b1101),
+ .IS_INMODE_INVERTED(5'b11111),
+ .IS_OPMODE_INVERTED(7'b1000101),
+ .MREG(1'b0),
+ .OPMODEREG(1'b0),
+ .PREG(1'b0),
+ .CREG(1'b0),
+ .A_INPUT("CASCADE"),
+ .B_INPUT("CASCADE"),
+ .USE_DPORT("TRUE"),
+ .USE_SIMD("FOUR12"),
+ .AUTORESET_PATDET("RESET_MATCH"),
+ .PATTERN(48'b111110111111101111111111100001111011110111111101),
+ .SEL_MASK("ROUNDING_MODE1"),
+ .IS_CARRYIN_INVERTED(1'b1),
+ .IS_CLK_INVERTED(1'b1)
+ )
+ dsp25x18(
+ .A(A),
+ .ALUMODE(4'b0011),
+ .B(B),
+ .C(48'b111111111111111111111111111111111111111111111111),
+ .CARRYIN(1'b0),
+ .CARRYINSEL(3'b000),
+ .CEA1(1'b1),
+ .CEA2(1'b1),
+ .CEAD(1'b1),
+ .CEALUMODE(1'b1),
+ .CEB1(1'b1),
+ .CEB2(1'b1),
+ .CEC(1'b1),
+ .CECARRYIN(1'b1),
+ .CECTRL(1'b1),
+ .CED(1'b1),
+ .CEINMODE(1'b1),
+ .CEM(1'b1),
+ .CEP(1'b1),
+ .CLK(1'b1),
+ .D(25'b0000000000000000000000000),
+ .INMODE(5'b00000),
+ .OPMODE(7'b0111111),
+ .RSTA(1'b0),
+ .RSTALLCARRYIN(1'b0),
+ .RSTALUMODE(1'b0),
+ .RSTB(1'b0),
+ .RSTC(1'b0),
+ .RSTCTRL(1'b0),
+ .RSTD(1'b0),
+ .RSTINMODE(1'b0),
+ .RSTM(1'b0),
+ .RSTP(1'b0),
+ .P(OUT)
+ );
+endmodule