lib.io: add i_clk and o_clk to pin layout with xdr>=1.
This commit is contained in:
parent
a1940c5528
commit
b42043f764
|
@ -5,7 +5,7 @@ from ..hdl.rec import *
|
||||||
__all__ = ["pin_layout", "Pin"]
|
__all__ = ["pin_layout", "Pin"]
|
||||||
|
|
||||||
|
|
||||||
def pin_layout(width, dir, xdr=1):
|
def pin_layout(width, dir, xdr=0):
|
||||||
"""
|
"""
|
||||||
Layout of the platform interface of a pin or several pins, which may be used inside
|
Layout of the platform interface of a pin or several pins, which may be used inside
|
||||||
user-defined records.
|
user-defined records.
|
||||||
|
@ -24,12 +24,16 @@ def pin_layout(width, dir, xdr=1):
|
||||||
|
|
||||||
fields = []
|
fields = []
|
||||||
if dir in ("i", "io"):
|
if dir in ("i", "io"):
|
||||||
|
if xdr > 0:
|
||||||
|
fields.append(("i_clk", 1))
|
||||||
if xdr in (0, 1):
|
if xdr in (0, 1):
|
||||||
fields.append(("i", width))
|
fields.append(("i", width))
|
||||||
else:
|
else:
|
||||||
for n in range(xdr):
|
for n in range(xdr):
|
||||||
fields.append(("i{}".format(n), width))
|
fields.append(("i{}".format(n), width))
|
||||||
if dir in ("o", "oe", "io"):
|
if dir in ("o", "oe", "io"):
|
||||||
|
if xdr > 0:
|
||||||
|
fields.append(("o_clk", 1))
|
||||||
if xdr in (0, 1):
|
if xdr in (0, 1):
|
||||||
fields.append(("o", width))
|
fields.append(("o", width))
|
||||||
else:
|
else:
|
||||||
|
@ -72,12 +76,16 @@ class Pin(Record):
|
||||||
|
|
||||||
Attributes
|
Attributes
|
||||||
----------
|
----------
|
||||||
|
i_clk:
|
||||||
|
I/O buffer input clock. Synchronizes `i*`. Present if ``xdr`` is nonzero.
|
||||||
i : Signal, out
|
i : Signal, out
|
||||||
I/O buffer input, without gearing. Present if ``dir="i"`` or ``dir="io"``, and ``xdr`` is
|
I/O buffer input, without gearing. Present if ``dir="i"`` or ``dir="io"``, and ``xdr`` is
|
||||||
equal to 0 or 1.
|
equal to 0 or 1.
|
||||||
i0, i1, ... : Signal, out
|
i0, i1, ... : Signal, out
|
||||||
I/O buffer inputs, with gearing. Present if ``dir="i"`` or ``dir="io"``, and ``xdr`` is
|
I/O buffer inputs, with gearing. Present if ``dir="i"`` or ``dir="io"``, and ``xdr`` is
|
||||||
greater than 1.
|
greater than 1.
|
||||||
|
o_clk:
|
||||||
|
I/O buffer output clock. Synchronizes `o*`, including `oe`. Present if ``xdr`` is nonzero.
|
||||||
o : Signal, in
|
o : Signal, in
|
||||||
I/O buffer output, without gearing. Present if ``dir="o"`` or ``dir="io"``, and ``xdr`` is
|
I/O buffer output, without gearing. Present if ``dir="o"`` or ``dir="io"``, and ``xdr`` is
|
||||||
equal to 0 or 1.
|
equal to 0 or 1.
|
||||||
|
|
|
@ -60,34 +60,40 @@ class PinLayoutSDRTestCase(FHDLTestCase):
|
||||||
def test_pin_layout_i(self):
|
def test_pin_layout_i(self):
|
||||||
layout_1 = pin_layout(1, dir="i", xdr=1)
|
layout_1 = pin_layout(1, dir="i", xdr=1)
|
||||||
self.assertEqual(layout_1.fields, {
|
self.assertEqual(layout_1.fields, {
|
||||||
|
"i_clk": ((1, False), DIR_NONE),
|
||||||
"i": ((1, False), DIR_NONE),
|
"i": ((1, False), DIR_NONE),
|
||||||
})
|
})
|
||||||
|
|
||||||
layout_2 = pin_layout(2, dir="i", xdr=1)
|
layout_2 = pin_layout(2, dir="i", xdr=1)
|
||||||
self.assertEqual(layout_2.fields, {
|
self.assertEqual(layout_2.fields, {
|
||||||
|
"i_clk": ((1, False), DIR_NONE),
|
||||||
"i": ((2, False), DIR_NONE),
|
"i": ((2, False), DIR_NONE),
|
||||||
})
|
})
|
||||||
|
|
||||||
def test_pin_layout_o(self):
|
def test_pin_layout_o(self):
|
||||||
layout_1 = pin_layout(1, dir="o", xdr=1)
|
layout_1 = pin_layout(1, dir="o", xdr=1)
|
||||||
self.assertEqual(layout_1.fields, {
|
self.assertEqual(layout_1.fields, {
|
||||||
|
"o_clk": ((1, False), DIR_NONE),
|
||||||
"o": ((1, False), DIR_NONE),
|
"o": ((1, False), DIR_NONE),
|
||||||
})
|
})
|
||||||
|
|
||||||
layout_2 = pin_layout(2, dir="o", xdr=1)
|
layout_2 = pin_layout(2, dir="o", xdr=1)
|
||||||
self.assertEqual(layout_2.fields, {
|
self.assertEqual(layout_2.fields, {
|
||||||
|
"o_clk": ((1, False), DIR_NONE),
|
||||||
"o": ((2, False), DIR_NONE),
|
"o": ((2, False), DIR_NONE),
|
||||||
})
|
})
|
||||||
|
|
||||||
def test_pin_layout_oe(self):
|
def test_pin_layout_oe(self):
|
||||||
layout_1 = pin_layout(1, dir="oe", xdr=1)
|
layout_1 = pin_layout(1, dir="oe", xdr=1)
|
||||||
self.assertEqual(layout_1.fields, {
|
self.assertEqual(layout_1.fields, {
|
||||||
|
"o_clk": ((1, False), DIR_NONE),
|
||||||
"o": ((1, False), DIR_NONE),
|
"o": ((1, False), DIR_NONE),
|
||||||
"oe": ((1, False), DIR_NONE),
|
"oe": ((1, False), DIR_NONE),
|
||||||
})
|
})
|
||||||
|
|
||||||
layout_2 = pin_layout(2, dir="oe", xdr=1)
|
layout_2 = pin_layout(2, dir="oe", xdr=1)
|
||||||
self.assertEqual(layout_2.fields, {
|
self.assertEqual(layout_2.fields, {
|
||||||
|
"o_clk": ((1, False), DIR_NONE),
|
||||||
"o": ((2, False), DIR_NONE),
|
"o": ((2, False), DIR_NONE),
|
||||||
"oe": ((1, False), DIR_NONE),
|
"oe": ((1, False), DIR_NONE),
|
||||||
})
|
})
|
||||||
|
@ -95,14 +101,18 @@ class PinLayoutSDRTestCase(FHDLTestCase):
|
||||||
def test_pin_layout_io(self):
|
def test_pin_layout_io(self):
|
||||||
layout_1 = pin_layout(1, dir="io", xdr=1)
|
layout_1 = pin_layout(1, dir="io", xdr=1)
|
||||||
self.assertEqual(layout_1.fields, {
|
self.assertEqual(layout_1.fields, {
|
||||||
|
"i_clk": ((1, False), DIR_NONE),
|
||||||
"i": ((1, False), DIR_NONE),
|
"i": ((1, False), DIR_NONE),
|
||||||
|
"o_clk": ((1, False), DIR_NONE),
|
||||||
"o": ((1, False), DIR_NONE),
|
"o": ((1, False), DIR_NONE),
|
||||||
"oe": ((1, False), DIR_NONE),
|
"oe": ((1, False), DIR_NONE),
|
||||||
})
|
})
|
||||||
|
|
||||||
layout_2 = pin_layout(2, dir="io", xdr=1)
|
layout_2 = pin_layout(2, dir="io", xdr=1)
|
||||||
self.assertEqual(layout_2.fields, {
|
self.assertEqual(layout_2.fields, {
|
||||||
|
"i_clk": ((1, False), DIR_NONE),
|
||||||
"i": ((2, False), DIR_NONE),
|
"i": ((2, False), DIR_NONE),
|
||||||
|
"o_clk": ((1, False), DIR_NONE),
|
||||||
"o": ((2, False), DIR_NONE),
|
"o": ((2, False), DIR_NONE),
|
||||||
"oe": ((1, False), DIR_NONE),
|
"oe": ((1, False), DIR_NONE),
|
||||||
})
|
})
|
||||||
|
@ -112,12 +122,14 @@ class PinLayoutDDRTestCase(FHDLTestCase):
|
||||||
def test_pin_layout_i(self):
|
def test_pin_layout_i(self):
|
||||||
layout_1 = pin_layout(1, dir="i", xdr=2)
|
layout_1 = pin_layout(1, dir="i", xdr=2)
|
||||||
self.assertEqual(layout_1.fields, {
|
self.assertEqual(layout_1.fields, {
|
||||||
|
"i_clk": ((1, False), DIR_NONE),
|
||||||
"i0": ((1, False), DIR_NONE),
|
"i0": ((1, False), DIR_NONE),
|
||||||
"i1": ((1, False), DIR_NONE),
|
"i1": ((1, False), DIR_NONE),
|
||||||
})
|
})
|
||||||
|
|
||||||
layout_2 = pin_layout(2, dir="i", xdr=2)
|
layout_2 = pin_layout(2, dir="i", xdr=2)
|
||||||
self.assertEqual(layout_2.fields, {
|
self.assertEqual(layout_2.fields, {
|
||||||
|
"i_clk": ((1, False), DIR_NONE),
|
||||||
"i0": ((2, False), DIR_NONE),
|
"i0": ((2, False), DIR_NONE),
|
||||||
"i1": ((2, False), DIR_NONE),
|
"i1": ((2, False), DIR_NONE),
|
||||||
})
|
})
|
||||||
|
@ -125,12 +137,14 @@ class PinLayoutDDRTestCase(FHDLTestCase):
|
||||||
def test_pin_layout_o(self):
|
def test_pin_layout_o(self):
|
||||||
layout_1 = pin_layout(1, dir="o", xdr=2)
|
layout_1 = pin_layout(1, dir="o", xdr=2)
|
||||||
self.assertEqual(layout_1.fields, {
|
self.assertEqual(layout_1.fields, {
|
||||||
|
"o_clk": ((1, False), DIR_NONE),
|
||||||
"o0": ((1, False), DIR_NONE),
|
"o0": ((1, False), DIR_NONE),
|
||||||
"o1": ((1, False), DIR_NONE),
|
"o1": ((1, False), DIR_NONE),
|
||||||
})
|
})
|
||||||
|
|
||||||
layout_2 = pin_layout(2, dir="o", xdr=2)
|
layout_2 = pin_layout(2, dir="o", xdr=2)
|
||||||
self.assertEqual(layout_2.fields, {
|
self.assertEqual(layout_2.fields, {
|
||||||
|
"o_clk": ((1, False), DIR_NONE),
|
||||||
"o0": ((2, False), DIR_NONE),
|
"o0": ((2, False), DIR_NONE),
|
||||||
"o1": ((2, False), DIR_NONE),
|
"o1": ((2, False), DIR_NONE),
|
||||||
})
|
})
|
||||||
|
@ -138,6 +152,7 @@ class PinLayoutDDRTestCase(FHDLTestCase):
|
||||||
def test_pin_layout_oe(self):
|
def test_pin_layout_oe(self):
|
||||||
layout_1 = pin_layout(1, dir="oe", xdr=2)
|
layout_1 = pin_layout(1, dir="oe", xdr=2)
|
||||||
self.assertEqual(layout_1.fields, {
|
self.assertEqual(layout_1.fields, {
|
||||||
|
"o_clk": ((1, False), DIR_NONE),
|
||||||
"o0": ((1, False), DIR_NONE),
|
"o0": ((1, False), DIR_NONE),
|
||||||
"o1": ((1, False), DIR_NONE),
|
"o1": ((1, False), DIR_NONE),
|
||||||
"oe": ((1, False), DIR_NONE),
|
"oe": ((1, False), DIR_NONE),
|
||||||
|
@ -145,6 +160,7 @@ class PinLayoutDDRTestCase(FHDLTestCase):
|
||||||
|
|
||||||
layout_2 = pin_layout(2, dir="oe", xdr=2)
|
layout_2 = pin_layout(2, dir="oe", xdr=2)
|
||||||
self.assertEqual(layout_2.fields, {
|
self.assertEqual(layout_2.fields, {
|
||||||
|
"o_clk": ((1, False), DIR_NONE),
|
||||||
"o0": ((2, False), DIR_NONE),
|
"o0": ((2, False), DIR_NONE),
|
||||||
"o1": ((2, False), DIR_NONE),
|
"o1": ((2, False), DIR_NONE),
|
||||||
"oe": ((1, False), DIR_NONE),
|
"oe": ((1, False), DIR_NONE),
|
||||||
|
@ -153,8 +169,10 @@ class PinLayoutDDRTestCase(FHDLTestCase):
|
||||||
def test_pin_layout_io(self):
|
def test_pin_layout_io(self):
|
||||||
layout_1 = pin_layout(1, dir="io", xdr=2)
|
layout_1 = pin_layout(1, dir="io", xdr=2)
|
||||||
self.assertEqual(layout_1.fields, {
|
self.assertEqual(layout_1.fields, {
|
||||||
|
"i_clk": ((1, False), DIR_NONE),
|
||||||
"i0": ((1, False), DIR_NONE),
|
"i0": ((1, False), DIR_NONE),
|
||||||
"i1": ((1, False), DIR_NONE),
|
"i1": ((1, False), DIR_NONE),
|
||||||
|
"o_clk": ((1, False), DIR_NONE),
|
||||||
"o0": ((1, False), DIR_NONE),
|
"o0": ((1, False), DIR_NONE),
|
||||||
"o1": ((1, False), DIR_NONE),
|
"o1": ((1, False), DIR_NONE),
|
||||||
"oe": ((1, False), DIR_NONE),
|
"oe": ((1, False), DIR_NONE),
|
||||||
|
@ -162,8 +180,10 @@ class PinLayoutDDRTestCase(FHDLTestCase):
|
||||||
|
|
||||||
layout_2 = pin_layout(2, dir="io", xdr=2)
|
layout_2 = pin_layout(2, dir="io", xdr=2)
|
||||||
self.assertEqual(layout_2.fields, {
|
self.assertEqual(layout_2.fields, {
|
||||||
|
"i_clk": ((1, False), DIR_NONE),
|
||||||
"i0": ((2, False), DIR_NONE),
|
"i0": ((2, False), DIR_NONE),
|
||||||
"i1": ((2, False), DIR_NONE),
|
"i1": ((2, False), DIR_NONE),
|
||||||
|
"o_clk": ((1, False), DIR_NONE),
|
||||||
"o0": ((2, False), DIR_NONE),
|
"o0": ((2, False), DIR_NONE),
|
||||||
"o1": ((2, False), DIR_NONE),
|
"o1": ((2, False), DIR_NONE),
|
||||||
"oe": ((1, False), DIR_NONE),
|
"oe": ((1, False), DIR_NONE),
|
||||||
|
|
Loading…
Reference in a new issue