Implement RFC 43: Rename reset= to init=.
This commit is contained in:
parent
b30c87fa3e
commit
24a392887a
30 changed files with 476 additions and 276 deletions
|
|
@ -1140,24 +1140,26 @@ class SignalTestCase(FHDLTestCase):
|
|||
s2 = Signal(name="sig")
|
||||
self.assertEqual(s2.name, "sig")
|
||||
|
||||
def test_reset(self):
|
||||
s1 = Signal(4, reset=0b111, reset_less=True)
|
||||
self.assertEqual(s1.reset, 0b111)
|
||||
def test_init(self):
|
||||
s1 = Signal(4, init=0b111, reset_less=True)
|
||||
self.assertEqual(s1.init, 0b111)
|
||||
self.assertEqual(s1.reset_less, True)
|
||||
s2 = Signal.like(s1, init=0b011)
|
||||
self.assertEqual(s2.init, 0b011)
|
||||
|
||||
def test_reset_enum(self):
|
||||
s1 = Signal(2, reset=UnsignedEnum.BAR)
|
||||
self.assertEqual(s1.reset, 2)
|
||||
def test_init_enum(self):
|
||||
s1 = Signal(2, init=UnsignedEnum.BAR)
|
||||
self.assertEqual(s1.init, 2)
|
||||
with self.assertRaisesRegex(TypeError,
|
||||
r"^Reset value must be a constant-castable expression, "
|
||||
r"^Initial value must be a constant-castable expression, "
|
||||
r"not <StringEnum\.FOO: 'a'>$"):
|
||||
Signal(1, reset=StringEnum.FOO)
|
||||
Signal(1, init=StringEnum.FOO)
|
||||
|
||||
def test_reset_const_castable(self):
|
||||
s1 = Signal(4, reset=Cat(Const(0, 1), Const(1, 1), Const(0, 2)))
|
||||
self.assertEqual(s1.reset, 2)
|
||||
def test_init_const_castable(self):
|
||||
s1 = Signal(4, init=Cat(Const(0, 1), Const(1, 1), Const(0, 2)))
|
||||
self.assertEqual(s1.init, 2)
|
||||
|
||||
def test_reset_shape_castable_const(self):
|
||||
def test_init_shape_castable_const(self):
|
||||
class CastableFromHex(ShapeCastable):
|
||||
def as_shape(self):
|
||||
return unsigned(8)
|
||||
|
|
@ -1168,54 +1170,80 @@ class SignalTestCase(FHDLTestCase):
|
|||
def const(self, init):
|
||||
return int(init, 16)
|
||||
|
||||
s1 = Signal(CastableFromHex(), reset="aa")
|
||||
self.assertEqual(s1.reset, 0xaa)
|
||||
s1 = Signal(CastableFromHex(), init="aa")
|
||||
self.assertEqual(s1.init, 0xaa)
|
||||
|
||||
with self.assertRaisesRegex(ValueError,
|
||||
r"^Constant returned by <.+?CastableFromHex.+?>\.const\(\) must have the shape "
|
||||
r"that it casts to, unsigned\(8\), and not unsigned\(1\)$"):
|
||||
Signal(CastableFromHex(), reset="01")
|
||||
Signal(CastableFromHex(), init="01")
|
||||
|
||||
def test_reset_shape_castable_enum_wrong(self):
|
||||
def test_init_shape_castable_enum_wrong(self):
|
||||
class EnumA(AmaranthEnum, shape=1):
|
||||
X = 1
|
||||
with self.assertRaisesRegex(TypeError,
|
||||
r"^Reset value must be a constant initializer of <enum 'EnumA'>$"):
|
||||
Signal(EnumA) # implied reset=0
|
||||
r"^Initial value must be a constant initializer of <enum 'EnumA'>$"):
|
||||
Signal(EnumA) # implied init=0
|
||||
|
||||
def test_reset_signed_mismatch(self):
|
||||
def test_init_signed_mismatch(self):
|
||||
with self.assertWarnsRegex(SyntaxWarning,
|
||||
r"^Reset value -2 is signed, but the signal shape is unsigned\(2\)$"):
|
||||
Signal(unsigned(2), reset=-2)
|
||||
r"^Initial value -2 is signed, but the signal shape is unsigned\(2\)$"):
|
||||
Signal(unsigned(2), init=-2)
|
||||
|
||||
def test_reset_wrong_too_wide(self):
|
||||
def test_init_wrong_too_wide(self):
|
||||
with self.assertWarnsRegex(SyntaxWarning,
|
||||
r"^Reset value 2 will be truncated to the signal shape unsigned\(1\)$"):
|
||||
Signal(unsigned(1), reset=2)
|
||||
r"^Initial value 2 will be truncated to the signal shape unsigned\(1\)$"):
|
||||
Signal(unsigned(1), init=2)
|
||||
with self.assertWarnsRegex(SyntaxWarning,
|
||||
r"^Reset value 1 will be truncated to the signal shape signed\(1\)$"):
|
||||
Signal(signed(1), reset=1)
|
||||
r"^Initial value 1 will be truncated to the signal shape signed\(1\)$"):
|
||||
Signal(signed(1), init=1)
|
||||
with self.assertWarnsRegex(SyntaxWarning,
|
||||
r"^Reset value -2 will be truncated to the signal shape signed\(1\)$"):
|
||||
Signal(signed(1), reset=-2)
|
||||
r"^Initial value -2 will be truncated to the signal shape signed\(1\)$"):
|
||||
Signal(signed(1), init=-2)
|
||||
|
||||
def test_reset_wrong_fencepost(self):
|
||||
def test_init_wrong_fencepost(self):
|
||||
with self.assertRaisesRegex(SyntaxError,
|
||||
r"^Reset value 10 equals the non-inclusive end of the signal shape "
|
||||
r"^Initial value 10 equals the non-inclusive end of the signal shape "
|
||||
r"range\(0, 10\); this is likely an off-by-one error$"):
|
||||
Signal(range(0, 10), reset=10)
|
||||
Signal(range(0, 10), init=10)
|
||||
with self.assertRaisesRegex(SyntaxError,
|
||||
r"^Reset value 0 equals the non-inclusive end of the signal shape "
|
||||
r"^Initial value 0 equals the non-inclusive end of the signal shape "
|
||||
r"range\(0, 0\); this is likely an off-by-one error$"):
|
||||
Signal(range(0), reset=0)
|
||||
Signal(range(0), init=0)
|
||||
|
||||
def test_reset_wrong_range(self):
|
||||
def test_init_wrong_range(self):
|
||||
with self.assertRaisesRegex(SyntaxError,
|
||||
r"^Reset value 11 is not within the signal shape range\(0, 10\)$"):
|
||||
Signal(range(0, 10), reset=11)
|
||||
r"^Initial value 11 is not within the signal shape range\(0, 10\)$"):
|
||||
Signal(range(0, 10), init=11)
|
||||
with self.assertRaisesRegex(SyntaxError,
|
||||
r"^Reset value 0 is not within the signal shape range\(1, 10\)$"):
|
||||
Signal(range(1, 10), reset=0)
|
||||
r"^Initial value 0 is not within the signal shape range\(1, 10\)$"):
|
||||
Signal(range(1, 10), init=0)
|
||||
|
||||
def test_reset(self):
|
||||
with self.assertWarnsRegex(DeprecationWarning,
|
||||
r"^`reset=` is deprecated, use `init=` instead$"):
|
||||
s1 = Signal(4, reset=0b111)
|
||||
self.assertEqual(s1.init, 0b111)
|
||||
with self.assertWarnsRegex(DeprecationWarning,
|
||||
r"^`Signal.reset` is deprecated, use `Signal.init` instead$"):
|
||||
self.assertEqual(s1.reset, 0b111)
|
||||
with self.assertWarnsRegex(DeprecationWarning,
|
||||
r"^`Signal.reset` is deprecated, use `Signal.init` instead$"):
|
||||
s1.reset = 0b010
|
||||
self.assertEqual(s1.init, 0b010)
|
||||
with self.assertWarnsRegex(DeprecationWarning,
|
||||
r"^`reset=` is deprecated, use `init=` instead$"):
|
||||
s2 = Signal.like(s1, reset=3)
|
||||
self.assertEqual(s2.init, 3)
|
||||
|
||||
def test_reset_wrong(self):
|
||||
with self.assertRaisesRegex(ValueError,
|
||||
r"^Cannot specify both `reset` and `init`$"):
|
||||
Signal(4, reset=1, init=1)
|
||||
s1 = Signal(4)
|
||||
with self.assertRaisesRegex(ValueError,
|
||||
r"^Cannot specify both `reset` and `init`$"):
|
||||
Signal.like(s1, reset=1, init=1)
|
||||
|
||||
def test_attrs(self):
|
||||
s1 = Signal()
|
||||
|
|
@ -1232,8 +1260,8 @@ class SignalTestCase(FHDLTestCase):
|
|||
self.assertEqual(s1.shape(), unsigned(4))
|
||||
s2 = Signal.like(Signal(range(-15, 1)))
|
||||
self.assertEqual(s2.shape(), signed(5))
|
||||
s3 = Signal.like(Signal(4, reset=0b111, reset_less=True))
|
||||
self.assertEqual(s3.reset, 0b111)
|
||||
s3 = Signal.like(Signal(4, init=0b111, reset_less=True))
|
||||
self.assertEqual(s3.init, 0b111)
|
||||
self.assertEqual(s3.reset_less, True)
|
||||
s4 = Signal.like(Signal(attrs={"no_retiming": True}))
|
||||
self.assertEqual(s4.attrs, {"no_retiming": True})
|
||||
|
|
|
|||
|
|
@ -451,7 +451,7 @@ class DSLTestCase(FHDLTestCase):
|
|||
RED = 1
|
||||
BLUE = 2
|
||||
m = Module()
|
||||
se = Signal(Color, reset=Color.RED)
|
||||
se = Signal(Color, init=Color.RED)
|
||||
with m.Switch(se):
|
||||
with m.Case(Color.RED):
|
||||
m.d.comb += self.c1.eq(1)
|
||||
|
|
@ -638,10 +638,10 @@ class DSLTestCase(FHDLTestCase):
|
|||
1: "SECOND"
|
||||
}))
|
||||
|
||||
def test_FSM_reset(self):
|
||||
def test_FSM_init(self):
|
||||
a = Signal()
|
||||
m = Module()
|
||||
with m.FSM(reset="SECOND"):
|
||||
with m.FSM(init="SECOND"):
|
||||
with m.State("FIRST"):
|
||||
m.d.comb += a.eq(0)
|
||||
m.next = "SECOND"
|
||||
|
|
@ -670,6 +670,55 @@ class DSLTestCase(FHDLTestCase):
|
|||
)
|
||||
)
|
||||
""")
|
||||
self.assertEqual(m._generated["fsm"].state.init, 1)
|
||||
|
||||
def test_FSM_reset(self):
|
||||
a = Signal()
|
||||
m = Module()
|
||||
with self.assertWarnsRegex(DeprecationWarning,
|
||||
r"^`reset=` is deprecated, use `init=` instead$"):
|
||||
with m.FSM(reset="SECOND"):
|
||||
with m.State("FIRST"):
|
||||
m.d.comb += a.eq(0)
|
||||
m.next = "SECOND"
|
||||
with m.State("SECOND"):
|
||||
m.next = "FIRST"
|
||||
m._flush()
|
||||
self.assertRepr(m._statements["comb"], """
|
||||
(
|
||||
(switch (sig fsm_state)
|
||||
(case 0
|
||||
(eq (sig a) (const 1'd0))
|
||||
)
|
||||
(case 1 )
|
||||
)
|
||||
)
|
||||
""")
|
||||
self.assertRepr(m._statements["sync"], """
|
||||
(
|
||||
(switch (sig fsm_state)
|
||||
(case 0
|
||||
(eq (sig fsm_state) (const 1'd1))
|
||||
)
|
||||
(case 1
|
||||
(eq (sig fsm_state) (const 1'd0))
|
||||
)
|
||||
)
|
||||
)
|
||||
""")
|
||||
self.assertEqual(m._generated["fsm"].state.init, 1)
|
||||
|
||||
def test_FSM_reset_wrong(self):
|
||||
a = Signal()
|
||||
m = Module()
|
||||
with self.assertRaisesRegex(ValueError,
|
||||
r"^Cannot specify both `reset` and `init`$"):
|
||||
with m.FSM(reset="SECOND", init="SECOND"):
|
||||
with m.State("FIRST"):
|
||||
m.d.comb += a.eq(0)
|
||||
m.next = "SECOND"
|
||||
with m.State("SECOND"):
|
||||
m.next = "FIRST"
|
||||
|
||||
def test_FSM_ongoing(self):
|
||||
a = Signal()
|
||||
|
|
@ -683,7 +732,7 @@ class DSLTestCase(FHDLTestCase):
|
|||
with m.State("SECOND"):
|
||||
pass
|
||||
m._flush()
|
||||
self.assertEqual(m._generated["fsm"].state.reset, 1)
|
||||
self.assertEqual(m._generated["fsm"].state.init, 1)
|
||||
self.maxDiff = 10000
|
||||
self.assertRepr(m._statements["comb"], """
|
||||
(
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ class MemoryTestCase(FHDLTestCase):
|
|||
self.assertEqual(len(rdport.data), 8)
|
||||
self.assertEqual(len(rdport.en), 1)
|
||||
self.assertIsInstance(rdport.en, Signal)
|
||||
self.assertEqual(rdport.en.reset, 1)
|
||||
self.assertEqual(rdport.en.init, 1)
|
||||
|
||||
def test_read_port_non_transparent(self):
|
||||
mem = Memory(width=8, depth=4)
|
||||
|
|
@ -69,7 +69,7 @@ class MemoryTestCase(FHDLTestCase):
|
|||
self.assertEqual(rdport.transparent, False)
|
||||
self.assertEqual(len(rdport.en), 1)
|
||||
self.assertIsInstance(rdport.en, Signal)
|
||||
self.assertEqual(rdport.en.reset, 1)
|
||||
self.assertEqual(rdport.en.init, 1)
|
||||
|
||||
def test_read_port_asynchronous(self):
|
||||
mem = Memory(width=8, depth=4)
|
||||
|
|
|
|||
|
|
@ -199,11 +199,11 @@ class RecordTestCase(FHDLTestCase):
|
|||
self.assertEqual(r1.a.name, "r1__a")
|
||||
self.assertEqual(r1.b.name, "r1__b")
|
||||
self.assertEqual(r1.b.s.name, "r1__b__s")
|
||||
r1.a.reset = 1
|
||||
r1.b.s.reset = 1
|
||||
r1.a.init = 1
|
||||
r1.b.s.init = 1
|
||||
r2 = Record.like(r1)
|
||||
self.assertEqual(r2.a.reset, 1)
|
||||
self.assertEqual(r2.b.s.reset, 1)
|
||||
self.assertEqual(r2.a.init, 1)
|
||||
self.assertEqual(r2.b.s.init, 1)
|
||||
self.assertEqual(r2.a.name, "r2__a")
|
||||
self.assertEqual(r2.b.name, "r2__b")
|
||||
self.assertEqual(r2.b.s.name, "r2__b__s")
|
||||
|
|
|
|||
|
|
@ -247,8 +247,8 @@ class DomainLowererTestCase(FHDLTestCase):
|
|||
class ResetInserterTestCase(FHDLTestCase):
|
||||
def setUp(self):
|
||||
self.s1 = Signal()
|
||||
self.s2 = Signal(reset=1)
|
||||
self.s3 = Signal(reset=1, reset_less=True)
|
||||
self.s2 = Signal(init=1)
|
||||
self.s3 = Signal(init=1, reset_less=True)
|
||||
self.c1 = Signal()
|
||||
|
||||
def test_reset_default(self):
|
||||
|
|
|
|||
|
|
@ -35,10 +35,10 @@ class FFSynchronizerTestCase(FHDLTestCase):
|
|||
sim.add_process(process)
|
||||
sim.run()
|
||||
|
||||
def test_reset_value(self):
|
||||
i = Signal(reset=1)
|
||||
def test_init_value(self):
|
||||
i = Signal(init=1)
|
||||
o = Signal()
|
||||
frag = FFSynchronizer(i, o, reset=1)
|
||||
frag = FFSynchronizer(i, o, init=1)
|
||||
|
||||
sim = Simulator(frag)
|
||||
sim.add_clock(1e-6)
|
||||
|
|
@ -54,6 +54,34 @@ class FFSynchronizerTestCase(FHDLTestCase):
|
|||
sim.add_process(process)
|
||||
sim.run()
|
||||
|
||||
def test_reset_value(self):
|
||||
i = Signal(init=1)
|
||||
o = Signal()
|
||||
with self.assertWarnsRegex(DeprecationWarning,
|
||||
r"^`reset=` is deprecated, use `init=` instead$"):
|
||||
frag = FFSynchronizer(i, o, reset=1)
|
||||
|
||||
sim = Simulator(frag)
|
||||
sim.add_clock(1e-6)
|
||||
def process():
|
||||
self.assertEqual((yield o), 1)
|
||||
yield i.eq(0)
|
||||
yield Tick()
|
||||
self.assertEqual((yield o), 1)
|
||||
yield Tick()
|
||||
self.assertEqual((yield o), 1)
|
||||
yield Tick()
|
||||
self.assertEqual((yield o), 0)
|
||||
sim.add_process(process)
|
||||
sim.run()
|
||||
|
||||
def test_reset_wrong(self):
|
||||
i = Signal(init=1)
|
||||
o = Signal()
|
||||
with self.assertRaisesRegex(ValueError,
|
||||
r"^Cannot specify both `reset` and `init`$"):
|
||||
FFSynchronizer(i, o, reset=1, init=1)
|
||||
|
||||
|
||||
class AsyncFFSynchronizerTestCase(FHDLTestCase):
|
||||
def test_stages_wrong(self):
|
||||
|
|
@ -115,7 +143,7 @@ class AsyncFFSynchronizerTestCase(FHDLTestCase):
|
|||
sim.run()
|
||||
|
||||
def test_neg_edge(self):
|
||||
i = Signal(reset=1)
|
||||
i = Signal(init=1)
|
||||
o = Signal()
|
||||
m = Module()
|
||||
m.domains += ClockDomain("sync")
|
||||
|
|
@ -166,7 +194,7 @@ class ResetSynchronizerTestCase(FHDLTestCase):
|
|||
m = Module()
|
||||
m.domains += ClockDomain("sync")
|
||||
m.submodules += ResetSynchronizer(arst)
|
||||
s = Signal(reset=1)
|
||||
s = Signal(init=1)
|
||||
m.d.sync += s.eq(0)
|
||||
|
||||
sim = Simulator(m)
|
||||
|
|
|
|||
|
|
@ -430,13 +430,13 @@ class LayoutTestCase(FHDLTestCase):
|
|||
sl = StructLayout({"f": unsigned(1)})
|
||||
self.assertRepr(sl.const({"f": Const(1)}).as_value(), "(const 1'd1)")
|
||||
|
||||
def test_signal_reset(self):
|
||||
def test_signal_init(self):
|
||||
sl = StructLayout({
|
||||
"a": unsigned(1),
|
||||
"b": unsigned(2)
|
||||
})
|
||||
self.assertEqual(Signal(sl).as_value().reset, 0)
|
||||
self.assertEqual(Signal(sl, reset={"a": 0b1, "b": 0b10}).as_value().reset, 5)
|
||||
self.assertEqual(Signal(sl).as_value().init, 0)
|
||||
self.assertEqual(Signal(sl, init={"a": 0b1, "b": 0b10}).as_value().init, 5)
|
||||
|
||||
|
||||
class ViewTestCase(FHDLTestCase):
|
||||
|
|
@ -454,17 +454,17 @@ class ViewTestCase(FHDLTestCase):
|
|||
self.assertEqual(cv.shape(), unsigned(3))
|
||||
self.assertEqual(cv.name, "v")
|
||||
|
||||
def test_construct_signal_reset(self):
|
||||
def test_construct_signal_init(self):
|
||||
v1 = Signal(StructLayout({"a": unsigned(1), "b": unsigned(2)}),
|
||||
reset={"a": 0b1, "b": 0b10})
|
||||
self.assertEqual(Value.cast(v1).reset, 0b101)
|
||||
init={"a": 0b1, "b": 0b10})
|
||||
self.assertEqual(Value.cast(v1).init, 0b101)
|
||||
v2 = Signal(StructLayout({"a": unsigned(1),
|
||||
"b": StructLayout({"x": unsigned(1), "y": unsigned(1)})}),
|
||||
reset={"a": 0b1, "b": {"x": 0b0, "y": 0b1}})
|
||||
self.assertEqual(Value.cast(v2).reset, 0b101)
|
||||
init={"a": 0b1, "b": {"x": 0b0, "y": 0b1}})
|
||||
self.assertEqual(Value.cast(v2).init, 0b101)
|
||||
v3 = Signal(ArrayLayout(unsigned(2), 2),
|
||||
reset=[0b01, 0b10])
|
||||
self.assertEqual(Value.cast(v3).reset, 0b1001)
|
||||
init=[0b01, 0b10])
|
||||
self.assertEqual(Value.cast(v3).init, 0b1001)
|
||||
|
||||
def test_layout_wrong(self):
|
||||
with self.assertRaisesRegex(TypeError,
|
||||
|
|
@ -625,13 +625,13 @@ class ViewTestCase(FHDLTestCase):
|
|||
def test_bug_837_array_layout_getitem_str(self):
|
||||
with self.assertRaisesRegex(TypeError,
|
||||
r"^Views with array layout may only be indexed with an integer or a value, "
|
||||
r"not 'reset'$"):
|
||||
Signal(ArrayLayout(unsigned(1), 1), reset=[0])["reset"]
|
||||
r"not 'init'$"):
|
||||
Signal(ArrayLayout(unsigned(1), 1), init=[0])["init"]
|
||||
|
||||
def test_bug_837_array_layout_getattr(self):
|
||||
with self.assertRaisesRegex(AttributeError,
|
||||
r"^View of \(sig \$signal\) with an array layout does not have fields$"):
|
||||
Signal(ArrayLayout(unsigned(1), 1), reset=[0]).reset
|
||||
Signal(ArrayLayout(unsigned(1), 1), init=[0]).init
|
||||
|
||||
def test_eq(self):
|
||||
s1 = Signal(StructLayout({"a": unsigned(2)}))
|
||||
|
|
@ -735,7 +735,7 @@ class StructTestCase(FHDLTestCase):
|
|||
self.assertRepr(v.b.q.r, "(s (slice (slice (slice (sig v) 1:9) 4:8) 0:2))")
|
||||
self.assertRepr(v.b.q.s, "(s (slice (slice (slice (sig v) 1:9) 4:8) 2:4))")
|
||||
|
||||
def test_construct_reset(self):
|
||||
def test_construct_init(self):
|
||||
class S(Struct):
|
||||
p: 4
|
||||
q: 2 = 1
|
||||
|
|
@ -744,11 +744,11 @@ class StructTestCase(FHDLTestCase):
|
|||
S.q
|
||||
|
||||
v1 = Signal(S)
|
||||
self.assertEqual(v1.as_value().reset, 0b010000)
|
||||
v2 = Signal(S, reset=dict(p=0b0011))
|
||||
self.assertEqual(v2.as_value().reset, 0b010011)
|
||||
v3 = Signal(S, reset=dict(p=0b0011, q=0b00))
|
||||
self.assertEqual(v3.as_value().reset, 0b000011)
|
||||
self.assertEqual(v1.as_value().init, 0b010000)
|
||||
v2 = Signal(S, init=dict(p=0b0011))
|
||||
self.assertEqual(v2.as_value().init, 0b010011)
|
||||
v3 = Signal(S, init=dict(p=0b0011, q=0b00))
|
||||
self.assertEqual(v3.as_value().init, 0b000011)
|
||||
|
||||
def test_shape_undefined_wrong(self):
|
||||
class S(Struct):
|
||||
|
|
@ -835,33 +835,33 @@ class UnionTestCase(FHDLTestCase):
|
|||
self.assertRepr(v.a, "(slice (sig v) 0:1)")
|
||||
self.assertRepr(v.b, "(s (slice (sig v) 0:3))")
|
||||
|
||||
def test_define_reset_two_wrong(self):
|
||||
def test_define_init_two_wrong(self):
|
||||
with self.assertRaisesRegex(ValueError,
|
||||
r"^Reset value for at most one field can be provided for a union class "
|
||||
r"^Initial value for at most one field can be provided for a union class "
|
||||
r"\(specified: a, b\)$"):
|
||||
class U(Union):
|
||||
a: unsigned(1) = 1
|
||||
b: unsigned(2) = 1
|
||||
|
||||
def test_construct_reset_two_wrong(self):
|
||||
def test_construct_init_two_wrong(self):
|
||||
class U(Union):
|
||||
a: unsigned(1)
|
||||
b: unsigned(2)
|
||||
|
||||
with self.assertRaisesRegex(TypeError,
|
||||
r"^Reset value must be a constant initializer of <class '.+?\.U'>$") as cm:
|
||||
Signal(U, reset=dict(a=1, b=2))
|
||||
r"^Initial value must be a constant initializer of <class '.+?\.U'>$") as cm:
|
||||
Signal(U, init=dict(a=1, b=2))
|
||||
self.assertRegex(cm.exception.__cause__.message,
|
||||
r"^Initializer for at most one field can be provided for a union "
|
||||
r"class \(specified: a, b\)$")
|
||||
|
||||
def test_construct_reset_override(self):
|
||||
def test_construct_init_override(self):
|
||||
class U(Union):
|
||||
a: unsigned(1) = 1
|
||||
b: unsigned(2)
|
||||
|
||||
self.assertEqual(Signal(U).as_value().reset, 0b01)
|
||||
self.assertEqual(Signal(U, reset=dict(b=0b10)).as_value().reset, 0b10)
|
||||
self.assertEqual(Signal(U).as_value().init, 0b01)
|
||||
self.assertEqual(Signal(U, init=dict(b=0b10)).as_value().init, 0b10)
|
||||
|
||||
|
||||
# Examples from https://github.com/amaranth-lang/amaranth/issues/693
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ class MemberTestCase(unittest.TestCase):
|
|||
self.assertEqual(member.flow, In)
|
||||
self.assertEqual(member.is_port, True)
|
||||
self.assertEqual(member.shape, unsigned(1))
|
||||
self.assertEqual(member.reset, None)
|
||||
self.assertEqual(member.init, None)
|
||||
self.assertEqual(member.is_signature, False)
|
||||
with self.assertRaisesRegex(AttributeError,
|
||||
r"^A port member does not have a signature$"):
|
||||
|
|
@ -50,33 +50,58 @@ class MemberTestCase(unittest.TestCase):
|
|||
r"not 'whatever'$"):
|
||||
Member(In, "whatever")
|
||||
|
||||
def test_port_member_reset(self):
|
||||
member = Member(Out, unsigned(1), reset=1)
|
||||
def test_port_member_init(self):
|
||||
member = Member(Out, unsigned(1), init=1)
|
||||
self.assertEqual(member.flow, Out)
|
||||
self.assertEqual(member.shape, unsigned(1))
|
||||
self.assertEqual(member.reset, 1)
|
||||
self.assertEqual(repr(member._reset_as_const), repr(Const(1, 1)))
|
||||
self.assertEqual(repr(member), "Out(unsigned(1), reset=1)")
|
||||
self.assertEqual(member.init, 1)
|
||||
self.assertEqual(repr(member._init_as_const), repr(Const(1, 1)))
|
||||
self.assertEqual(repr(member), "Out(unsigned(1), init=1)")
|
||||
|
||||
def test_port_member_reset_wrong(self):
|
||||
def test_port_member_init_wrong(self):
|
||||
with self.assertRaisesRegex(TypeError,
|
||||
r"^Port member reset value 'no' is not a valid constant initializer "
|
||||
r"^Port member initial value 'no' is not a valid constant initializer "
|
||||
r"for unsigned\(1\)$"):
|
||||
Member(In, 1, reset="no")
|
||||
Member(In, 1, init="no")
|
||||
|
||||
def test_port_member_reset_shape_castable(self):
|
||||
def test_port_member_init_shape_castable(self):
|
||||
layout = data.StructLayout({"a": 32})
|
||||
member = Member(In, layout, reset={"a": 1})
|
||||
member = Member(In, layout, init={"a": 1})
|
||||
self.assertEqual(member.flow, In)
|
||||
self.assertEqual(member.shape, layout)
|
||||
self.assertEqual(member.reset, {"a": 1})
|
||||
self.assertEqual(repr(member), "In(StructLayout({'a': 32}), reset={'a': 1})")
|
||||
self.assertEqual(member.init, {"a": 1})
|
||||
self.assertEqual(repr(member), "In(StructLayout({'a': 32}), init={'a': 1})")
|
||||
|
||||
def test_port_member_reset_shape_castable_wrong(self):
|
||||
def test_port_member_init_shape_castable_wrong(self):
|
||||
with self.assertRaisesRegex(TypeError,
|
||||
r"^Port member reset value 'no' is not a valid constant initializer "
|
||||
r"^Port member initial value 'no' is not a valid constant initializer "
|
||||
r"for StructLayout\({'a': 32}\)$"):
|
||||
Member(In, data.StructLayout({"a": 32}), reset="no")
|
||||
Member(In, data.StructLayout({"a": 32}), init="no")
|
||||
|
||||
def test_port_member_reset(self):
|
||||
with self.assertWarnsRegex(DeprecationWarning,
|
||||
r"^`reset=` is deprecated, use `init=` instead$"):
|
||||
member = Member(Out, unsigned(1), reset=1)
|
||||
self.assertEqual(member.flow, Out)
|
||||
self.assertEqual(member.shape, unsigned(1))
|
||||
self.assertEqual(member.init, 1)
|
||||
self.assertEqual(repr(member._init_as_const), repr(Const(1, 1)))
|
||||
self.assertEqual(repr(member), "Out(unsigned(1), init=1)")
|
||||
with self.assertWarnsRegex(DeprecationWarning,
|
||||
r"^`Member.reset` is deprecated, use `Member.init` instead$"):
|
||||
self.assertEqual(member.reset, 1)
|
||||
with self.assertWarnsRegex(DeprecationWarning,
|
||||
r"^`reset=` is deprecated, use `init=` instead$"):
|
||||
member = Out(unsigned(1), reset=1)
|
||||
self.assertEqual(member.init,1)
|
||||
|
||||
def test_port_member_reset_wrong(self):
|
||||
with self.assertRaisesRegex(ValueError,
|
||||
r"^Cannot specify both `reset` and `init`$"):
|
||||
Member(Out, unsigned(1), reset=1, init=1)
|
||||
with self.assertRaisesRegex(ValueError,
|
||||
r"^Cannot specify both `reset` and `init`$"):
|
||||
Out(unsigned(1), reset=1, init=1)
|
||||
|
||||
def test_signature_member_out(self):
|
||||
sig = Signature({"data": Out(unsigned(32))})
|
||||
|
|
@ -87,8 +112,8 @@ class MemberTestCase(unittest.TestCase):
|
|||
r"^A signature member does not have a shape$"):
|
||||
member.shape
|
||||
with self.assertRaisesRegex(AttributeError,
|
||||
r"^A signature member does not have a reset value$"):
|
||||
member.reset
|
||||
r"^A signature member does not have an initial value$"):
|
||||
member.init
|
||||
self.assertEqual(member.is_signature, True)
|
||||
self.assertEqual(member.signature, sig)
|
||||
self.assertEqual(member.dimensions, ())
|
||||
|
|
@ -103,8 +128,8 @@ class MemberTestCase(unittest.TestCase):
|
|||
r"^A signature member does not have a shape$"):
|
||||
member.shape
|
||||
with self.assertRaisesRegex(AttributeError,
|
||||
r"^A signature member does not have a reset value$"):
|
||||
member.reset
|
||||
r"^A signature member does not have an initial value$"):
|
||||
member.init
|
||||
self.assertEqual(member.is_signature, True)
|
||||
self.assertEqual(member.signature, sig.flip())
|
||||
self.assertEqual(member.dimensions, ())
|
||||
|
|
@ -112,8 +137,8 @@ class MemberTestCase(unittest.TestCase):
|
|||
|
||||
def test_signature_member_wrong(self):
|
||||
with self.assertRaisesRegex(ValueError,
|
||||
r"^A signature member cannot have a reset value$"):
|
||||
Member(In, Signature({}), reset=1)
|
||||
r"^A signature member cannot have an initial value$"):
|
||||
Member(In, Signature({}), init=1)
|
||||
|
||||
def test_array(self):
|
||||
array_2 = Member(In, unsigned(1)).array(2)
|
||||
|
|
@ -143,8 +168,8 @@ class MemberTestCase(unittest.TestCase):
|
|||
def test_equality(self):
|
||||
self.assertEqual(In(1), In(1))
|
||||
self.assertNotEqual(In(1), Out(1))
|
||||
self.assertNotEqual(In(1), In(1, reset=1))
|
||||
self.assertNotEqual(In(1), In(1, reset=0))
|
||||
self.assertNotEqual(In(1), In(1, init=1))
|
||||
self.assertNotEqual(In(1), In(1, init=0))
|
||||
self.assertEqual(In(1), In(1).array())
|
||||
self.assertNotEqual(In(1), In(1).array(1))
|
||||
sig = Signature({})
|
||||
|
|
@ -237,12 +262,12 @@ class SignatureMembersTestCase(unittest.TestCase):
|
|||
self.assertEqual(attrs["s"].b.shape(), unsigned(2))
|
||||
self.assertEqual(attrs["s"].b.name, "attrs__s__b")
|
||||
|
||||
def test_create_reset(self):
|
||||
def test_create_init(self):
|
||||
members = SignatureMembers({
|
||||
"a": In(1, reset=1),
|
||||
"a": In(1, init=1),
|
||||
})
|
||||
attrs = members.create()
|
||||
self.assertEqual(attrs["a"].reset, 1)
|
||||
self.assertEqual(attrs["a"].init, 1)
|
||||
|
||||
def test_create_tuple(self):
|
||||
sig = SignatureMembers({
|
||||
|
|
@ -421,12 +446,12 @@ class SignatureTestCase(unittest.TestCase):
|
|||
sig=Signature({"a": In(unsigned(1))}),
|
||||
obj=NS(a=Signal(signed(1))))
|
||||
self.assertNotCompliant(
|
||||
r"^'obj\.a' is expected to have the reset value None, but it has the reset value 1$",
|
||||
r"^'obj\.a' is expected to have the initial value None, but it has the initial value 1$",
|
||||
sig=Signature({"a": In(1)}),
|
||||
obj=NS(a=Signal(reset=1)))
|
||||
obj=NS(a=Signal(init=1)))
|
||||
self.assertNotCompliant(
|
||||
r"^'obj\.a' is expected to have the reset value 1, but it has the reset value 0$",
|
||||
sig=Signature({"a": In(1, reset=1)}),
|
||||
r"^'obj\.a' is expected to have the initial value 1, but it has the initial value 0$",
|
||||
sig=Signature({"a": In(1, init=1)}),
|
||||
obj=NS(a=Signal(1)))
|
||||
self.assertNotCompliant(
|
||||
r"^'obj\.a' is expected to not be reset-less$",
|
||||
|
|
@ -820,21 +845,21 @@ class ConnectTestCase(unittest.TestCase):
|
|||
q=NS(signature=Signature({"a": In(Cycle)}),
|
||||
a=Signal(Cycle)))
|
||||
|
||||
def test_reset_mismatch(self):
|
||||
def test_init_mismatch(self):
|
||||
m = Module()
|
||||
with self.assertRaisesRegex(ConnectionError,
|
||||
r"^Cannot connect together the member 'q\.a' with reset value 1 and the member "
|
||||
r"'p\.a' with reset value 0 because the reset values do not match$"):
|
||||
r"^Cannot connect together the member 'q\.a' with initial value 1 and the member "
|
||||
r"'p\.a' with initial value 0 because the initial values do not match$"):
|
||||
connect(m,
|
||||
p=NS(signature=Signature({"a": Out(1, reset=0)}),
|
||||
p=NS(signature=Signature({"a": Out(1, init=0)}),
|
||||
a=Signal()),
|
||||
q=NS(signature=Signature({"a": In(1, reset=1)}),
|
||||
a=Signal(reset=1)))
|
||||
q=NS(signature=Signature({"a": In(1, init=1)}),
|
||||
a=Signal(init=1)))
|
||||
|
||||
def test_reset_none_match(self):
|
||||
def test_init_none_match(self):
|
||||
m = Module()
|
||||
connect(m,
|
||||
p=NS(signature=Signature({"a": Out(1, reset=0)}),
|
||||
p=NS(signature=Signature({"a": Out(1, init=0)}),
|
||||
a=Signal()),
|
||||
q=NS(signature=Signature({"a": In(1)}),
|
||||
a=Signal()))
|
||||
|
|
|
|||
|
|
@ -18,12 +18,12 @@ from amaranth._utils import _ignore_deprecated
|
|||
|
||||
|
||||
class SimulatorUnitTestCase(FHDLTestCase):
|
||||
def assertStatement(self, stmt, inputs, output, reset=0):
|
||||
def assertStatement(self, stmt, inputs, output, init=0):
|
||||
inputs = [Value.cast(i) for i in inputs]
|
||||
output = Value.cast(output)
|
||||
|
||||
isigs = [Signal(i.shape(), name=n) for i, n in zip(inputs, "abcd")]
|
||||
osig = Signal(output.shape(), name="y", reset=reset)
|
||||
osig = Signal(output.shape(), name="y", init=init)
|
||||
|
||||
stmt = stmt(osig, *isigs)
|
||||
frag = Fragment()
|
||||
|
|
@ -243,9 +243,9 @@ class SimulatorUnitTestCase(FHDLTestCase):
|
|||
|
||||
def test_slice_lhs(self):
|
||||
stmt1 = lambda y, a: y[2].eq(a)
|
||||
self.assertStatement(stmt1, [C(0b0, 1)], C(0b11111011, 8), reset=0b11111111)
|
||||
self.assertStatement(stmt1, [C(0b0, 1)], C(0b11111011, 8), init=0b11111111)
|
||||
stmt2 = lambda y, a: y[2:4].eq(a)
|
||||
self.assertStatement(stmt2, [C(0b01, 2)], C(0b11110111, 8), reset=0b11111011)
|
||||
self.assertStatement(stmt2, [C(0b01, 2)], C(0b11110111, 8), init=0b11111011)
|
||||
|
||||
def test_bit_select(self):
|
||||
stmt = lambda y, a, b: y.eq(a.bit_select(b, 3))
|
||||
|
|
@ -255,9 +255,9 @@ class SimulatorUnitTestCase(FHDLTestCase):
|
|||
|
||||
def test_bit_select_lhs(self):
|
||||
stmt = lambda y, a, b: y.bit_select(a, 3).eq(b)
|
||||
self.assertStatement(stmt, [C(0), C(0b100, 3)], C(0b11111100, 8), reset=0b11111111)
|
||||
self.assertStatement(stmt, [C(2), C(0b101, 3)], C(0b11110111, 8), reset=0b11111111)
|
||||
self.assertStatement(stmt, [C(3), C(0b110, 3)], C(0b11110111, 8), reset=0b11111111)
|
||||
self.assertStatement(stmt, [C(0), C(0b100, 3)], C(0b11111100, 8), init=0b11111111)
|
||||
self.assertStatement(stmt, [C(2), C(0b101, 3)], C(0b11110111, 8), init=0b11111111)
|
||||
self.assertStatement(stmt, [C(3), C(0b110, 3)], C(0b11110111, 8), init=0b11111111)
|
||||
|
||||
def test_word_select(self):
|
||||
stmt = lambda y, a, b: y.eq(a.word_select(b, 3))
|
||||
|
|
@ -267,9 +267,9 @@ class SimulatorUnitTestCase(FHDLTestCase):
|
|||
|
||||
def test_word_select_lhs(self):
|
||||
stmt = lambda y, a, b: y.word_select(a, 3).eq(b)
|
||||
self.assertStatement(stmt, [C(0), C(0b100, 3)], C(0b11111100, 8), reset=0b11111111)
|
||||
self.assertStatement(stmt, [C(1), C(0b101, 3)], C(0b11101111, 8), reset=0b11111111)
|
||||
self.assertStatement(stmt, [C(2), C(0b110, 3)], C(0b10111111, 8), reset=0b11111111)
|
||||
self.assertStatement(stmt, [C(0), C(0b100, 3)], C(0b11111100, 8), init=0b11111111)
|
||||
self.assertStatement(stmt, [C(1), C(0b101, 3)], C(0b11101111, 8), init=0b11111111)
|
||||
self.assertStatement(stmt, [C(2), C(0b110, 3)], C(0b10111111, 8), init=0b11111111)
|
||||
|
||||
def test_cat(self):
|
||||
stmt = lambda y, *xs: y.eq(Cat(*xs))
|
||||
|
|
@ -315,9 +315,9 @@ class SimulatorUnitTestCase(FHDLTestCase):
|
|||
self.assertStatement(stmt, [C(4)], C(10))
|
||||
|
||||
def test_array_lhs(self):
|
||||
l = Signal(3, reset=1)
|
||||
m = Signal(3, reset=4)
|
||||
n = Signal(3, reset=7)
|
||||
l = Signal(3, init=1)
|
||||
m = Signal(3, init=4)
|
||||
n = Signal(3, init=7)
|
||||
array = Array([l, m, n])
|
||||
stmt = lambda y, a, b: [array[a].eq(b), y.eq(Cat(*array))]
|
||||
self.assertStatement(stmt, [C(0), C(0b000)], C(0b111100000))
|
||||
|
|
@ -426,7 +426,7 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
|
|||
sim.run_until(deadline)
|
||||
|
||||
def setUp_counter(self):
|
||||
self.count = Signal(3, reset=4)
|
||||
self.count = Signal(3, init=4)
|
||||
self.sync = ClockDomain()
|
||||
|
||||
self.m = Module()
|
||||
|
|
@ -876,7 +876,7 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
|
|||
|
||||
def test_comb_bench_process(self):
|
||||
m = Module()
|
||||
a = Signal(reset=1)
|
||||
a = Signal(init=1)
|
||||
b = Signal()
|
||||
m.d.comb += b.eq(a)
|
||||
with self.assertSimulation(m) as sim:
|
||||
|
|
@ -890,7 +890,7 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
|
|||
|
||||
def test_sync_bench_process(self):
|
||||
m = Module()
|
||||
a = Signal(reset=1)
|
||||
a = Signal(init=1)
|
||||
b = Signal()
|
||||
m.d.sync += b.eq(a)
|
||||
t = Signal()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue