Skip to content

Commit eecd49c

Browse files
committed
serial: follow RFCs 37 and 38.
See #9.
1 parent 21f44f5 commit eecd49c

File tree

1 file changed

+21
-50
lines changed

1 file changed

+21
-50
lines changed

Diff for: amaranth_stdio/serial.py

+21-50
Original file line numberDiff line numberDiff line change
@@ -172,26 +172,15 @@ def __repr__(self):
172172
See :meth:`AsyncSerialRX.Signature.check_parameters`.
173173
"""
174174
def __init__(self, *, divisor, divisor_bits=None, data_bits=8, parity="none", pins=None):
175-
self.Signature.check_parameters(divisor=divisor, divisor_bits=divisor_bits,
176-
data_bits=data_bits, parity=parity)
177-
self._divisor = divisor
178-
self._divisor_bits = divisor_bits if divisor_bits is not None else bits_for(divisor)
179-
self._data_bits = data_bits
180-
self._parity = Parity(parity)
181-
self._pins = pins
182-
183-
super().__init__()
184-
185-
@property
186-
def signature(self):
187-
return self.Signature(divisor=self._divisor, divisor_bits=self._divisor_bits,
188-
data_bits=self._data_bits, parity=self._parity)
175+
super().__init__(self.Signature(divisor=divisor, divisor_bits=divisor_bits,
176+
data_bits=data_bits, parity=parity))
177+
self._pins = pins
189178

190179
def elaborate(self, platform):
191180
m = Module()
192181

193182
timer = Signal.like(self.divisor)
194-
shreg = Signal(_FrameLayout(self._data_bits, self._parity))
183+
shreg = Signal(_FrameLayout(len(self.data), self.signature.parity))
195184
bitno = Signal(range(len(shreg.as_value())))
196185

197186
if self._pins is not None:
@@ -224,7 +213,7 @@ def elaborate(self, platform):
224213
self.data.eq(shreg.data),
225214
self.err.frame .eq(~((shreg.start == 0) & (shreg.stop == 1))),
226215
self.err.parity.eq(~(shreg.parity ==
227-
self._parity._compute_bit(shreg.data))),
216+
self.signature.parity._compute_bit(shreg.data))),
228217
]
229218
m.d.sync += self.err.overflow.eq(~self.ack)
230219
m.next = "IDLE"
@@ -357,26 +346,15 @@ def __repr__(self):
357346
See :class:`AsyncSerialTX.Signature.check_parameters`.
358347
"""
359348
def __init__(self, *, divisor, divisor_bits=None, data_bits=8, parity="none", pins=None):
360-
self.Signature.check_parameters(divisor=divisor, divisor_bits=divisor_bits,
361-
data_bits=data_bits, parity=parity)
362-
self._divisor = divisor
363-
self._divisor_bits = divisor_bits if divisor_bits is not None else bits_for(divisor)
364-
self._data_bits = data_bits
365-
self._parity = Parity(parity)
366-
self._pins = pins
367-
368-
super().__init__()
369-
370-
@property
371-
def signature(self):
372-
return self.Signature(divisor=self._divisor, divisor_bits=self._divisor_bits,
373-
data_bits=self._data_bits, parity=self._parity)
349+
super().__init__(signature=self.Signature(divisor=divisor, divisor_bits=divisor_bits,
350+
data_bits=data_bits, parity=parity))
351+
self._pins = pins
374352

375353
def elaborate(self, platform):
376354
m = Module()
377355

378356
timer = Signal.like(self.divisor)
379-
shreg = Signal(_FrameLayout(len(self.data), self._parity))
357+
shreg = Signal(_FrameLayout(len(self.data), self.signature.parity))
380358
bitno = Signal(range(len(shreg.as_value())))
381359

382360
if self._pins is not None:
@@ -389,7 +367,7 @@ def elaborate(self, platform):
389367
m.d.sync += [
390368
shreg.start .eq(0),
391369
shreg.data .eq(self.data),
392-
shreg.parity.eq(self._parity._compute_bit(self.data)),
370+
shreg.parity.eq(self.signature.parity._compute_bit(self.data)),
393371
shreg.stop .eq(1),
394372
bitno.eq(len(shreg.as_value()) - 1),
395373
timer.eq(self.divisor - 1),
@@ -540,28 +518,21 @@ def __repr__(self):
540518
See :meth:`AsyncSerial.Signature.check_parameters`.
541519
"""
542520
def __init__(self, *, divisor, divisor_bits=None, data_bits=8, parity="none", pins=None):
543-
self.Signature.check_parameters(divisor=divisor, divisor_bits=divisor_bits,
544-
data_bits=data_bits, parity=parity)
545-
self._divisor = divisor
546-
self._divisor_bits = divisor_bits if divisor_bits is not None else bits_for(divisor)
547-
self._data_bits = data_bits
548-
self._parity = Parity(parity)
549-
self._pins = pins
550-
551-
super().__init__()
552-
553-
@property
554-
def signature(self):
555-
return self.Signature(divisor=self._divisor, divisor_bits=self._divisor_bits,
556-
data_bits=self._data_bits, parity=self._parity)
521+
super().__init__(self.Signature(divisor=divisor, divisor_bits=divisor_bits,
522+
data_bits=data_bits, parity=parity))
523+
self._pins = pins
557524

558525
def elaborate(self, platform):
559526
m = Module()
560527

561-
rx = AsyncSerialRX(divisor=self._divisor, divisor_bits=self._divisor_bits,
562-
data_bits=self._data_bits, parity=self._parity)
563-
tx = AsyncSerialTX(divisor=self._divisor, divisor_bits=self._divisor_bits,
564-
data_bits=self._data_bits, parity=self._parity)
528+
rx = AsyncSerialRX(divisor=self.signature.divisor,
529+
divisor_bits=self.signature.divisor_bits,
530+
data_bits=self.signature.data_bits,
531+
parity=self.signature.parity)
532+
tx = AsyncSerialTX(divisor=self.signature.divisor,
533+
divisor_bits=self.signature.divisor_bits,
534+
data_bits=self.signature.data_bits,
535+
parity=self.signature.parity)
565536
m.submodules.rx = rx
566537
m.submodules.tx = tx
567538

0 commit comments

Comments
 (0)