hdl.ast: deprecate Sample, Past, Rose, Fell, Stable.

See #526.
This commit is contained in:
Catherine 2023-02-28 14:28:41 +00:00
parent 9ec7f5b507
commit 0ee5de036c
8 changed files with 40 additions and 6 deletions

View file

@ -72,7 +72,7 @@ def _ignore_deprecated(f=None):
def decorator_like(*args, **kwargs): def decorator_like(*args, **kwargs):
with warnings.catch_warnings(): with warnings.catch_warnings():
warnings.filterwarnings(action="ignore", category=DeprecationWarning) warnings.filterwarnings(action="ignore", category=DeprecationWarning)
f(*args, **kwargs) return f(*args, **kwargs)
return decorator_like return decorator_like

View file

@ -8,6 +8,7 @@ from itertools import chain
from .. import tracer from .. import tracer
from .._utils import * from .._utils import *
from .._utils import _ignore_deprecated
from .._unused import * from .._unused import *
@ -1333,6 +1334,7 @@ class ValueCastable:
return wrapper_memoized return wrapper_memoized
# TODO(amaranth-0.5): remove
@final @final
class Sample(Value): class Sample(Value):
"""Value from the past. """Value from the past.
@ -1341,6 +1343,7 @@ class Sample(Value):
of the ``domain`` clock back. If that moment is before the beginning of time, it is equal of the ``domain`` clock back. If that moment is before the beginning of time, it is equal
to the value of the expression calculated as if each signal had its reset value. to the value of the expression calculated as if each signal had its reset value.
""" """
@deprecated("instead of using `Sample`, create a register explicitly")
def __init__(self, expr, clocks, domain, *, src_loc_at=0): def __init__(self, expr, clocks, domain, *, src_loc_at=0):
super().__init__(src_loc_at=1 + src_loc_at) super().__init__(src_loc_at=1 + src_loc_at)
self.value = Value.cast(expr) self.value = Value.cast(expr)
@ -1367,20 +1370,32 @@ class Sample(Value):
self.value, "<default>" if self.domain is None else self.domain, self.clocks) self.value, "<default>" if self.domain is None else self.domain, self.clocks)
# TODO(amaranth-0.5): remove
@deprecated("instead of using `Past`, create a register explicitly")
def Past(expr, clocks=1, domain=None): def Past(expr, clocks=1, domain=None):
return Sample(expr, clocks, domain) with _ignore_deprecated():
return Sample(expr, clocks, domain)
# TODO(amaranth-0.5): remove
@deprecated("instead of using `Stable`, create registers and comparisons explicitly")
def Stable(expr, clocks=0, domain=None): def Stable(expr, clocks=0, domain=None):
return Sample(expr, clocks + 1, domain) == Sample(expr, clocks, domain) with _ignore_deprecated():
return Sample(expr, clocks + 1, domain) == Sample(expr, clocks, domain)
# TODO(amaranth-0.5): remove
@deprecated("instead of using `Rose`, create registers and comparisons explicitly")
def Rose(expr, clocks=0, domain=None): def Rose(expr, clocks=0, domain=None):
return ~Sample(expr, clocks + 1, domain) & Sample(expr, clocks, domain) with _ignore_deprecated():
return ~Sample(expr, clocks + 1, domain) & Sample(expr, clocks, domain)
# TODO(amaranth-0.5): remove
@deprecated("instead of using `Fell`, create registers and comparisons explicitly")
def Fell(expr, clocks=0, domain=None): def Fell(expr, clocks=0, domain=None):
return Sample(expr, clocks + 1, domain) & ~Sample(expr, clocks, domain) with _ignore_deprecated():
return Sample(expr, clocks + 1, domain) & ~Sample(expr, clocks, domain)
@final @final

View file

@ -2,7 +2,7 @@ from abc import ABCMeta, abstractmethod
from collections import OrderedDict from collections import OrderedDict
from collections.abc import Iterable from collections.abc import Iterable
from .._utils import flatten from .._utils import flatten, _ignore_deprecated
from .. import tracer from .. import tracer
from .ast import * from .ast import *
from .ast import _StatementList from .ast import _StatementList
@ -526,6 +526,7 @@ class SampleDomainInjector(ValueTransformer, StatementTransformer):
def __init__(self, domain): def __init__(self, domain):
self.domain = domain self.domain = domain
@_ignore_deprecated
def on_Sample(self, value): def on_Sample(self, value):
if value.domain is not None: if value.domain is not None:
return value return value
@ -555,6 +556,7 @@ class SampleLowerer(FragmentTransformer, ValueTransformer, StatementTransformer)
else: else:
raise NotImplementedError # :nocov: raise NotImplementedError # :nocov:
@_ignore_deprecated
def on_Sample(self, value): def on_Sample(self, value):
if value in self.sample_cache: if value in self.sample_cache:
return self.sample_cache[value] return self.sample_cache[value]

View file

@ -4,6 +4,7 @@ from enum import Enum
from amaranth.hdl.ast import * from amaranth.hdl.ast import *
from .utils import * from .utils import *
from amaranth._utils import _ignore_deprecated
class UnsignedEnum(Enum): class UnsignedEnum(Enum):
@ -1187,27 +1188,32 @@ class ValueCastableTestCase(FHDLTestCase):
class SampleTestCase(FHDLTestCase): class SampleTestCase(FHDLTestCase):
@_ignore_deprecated
def test_const(self): def test_const(self):
s = Sample(1, 1, "sync") s = Sample(1, 1, "sync")
self.assertEqual(s.shape(), unsigned(1)) self.assertEqual(s.shape(), unsigned(1))
@_ignore_deprecated
def test_signal(self): def test_signal(self):
s1 = Sample(Signal(2), 1, "sync") s1 = Sample(Signal(2), 1, "sync")
self.assertEqual(s1.shape(), unsigned(2)) self.assertEqual(s1.shape(), unsigned(2))
s2 = Sample(ClockSignal(), 1, "sync") s2 = Sample(ClockSignal(), 1, "sync")
s3 = Sample(ResetSignal(), 1, "sync") s3 = Sample(ResetSignal(), 1, "sync")
@_ignore_deprecated
def test_wrong_value_operator(self): def test_wrong_value_operator(self):
with self.assertRaisesRegex(TypeError, with self.assertRaisesRegex(TypeError,
(r"^Sampled value must be a signal or a constant, not " (r"^Sampled value must be a signal or a constant, not "
r"\(\+ \(sig \$signal\) \(const 1'd1\)\)$")): r"\(\+ \(sig \$signal\) \(const 1'd1\)\)$")):
Sample(Signal() + 1, 1, "sync") Sample(Signal() + 1, 1, "sync")
@_ignore_deprecated
def test_wrong_clocks_neg(self): def test_wrong_clocks_neg(self):
with self.assertRaisesRegex(ValueError, with self.assertRaisesRegex(ValueError,
r"^Cannot sample a value 1 cycles in the future$"): r"^Cannot sample a value 1 cycles in the future$"):
Sample(Signal(), -1, "sync") Sample(Signal(), -1, "sync")
@_ignore_deprecated
def test_wrong_domain(self): def test_wrong_domain(self):
with self.assertRaisesRegex(TypeError, with self.assertRaisesRegex(TypeError,
r"^Domain name must be a string or None, not 0$"): r"^Domain name must be a string or None, not 0$"):

View file

@ -8,6 +8,7 @@ from amaranth.hdl.dsl import *
from amaranth.lib.enum import Enum from amaranth.lib.enum import Enum
from .utils import * from .utils import *
from amaranth._utils import _ignore_deprecated
class DSLTestCase(FHDLTestCase): class DSLTestCase(FHDLTestCase):
@ -131,6 +132,7 @@ class DSLTestCase(FHDLTestCase):
) )
""") """)
@_ignore_deprecated
def test_sample_domain(self): def test_sample_domain(self):
m = Module() m = Module()
i = Signal() i = Signal()

View file

@ -9,6 +9,7 @@ from amaranth.hdl.xfrm import *
from amaranth.hdl.mem import * from amaranth.hdl.mem import *
from .utils import * from .utils import *
from amaranth._utils import _ignore_deprecated
class DomainRenamerTestCase(FHDLTestCase): class DomainRenamerTestCase(FHDLTestCase):
@ -216,6 +217,7 @@ class SampleLowererTestCase(FHDLTestCase):
self.o2 = Signal() self.o2 = Signal()
self.o3 = Signal() self.o3 = Signal()
@_ignore_deprecated
def test_lower_signal(self): def test_lower_signal(self):
f = Fragment() f = Fragment()
f.add_statements( f.add_statements(
@ -238,6 +240,7 @@ class SampleLowererTestCase(FHDLTestCase):
self.assertEqual(len(f.drivers["sync"]), 2) self.assertEqual(len(f.drivers["sync"]), 2)
self.assertEqual(len(f.drivers["pix"]), 1) self.assertEqual(len(f.drivers["pix"]), 1)
@_ignore_deprecated
def test_lower_const(self): def test_lower_const(self):
f = Fragment() f = Fragment()
f.add_statements( f.add_statements(

View file

@ -6,6 +6,7 @@ from amaranth.sim import *
from amaranth.lib.fifo import * from amaranth.lib.fifo import *
from .utils import * from .utils import *
from amaranth._utils import _ignore_deprecated
class FIFOTestCase(FHDLTestCase): class FIFOTestCase(FHDLTestCase):
@ -60,6 +61,7 @@ class FIFOTestCase(FHDLTestCase):
r"requested exact depth 16 is not$")): r"requested exact depth 16 is not$")):
AsyncFIFOBuffered(width=8, depth=16, exact_depth=True) AsyncFIFOBuffered(width=8, depth=16, exact_depth=True)
class FIFOModel(Elaboratable, FIFOInterface): class FIFOModel(Elaboratable, FIFOInterface):
""" """
Non-synthesizable first-in first-out queue, implemented naively as a chain of registers. Non-synthesizable first-in first-out queue, implemented naively as a chain of registers.
@ -128,6 +130,7 @@ class FIFOModelEquivalenceSpec(Elaboratable):
self.r_domain = r_domain self.r_domain = r_domain
self.w_domain = w_domain self.w_domain = w_domain
@_ignore_deprecated
def elaborate(self, platform): def elaborate(self, platform):
m = Module() m = Module()
m.submodules.dut = dut = self.fifo m.submodules.dut = dut = self.fifo
@ -168,6 +171,7 @@ class FIFOContractSpec(Elaboratable):
self.w_domain = w_domain self.w_domain = w_domain
self.bound = bound self.bound = bound
@_ignore_deprecated
def elaborate(self, platform): def elaborate(self, platform):
m = Module() m = Module()
m.submodules.dut = fifo = self.fifo m.submodules.dut = fifo = self.fifo

View file

@ -11,6 +11,7 @@ from amaranth.hdl.ir import *
from amaranth.sim import * from amaranth.sim import *
from .utils import * from .utils import *
from amaranth._utils import _ignore_deprecated
class SimulatorUnitTestCase(FHDLTestCase): class SimulatorUnitTestCase(FHDLTestCase):
@ -811,6 +812,7 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
sim.add_clock(1e-6) sim.add_clock(1e-6)
sim.add_sync_process(process) sim.add_sync_process(process)
@_ignore_deprecated
def test_sample_helpers(self): def test_sample_helpers(self):
m = Module() m = Module()
s = Signal(2) s = Signal(2)