Introduction

Edifice is a package manager and build automation tool adapted to the hardware industry. Edifice has ambition to be an language-agnostique and rust-powered package manager and automation tool. Its goal is to bring a scalable solution (1000+ IP management) to the hardware industry. Edifice is born to answer to scalability limations of the open source projects Fusesoc and Edalize.

Contributing

License

Limitations of Fusesoc

Python project Fusesoc is not able to efficiently load thousants modules from a registry:

  • Python is very slow
  • Fusesoc resolve the dependency three for each command
  • The fileset is not flexible enough
  • Compilation options are common to the whole dependency three
  • Module API and backend tools are not versionned as module
  • Flags has an impact on module dependencies
  • Build are not lockable which prevent reproducibility

Limitations of Edalize

  • Python is very slow
  • Backend API is common to all tools
  • Filesets three is flatenized before being send to backend tool

Configuration files

Module

A module is defined by a file module.toml in a versionned directory.

# module.toml

module_api = "0.1.0"

[module]
name = "module_a"
version = "0.1.0"

[dependencies]
rule_eda = "^1.2.3"
module_b = ">0.2.4"
module_c = "^0.6.1"
module_d = "~1.7.3"
module_e = "2.3.*"

The module version has to respect the semver version syntaxe and the version constraints have to respect the semver containts syntaxe.

Dataset

The transitive data management is done through the file dataset.toml of each module in the tree.

# dataset.toml of module_b

[eda.dataset.dataset_a]
sources = [
  "file_e",
  "file_f",
]
include_directories = []
compilation_options = [
  "+opt_c",
]
prepend = []

# dataset.toml of module_a

[eda.dataset.dataset_a]
sources = [
  "file_a",
  "file_b",
]
include_directories = [
  "include/",
]
compilation_options = [
  "+opt_a",
]
prepend = [
  "module_c.dataset_a",
]

[eda.dataset.dataset_b]
sources = [
  "file_c",
  "file_d",
]
include_directories = [
  "include/",
]
compilation_options = [
  "+opt_a",
]
prepend = [
  "module_b.dataset_a",
  "dataset_a",
]

Target

  • TODO

Dependencies management

Fetch registry

Add dependencies to module

Check module satisfability

Update dependencies version into lock file

Install modules localy

Build generation

Langage agnostique

Remotly cachable artifact

Edifice containes many tools and features:

  • A package manager (like Fusesoc, npm, composert ... etc)
  • A build automation tool (like Edalize, CMake ... etc)
  • Three configurations concept and files:
    • The module (module.toml): The name, the version and the dependencies of the package
    • The dataset (dataset.toml): The management of the transitives data along the dependencies tree
    • The targets (target.toml): The rules to produce the build

Inspirations

The main inspirations of Edifice are: