class Attrs(OrderedDict):
def __init__(self, **attrs):
for key, value in attrs.items():
- if not (value is None or isinstance(value, str) or hasattr(value, "__call__")):
- raise TypeError("Value of attribute {} must be None, str, or callable, not {!r}"
+ if not (value is None or isinstance(value, (str, int)) or hasattr(value, "__call__")):
+ raise TypeError("Value of attribute {} must be None, int, str, or callable, "
+ "not {!r}"
.format(key, value))
super().__init__(**attrs)
for key, value in self.items():
if value is None:
items.append("!" + key)
- elif hasattr(value, "__call__"):
- items.append(key + "=" + repr(value))
else:
- items.append(key + "=" + value)
+ items.append(key + "=" + repr(value))
return "(attrs {})".format(" ".join(items))
class AttrsTestCase(FHDLTestCase):
def test_basic(self):
- a = Attrs(IO_STANDARD="LVCMOS33", PULLUP="1")
+ a = Attrs(IO_STANDARD="LVCMOS33", PULLUP=1)
self.assertEqual(a["IO_STANDARD"], "LVCMOS33")
- self.assertEqual(repr(a), "(attrs IO_STANDARD=LVCMOS33 PULLUP=1)")
+ self.assertEqual(repr(a), "(attrs IO_STANDARD='LVCMOS33' PULLUP=1)")
def test_remove(self):
a = Attrs(FOO=None)
def test_wrong_value(self):
with self.assertRaises(TypeError,
- msg="Value of attribute FOO must be None, str, or callable, not 1"):
- a = Attrs(FOO=1)
+ msg="Value of attribute FOO must be None, int, str, or callable, not 1.0"):
+ a = Attrs(FOO=1.0)
class ClockTestCase(FHDLTestCase):
def test_basic_pins(self):
s = Subsignal("a", Pins("A0"), Attrs(IOSTANDARD="LVCMOS33"))
self.assertEqual(repr(s),
- "(subsignal a (pins io A0) (attrs IOSTANDARD=LVCMOS33))")
+ "(subsignal a (pins io A0) (attrs IOSTANDARD='LVCMOS33'))")
def test_basic_diffpairs(self):
s = Subsignal("a", DiffPairs("A0", "B0"))
self.assertEqual(repr(r), "(resource serial 0"
" (subsignal tx (pins o A0))"
" (subsignal rx (pins i A1))"
- " (attrs IOSTANDARD=LVCMOS33))")
+ " (attrs IOSTANDARD='LVCMOS33'))")
def test_family(self):
ios = [Subsignal("clk", Pins("A0", dir="o"))]