from litex.build.io import *
 
-# DifferentialInput --------------------------------------------------------------------------------
+# Common AsyncResetSynchronizer --------------------------------------------------------------------
+
+class AlteraAsyncResetSynchronizerImpl(Module):
+    def __init__(self, cd, async_reset):
+        rst_meta = Signal()
+        self.specials += [
+            Instance("DFF",
+                i_d    = 0,
+                i_clk  = cd.clk,
+                i_clrn = 1,
+                i_prn  = ~async_reset,
+                o_q    = rst_meta
+            ),
+            Instance("DFF",
+                i_d    = rst_meta,
+                i_clk  = cd.clk,
+                i_clrn = 1,
+                i_prn  = ~async_reset,
+                o_q    = cd.rst
+            )
+        ]
+
+
+class AlteraAsyncResetSynchronizer:
+    @staticmethod
+    def lower(dr):
+        return AlteraAsyncResetSynchronizerImpl(dr.cd, dr.async_reset)
+
+# Common DifferentialInput -------------------------------------------------------------------------
 
 class AlteraDifferentialInputImpl(Module):
     def __init__(self, i_p, i_n, o):
     def lower(dr):
         return AlteraDifferentialInputImpl(dr.i_p, dr.i_n, dr.o)
 
-# DifferentialOutput -------------------------------------------------------------------------------
+# Common DifferentialOutput ------------------------------------------------------------------------
 
 class AlteraDifferentialOutputImpl(Module):
     def __init__(self, i, o_p, o_n):
     def lower(dr):
         return AlteraDifferentialOutputImpl(dr.i, dr.o_p, dr.o_n)
 
-# AsyncResetSynchronizer ---------------------------------------------------------------------------
+# Common DDROutput ---------------------------------------------------------------------------------
 
-class AlteraAsyncResetSynchronizerImpl(Module):
-    def __init__(self, cd, async_reset):
-        rst_meta = Signal()
-        self.specials += [
-            Instance("DFF",
-                i_d    = 0,
-                i_clk  = cd.clk,
-                i_clrn = 1,
-                i_prn  = ~async_reset,
-                o_q    = rst_meta
-            ),
-            Instance("DFF",
-                i_d    = rst_meta,
-                i_clk  = cd.clk,
-                i_clrn = 1,
-                i_prn  = ~async_reset,
-                o_q    = cd.rst
-            )
-        ]
+class AlteraDDROutputImpl(Module):
+    def __init__(self, i1, i2, o, clk):
+        self.specials += Instance("ALTDDIO_OUT",
+            p_WIDTH    = 1,
+            i_outclock = clk,
+            i_datain_h = i1,
+            i_datain_l = i2,
+            o_dataout  = o,
+        )
 
 
-class AlteraAsyncResetSynchronizer:
+class AlteraDDROutput:
     @staticmethod
     def lower(dr):
-        return AlteraAsyncResetSynchronizerImpl(dr.cd, dr.async_reset)
+        return AlteraDDROutputImpl(dr.i1, dr.i2, dr.o, dr.clk)
+
+# Common DDRInput ----------------------------------------------------------------------------------
+
+class AlteraDDRInputImpl(Module):
+    def __init__(self, i, o1, o2, clk):
+        self.specials += Instance("ALTDDIO_IN",
+            p_WIDTH     = 1,
+            i_inclock   = clk,
+            i_datain    = i,
+            o_dataout_h = o1,
+            o_dataout_l = o2
+        )
+
+class AlteraDDRInput:
+    @staticmethod
+    def lower(dr):
+        return AlteraDDRInputImpl(dr.i, dr.o1, dr.o2, dr.clk)
+
+# Common SDROutput -------------------------------------------------------------------------------
+
+class AlteraSDROutput:
+    @staticmethod
+    def lower(dr):
+        return AlteraDDROutputImpl(dr.i, dr.i, dr.o, dr.clk)
+
+# Common SDRInput --------------------------------------------------------------------------------
+
+class AlteraSDRInput:
+    @staticmethod
+    def lower(dr):
+        return AlteraDDRInputImpl(dr.i, dr.o, Signal(), dr.clk)
 
 # Special Overrides --------------------------------------------------------------------------------
 
 altera_special_overrides = {
+    AsyncResetSynchronizer: AlteraAsyncResetSynchronizer,
     DifferentialInput:      AlteraDifferentialInput,
     DifferentialOutput:     AlteraDifferentialOutput,
-    AsyncResetSynchronizer: AlteraAsyncResetSynchronizer,
+    DDROutput:              AlteraDDROutput,
+    DDRInput:               AlteraDDRInput,
+    SDROutput:              AlteraSDROutput,
+    SDRInput:               AlteraSDRInput,
 }