Dependency Sets
What are Dependency Sets?
Dependency sets are named collections of package dependencies. They allow you to define different dependency profiles for different scenarios, such as development vs. release, or different build targets.
Why Use Dependency Sets?
Separate Concerns
Development and release often need different dependencies:
Development needs:
Testing frameworks (pytest, unittest)
Debugging tools
Documentation generators
Linters and formatters
Build tools
Release needs:
Only runtime dependencies
Minimal footprint
No development tools
Example: A verification IP might depend on UVM libraries at runtime, but also need waveform viewers and coverage tools during development.
Multiple Build Targets
Different configurations may need different dependencies:
FPGA vs ASIC builds
Simulation vs synthesis
Different test suites
Platform-specific dependencies
Faster Updates
By selecting only the dependencies you need, ivpm update runs faster and uses
less disk space.
Defining Dependency Sets
Basic Structure
Define dependency sets in your ivpm.yaml:
package:
name: my-project
default-dep-set: default-dev # Default when not specified
dep-sets:
- name: default # Release dependencies
deps:
- name: runtime-lib
url: https://github.com/org/runtime-lib.git
- name: default-dev # Development dependencies
deps:
- name: runtime-lib
url: https://github.com/org/runtime-lib.git
- name: pytest
src: pypi
- name: test-framework
url: https://github.com/org/test-framework.git
Standard Names
While you can use any names, IVPM recognizes these standard names:
defaultRelease/runtime dependencies. Use this for packages you’re distributing.
default-devDevelopment dependencies. Includes everything from
defaultplus development tools.
Using Dependency Sets
Selecting a Set
On the command line:
# Use development dependencies (default if default-dep-set is set)
ivpm update
# Explicitly use development dependencies
ivpm update -d default-dev
# Use release dependencies
ivpm update -d default
# Use custom dependency set
ivpm update -d fpga-build
Setting the default:
package:
name: my-project
default-dep-set: default-dev
If default-dep-set is specified, that set is used when no -d option
is given to ivpm update.
Complete Examples
Example 1: Simple Dev/Release Split
package:
name: uart-ip
default-dep-set: default-dev
dep-sets:
- name: default
deps:
- name: wishbone-if
url: https://github.com/vendor/wishbone.git
branch: v1.0
- name: default-dev
deps:
- name: wishbone-if
url: https://github.com/vendor/wishbone.git
branch: v1.0
- name: cocotb
src: pypi
- name: vcd-tools
url: https://github.com/tools/vcd.git
Example 2: Multiple Build Targets
package:
name: soc-design
default-dep-set: sim
dep-sets:
- name: sim
deps:
- name: cpu-core
url: https://github.com/org/cpu.git
- name: verilator
url: https://github.com/verilator/verilator.git
- name: fpga
deps:
- name: cpu-core
url: https://github.com/org/cpu.git
- name: xilinx-ips
url: https://github.com/org/xilinx.git
- name: asic
deps:
- name: cpu-core
url: https://github.com/org/cpu.git
- name: pdk-libs
url: https://github.com/org/pdk.git
Hierarchical Dependency Sets
When a dependency has its own ivpm.yaml, you can control which of its
dependency sets is loaded.
Dependency Set Inheritance
By default, sub-packages inherit the parent’s dependency set name:
Root Project
dep-set: "default-dev"
↓
Dependency A (uses "default-dev")
↓
Sub-dependency A1 (uses "default-dev")
Example:
# Root project
package:
name: root-project
dep-sets:
- name: default-dev
deps:
- name: sub-package
url: https://github.com/org/sub.git
# No dep-set specified → inherits "default-dev"
When ivpm update -d default-dev runs:
Loads
root-projectwithdefault-devFetches
sub-packageLoads
sub-packagewithdefault-dev(inherited)
Overriding Dependency Sets
You can explicitly specify which dependency set a sub-package should use:
package:
name: root-project
dep-sets:
- name: default-dev
deps:
- name: library-a
url: https://github.com/org/library-a.git
dep-set: default # Use release deps from library-a
- name: test-tools
url: https://github.com/org/tools.git
dep-set: default-dev # Use dev deps from tools
Use case: Include a third-party library’s release dependencies even when developing, to avoid pulling in all their development tools.
Default Dependency Set for Sub-Packages
You can set a default dep-set that all sub-packages will use:
package:
name: root-project
dep-sets:
- name: default-dev
default-dep-set: default # All sub-packages use "default"
deps:
- name: library-a
url: https://github.com/org/library-a.git
# Uses "default" (from default-dep-set)
- name: library-b
url: https://github.com/org/library-b.git
dep-set: default-dev # Override: use dev deps
Dependency Set Diagram
┌──────────────────────────────────────────────────┐
│ Root Project: ivpm update -d default-dev │
│ default-dep-set in dep-set: default │
└────────┬─────────────────────────────────────────┘
│
├─ Library A (dep-set: not specified)
│ → Uses "default" (from parent's default-dep-set)
│ ├─ Sub-dep A1 → Uses "default" (inherited)
│ └─ Sub-dep A2 → Uses "default" (inherited)
│
├─ Library B (dep-set: default-dev)
│ → Uses "default-dev" (explicitly overridden)
│ └─ Sub-dep B1 → Uses "default-dev" (inherited)
│
└─ Tool C (dep-set: not specified)
→ Uses "default" (from parent's default-dep-set)
Common Patterns
Pattern 2: Development Tools Only
Keep development tools completely separate:
dep-sets:
- name: default
deps:
- name: runtime-lib
url: https://github.com/org/runtime.git
- name: tools
deps:
- name: linter
src: pypi
- name: formatter
src: pypi
Usage: ivpm update -d default && ivpm update -d tools
Pattern 3: Conditional Dependencies
Use different dependency sets for optional features:
dep-sets:
- name: minimal
deps:
- name: core
url: https://github.com/org/core.git
- name: with-gui
deps:
- name: core
url: https://github.com/org/core.git
- name: gui-toolkit
url: https://github.com/org/gui.git
- name: with-plugins
deps:
- name: core
url: https://github.com/org/core.git
- name: plugin-system
url: https://github.com/org/plugins.git
Best Practices
Use standard names (
default,default-dev) for consistencySet default-dep-set in your project root for developer convenience
Keep release deps minimal - only include what’s needed at runtime
Document custom sets - explain when to use each set
Control sub-dependencies - use
dep-setoverride to avoid pulling excess depsTest both profiles - ensure
defaultworks without dev tools
Troubleshooting
Missing Dependency Set
Error: Dep-set <name> is not present in project <project>
Solution: Check that:
The dep-set is defined in the project’s
ivpm.yamlThe name matches exactly (case-sensitive)
If using
dep-setoverride, the target package has that set
Package Not Loading
Issue: Expected package not appearing in packages/
Check:
Is it in the active dependency set?
Run
ivpm update -d <set-name>with the correct setCheck if
deps: skipis set on any dependencies
Wrong Dependencies Loaded
Issue: Getting development tools when you wanted release deps
Solution:
Check
default-dep-setin rootivpm.yamlExplicitly specify:
ivpm update -d defaultCheck
default-dep-setin each dependency set
See Also
Core Concepts - Understanding IVPM’s model
Package Types & Sources - Complete dependency attribute reference