compat.fhdl.specials: fix handling of tristate (i=None) pins.

Fixes #406.
This commit is contained in:
whitequark 2020-07-02 22:22:44 +00:00
parent 369bc3e307
commit 8dd28fecc6

View file

@ -39,16 +39,21 @@ class Tristate(Elaboratable):
self.i = i if i is not None else None self.i = i if i is not None else None
def elaborate(self, platform): def elaborate(self, platform):
if hasattr(platform, "get_input_output"): if self.i is None:
pin = Pin(len(self.target), dir="oe" if self.i is None else "io") pin = Pin(len(self.target), dir="oe")
pin.o = self.o pin.o = self.o
pin.oe = self.oe pin.oe = self.oe
if self.i is not None: return platform.get_tristate(pin, self.target, attrs={}, invert=None)
pin.i = self.i else:
pin = Pin(len(self.target), dir="io")
pin.o = self.o
pin.oe = self.oe
pin.i = self.i
return platform.get_input_output(pin, self.target, attrs={}, invert=None) return platform.get_input_output(pin, self.target, attrs={}, invert=None)
m = Module() m = Module()
m.d.comb += self.i.eq(self.target) if self.i is not None:
m.d.comb += self.i.eq(self.target)
m.submodules += Instance("$tribuf", m.submodules += Instance("$tribuf",
p_WIDTH=len(self.target), p_WIDTH=len(self.target),
i_EN=self.oe, i_EN=self.oe,