2023-08-31 20:58:42 -06:00
|
|
|
import warnings
|
|
|
|
|
2021-12-09 22:39:50 -07:00
|
|
|
from amaranth.hdl import *
|
|
|
|
from amaranth.sim import *
|
|
|
|
from amaranth.lib.io import *
|
2024-02-27 02:42:57 -07:00
|
|
|
from amaranth.lib.wiring import *
|
tests: move out of the main package.
Compared to tests in the repository root, tests in the package have
many downsides:
* Unless explicitly excluded in find_packages(), tests and their
support code effectively become a part of public API.
This, unfortunately, happened with FHDLTestCase, which was never
intended for downstream use.
* Even if explicitly excluded from the setuptools package, using
an editable install, or setting PYTHONPATH still allows accessing
the tests.
* Having a sub-package that is present in the source tree but not
exported (or, worse, exported only sometimes) is confusing.
* The name `nmigen.test` cannot be used for anything else, such as
testing utilities that *are* intended for downstream use.
2020-08-26 18:33:31 -06:00
|
|
|
|
2019-10-13 12:53:38 -06:00
|
|
|
from .utils import *
|
2019-04-15 10:27:23 -06:00
|
|
|
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
class PinSignatureTestCase(FHDLTestCase):
|
|
|
|
def assertSignatureEqual(self, signature, expected):
|
|
|
|
self.assertEqual(signature.members, Signature(expected).members)
|
2020-06-04 21:19:46 -06:00
|
|
|
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
class PinSignatureCombTestCase(PinSignatureTestCase):
|
|
|
|
def test_signature_i(self):
|
|
|
|
sig_1 = Pin.Signature(1, dir="i")
|
|
|
|
self.assertSignatureEqual(sig_1, {
|
|
|
|
"i": In(1),
|
2019-04-15 10:27:23 -06:00
|
|
|
})
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
sig_2 = Pin.Signature(2, dir="i")
|
|
|
|
self.assertSignatureEqual(sig_2, {
|
|
|
|
"i": In(2),
|
2019-04-15 10:27:23 -06:00
|
|
|
})
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
def test_signature_o(self):
|
|
|
|
sig_1 = Pin.Signature(1, dir="o")
|
|
|
|
self.assertSignatureEqual(sig_1, {
|
|
|
|
"o": Out(1),
|
2019-04-15 10:27:23 -06:00
|
|
|
})
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
sig_2 = Pin.Signature(2, dir="o")
|
|
|
|
self.assertSignatureEqual(sig_2, {
|
|
|
|
"o": Out(2),
|
2019-04-15 10:27:23 -06:00
|
|
|
})
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
def test_signature_oe(self):
|
|
|
|
sig_1 = Pin.Signature(1, dir="oe")
|
|
|
|
self.assertSignatureEqual(sig_1, {
|
|
|
|
"o": Out(1),
|
|
|
|
"oe": Out(1),
|
2019-06-02 22:28:53 -06:00
|
|
|
})
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
sig_2 = Pin.Signature(2, dir="oe")
|
|
|
|
self.assertSignatureEqual(sig_2, {
|
|
|
|
"o": Out(2),
|
|
|
|
"oe": Out(1),
|
2019-06-02 22:28:53 -06:00
|
|
|
})
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
def test_signature_io(self):
|
|
|
|
sig_1 = Pin.Signature(1, dir="io")
|
|
|
|
self.assertSignatureEqual(sig_1, {
|
|
|
|
"i": In(1),
|
|
|
|
"o": Out(1),
|
|
|
|
"oe": Out(1),
|
2019-04-15 10:27:23 -06:00
|
|
|
})
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
sig_2 = Pin.Signature(2, dir="io")
|
|
|
|
self.assertSignatureEqual(sig_2, {
|
|
|
|
"i": In(2),
|
|
|
|
"o": Out(2),
|
|
|
|
"oe": Out(1),
|
2019-04-15 10:27:23 -06:00
|
|
|
})
|
|
|
|
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
class PinSignatureSDRTestCase(PinSignatureTestCase):
|
|
|
|
def test_signature_i(self):
|
|
|
|
sig_1 = Pin.Signature(1, dir="i", xdr=1)
|
|
|
|
self.assertSignatureEqual(sig_1, {
|
|
|
|
"i_clk": Out(1),
|
|
|
|
"i": In(1),
|
2019-06-02 21:29:27 -06:00
|
|
|
})
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
sig_2 = Pin.Signature(2, dir="i", xdr=1)
|
|
|
|
self.assertSignatureEqual(sig_2, {
|
|
|
|
"i_clk": Out(1),
|
|
|
|
"i": In(2),
|
2019-06-02 21:29:27 -06:00
|
|
|
})
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
def test_signature_o(self):
|
|
|
|
sig_1 = Pin.Signature(1, dir="o", xdr=1)
|
|
|
|
self.assertSignatureEqual(sig_1, {
|
|
|
|
"o_clk": Out(1),
|
|
|
|
"o": Out(1),
|
2019-06-02 21:29:27 -06:00
|
|
|
})
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
sig_2 = Pin.Signature(2, dir="o", xdr=1)
|
|
|
|
self.assertSignatureEqual(sig_2, {
|
|
|
|
"o_clk": Out(1),
|
|
|
|
"o": Out(2),
|
2019-06-02 21:29:27 -06:00
|
|
|
})
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
def test_signature_oe(self):
|
|
|
|
sig_1 = Pin.Signature(1, dir="oe", xdr=1)
|
|
|
|
self.assertSignatureEqual(sig_1, {
|
|
|
|
"o_clk": Out(1),
|
|
|
|
"o": Out(1),
|
|
|
|
"oe": Out(1),
|
2019-06-02 22:28:53 -06:00
|
|
|
})
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
sig_2 = Pin.Signature(2, dir="oe", xdr=1)
|
|
|
|
self.assertSignatureEqual(sig_2, {
|
|
|
|
"o_clk": Out(1),
|
|
|
|
"o": Out(2),
|
|
|
|
"oe": Out(1),
|
2019-06-02 22:28:53 -06:00
|
|
|
})
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
def test_signature_io(self):
|
|
|
|
sig_1 = Pin.Signature(1, dir="io", xdr=1)
|
|
|
|
self.assertSignatureEqual(sig_1, {
|
|
|
|
"i_clk": Out(1),
|
|
|
|
"i": In(1),
|
|
|
|
"o_clk": Out(1),
|
|
|
|
"o": Out(1),
|
|
|
|
"oe": Out(1),
|
2019-06-02 21:29:27 -06:00
|
|
|
})
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
sig_2 = Pin.Signature(2, dir="io", xdr=1)
|
|
|
|
self.assertSignatureEqual(sig_2, {
|
|
|
|
"i_clk": Out(1),
|
|
|
|
"i": In(2),
|
|
|
|
"o_clk": Out(1),
|
|
|
|
"o": Out(2),
|
|
|
|
"oe": Out(1),
|
2019-06-02 21:29:27 -06:00
|
|
|
})
|
|
|
|
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
class PinSignatureDDRTestCase(PinSignatureTestCase):
|
|
|
|
def test_signature_i(self):
|
|
|
|
sig_1 = Pin.Signature(1, dir="i", xdr=2)
|
|
|
|
self.assertSignatureEqual(sig_1, {
|
|
|
|
"i_clk": Out(1),
|
|
|
|
"i0": In(1),
|
|
|
|
"i1": In(1),
|
2019-04-15 10:27:23 -06:00
|
|
|
})
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
sig_2 = Pin.Signature(2, dir="i", xdr=2)
|
|
|
|
self.assertSignatureEqual(sig_2, {
|
|
|
|
"i_clk": Out(1),
|
|
|
|
"i0": In(2),
|
|
|
|
"i1": In(2),
|
2019-04-15 10:27:23 -06:00
|
|
|
})
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
def test_signature_o(self):
|
|
|
|
sig_1 = Pin.Signature(1, dir="o", xdr=2)
|
|
|
|
self.assertSignatureEqual(sig_1, {
|
|
|
|
"o_clk": Out(1),
|
|
|
|
"o0": Out(1),
|
|
|
|
"o1": Out(1),
|
2019-04-15 10:27:23 -06:00
|
|
|
})
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
sig_2 = Pin.Signature(2, dir="o", xdr=2)
|
|
|
|
self.assertSignatureEqual(sig_2, {
|
|
|
|
"o_clk": Out(1),
|
|
|
|
"o0": Out(2),
|
|
|
|
"o1": Out(2),
|
2019-04-15 10:27:23 -06:00
|
|
|
})
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
def test_signature_oe(self):
|
|
|
|
sig_1 = Pin.Signature(1, dir="oe", xdr=2)
|
|
|
|
self.assertSignatureEqual(sig_1, {
|
|
|
|
"o_clk": Out(1),
|
|
|
|
"o0": Out(1),
|
|
|
|
"o1": Out(1),
|
|
|
|
"oe": Out(1),
|
2019-06-02 22:28:53 -06:00
|
|
|
})
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
sig_2 = Pin.Signature(2, dir="oe", xdr=2)
|
|
|
|
self.assertSignatureEqual(sig_2, {
|
|
|
|
"o_clk": Out(1),
|
|
|
|
"o0": Out(2),
|
|
|
|
"o1": Out(2),
|
|
|
|
"oe": Out(1),
|
2019-06-02 22:28:53 -06:00
|
|
|
})
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
def test_signature_io(self):
|
|
|
|
sig_1 = Pin.Signature(1, dir="io", xdr=2)
|
|
|
|
self.assertSignatureEqual(sig_1, {
|
|
|
|
"i_clk": Out(1),
|
|
|
|
"i0": In(1),
|
|
|
|
"i1": In(1),
|
|
|
|
"o_clk": Out(1),
|
|
|
|
"o0": Out(1),
|
|
|
|
"o1": Out(1),
|
|
|
|
"oe": Out(1),
|
2019-04-15 10:27:23 -06:00
|
|
|
})
|
|
|
|
|
2024-02-27 02:42:57 -07:00
|
|
|
sig_2 = Pin.Signature(2, dir="io", xdr=2)
|
|
|
|
self.assertSignatureEqual(sig_2, {
|
|
|
|
"i_clk": Out(1),
|
|
|
|
"i0": In(2),
|
|
|
|
"i1": In(2),
|
|
|
|
"o_clk": Out(1),
|
|
|
|
"o0": Out(2),
|
|
|
|
"o1": Out(2),
|
|
|
|
"oe": Out(1),
|
2019-04-15 10:27:23 -06:00
|
|
|
})
|
|
|
|
|
|
|
|
|
2024-02-28 02:06:19 -07:00
|
|
|
class PinSignatureReprCase(FHDLTestCase):
|
|
|
|
def test_repr(self):
|
|
|
|
sig_0 = Pin.Signature(1, dir="i")
|
|
|
|
self.assertRepr(sig_0, "Pin.Signature(1, dir='i')")
|
|
|
|
sig_0 = Pin.Signature(2, dir="o", xdr=1)
|
|
|
|
self.assertRepr(sig_0, "Pin.Signature(2, dir='o', xdr=1)")
|
|
|
|
sig_0 = Pin.Signature(3, dir="io", xdr=2)
|
|
|
|
self.assertRepr(sig_0, "Pin.Signature(3, dir='io', xdr=2)")
|
|
|
|
|
|
|
|
|
2019-04-15 10:27:23 -06:00
|
|
|
class PinTestCase(FHDLTestCase):
|
|
|
|
def test_attributes(self):
|
|
|
|
pin = Pin(2, dir="io", xdr=2)
|
|
|
|
self.assertEqual(pin.width, 2)
|
|
|
|
self.assertEqual(pin.dir, "io")
|
|
|
|
self.assertEqual(pin.xdr, 2)
|
2024-02-27 02:42:57 -07:00
|
|
|
self.assertEqual(pin.signature.width, 2)
|
|
|
|
self.assertEqual(pin.signature.dir, "io")
|
|
|
|
self.assertEqual(pin.signature.xdr, 2)
|
2024-02-28 04:43:12 -07:00
|
|
|
self.assertEqual(pin.name, "pin")
|
|
|
|
self.assertEqual(pin.path, ("pin",))
|
|
|
|
self.assertEqual(pin.i0.name, "pin__i0")
|
|
|
|
pin = Pin(2, dir="io", xdr=2, name="testpin")
|
|
|
|
self.assertEqual(pin.name, "testpin")
|
|
|
|
self.assertEqual(pin.path, ("testpin",))
|
|
|
|
self.assertEqual(pin.i0.name, "testpin__i0")
|
|
|
|
pin = Pin(2, dir="io", xdr=2, path=["a", "b"])
|
|
|
|
self.assertEqual(pin.name, "b")
|
|
|
|
self.assertEqual(pin.path, ("a", "b"))
|
|
|
|
self.assertEqual(pin.i0.name, "a__b__i0")
|