Giter VIP home page Giter VIP logo

cdotrus / orbit Goto Github PK

View Code? Open in Web Editor NEW
22.0 3.0 2.0 51.86 MB

An agile package manager and extensible build tool for HDLs

Home Page: https://chaseruskin.github.io/orbit/

License: GNU General Public License v3.0

Rust 96.73% Python 2.50% VHDL 0.25% Dockerfile 0.28% Shell 0.07% Just 0.16%
hardware hdl vhdl command-line-tool cross-platform package-manager verilog systemverilog agile agile-development build-tool

orbit's Introduction

Orbit

Pipeline GitHub Pages License DockerHub Downloads

Orbit is an agile package manager and extensible build tool for hardware description languages (HDL).

Live at the cutting edge of hardware design

The boom of AI and emerging workloads have shown just how fast new advancements can be made in models and algorithms. Today's hardware is no longer good enough to meet the immediate demands of tomorrow's innovations; today's hardware must shift to a more agile development approach. It's time to build tomorrow's hardware, today. It's time to live at the cutting edge of hardware design.

An agile package manager designed to minimize technical debt

As codebases scale and increase in complexity, it becomes of upmost importance to have the right system in place to efficiently manage the increasing number of resources. Without the right system, the codebase can become bogged down by technical debt, leaving you stuck in yesterday's designs.

However, using just any package management system does not guarantee that technical debt is minimized. Poorly-designed package managers will simply shift the technical debt to different resources, while a well-designed package manager will minimize the overall amount of technical debt. With minimal technical debt, you can bring up tomorrow's hardware today. Orbit is an agile package manager designed to minimize technical debt.

An extensible build tool designed to support any workflow

Hardware development involves many complex processes, from running simulations to generating bitstreams. Orbit simplifies the build process into two stages: planning and execution. Orbit performs the planning of a build by resolving all HDL source code dependencies to produce a single file listing the topologically sorted source file order. From here, Orbit invokes any user-configured target to execute and process the planned list of source files. By allowing users to add their own execution processes, Orbit is an extensible build tool designed to support any workflow.

Free and open source

Orbit is available free to use and open source to encourage adoption, contribution, and integration among the hardware community. We rely on the open source community for feedback and new ideas, while remaining focused on our design goals and principles.

Orbit's use case is targeted toward anyone interested in developing digital hardware; this includes industrial, academic, and personal settings. Create your next commerical product, university lab assignment, or personal project, using a tool that is tailored to today's advanced development processes.

Prebuilt binaries are available for Linux, MacOS, and Windows with no dependencies. Visit the releases page for the latest version. Working on a different platform? No problem, building from source is easy with Cargo, Rust's default package manager. Use docker? We have docker images available too. See Installing for complete details.

For more information on getting started and how to use Orbit in your workflow, check out the Book of Orbit.

Simple and intuitive to use

Orbit manages your project by turning it into a package (referred to as an ip) with the addition of a single file: "Orbit.toml."

cpu/
├─ Orbit.toml
├─ rtl/
│  ├─ ctrl.vhd
│  ├─ datapath.v
│  └─ top.vhd
└─ sim/
   └─ top_tb.sv

The "Orbit.toml" file is a simple file written in TOML syntax that requires only a couple fields, such as the ip's name and version, to get setup.

filename: Orbit.toml

[ip]
name = "cpu"
version = "1.0.0"

[dependencies]
gates = "2.0.0"

Low effort integration

To encourage code reuse and faster development cycles, Orbit includes HDL-specific commands to integrate designs across ips. For example, Orbit can display HDL code snippets of other known design units to be instantiated within your local ip.

$ orbit get and_gate --ip gates:2.0.0 --library --signals --instance
library gates;

signal a : std_logic;
signal b : std_logic;
signal x : std_logic;

u_and_gate : entity gates.and_gate
  port map(
    a => a,
    b => b,
    x => x
  );

Flexibility in use

Since Orbit focuses on efficiently managing the HDL source code and minimizing its associated technical debt, users have the power to add their own execution targets to the build process. This is accomplished by Orbit performing the planning of a build process to generate a single file, called a blueprint, that lists the topologically-sorted order of source files. After planning the build, Orbit invokes the user's target to perform the execution process on the list of source files.

filename: blueprint.tsv

VHDL	gates	/users/chase/.orbit/cache/gates-2.0.0-7f4d8c7812/rtl/nand_gate.vhd
VHDL	gates	/users/chase/.orbit/cache/gates-2.0.0-7f4d8c7812/rtl/and_gate.vhd
VLOG	cpu	/users/chase/projects/cpu/rtl/datapath.v
VHDL	cpu	/users/chase/projects/cpu/rtl/ctrl.vhd
VHDL	cpu	/users/chase/projects/cpu/rtl/top.vhd
SYSV	cpu	/users/chase/projects/cpu/sim/top_tb.sv

Add a target by writing a script to accept Orbit's generated blueprint file for whatever EDA tools you prefer once, and use it across all future ips.

Highlights

What makes Orbit an agile package manager for HDLs? Here are some of its key features:

  • Orbit acts as the intermediary between your source code and back end EDA tools, automating the upkeep process to minimize technical debt as your codebase evolves over time

  • Supports VHDL, Verilog, and SystemVerilog hardware description languages

  • Reproduce results across any environment with Orbit through its automatic handling of lockfiles and checksums

  • Overcome namespace collisions, a problem inherent to VHDL and Verilog, through a custom aglorithm that dynamically transforms conflicting design names called dynamic symbol transformation

  • Because of dynamic symbol transformation, multiple versions of the same design unit (or more broadly, design units given the same identifier) are allowed in the same build under two simple constraints

  • Quickly navigate through HDL source code to read its inline documentation and review a design unit's implementation with Orbit's ability to jump to and display HDL code segments

  • Integrate existing design units across projects faster than ever with Orbit's ability to display valid HDL code snippets for design unit instantiation

  • Explore your evolving codebase to identify the projects you need next with Orbit's ability to quickly search through known ip by filtering based on keywords, status, and name

  • Keep your source code independent of vendor tools and avoid vendor lock-in with Orbit's vendor-agnostic interface to back end EDA tools

  • Continue to use your preferred version control system (or none) due to Orbit's flexible approach to being version control system agnostic

  • Review high-level design unit circuit tree hierarchies at the HDL level or ip level

  • No longer worry about manually organizing a design unit's order of dependencies with Orbit's built-in ability to tokenize HDL source code and automatically identify valid references to other design units

  • Linux, MacOS, and Windows are fully supported with zero dependencies

  • Docker images and GitHub Actions are available to support CI/CD workflows

  • Manifest files that mark a project as an ip only require a few user-defined fields to get setup

  • Write a target for your preferred EDA tools once, and reuse across projects with Orbit's support for configuration files

And these are only a few of Orbit's features! Download Orbit and read its documentation today to discover everything Orbit provides as an agile package manager for HDLs.

Installing

Orbit has prebuilt binaries for MacOS, Windows, and Linux. See the releases page to download the latest version, or build from source using Cargo, Rust's default package manager. See Installing for more details on getting Orbit up and running.

Examples

A fictitious organization, "Hyperspace Labs", exists for the purpose of demonstrating and learning how to leverage Orbit in a real development setting. No identification with actual persons, places, buildings, and products is intended or should be inferred.

The projects and code for Hyperspace Labs are walked through in the tutorials section.

The final code repositories for Hyperspace Labs are found here.

Documentation

Read the Book of Orbit for comprehensive documentation composed of tutorials, user guides, topic guides, references, and command manuals.

Orbit brings an agile approach to hardware development that minimizes technical debt through its available commands related to ip integration and build automation:

Orbit is an hdl package manager and build tool.

Usage:
    orbit [options] [command]

Commands:
    new             create a new ip
    init            initialize an ip from an existing project
    view            display metadata of an ip
    read            navigate hdl design unit source code
    get             fetch an entity
    tree            view the dependency graph
    lock            save the world state of the current ip
    test, t         run a test
    build, b        plan and execute a target
    publish         post an ip to a channel
    search          browse the ip catalog 
    download        request packages from the internet
    install         store an immutable reference to an ip
    env             print orbit environment information
    config          modify configuration values
    remove          uninstall an ip from the catalog

Options:
    --version       print version information and exit
    --upgrade       check for the latest orbit binary
    --force         bypass interactive prompts
    --color <when>  coloring: auto, always, never
    --help, -h      print help information

Use 'orbit help <command>' for more information about a command.

License

This program is free software distributed under the terms of the GNU General Public License version 3 or later. You may use, modify, and redistribute the program as you wish but if you distribute modifications you must preserve the license text and copyright notices, and also make the modified source code available to your users.

See LICENSE.

Sponsoring

Orbit has yet to have its first sponsor! I initially got inspiration for this project during my first internship with NASA Glenn Research Center in 2021, and started working on this project in my free time throughout my undergraduate studies at the University of Florida. Since then, I have continued to work on this project whenever possible throughout my graduate studies without any direct funding. If you use Orbit, please consider sponsoring; any amount is very much appreciated.

Being a sponsor not only keeps this project going, but enables you or your organization to have additional perks, such as prioritized issues and feature requests, being advertised in our documentation, and direct support for configuring Orbit for your specialized use case. See SPONSORING.

Contributing

See CONTRIBUTING.

orbit's People

Contributors

chaseruskin avatar gatordevin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

orbit's Issues

Orbit Windows Install Not Working

When running the windows installer I receive the following error.

installation size: 10.74 MB
default installation path: C:\Users\gator\AppData\Local\Programs
enter installation path or press enter to continue:
set installation path: C:\Users\gator\AppData\Local\Programs
Install? [y/n]
y
error: The system cannot find the file specified. (os error 2)
press enter to exit

It successfully creates an orbit directory at the folder location specified but fails after that.

To Reproduce
Steps to reproduce the behavior:

  1. Download release orbit-0.8.7-x86_64-windows.zip
  2. Extract folder into Downloads
  3. Run install file
  4. Press enter to use default install path and y to install to see error

Expected behavior
I would expect the install to continue rather than the script to fail.

Desktop (please complete the following information):

  • OS: Windows 11 64 bit
  • Version 10.0.22621

`cargo install --git ...` fails to find `clif` dependency, but building from source works fine.

Describe the bug
Running cargo install --git https://github.com/cdotrus/orbit.git --tag 0.12.0 fails. However, cloning the repo and running cargo build seems to resolve the dependency just fine, and the executable works.

To Reproduce
Steps to reproduce the behavior:

  1. Run cargo install --git https://github.com/cdotrus/orbit.git (optionally with --tag 0.12.0)
  2. See error
  3. Clone the repo and run cargo build
  4. See a successful build

Expected behavior
cargo install should resolve the dependency.

Screenshots

❯ cargo install --git https://github.com/cdotrus/orbit.git --tag 0.12.0 
    Updating git repository `https://github.com/cdotrus/orbit.git`
  Installing orbit v0.12.0 (https://github.com/cdotrus/orbit.git?tag=0.12.0#7c410599)
    Updating git repository `https://github.com/cdotrus/clif`
error: failed to compile `orbit v0.12.0 (https://github.com/cdotrus/orbit.git?tag=0.12.0#7c410599)`, intermediate artifacts can be found at `/tmp/cargo-installMEZpsS`.
To reuse those artifacts with a future compilation, set the environment variable `CARGO_TARGET_DIR` to that path.

Caused by:
  failed to get `clif` as a dependency of package `orbit v0.12.0 (/home/benjamin/.cargo/git/checkouts/orbit-f051ae44dadefe9d/7c41059)`

Caused by:
  failed to load source for dependency `clif`

Caused by:
  Unable to update https://github.com/cdotrus/clif?tag=0.1.5

Caused by:
  failed to find tag `0.1.5`

Caused by:
  reference 'refs/remotes/origin/tags/0.1.5' not found; class=Reference (4); code=NotFound (-3)

Desktop (please complete the following information):

❯ lsb_release --all
LSB Version:	n/a
Distributor ID:	openSUSE
Description:	openSUSE Tumbleweed
Release:	20240520
Codename:	n/a

❯ rustup show
Default host: x86_64-unknown-linux-gnu
rustup home:  /home/benjamin/.rustup

stable-x86_64-unknown-linux-gnu (default)
rustc 1.78.0 (9b00956e5 2024-04-29)

Additional context
The URL in Cargo.toml, https://github.com/cdotrus/clif, redirects to https://github.com/cdotrus/cliproc. Perhaps updating it will fix the problem?

I'm also wondering if this is an upstream issue with cargo.

Create installer program

Big Idea

The installation process should be fast and easy for users to get working with orbit.

  1. Download the compressed contents generated from Github Actions.
  2. Decompress the file to see installer executable, binary, potentially other misc. files such as the license and checksum.
  3. Run the installer (also a rust binary) to automate setup steps.
  4. Test running orbit with $ orbit --version on the command-line.

What the installer should do

  1. Verify the application is correct (check the checksum of the binary with the computed hash in a file included in download)
  2. Create new folder directory for ~/.orbit.
  3. Move downloaded contents to installation destination.
  4. Prepend orbit's path to user's PATH environment variable (according to operating system).

Add an auto-generated CHANGELOG script

Big Idea

To keep the project organized and well-maintained, releases should be documented with notable changes. To minimize the amount of overhead on the developers, a script can be created to parse git commits and group them accordingly into a nice CHANGELOG.md file to post with every release.

Details

The script will allow for "prefixes" to be attached to notable commit messages such as feat:, fix:, mod:, docs:, and test:. The script should filter these prefixes to formulate a changelog from the last tag in the branch (previous version) to the new version requested in the Cargo.toml manifest.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.