API reference#
pw_emu: Flexible emulators frontend
pw_emu.frontend.Emulator#
- class pw_emu.frontend.Emulator(wdir: Path, config_path: Path | None = None)#
Launches, controls and interacts with an emulator instance.
- __init__(wdir: Path, config_path: Path | None = None) None#
- cont() None#
Resumes the emulator’s execution.
- get_channel_addr(name: str) tuple#
Returns a pair of
(host, port)for the channel. RaisesInvalidChannelTypeif this is not a TCP channel.
- get_channel_path(name: str) str#
Returns the channel path. Raises
InvalidChannelTypeif this is not aptychannel.
- get_channel_stream(name: str, timeout: float | None = None) RawIOBase#
Returns a file object for a given host-exposed device.
If
timeoutisNonethan reads and writes are blocking. Iftimeoutis0the stream is operating in non-blocking mode. Otherwise read and write will timeout after the given value.
- get_channel_type(name: str) str#
Returns the channel type
Currently
ptyandtcpare the only supported types.
- get_channels() list[str]#
Returns the list of available channels.
- get_gdb_cmd() list[str]#
Returns the
gdbcommand for current target.
- get_gdb_remote() str#
Returns a string that can be passed to the target remote
gdbcommand.
- get_property(path: str, prop: str) Any#
Returns the value of an emulator’s object property.
- list_properties(path: str) list[dict]#
Returns the property list for an emulator object.
The object is identified by a full path. The path is target-specific and the format of the path is backend-specific.
QEMU path example:
/machine/unattached/device[10]renode path example:
sysbus.uart
- reset() None#
Performs a software reset.
- run_gdb_cmds(commands: list[str], executable: str | None = None, pause: bool = False) CompletedProcess#
Connects to the target and runs the given commands silently in batch mode.
executableis optional but may be required by somegdbcommands.If
pauseis set, execution stops after running the given commands.
- running() bool#
Checks if the main emulator process is already running.
- set_emu(emu: str) None#
Sets the emulator type for this instance.
- set_property(path: str, prop: str, value: Any) None#
Sets the value of an emulator’s object property.
- start(
- target: str,
- file: Path | None = None,
- pause: bool = False,
- debug: bool = False,
- foreground: bool = False,
- args: str | None = None,
Starts the emulator for the given
target.If
fileis set the emulator loads the file before starting.If
pauseisTruethe emulator pauses until the debugger is connected.If
debugisTruethe emulator runs in the foreground with debug output enabled. This is useful for seeing errors, traces, etc.If
foregroundisTruethe emulator runs in the foreground, otherwise it starts in daemon mode. Foreground mode is useful when there is another process controlling the emulator’s life cycle, e.g. cuttlefish.argsare passed directly to the emulator.
- stop()#
Stop the emulator.
pw_emu.frontend.TemporaryEmulator#
- class pw_emu.frontend.TemporaryEmulator(config_path: Path | None = None, cleanup: bool = True)#
Temporary emulator instances.
Manages emulator instances that run in temporary working directories. The emulator instance is stopped and the working directory is cleared when the
withblock completes.It also supports interoperability with the
pw_emucli, e.g. starting the emulator with the CLI and then controlling it from the Python API.Usage example:
# programatically start and load an executable then access it with TemporaryEmulator() as emu: emu.start(target, file) with emu.get_channel_stream(chan) as stream: ...
# or start it form the command line then access it with TemporaryEmulator() as emu: build.bazel( ctx, "run", exec_path, "--run_under=pw emu start <target> --file " ) with emu.get_channel_stream(chan) as stream: ...
- __init__(config_path: Path | None = None, cleanup: bool = True) None#
pw_emu.core.Config#
- class pw_emu.core.Config(config_path: Path | None = None, target: str | None = None, emu: str | None = None)#
Get and validate options from the configuration file.
- __init__(config_path: Path | None = None, target: str | None = None, emu: str | None = None) None#
Loads the emulator configuration.
If no configuration file path is given, the root project configuration is used.
This method set ups the generic configuration (e.g.
gdb).It loads emulator target files and gathers them under the
targetskey for each emulator backend. Thetargetssettings in the configuration file takes precedence over the loaded target files.
- get(keys: list[str], optional: bool = True, entry_type: Type | None = None) Any#
Gets a config entry.
keysidentifies the config entry, e.g.['targets', 'test-target']looks in the config dictionary for['targets']['test-target'].If the option is not found and optional is
Trueit returnsNoneifentry_typeisNoneor a new (empty) object of typeentry_type.If the option is not found and
optionalisFalseit raisesConfigError.If
entry_typeis notNoneit checks the option to be of that type. If it is not it will raiseConfigError.
- get_emu(keys: list[str], optional: bool = True, entry_type: Type | None = None) Any#
Gets a config option starting at
[emu].
- get_target(keys: list[str], optional: bool = True, entry_type: Type | None = None) Any#
Gets a config option starting at
['targets'][target].
- get_target_emu(keys: list[str], optional: bool = True, entry_type: Type | None = None) Any#
Gets a config option starting at
['targets'][target][emu].
- set_target(target: str) None#
Sets the current target.
The current target is used by the
pw_emu.core.Config.get_target()method.
pw_emu.core.Handles#
- class pw_emu.core.Handles(emu: str, config: str)#
Running emulator handles.
- __init__(emu: str, config: str) None#
- add_channel_pty(name: str, path: str) None#
Adds a pty channel.
- add_channel_tcp(name: str, host: str, port: int) None#
Adds a TCP channel.
- add_proc(name: str, pid: int) None#
Adds a process ID.
- save(wdir: Path) None#
Saves handles to the given working directory.
- set_gdb_cmd(cmd: list[str]) None#
Sets the
gdbcommand.
- set_target(target: str) None#
Sets the target.
pw_emu.core.Connector#
- class pw_emu.core.Connector(wdir: Path)#
Interface between a running emulator and the user-visible APIs.
- __init__(wdir: Path) None#
- abstract cont() None#
Resumes the emulator’s execution.
- static get(wdir: Path) Any#
Returns a connector instance for a given emulator type.
- get_channel_addr(name: str) tuple#
Returns a pair of
(host, port)for the channel. RaisesInvalidChannelTypeif this is not atcpchannel.
- get_channel_path(name: str) str#
Returns the channel path. Raises
InvalidChannelTypeif this is not aptychannel.
- get_channel_stream(name: str, timeout: float | None = None) RawIOBase#
Returns a file object for a given host-exposed device.
If
timeoutisNonethen reads and writes are blocking. Iftimeoutis0the stream is operating in non-blocking mode. Otherwise reads and writes will timeout after the given value.
- get_channel_type(name: str) str#
Returns the channel type.
- get_config_path() Path#
Returns the configuration path.
- get_emu() str#
Returns the emulator type.
- get_gdb_cmd() list[str]#
Returns the configured
gdbcommand.
- get_logs() str#
Returns the emulator logs.
- get_procs() dict[str, Proc]#
Returns the running processes indexed by the process name.
- abstract get_property(path: str, prop: str) Any#
Returns the value of an emulator’s object property.
- abstract list_properties(path: str) list[Any]#
Returns the property list for an emulator object.
- abstract reset() None#
Performs a software reset.
- running() bool#
Checks if the main emulator process is already running.
- abstract set_property(path: str, prop: str, value: str) None#
Sets the value of an emulator’s object property.
- stop() None#
Stops the emulator.
pw_emu.core.Launcher#
- class pw_emu.core.Launcher(emu: str, config_path: Path | None = None)#
Starts an emulator based on the target and configuration file.
- __init__(emu: str, config_path: Path | None = None) None#
Initializes a
Launcherinstance.
- _config#
Global, emulator and target configuration.
- _handles#
Handles for processes, channels, etc.
- abstract _post_start() None#
Post-start work, finalize emulator handles.
Perform any post-start emulator initialization and finalize the emulator handles information.
Typically an internal monitor channel is used to inquire information about the configured channels (e.g. TCP ports, pty paths) and
pw_emu.core.Launcher._handlesis updated viapw_emu.core.Handles.add_channel_tcp(),pw_emu.core.Handles.add_channel_pty(), etc.
- abstract _pre_start(
- target: str,
- file: Path | None = None,
- pause: bool = False,
- debug: bool = False,
- args: str | None = None,
Pre-start work, returns command to start the emulator.
The target and emulator configuration can be accessed through
pw_emu.core.Launcher._configwithpw_emu.core.Config.get(),pw_emu.core.Config.get_target(),pw_emu.core.Config.get_emu(),pw_emu.core.Config.get_target_emu().
- static get(emu: str, config_path: Path | None = None) Any#
Returns a launcher for a given emulator type.
- start(
- wdir: Path,
- target: str,
- file: Path | None = None,
- pause: bool = False,
- debug: bool = False,
- foreground: bool = False,
- args: str | None = None,
Starts the emulator for the given target.
If
fileis set the emulator loads that file before starting.If
pauseisTruethe emulator gets paused.If
debugisTruethe emulator runs in the foreground with debug output enabled. This is useful for seeing errors, traces, etc.If
foregroundisTruethe emulator is run in the foreground otherwise it is started in daemon mode. This is useful when there is another process controlling the emulator’s life cycle, e.g. cuttlefish.argsare passed directly to the emulator.