opentitanlib/io/
console.rs

1// Copyright lowRISC contributors (OpenTitan project).
2// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3// SPDX-License-Identifier: Apache-2.0
4
5use std::task::{Context, Poll};
6
7use anyhow::Result;
8use serde::{Deserialize, Serialize};
9use thiserror::Error;
10
11use crate::impl_serializable_error;
12
13pub mod broadcast;
14mod buf;
15mod coverage;
16#[cfg(test)]
17mod coverage_test;
18pub mod ext;
19mod logged;
20pub use broadcast::Broadcaster;
21pub use buf::Buffered;
22pub use coverage::CoverageMiddleware;
23pub use ext::ConsoleExt;
24pub use logged::Logged;
25
26/// Errors related to the console interface.
27#[derive(Error, Debug, Serialize, Deserialize)]
28pub enum ConsoleError {
29    #[error("Timed Out")]
30    TimedOut,
31    #[error("{0}")]
32    GenericError(String),
33}
34impl_serializable_error!(ConsoleError);
35
36pub trait ConsoleDevice {
37    /// Reads received data into `buf`, returning the number of bytes read.
38    ///
39    /// If data is not yet ready, `Poll::Pending` will be returned and `cx` would be notified when it's available.
40    /// When this function is called with multiple wakers, all wakers should be notified instead of just the last one.
41    fn poll_read(&self, cx: &mut Context<'_>, buf: &mut [u8]) -> Poll<Result<usize>>;
42
43    /// Writes data from `buf` to the UART.
44    fn write(&self, buf: &[u8]) -> Result<()>;
45
46    /// Returns a reference to the coverage extraction interface if supported.
47    fn as_coverage_console(&self) -> Option<&dyn CoverageConsole> {
48        None
49    }
50}
51
52/// Interface for objects that can wait for coverage extraction to complete.
53pub trait CoverageConsole {
54    /// Returns the number of coverage blocks processed (finished or skipped).
55    fn coverage_blocks_processed(&self) -> usize;
56}