Skip to content

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: git URLs with semantic versions or explicit rev git revisions.
  • Path dependencies: Local path references.
  • 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.lock is ignored. astli maintains its own deterministic lockfile in astli.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:

  • astli forces 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.