From 49a56c446790307b25d0c0e7fe0bd5b0cbafe744 Mon Sep 17 00:00:00 2001 From: Catherine Date: Tue, 8 Aug 2023 16:07:52 +0000 Subject: [PATCH] vendor.gowin: unbreak `dir="o"` pins with `xdr=2`. --- amaranth/vendor/gowin.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/amaranth/vendor/gowin.py b/amaranth/vendor/gowin.py index 15e2565..02a58d8 100644 --- a/amaranth/vendor/gowin.py +++ b/amaranth/vendor/gowin.py @@ -412,16 +412,26 @@ class GowinPlatform(TemplatedPlatform): o_Q1=q1[bit] ) - def get_oddr(clk,d0,d1,tx,q0,q1): + def get_oddr(clk,d0,d1,q): + for bit in range(len(q)): + m.submodules += Instance("ODDR", + p_TXCLK_POL=0, # default -> Q1 changes on posedge of CLK + i_CLK=clk, + i_D0=d0[bit], + i_D1=d1[bit], + o_Q0=q[bit] + ) + + def get_oeddr(clk,d0,d1,tx,q0,q1): for bit in range(len(q0)): m.submodules += Instance("ODDR", p_TXCLK_POL=0, # default -> Q1 changes on posedge of CLK i_CLK=clk, i_D0=d0[bit], i_D1=d1[bit], - i_TX=tx[bit], + i_TX=tx, o_Q0=q0[bit], - o_Q1=q1[bit] + o_Q1=q1 ) def get_ineg(y, invert): @@ -480,8 +490,10 @@ class GowinPlatform(TemplatedPlatform): elif pin.xdr == 2: if "i" in pin.dir: get_iddr(pin.i_clk, i, pin_i0, pin_i1) - if pin.dir in ("o", "oe", "io"): - get_oddr(pin.o_clk, pin_o0, pin_o1, ~pin_oe, o, t) + if pin.dir in ("o",): + get_oddr(pin.o_clk, pin_o0, pin_o1, o) + if pin.dir in ("oe", "io"): + get_oeddr(pin.o_clk, pin_o0, pin_o1, ~pin.oe, o, t) else: assert False