Writing and Using Plugins¶
LibreLane plugin modules are written in Python and can be added to PYTHONPATH
or installed to your Python site-packages (e.g. installed either inside
or outside a venv). LibreLane detects and imports all Python modules found that
have the prefix librelane_plugin_.
Plugins are useful to add support for more utilities other than those included with LibreLane; either alternative open-source EDA utilities that are not part of the built-in flows, or proprietary utilities that can never be a part of the built-in parts.
Note
Plugins are not supported in LibreLane Docker containers.
Registering new Flows and Steps¶
Plugins, much like LibreLane itself, may create and register steps and flows into global registries, where the steps and flows can then be accessed programmatically via their ID.
You can use the Python decorators @Flow.factory.register() and
@Step.factory.register() to register flows and steps respectively.
Registered flows and steps can be accessed in configuration files as shown in Writing Custom Flows, but they can also be accessed programmatically as follows:
MyCustomStep = Step.factory.get("ToolName.MyCustomStep")
MyCustomFlow = Flow.factory.get("MyCustomFlow")
For information on writing the flows and steps themselves, see Writing Custom Flows and Writing Custom Steps.
Including Tools¶
Naturally, one of the most important uses of plugins is the ability to write steps for other tools. There are multiple ways to include these tools:
Bring-your-own-tools¶
You may require users to bring their own tools by installing them on their own
and adding them to PATH, then running LibreLane with the plugin separately.
This is usually the only option for proprietary utilities.
You can still install the plugin itself with Nix while requiring the tool be separate- see the section below.
With Nix¶
Note
This section requires a strong understanding of the Nix programming language, including the Flakes feature, to follow.
You may bundle either the plugin alone or the plugin and the tool using Nix.
The flake for LibreLane contains a function named createOpenLaneShell in its
outputs. This creates a devshell, which
is an executable script that drops you into an environment with LibreLane, its
dependencies, and optionally plugins, installed.
The plugins are to be regular Python Nix derivations, built using the
buildPythonPackage function
with one addition: Plugins must have the attribute includedTools, declaring
tool dependencies (so they may be available to the user standalone in the
environment).
For example, if a plugin, for some reason, depends on the Python numpy library
and incorporates bash, it can declare its dependencies as follows:
propagatedBuildInputs = includedTools ++ [
librelane
…
];
Then to create a devshell with both LibreLane and the plugin available, use this Nix expression:
devShells = librelane.inputs.nix-eda.forAllSystems { withInputs = [librelane self]; } (utils: with utils; {
default = callPackage (librelane.createOpenLaneShell {
extra-python-packages = [
pkgs.librelane_plugin_example
];
}) {};
});