UART simulation
This commit is contained in:
35
h8536/emulator/uart.py
Normal file
35
h8536/emulator/uart.py
Normal file
@@ -0,0 +1,35 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class UartTiming:
|
||||
baud: int = 38_400
|
||||
data_bits: int = 8
|
||||
parity_bits: int = 0
|
||||
stop_bits: int = 1
|
||||
start_bits: int = 1
|
||||
|
||||
@property
|
||||
def bits_per_character(self) -> int:
|
||||
return self.start_bits + self.data_bits + self.parity_bits + self.stop_bits
|
||||
|
||||
def seconds_per_character(self) -> float:
|
||||
return self.bits_per_character / max(1, self.baud)
|
||||
|
||||
def micros_per_character(self) -> float:
|
||||
return 1_000_000.0 * self.seconds_per_character()
|
||||
|
||||
def cycles_per_character(self, clock_hz: int) -> int:
|
||||
return max(1, round(max(1, clock_hz) * self.seconds_per_character()))
|
||||
|
||||
def summary(self, clock_hz: int) -> str:
|
||||
return (
|
||||
f"uart_{self.data_bits}{'N' if self.parity_bits == 0 else 'P'}{self.stop_bits} "
|
||||
f"baud={self.baud} byte_us={self.micros_per_character():.3f} "
|
||||
f"byte_cycles={self.cycles_per_character(clock_hz)}"
|
||||
)
|
||||
|
||||
|
||||
__all__ = ["UartTiming"]
|
||||
Reference in New Issue
Block a user