Coming from Bender¶
Bender is a popular dependency management and filelist generation tool developed by the PULP Platform team.
astli is designed to coexist smoothly with Bender projects and provides an easy, incremental migration path. You don't have to rewrite your existing infrastructure overnight.
What astli reads from Bender.yml¶
If your project directory contains a Bender.yml file, astli automatically reads its declared dependencies, as long as your astli.toml does not define its own [dependencies] table:
- Git dependencies:
gitURLs with semantic versions or explicitrevgit revisions. - Path dependencies: Local
pathreferences. - Remote shorthands: Named remotes and package names, normalized to lowercase following Bender conventions.
What astli ignores in Bender.yml
astli intentionally does not read Bender's sources, defines, or targets:
- Source files are discovered automatically via standard directory scanning (see Packages).
- Conditional compilation targets are represented using Features.
Bender.lockis ignored.astlimaintains its own deterministic lockfile inastli.lock.
Step-by-step migration¶
You can migrate a Bender project to astli in three gradual steps:
Step 1: Use astli on Bender's filelist¶
Without modifying any repository files, you can immediately use astli to check, lint, or trim filelists generated by Bender:
# Generate a complete filelist using Bender
bender script flist-plus -t rtl > design.f
# Check and verify the design with astli
astli check -f design.f --top soc_top
Step 2: Add an astli.toml for formatting and linting¶
Run astli init in your repository root. It writes a minimal astli.toml with the package name inferred directly from Bender.yml. You can then configure formatting preferences, linter waivers, or custom source search directories:
[package]
name = "my_soc"
[fmt]
width = 100
indent = 2
Because your astli.toml omits [dependencies], astli continues to read your dependencies transparently from Bender.yml. You can now run astli fmt, astli lint, and astli check directly across your repository without generating intermediate .f filelists.
Step 3: Transition dependencies to astli.toml¶
When you are ready to manage dependencies natively with astli, run astli init --bender (or manually copy your dependencies). This converts Bender's dependency definitions directly into [dependencies] in astli.toml:
[dependencies]
common_cells = { git = "https://github.com/pulp-platform/common_cells.git", version = "1.38" }
axi = { git = "https://github.com/pulp-platform/axi.git", version = "0.39" }
Once [dependencies] is defined in astli.toml, astli exclusively uses its own native resolver and lockfile.
Target-specific dependencies
astli init --bender omits dependencies that are restricted to specific Bender targets (such as simulation testbenches or FPGA builds). In astli, flow-specific dependencies and conditional compilation are managed declaratively using Features.
Handling version conflicts ([resolve] pinned)¶
When dependency version requirements conflict, Bender interactively prompts the user in the terminal to pick a version (or requires a local override file such as Bender.local).
astli is strictly non-interactive and scriptable: it never halts to prompt for manual user input during dependency resolution. If two packages request incompatible versions, astli stops with an explicit conflict error by default.
To resolve a conflict without modifying transitive upstream manifests, pin the package in [resolve] pinned in your astli.toml:
[resolve]
pinned = ["common_cells"]
When a package is pinned:
astliforces the dependency to whichever version or revision the root package specifies.- Any conflicting downstream requirements that cannot be met are downgraded to informative warnings rather than fatal errors.
Projects with only a Bender.yml
A project that relies solely on Bender.yml has no mechanism to declare pins. If your design encounters version conflicts across its dependencies, you will need to add an astli.toml and declare [resolve] pinned to explicitly resolve them.