--- /dev/null
+from nmigen import *
+from nmigen.cli import main
+
+
+pin = Signal()
+pin_t = TSTriple()
+
+m = Module()
+m.submodules += pin_t.get_tristate(pin)
+
+if __name__ == "__main__":
+    main(m.lower(platform=None), ports=[pin, pin_t.oe, pin_t.i, pin_t.o])
 
 from .hdl.xfrm import ResetInserter, CEInserter
 
 from .lib.cdc import MultiReg
+from .lib.io import TSTriple
 
 from .. import *
 
 
-__all__ = ["TSTriple"]
+__all__ = ["TSTriple", "Tristate"]
 
 
 class TSTriple:
 
     def get_fragment(self, platform):
         return Fragment()
+
+    def get_tristate(self, io):
+        return Tristate(self, io)
+
+
+class Tristate:
+    def __init__(self, triple, io):
+        self.triple = triple
+        self.io     = io
+
+    def get_fragment(self, platform):
+        if hasattr(platform, "get_tristate"):
+            return platform.get_tristate(self.triple)
+
+        m = Module()
+        m.d.comb += self.triple.i.eq(self.io)
+        m.submodules += Instance("$tribuf",
+            p_WIDTH=len(self.io),
+            i_EN=self.triple.oe,
+            i_A=self.triple.o,
+            o_Y=self.io,
+        )
+        return m.lower(platform)