Merge pull request #3322 from ad-astra-et-ultra/dsp48e1_support

Dsp48e1 support for XILINX
diff --git a/utils/update_arch_timings.py b/utils/update_arch_timings.py
index 7aec657..6755ec7 100755
--- a/utils/update_arch_timings.py
+++ b/utils/update_arch_timings.py
@@ -114,7 +114,7 @@
 
     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()]
diff --git a/xilinx/common/primitives/dsp48e1/CMakeLists.txt b/xilinx/common/primitives/dsp48e1/CMakeLists.txt
index 4e58dff..973990c 100644
--- a/xilinx/common/primitives/dsp48e1/CMakeLists.txt
+++ b/xilinx/common/primitives/dsp48e1/CMakeLists.txt
@@ -1,17 +1,2 @@
-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 0000000..8148752
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dsp48e1.model.xml
@@ -0,0 +1,57 @@
+<models>
+<model name="DSP48E1_VPR">
+<input_ports>
+<port clock="CLK" name="A" combinational_sink_ports="ACOUT CARRYCASCOUT CARRYOUT MULTSIGNOUT P PATTERNBDETECT PATTERNDETECT PCOUT"/>
+<port clock="CLK" name="B" combinational_sink_ports="BCOUT CARRYCASCOUT CARRYOUT MULTSIGNOUT P PATTERNBDETECT PATTERNDETECT PCOUT"/>
+<port clock="CLK" name="C" combinational_sink_ports="CARRYCASCOUT CARRYOUT MULTSIGNOUT P PATTERNBDETECT PATTERNDETECT PCOUT"/>
+<port clock="CLK" name="D" combinational_sink_ports="CARRYCASCOUT CARRYOUT MULTSIGNOUT P PATTERNBDETECT PATTERNDETECT PCOUT"/>
+<port clock="CLK" name="OPMODE" combinational_sink_ports="CARRYCASCOUT CARRYOUT MULTSIGNOUT P PATTERNBDETECT PATTERNDETECT PCOUT"/>
+<port clock="CLK" name="ALUMODE" combinational_sink_ports="CARRYCASCOUT CARRYOUT MULTSIGNOUT P PATTERNBDETECT PATTERNDETECT PCOUT"/>
+<port clock="CLK" name="CARRYIN" combinational_sink_ports="CARRYCASCOUT CARRYOUT MULTSIGNOUT P PATTERNBDETECT PATTERNDETECT PCOUT"/>
+<port clock="CLK" name="CARRYINSEL" combinational_sink_ports="CARRYCASCOUT CARRYOUT MULTSIGNOUT P PATTERNBDETECT PATTERNDETECT PCOUT"/>
+<port clock="CLK" name="INMODE" combinational_sink_ports="CARRYCASCOUT CARRYOUT MULTSIGNOUT P PATTERNBDETECT PATTERNDETECT PCOUT"/>
+<port clock="CLK" name="CEA1"/>
+<port clock="CLK" name="CEA2"/>
+<port clock="CLK" name="CEB1"/>
+<port clock="CLK" name="CEB2"/>
+<port clock="CLK" name="CEC"/>
+<port clock="CLK" name="CED"/>
+<port clock="CLK" name="CEM"/>
+<port clock="CLK" name="CEP"/>
+<port clock="CLK" name="CEAD"/>
+<port clock="CLK" name="CEALUMODE"/>
+<port clock="CLK" name="CECTRL"/>
+<port clock="CLK" name="CECARRYIN"/>
+<port clock="CLK" name="CEINMODE"/>
+<port clock="CLK" name="RSTA"/>
+<port clock="CLK" name="RSTB"/>
+<port clock="CLK" name="RSTC"/>
+<port clock="CLK" name="RSTD"/>
+<port clock="CLK" name="RSTM"/>
+<port clock="CLK" name="RSTP"/>
+<port clock="CLK" name="RSTCTRL"/>
+<port clock="CLK" name="RSTALLCARRYIN"/>
+<port clock="CLK" name="RSTALUMODE"/>
+<port clock="CLK" name="RSTINMODE"/>
+<port is_clock="1" name="CLK"/>
+<port clock="CLK" name="ACIN" combinational_sink_ports="ACOUT CARRYCASCOUT CARRYOUT MULTSIGNOUT P PATTERNBDETECT PATTERNDETECT PCOUT"/>
+<port clock="CLK" name="BCIN" combinational_sink_ports="BCOUT CARRYCASCOUT CARRYOUT MULTSIGNOUT P PATTERNBDETECT PATTERNDETECT PCOUT"/>
+<port clock="CLK" name="PCIN" combinational_sink_ports="CARRYCASCOUT CARRYOUT MULTSIGNOUT P PATTERNBDETECT PATTERNDETECT PCOUT"/>
+<port clock="CLK" name="CARRYCASCIN" combinational_sink_ports="CARRYCASCOUT CARRYOUT MULTSIGNOUT P PATTERNBDETECT PATTERNDETECT PCOUT"/>
+<port clock="CLK" name="MULTSIGNIN" combinational_sink_ports="CARRYCASCOUT CARRYOUT MULTSIGNOUT P PATTERNBDETECT PATTERNDETECT PCOUT"/>
+</input_ports>
+<output_ports>
+<port clock="CLK" name="ACOUT"/>
+<port clock="CLK" name="BCOUT"/>
+<port clock="CLK" name="PCOUT"/>
+<port clock="CLK" name="P"/>
+<port clock="CLK" name="CARRYOUT"/>
+<port clock="CLK" name="CARRYCASCOUT"/>
+<port clock="CLK" name="MULTSIGNOUT"/>
+<port clock="CLK" name="PATTERNDETECT"/>
+<port clock="CLK" name="PATTERNBDETECT"/>
+<port clock="CLK" name="OVERFLOW"/>
+<port clock="CLK" name="UNDERFLOW"/>
+</output_ports>
+</model>
+</models>
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 0000000..45b063e
--- /dev/null
+++ b/xilinx/common/primitives/dsp48e1/dsp48e1.pb_type.xml
@@ -0,0 +1,462 @@
+<pb_type name="DSP48" num_pb="1" xmlns:xi="http://www.w3.org/2001/XInclude">
+<clock name="CLK" num_pins="1"/>
+<input name="A" num_pins="30"/>
+<input name="B" num_pins="18"/>
+<input name="C" num_pins="48"/>
+<input name="D" num_pins="25"/>
+<input name="OPMODE" num_pins="7"/>
+<input name="ALUMODE" num_pins="4"/>
+<input name="CARRYIN" num_pins="1"/>
+<input name="CARRYINSEL" num_pins="3"/>
+<input name="INMODE" num_pins="5"/>
+<input name="CEA1" num_pins="1"/>
+<input name="CEA2" num_pins="1"/>
+<input name="CEB1" num_pins="1"/>
+<input name="CEB2" num_pins="1"/>
+<input name="CEC" num_pins="1"/>
+<input name="CED" num_pins="1"/>
+<input name="CEM" num_pins="1"/>
+<input name="CEP" num_pins="1"/>
+<input name="CEAD" num_pins="1"/>
+<input name="CEALUMODE" num_pins="1"/>
+<input name="CECTRL" num_pins="1"/>
+<input name="CECARRYIN" num_pins="1"/>
+<input name="CEINMODE" num_pins="1"/>
+<input name="RSTA" num_pins="1"/>
+<input name="RSTB" num_pins="1"/>
+<input name="RSTC" num_pins="1"/>
+<input name="RSTD" num_pins="1"/>
+<input name="RSTM" num_pins="1"/>
+<input name="RSTP" num_pins="1"/>
+<input name="RSTCTRL" num_pins="1"/>
+<input name="RSTALLCARRYIN" num_pins="1"/>
+<input name="RSTALUMODE" num_pins="1"/>
+<input name="RSTINMODE" num_pins="1"/>
+<input name="ACIN" num_pins="30"/>
+<input name="BCIN" num_pins="18"/>
+<input name="PCIN" num_pins="48"/>
+<input name="CARRYCASCIN" num_pins="1"/>
+<input name="MULTSIGNIN" num_pins="1"/>
+<output name="ACOUT" num_pins="30"/>
+<output name="BCOUT" num_pins="18"/>
+<output name="PCOUT" num_pins="48"/>
+<output name="P" num_pins="48"/>
+<output name="CARRYOUT" num_pins="4"/>
+<output name="CARRYCASCOUT" num_pins="1"/>
+<output name="MULTSIGNOUT" num_pins="1"/>
+<output name="PATTERNDETECT" num_pins="1"/>
+<output name="PATTERNBDETECT" num_pins="1"/>
+<output name="OVERFLOW" num_pins="1"/>
+<output name="UNDERFLOW" num_pins="1"/>
+
+<mode name="DSP">
+<pb_type name="DSP" num_pb="1" blif_model=".subckt DSP48E1_VPR">
+<clock name="CLK" num_pins="1"/>
+
+<input name="A" num_pins="30"/>
+<T_setup value="{setup_CLK_A}" port="A" clock="CLK"/>
+<T_hold value="{hold_CLK_A}" port="A" clock="CLK"/>
+
+<input name="B" num_pins="18"/>
+<T_setup value="{setup_CLK_B}" port="B" clock="CLK"/>
+<T_hold value="{hold_CLK_B}" port="B" clock="CLK"/>
+
+<input name="C" num_pins="48"/>
+<T_setup value="{setup_CLK_C}" port="C" clock="CLK"/>
+<T_hold value="{hold_CLK_C}" port="C" clock="CLK"/>
+
+<input name="D" num_pins="25"/>
+<T_setup value="{setup_CLK_D}" port="D" clock="CLK"/>
+<T_hold value="{hold_CLK_D}" port="D" clock="CLK"/>
+
+<input name="OPMODE" num_pins="7"/>
+<T_setup value="{setup_CLK_OPMODE}" port="OPMODE" clock="CLK"/>
+<T_hold value="{hold_CLK_OPMODE}" port="OPMODE" clock="CLK"/>
+
+<input name="ALUMODE" num_pins="4"/>
+<T_setup value="{setup_CLK_ALUMODE}" port="ALUMODE" clock="CLK"/>
+<T_hold value="{hold_CLK_ALUMODE}" port="ALUMODE" clock="CLK"/>
+
+<input name="CARRYIN" num_pins="1"/>
+<T_setup value="{setup_CLK_CARRYIN}" port="CARRYIN" clock="CLK"/>
+<T_hold value="{hold_CLK_CARRYIN}" port="CARRYIN" clock="CLK"/>
+
+<input name="CARRYINSEL" num_pins="3"/>
+<T_setup value="{setup_CLK_CARRYINSEL}" port="CARRYINSEL" clock="CLK"/>
+<T_hold value="{hold_CLK_CARRYINSEL}" port="CARRYINSEL" clock="CLK"/>
+
+<input name="INMODE" num_pins="5"/>
+<T_setup value="{setup_CLK_INMODE}" port="INMODE" clock="CLK"/>
+<T_hold value="{hold_CLK_INMODE}" port="INMODE" clock="CLK"/>
+
+<input name="CEA1" num_pins="1"/>
+<T_setup value="{setup_CLK_CEA1}" port="CEA1" clock="CLK"/>
+<T_hold value="{hold_CLK_CEA1}" port="CEA1" clock="CLK"/>
+
+<input name="CEA2" num_pins="1"/>
+<T_setup value="{setup_CLK_CEA2}" port="CEA2" clock="CLK"/>
+<T_hold value="{hold_CLK_CEA2}" port="CEA2" clock="CLK"/>
+
+<input name="CEB1" num_pins="1"/>
+<T_setup value="{setup_CLK_CEB1}" port="CEB1" clock="CLK"/>
+<T_hold value="{hold_CLK_CEB1}" port="CEB1" clock="CLK"/>
+
+<input name="CEB2" num_pins="1"/>
+<T_setup value="{setup_CLK_CEB2}" port="CEB2" clock="CLK"/>
+<T_hold value="{hold_CLK_CEB2}" port="CEB2" clock="CLK"/>
+
+<input name="CEC" num_pins="1"/>
+<T_setup value="{setup_CLK_CEC}" port="CEC" clock="CLK"/>
+<T_hold value="{hold_CLK_CEC}" port="CEC" clock="CLK"/>
+
+<input name="CED" num_pins="1"/>
+<T_setup value="{setup_CLK_CED}" port="CED" clock="CLK"/>
+<T_hold value="{hold_CLK_CED}" port="CED" clock="CLK"/>
+
+<input name="CEM" num_pins="1"/>
+<T_setup value="{setup_CLK_CEM}" port="CEM" clock="CLK"/>
+<T_hold value="{hold_CLK_CEM}" port="CEM" clock="CLK"/>
+
+<input name="CEP" num_pins="1"/>
+<T_setup value="{setup_CLK_CEP}" port="CEP" clock="CLK"/>
+<T_hold value="{hold_CLK_CEP}" port="CEP" clock="CLK"/>
+
+<input name="CEAD" num_pins="1"/>
+<T_setup value="{setup_CLK_CEAD}" port="CEAD" clock="CLK"/>
+<T_hold value="{hold_CLK_CEAD}" port="CEAD" clock="CLK"/>
+
+<input name="CEALUMODE" num_pins="1"/>
+<T_setup value="{setup_CLK_CEALUMODE}" port="CEALUMODE" clock="CLK"/>
+<T_hold value="{hold_CLK_CEALUMODE}" port="CEALUMODE" clock="CLK"/>
+
+<input name="CECTRL" num_pins="1"/>
+<T_setup value="{setup_CLK_CECTRL}" port="CECTRL" clock="CLK"/>
+<T_hold value="{hold_CLK_CECTRL}" port="CECTRL" clock="CLK"/>
+
+<input name="CECARRYIN" num_pins="1"/>
+<T_setup value="{setup_CLK_CECARRYIN}" port="CECARRYIN" clock="CLK"/>
+<T_hold value="{hold_CLK_CECARRYIN}" port="CECARRYIN" clock="CLK"/>
+
+<input name="CEINMODE" num_pins="1"/>
+<T_setup value="{setup_CLK_CEINMODE}" port="CEINMODE" clock="CLK"/>
+<T_hold value="{hold_CLK_CEINMODE}" port="CEINMODE" clock="CLK"/>
+
+<input name="RSTA" num_pins="1"/>
+<T_setup value="{setup_CLK_RSTA}" port="RSTA" clock="CLK"/>
+<T_hold value="{hold_CLK_RSTA}" port="RSTA" clock="CLK"/>
+
+<input name="RSTB" num_pins="1"/>
+<T_setup value="{setup_CLK_RSTB}" port="RSTB" clock="CLK"/>
+<T_hold value="{hold_CLK_RSTB}" port="RSTB" clock="CLK"/>
+
+<input name="RSTC" num_pins="1"/>
+<T_setup value="{setup_CLK_RSTC}" port="RSTC" clock="CLK"/>
+<T_hold value="{hold_CLK_RSTC}" port="RSTC" clock="CLK"/>
+
+<input name="RSTD" num_pins="1"/>
+<T_setup value="{setup_CLK_RSTD}" port="RSTD" clock="CLK"/>
+<T_hold value="{hold_CLK_RSTD}" port="RSTD" clock="CLK"/>
+
+<input name="RSTM" num_pins="1"/>
+<T_setup value="{setup_CLK_RSTM}" port="RSTM" clock="CLK"/>
+<T_hold value="{hold_CLK_RSTM}" port="RSTM" clock="CLK"/>
+
+<input name="RSTP" num_pins="1"/>
+<T_setup value="{setup_CLK_RSTP}" port="RSTP" clock="CLK"/>
+<T_hold value="{hold_CLK_RSTP}" port="RSTP" clock="CLK"/>
+
+<input name="RSTCTRL" num_pins="1"/>
+<T_setup value="{setup_CLK_RSTCTRL}" port="RSTCTRL" clock="CLK"/>
+<T_hold value="{hold_CLK_RSTCTRL}" port="RSTCTRL" clock="CLK"/>
+
+<input name="RSTALLCARRYIN" num_pins="1"/>
+<T_setup value="{setup_CLK_RSTALLCARRYIN}" port="RSTALLCARRYIN" clock="CLK"/>
+<T_hold value="{hold_CLK_RSTALLCARRYIN}" port="RSTALLCARRYIN" clock="CLK"/>
+
+<input name="RSTALUMODE" num_pins="1"/>
+<T_setup value="{setup_CLK_RSTALUMODE}" port="RSTALUMODE" clock="CLK"/>
+<T_hold value="{hold_CLK_RSTALUMODE}" port="RSTALUMODE" clock="CLK"/>
+
+<input name="RSTINMODE" num_pins="1"/>
+<T_setup value="{setup_CLK_RSTINMODE}" port="RSTINMODE" clock="CLK"/>
+<T_hold value="{hold_CLK_RSTINMODE}" port="RSTINMODE" clock="CLK"/>
+
+<input name="ACIN" num_pins="30"/>
+<T_setup value="{setup_CLK_ACIN}" port="ACIN" clock="CLK"/>
+<T_hold value="{hold_CLK_ACIN}" port="ACIN" clock="CLK"/>
+
+<input name="BCIN" num_pins="18"/>
+<T_setup value="{setup_CLK_BCIN}" port="BCIN" clock="CLK"/>
+<T_hold value="{hold_CLK_BCIN}" port="BCIN" clock="CLK"/>
+
+<input name="PCIN" num_pins="48"/>
+<T_setup value="{setup_CLK_PCIN}" port="PCIN" clock="CLK"/>
+<T_hold value="{hold_CLK_PCIN}" port="PCIN" clock="CLK"/>
+
+<input name="CARRYCASCIN" num_pins="1"/>
+<T_setup value="{setup_CLK_CARRYCASCIN}" port="CARRYCASCIN" clock="CLK"/>
+<T_hold value="{hold_CLK_CARRYCASCIN}" port="CARRYCASCIN" clock="CLK"/>
+
+<input name="MULTSIGNIN" num_pins="1"/>
+<T_setup value="{setup_CLK_MULTSIGNIN}" port="MULTSIGNIN" clock="CLK"/>
+<T_hold value="{hold_CLK_MULTSIGNIN}" port="MULTSIGNIN" clock="CLK"/>
+
+<output name="ACOUT" num_pins="30"/>
+<T_clock_to_Q max="{iopath_CLK_ACOUT}" port="ACOUT" clock="CLK"/>
+
+<output name="BCOUT" num_pins="18"/>
+<T_clock_to_Q max="{iopath_CLK_BCOUT}" port="BCOUT" clock="CLK"/>
+
+<output name="PCOUT" num_pins="48"/>
+<T_clock_to_Q max="{iopath_CLK_PCOUT}" port="PCOUT" clock="CLK"/>
+
+<output name="P" num_pins="48"/>
+<T_clock_to_Q max="{iopath_CLK_P}" port="P" clock="CLK"/>
+
+<output name="CARRYOUT" num_pins="4"/>
+<T_clock_to_Q max="{iopath_CLK_CARRYOUT}" port="CARRYOUT" clock="CLK"/>
+
+<output name="CARRYCASCOUT" num_pins="1"/>
+<T_clock_to_Q max="{iopath_CLK_CARRYCASCOUT}" port="CARRYCASCOUT" clock="CLK"/>
+
+<output name="MULTSIGNOUT" num_pins="1"/>
+<T_clock_to_Q max="{iopath_CLK_MULTSIGNOUT}" port="MULTSIGNOUT" clock="CLK"/>
+
+<output name="PATTERNDETECT" num_pins="1"/>
+<T_clock_to_Q max="{iopath_CLK_PATTERNDETECT}" port="PATTERNDETECT" clock="CLK"/>
+
+<output name="PATTERNBDETECT" num_pins="1"/>
+<T_clock_to_Q max="{iopath_CLK_PATTERNBDETECT}" port="PATTERNBDETECT" clock="CLK"/>
+
+<output name="OVERFLOW" num_pins="1"/>
+<T_clock_to_Q max="{iopath_CLK_OVERFLOW}" port="OVERFLOW" clock="CLK"/>
+
+<output name="UNDERFLOW" num_pins="1"/>
+<T_clock_to_Q max="{iopath_CLK_UNDERFLOW}" port="UNDERFLOW" clock="CLK"/>
+
+<delay_constant max="{iopath_ACIN_ACOUT}" in_port="ACIN" out_port="ACOUT"/>
+<delay_constant max="{iopath_A_ACOUT}" in_port="A" out_port="ACOUT"/>
+<delay_constant max="{iopath_ACIN_CARRYCASCOUT}" in_port="ACIN" out_port="CARRYCASCOUT"/>
+<delay_constant max="{iopath_ACIN_CARRYOUT}" in_port="ACIN" out_port="CARRYOUT"/>
+<delay_constant max="{iopath_ACIN_MULTSIGNOUT}" in_port="ACIN" out_port="MULTSIGNOUT"/>
+<delay_constant max="{iopath_ACIN_P}" in_port="ACIN" out_port="P"/>
+<delay_constant max="{iopath_ACIN_PATTERNBDETECT}" in_port="ACIN" out_port="PATTERNBDETECT"/>
+<delay_constant max="{iopath_ACIN_PATTERNDETECT}" in_port="ACIN" out_port="PATTERNDETECT"/>
+<delay_constant max="{iopath_ACIN_PCOUT}" in_port="ACIN" out_port="PCOUT"/>
+<delay_constant max="{iopath_A_CARRYCASCOUT}" in_port="A" out_port="CARRYCASCOUT"/>
+<delay_constant max="{iopath_A_CARRYOUT}" in_port="A" out_port="CARRYOUT"/>
+<delay_constant max="{iopath_A_MULTSIGNOUT}" in_port="A" out_port="MULTSIGNOUT"/>
+<delay_constant max="{iopath_A_P}" in_port="A" out_port="P"/>
+<delay_constant max="{iopath_A_PATTERNBDETECT}" in_port="A" out_port="PATTERNBDETECT"/>
+<delay_constant max="{iopath_A_PATTERNDETECT}" in_port="A" out_port="PATTERNDETECT"/>
+<delay_constant max="{iopath_A_PCOUT}" in_port="A" out_port="PCOUT"/>
+<delay_constant max="{iopath_D_CARRYCASCOUT}" in_port="D" out_port="CARRYCASCOUT"/>
+<delay_constant max="{iopath_D_CARRYOUT}" in_port="D" out_port="CARRYOUT"/>
+<delay_constant max="{iopath_D_MULTSIGNOUT}" in_port="D" out_port="MULTSIGNOUT"/>
+<delay_constant max="{iopath_D_P}" in_port="D" out_port="P"/>
+<delay_constant max="{iopath_D_PATTERNBDETECT}" in_port="D" out_port="PATTERNBDETECT"/>
+<delay_constant max="{iopath_D_PATTERNDETECT}" in_port="D" out_port="PATTERNDETECT"/>
+<delay_constant max="{iopath_D_PCOUT}" in_port="D" out_port="PCOUT"/>
+<delay_constant max="{iopath_INMODE_CARRYCASCOUT}" in_port="INMODE" out_port="CARRYCASCOUT"/>
+<delay_constant max="{iopath_INMODE_CARRYOUT}" in_port="INMODE" out_port="CARRYOUT"/>
+<delay_constant max="{iopath_INMODE_MULTSIGNOUT}" in_port="INMODE" out_port="MULTSIGNOUT"/>
+<delay_constant max="{iopath_INMODE_P}" in_port="INMODE" out_port="P"/>
+<delay_constant max="{iopath_INMODE_PATTERNBDETECT}" in_port="INMODE" out_port="PATTERNBDETECT"/>
+<delay_constant max="{iopath_INMODE_PATTERNDETECT}" in_port="INMODE" out_port="PATTERNDETECT"/>
+<delay_constant max="{iopath_INMODE_PCOUT}" in_port="INMODE" out_port="PCOUT"/>
+<delay_constant max="{iopath_ALUMODE_CARRYCASCOUT}" in_port="ALUMODE" out_port="CARRYCASCOUT"/>
+<delay_constant max="{iopath_ALUMODE_CARRYOUT}" in_port="ALUMODE" out_port="CARRYOUT"/>
+<delay_constant max="{iopath_ALUMODE_MULTSIGNOUT}" in_port="ALUMODE" out_port="MULTSIGNOUT"/>
+<delay_constant max="{iopath_ALUMODE_P}" in_port="ALUMODE" out_port="P"/>
+<delay_constant max="{iopath_ALUMODE_PATTERNBDETECT}" in_port="ALUMODE" out_port="PATTERNBDETECT"/>
+<delay_constant max="{iopath_ALUMODE_PATTERNDETECT}" in_port="ALUMODE" out_port="PATTERNDETECT"/>
+<delay_constant max="{iopath_ALUMODE_PCOUT}" in_port="ALUMODE" out_port="PCOUT"/>
+<delay_constant max="{iopath_BCIN_BCOUT}" in_port="BCIN" out_port="BCOUT"/>
+<delay_constant max="{iopath_B_BCOUT}" in_port="B" out_port="BCOUT"/>
+<delay_constant max="{iopath_BCIN_CARRYCASCOUT}" in_port="BCIN" out_port="CARRYCASCOUT"/>
+<delay_constant max="{iopath_BCIN_CARRYOUT}" in_port="BCIN" out_port="CARRYOUT"/>
+<delay_constant max="{iopath_BCIN_MULTSIGNOUT}" in_port="BCIN" out_port="MULTSIGNOUT"/>
+<delay_constant max="{iopath_BCIN_P}" in_port="BCIN" out_port="P"/>
+<delay_constant max="{iopath_BCIN_PATTERNBDETECT}" in_port="BCIN" out_port="PATTERNBDETECT"/>
+<delay_constant max="{iopath_BCIN_PATTERNDETECT}" in_port="BCIN" out_port="PATTERNDETECT"/>
+<delay_constant max="{iopath_BCIN_PCOUT}" in_port="BCIN" out_port="PCOUT"/>
+<delay_constant max="{iopath_B_CARRYCASCOUT}" in_port="B" out_port="CARRYCASCOUT"/>
+<delay_constant max="{iopath_B_CARRYOUT}" in_port="B" out_port="CARRYOUT"/>
+<delay_constant max="{iopath_B_MULTSIGNOUT}" in_port="B" out_port="MULTSIGNOUT"/>
+<delay_constant max="{iopath_B_P}" in_port="B" out_port="P"/>
+<delay_constant max="{iopath_B_PATTERNBDETECT}" in_port="B" out_port="PATTERNBDETECT"/>
+<delay_constant max="{iopath_B_PATTERNDETECT}" in_port="B" out_port="PATTERNDETECT"/>
+<delay_constant max="{iopath_B_PCOUT}" in_port="B" out_port="PCOUT"/>
+<delay_constant max="{iopath_CARRYIN_CARRYCASCOUT}" in_port="CARRYIN" out_port="CARRYCASCOUT"/>
+<delay_constant max="{iopath_CARRYIN_CARRYOUT}" in_port="CARRYIN" out_port="CARRYOUT"/>
+<delay_constant max="{iopath_CARRYIN_MULTSIGNOUT}" in_port="CARRYIN" out_port="MULTSIGNOUT"/>
+<delay_constant max="{iopath_CARRYIN_P}" in_port="CARRYIN" out_port="P"/>
+<delay_constant max="{iopath_CARRYIN_PATTERNBDETECT}" in_port="CARRYIN" out_port="PATTERNBDETECT"/>
+<delay_constant max="{iopath_CARRYIN_PATTERNDETECT}" in_port="CARRYIN" out_port="PATTERNDETECT"/>
+<delay_constant max="{iopath_CARRYIN_PCOUT}" in_port="CARRYIN" out_port="PCOUT"/>
+<delay_constant max="{iopath_CARRYINSEL_CARRYCASCOUT}" in_port="CARRYINSEL" out_port="CARRYCASCOUT"/>
+<delay_constant max="{iopath_CARRYINSEL_CARRYOUT}" in_port="CARRYINSEL" out_port="CARRYOUT"/>
+<delay_constant max="{iopath_CARRYINSEL_MULTSIGNOUT}" in_port="CARRYINSEL" out_port="MULTSIGNOUT"/>
+<delay_constant max="{iopath_CARRYINSEL_P}" in_port="CARRYINSEL" out_port="P"/>
+<delay_constant max="{iopath_CARRYINSEL_PATTERNBDETECT}" in_port="CARRYINSEL" out_port="PATTERNBDETECT"/>
+<delay_constant max="{iopath_CARRYINSEL_PATTERNDETECT}" in_port="CARRYINSEL" out_port="PATTERNDETECT"/>
+<delay_constant max="{iopath_CARRYINSEL_PCOUT}" in_port="CARRYINSEL" out_port="PCOUT"/>
+<delay_constant max="{iopath_C_CARRYCASCOUT}" in_port="C" out_port="CARRYCASCOUT"/>
+<delay_constant max="{iopath_C_CARRYOUT}" in_port="C" out_port="CARRYOUT"/>
+<delay_constant max="{iopath_C_MULTSIGNOUT}" in_port="C" out_port="MULTSIGNOUT"/>
+<delay_constant max="{iopath_C_P}" in_port="C" out_port="P"/>
+<delay_constant max="{iopath_C_PATTERNBDETECT}" in_port="C" out_port="PATTERNBDETECT"/>
+<delay_constant max="{iopath_C_PATTERNDETECT}" in_port="C" out_port="PATTERNDETECT"/>
+<delay_constant max="{iopath_C_PCOUT}" in_port="C" out_port="PCOUT"/>
+<delay_constant max="{iopath_OPMODE_CARRYCASCOUT}" in_port="OPMODE" out_port="CARRYCASCOUT"/>
+<delay_constant max="{iopath_OPMODE_CARRYOUT}" in_port="OPMODE" out_port="CARRYOUT"/>
+<delay_constant max="{iopath_OPMODE_MULTSIGNOUT}" in_port="OPMODE" out_port="MULTSIGNOUT"/>
+<delay_constant max="{iopath_OPMODE_P}" in_port="OPMODE" out_port="P"/>
+<delay_constant max="{iopath_OPMODE_PATTERNBDETECT}" in_port="OPMODE" out_port="PATTERNBDETECT"/>
+<delay_constant max="{iopath_OPMODE_PATTERNDETECT}" in_port="OPMODE" out_port="PATTERNDETECT"/>
+<delay_constant max="{iopath_OPMODE_PCOUT}" in_port="OPMODE" out_port="PCOUT"/>
+<delay_constant max="{iopath_CARRYCASCIN_CARRYCASCOUT}" in_port="CARRYCASCIN" out_port="CARRYCASCOUT"/>
+<delay_constant max="{iopath_CARRYCASCIN_CARRYOUT}" in_port="CARRYCASCIN" out_port="CARRYOUT"/>
+<delay_constant max="{iopath_CARRYCASCIN_MULTSIGNOUT}" in_port="CARRYCASCIN" out_port="MULTSIGNOUT"/>
+<delay_constant max="{iopath_CARRYCASCIN_P}" in_port="CARRYCASCIN" out_port="P"/>
+<delay_constant max="{iopath_CARRYCASCIN_PATTERNBDETECT}" in_port="CARRYCASCIN" out_port="PATTERNBDETECT"/>
+<delay_constant max="{iopath_CARRYCASCIN_PATTERNDETECT}" in_port="CARRYCASCIN" out_port="PATTERNDETECT"/>
+<delay_constant max="{iopath_CARRYCASCIN_PCOUT}" in_port="CARRYCASCIN" out_port="PCOUT"/>
+<delay_constant max="{iopath_MULTSIGNIN_CARRYCASCOUT}" in_port="MULTSIGNIN" out_port="CARRYCASCOUT"/>
+<delay_constant max="{iopath_MULTSIGNIN_CARRYOUT}" in_port="MULTSIGNIN" out_port="CARRYOUT"/>
+<delay_constant max="{iopath_MULTSIGNIN_MULTSIGNOUT}" in_port="MULTSIGNIN" out_port="MULTSIGNOUT"/>
+<delay_constant max="{iopath_MULTSIGNIN_P}" in_port="MULTSIGNIN" out_port="P"/>
+<delay_constant max="{iopath_MULTSIGNIN_PATTERNBDETECT}" in_port="MULTSIGNIN" out_port="PATTERNBDETECT"/>
+<delay_constant max="{iopath_MULTSIGNIN_PATTERNDETECT}" in_port="MULTSIGNIN" out_port="PATTERNDETECT"/>
+<delay_constant max="{iopath_MULTSIGNIN_PCOUT}" in_port="MULTSIGNIN" out_port="PCOUT"/>
+<delay_constant max="{iopath_PCIN_CARRYCASCOUT}" in_port="PCIN" out_port="CARRYCASCOUT"/>
+<delay_constant max="{iopath_PCIN_CARRYOUT}" in_port="PCIN" out_port="CARRYOUT"/>
+<delay_constant max="{iopath_PCIN_MULTSIGNOUT}" in_port="PCIN" out_port="MULTSIGNOUT"/>
+<delay_constant max="{iopath_PCIN_P}" in_port="PCIN" out_port="P"/>
+<delay_constant max="{iopath_PCIN_PATTERNBDETECT}" in_port="PCIN" out_port="PATTERNBDETECT"/>
+<delay_constant max="{iopath_PCIN_PATTERNDETECT}" in_port="PCIN" out_port="PATTERNDETECT"/>
+<delay_constant max="{iopath_PCIN_PCOUT}" in_port="PCIN" out_port="PCOUT"/>
+
+<!--
+ Fake timing values as there is no database entry for CLOCK TO Q DELAYS of these input pins
+-->
+<T_clock_to_Q max="10e-12" port="A" clock="CLK"/>
+<T_clock_to_Q max="10e-12" port="B" clock="CLK"/>
+<T_clock_to_Q max="10e-12" port="C" clock="CLK"/>
+<T_clock_to_Q max="10e-12" port="D" clock="CLK"/>
+<T_clock_to_Q max="10e-12" port="OPMODE" clock="CLK"/>
+<T_clock_to_Q max="10e-12" port="ALUMODE" clock="CLK"/>
+<T_clock_to_Q max="10e-12" port="INMODE" clock="CLK"/>
+<T_clock_to_Q max="10e-12" port="CARRYIN" clock="CLK"/>
+<T_clock_to_Q max="10e-12" port="CARRYINSEL" clock="CLK"/>
+<T_clock_to_Q max="10e-12" port="ACIN" clock="CLK"/>
+<T_clock_to_Q max="10e-12" port="BCIN" clock="CLK"/>
+<T_clock_to_Q max="10e-12" port="PCIN" clock="CLK"/>
+<T_clock_to_Q max="10e-12" port="CARRYCASCIN" clock="CLK"/>
+<T_clock_to_Q max="10e-12" port="MULTSIGNIN" clock="CLK"/>
+<!--
+ Fake timing values as there is no database entry for SETUP TIMES of these output pins
+-->
+<T_setup value="10e-12" port="ACOUT" clock="CLK"/>
+<T_setup value="10e-12" port="BCOUT" clock="CLK"/>
+<T_setup value="10e-12" port="PCOUT" clock="CLK"/>
+<T_setup value="10e-12" port="P" clock="CLK"/>
+<T_setup value="10e-12" port="CARRYOUT" clock="CLK"/>
+<T_setup value="10e-12" port="CARRYCASCOUT" clock="CLK"/>
+<T_setup value="10e-12" port="MULTSIGNOUT" clock="CLK"/>
+<T_setup value="10e-12" port="PATTERNDETECT" clock="CLK"/>
+<T_setup value="10e-12" port="PATTERNBDETECT" clock="CLK"/>
+<T_setup value="10e-12" port="OVERFLOW" clock="CLK"/>
+<T_setup value="10e-12" port="UNDERFLOW" clock="CLK"/>
+
+<metadata>
+<meta name="fasm_params">
+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
+</meta>
+</metadata>
+</pb_type>
+<interconnect>
+<direct name="CLK" input="DSP48.CLK" output="DSP.CLK"/>
+<direct name="A" input="DSP48.A" output="DSP.A"/>
+<direct name="B" input="DSP48.B" output="DSP.B"/>
+<direct name="C" input="DSP48.C" output="DSP.C"/>
+<direct name="D" input="DSP48.D" output="DSP.D"/>
+<direct name="OPMODE" input="DSP48.OPMODE" output="DSP.OPMODE"/>
+<direct name="ALUMODE" input="DSP48.ALUMODE" output="DSP.ALUMODE"/>
+<direct name="CARRYIN" input="DSP48.CARRYIN" output="DSP.CARRYIN"/>
+<direct name="CARRYINSEL" input="DSP48.CARRYINSEL" output="DSP.CARRYINSEL"/>
+<direct name="INMODE" input="DSP48.INMODE" output="DSP.INMODE"/>
+<direct name="CEA1" input="DSP48.CEA1" output="DSP.CEA1"/>
+<direct name="CEA2" input="DSP48.CEA2" output="DSP.CEA2"/>
+<direct name="CEB1" input="DSP48.CEB1" output="DSP.CEB1"/>
+<direct name="CEB2" input="DSP48.CEB2" output="DSP.CEB2"/>
+<direct name="CEC" input="DSP48.CEC" output="DSP.CEC"/>
+<direct name="CED" input="DSP48.CED" output="DSP.CED"/>
+<direct name="CEM" input="DSP48.CEM" output="DSP.CEM"/>
+<direct name="CEP" input="DSP48.CEP" output="DSP.CEP"/>
+<direct name="CEAD" input="DSP48.CEAD" output="DSP.CEAD"/>
+<direct name="CEALUMODE" input="DSP48.CEALUMODE" output="DSP.CEALUMODE"/>
+<direct name="CECTRL" input="DSP48.CECTRL" output="DSP.CECTRL"/>
+<direct name="CECARRYIN" input="DSP48.CECARRYIN" output="DSP.CECARRYIN"/>
+<direct name="CEINMODE" input="DSP48.CEINMODE" output="DSP.CEINMODE"/>
+<direct name="RSTA" input="DSP48.RSTA" output="DSP.RSTA"/>
+<direct name="RSTB" input="DSP48.RSTB" output="DSP.RSTB"/>
+<direct name="RSTC" input="DSP48.RSTC" output="DSP.RSTC"/>
+<direct name="RSTD" input="DSP48.RSTD" output="DSP.RSTD"/>
+<direct name="RSTM" input="DSP48.RSTM" output="DSP.RSTM"/>
+<direct name="RSTP" input="DSP48.RSTP" output="DSP.RSTP"/>
+<direct name="RSTCTRL" input="DSP48.RSTCTRL" output="DSP.RSTCTRL"/>
+<direct name="RSTALLCARRYIN" input="DSP48.RSTALLCARRYIN" output="DSP.RSTALLCARRYIN"/>
+<direct name="RSTALUMODE" input="DSP48.RSTALUMODE" output="DSP.RSTALUMODE"/>
+<direct name="RSTINMODE" input="DSP48.RSTINMODE" output="DSP.RSTINMODE"/>
+<direct name="ACIN" input="DSP48.ACIN" output="DSP.ACIN"/>
+<direct name="BCIN" input="DSP48.BCIN" output="DSP.BCIN"/>
+<direct name="PCIN" input="DSP48.PCIN" output="DSP.PCIN"/>
+<direct name="CARRYCASCIN" input="DSP48.CARRYCASCIN" output="DSP.CARRYCASCIN"/>
+<direct name="MULTSIGNIN" input="DSP48.MULTSIGNIN" output="DSP.MULTSIGNIN"/>
+<direct name="ACOUT" input="DSP.ACOUT" output="DSP48.ACOUT"/>
+<direct name="BCOUT" input="DSP.BCOUT" output="DSP48.BCOUT"/>
+<direct name="PCOUT" input="DSP.PCOUT" output="DSP48.PCOUT"/>
+<direct name="P" input="DSP.P" output="DSP48.P"/>
+<direct name="CARRYOUT" input="DSP.CARRYOUT" output="DSP48.CARRYOUT"/>
+<direct name="CARRYCASCOUT" input="DSP.CARRYCASCOUT" output="DSP48.CARRYCASCOUT"/>
+<direct name="MULTSIGNOUT" input="DSP.MULTSIGNOUT" output="DSP48.MULTSIGNOUT"/>
+<direct name="PATTERNDETECT" input="DSP.PATTERNDETECT" output="DSP48.PATTERNDETECT"/>
+<direct name="PATTERNBDETECT" input="DSP.PATTERNBDETECT" output="DSP48.PATTERNBDETECT"/>
+<direct name="OVERFLOW" input="DSP.OVERFLOW" output="DSP48.OVERFLOW"/>
+<direct name="UNDERFLOW" input="DSP.UNDERFLOW" output="DSP48.UNDERFLOW"/>
+</interconnect>
+</mode>
+</pb_type>
diff --git a/xilinx/common/utils/prjxray_arch_import.py b/xilinx/common/utils/prjxray_arch_import.py
index 3a41f3e..d1a5b8a 100644
--- a/xilinx/common/utils/prjxray_arch_import.py
+++ b/xilinx/common/utils/prjxray_arch_import.py
@@ -521,11 +521,14 @@
     "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 @@
     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 @@
         (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 5d916f8..57d330e 100644
--- a/xilinx/common/utils/prjxray_db_cache.py
+++ b/xilinx/common/utils/prjxray_db_cache.py
@@ -73,6 +73,7 @@
         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 ca53435..2f2eafe 100755
--- a/xilinx/common/utils/prjxray_physical_tile_import.py
+++ b/xilinx/common/utils/prjxray_physical_tile_import.py
@@ -78,7 +78,6 @@
 
     def add_equivalent_sites(tile_xml, equivalent_sites):
         """ Used to add to the <tile> tag the equivalent tiles associated with it."""
-
         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 36407bd..312cfc7 100755
--- a/xilinx/common/utils/prjxray_tile_import.py
+++ b/xilinx/common/utils/prjxray_tile_import.py
@@ -373,10 +373,9 @@
 
             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()
-            )
+            )'''
             site_type_ports[site_instance] = ports
 
             attrib = dict(root_element.attrib)
@@ -1393,7 +1392,7 @@
     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 3848af9..ad60539 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 @@
     GTP_CHANNEL_2
     GTP_CHANNEL_3
     PCIE_BOT
+    DSP_L
+    DSP_R
   PB_TYPES
     SLICEL
     SLICEM
@@ -43,4 +45,6 @@
     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 b258dc9..fa312d9 100644
--- a/xilinx/xc7/archs/artix7/tiles/CMakeLists.txt
+++ b/xilinx/xc7/archs/artix7/tiles/CMakeLists.txt
@@ -25,6 +25,10 @@
 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 0000000..39cb5a9
--- /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 0000000..b6522ed
--- /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 0000000..31f2600
--- /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 0000000..7361df5
--- /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 91b85ca..6b38c04 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 4cc339a..b236f3c 100644
--- a/xilinx/xc7/techmap/cells_map.v
+++ b/xilinx/xc7/techmap/cells_map.v
@@ -10793,3 +10793,324 @@
     .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 a06ebbe..75994d9 100644
--- a/xilinx/xc7/techmap/cells_sim.v
+++ b/xilinx/xc7/techmap/cells_sim.v
@@ -3575,3 +3575,89 @@
   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 4408f5a..244d6f1 100644
--- a/xilinx/xc7/tests/CMakeLists.txt
+++ b/xilinx/xc7/tests/CMakeLists.txt
@@ -45,6 +45,7 @@
 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 0000000..527b4dc
--- /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 0000000..e9cae4a
--- /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 0000000..9ac5341
--- /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