hdl._ast: make Signal.like
work properly with ShapeCastable
s.
Fixes #1285.
This commit is contained in:
parent
0be2dda656
commit
c59447c258
|
@ -2177,13 +2177,14 @@ class Signal(Value, DUID, metaclass=_SignalMeta):
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
other : Value
|
other : ValueLike
|
||||||
Object to base this Signal on.
|
Object to base this Signal on.
|
||||||
"""
|
"""
|
||||||
|
cast_other = Value.cast(other)
|
||||||
if name is not None:
|
if name is not None:
|
||||||
new_name = str(name)
|
new_name = str(name)
|
||||||
elif name_suffix is not None:
|
elif name_suffix is not None:
|
||||||
new_name = other.name + str(name_suffix)
|
new_name = cast_other.name + str(name_suffix)
|
||||||
else:
|
else:
|
||||||
new_name = tracer.get_var_name(depth=2 + src_loc_at, default="$like")
|
new_name = tracer.get_var_name(depth=2 + src_loc_at, default="$like")
|
||||||
# TODO(amaranth-0.7): remove
|
# TODO(amaranth-0.7): remove
|
||||||
|
@ -2196,11 +2197,15 @@ class Signal(Value, DUID, metaclass=_SignalMeta):
|
||||||
if isinstance(other, ValueCastable):
|
if isinstance(other, ValueCastable):
|
||||||
shape = other.shape()
|
shape = other.shape()
|
||||||
else:
|
else:
|
||||||
shape = Value.cast(other).shape()
|
shape = cast_other.shape()
|
||||||
kw = dict(shape=shape, name=new_name)
|
kw = dict(shape=shape, name=new_name)
|
||||||
if isinstance(other, Signal):
|
if isinstance(cast_other, Signal):
|
||||||
kw.update(init=other.init, reset_less=other.reset_less,
|
if isinstance(shape, ShapeCastable):
|
||||||
attrs=other.attrs, decoder=other.decoder)
|
other_init = shape.from_bits(cast_other.init)
|
||||||
|
else:
|
||||||
|
other_init = cast_other.init
|
||||||
|
kw.update(init=other_init, reset_less=cast_other.reset_less,
|
||||||
|
attrs=cast_other.attrs, decoder=cast_other.decoder)
|
||||||
kw.update(kwargs)
|
kw.update(kwargs)
|
||||||
if init is not None:
|
if init is not None:
|
||||||
kw["init"] = init
|
kw["init"] = init
|
||||||
|
|
|
@ -641,6 +641,15 @@ class ViewTestCase(FHDLTestCase):
|
||||||
s1 = Signal(data.StructLayout({"a": unsigned(1)}))
|
s1 = Signal(data.StructLayout({"a": unsigned(1)}))
|
||||||
s2 = Signal.like(s1)
|
s2 = Signal.like(s1)
|
||||||
self.assertEqual(s2.shape(), data.StructLayout({"a": unsigned(1)}))
|
self.assertEqual(s2.shape(), data.StructLayout({"a": unsigned(1)}))
|
||||||
|
s3 = Signal.like(s1, name_suffix="a")
|
||||||
|
self.assertEqual(s3.as_value().name, "s1a")
|
||||||
|
|
||||||
|
s4 = Signal(data.StructLayout({"a": unsigned(2), "b": unsigned(3)}), init={"a": 1}, reset_less=True, attrs={"x": "y"})
|
||||||
|
s5 = Signal.like(s4)
|
||||||
|
self.assertEqual(s5.as_value().init, 0b00001)
|
||||||
|
self.assertEqual(s5.as_value().reset_less, True)
|
||||||
|
self.assertEqual(s5.as_value().attrs, {"x": "y"})
|
||||||
|
|
||||||
|
|
||||||
def test_bug_837_array_layout_getitem_str(self):
|
def test_bug_837_array_layout_getitem_str(self):
|
||||||
with self.assertRaisesRegex(TypeError,
|
with self.assertRaisesRegex(TypeError,
|
||||||
|
|
Loading…
Reference in a new issue