Skip to content
/ Phi Public

Hardware description language that tries not to suck

License

Notifications You must be signed in to change notification settings

donn/Phi

Repository files navigation

Φ Phi (Alpha)

macOS CI Linux CI

Phi is a pure-ish RTL hardware description language based on Verilog that aims to be safer and more explicit. It was my undergrad thesis project.

Phi aims to have:

  • No behavioral ambiguity
  • A clear definition and meta-definition divide

Syntactically, it takes a lot from C/C++/Swift. Semantically, it takes the best parts of Verilog.

Phi supports Linux, macOS, and Windows with MSYS2.

Examples

Counter

module Counter(
    clock: Input,
    reset: Input,
    enable: Input,
    output: Output[31..0]
) {
    Register[31..0] counter = 32b0
    counter.clock = clock
    counter.reset = reset
    counter.data = counter &+ 32b1
    counter.enable = enable

    output = counter
}

Dependencies

Running

  • A reasonably recent libstdc++.

Building

  • A POSIX environment
  • A C++17 compiler that supports standard C++17
    • No GCC or Clang specific extensions are used. Any used by accident are a bug we are interested in fixing.
    • We still recommend Clang + LLDB for debugging.
  • Git (for submodules)
  • GNU Make 3.8.1+
  • GNU Bison 3.0.4+
  • LLVM 14.0+
  • Ruby 2.3+
  • zlib

macOS

Install Xcode 9.0 or higher from the App Store.

For the other dependencies, we recommend Homebrew. Install it using the command in the link provided, then invoke:

    brew install ruby bison llvm

This will take some time, llvm is big.

You will need to add bison to PATH, as brew won't. Do this however you want: a suggestion is to add this to your shell's profile:

export BISON="/usr/local/opt/bison/bin/bison"

You will also need to expose LLVM Config to the compiler, as brew also won't. Again, it is suggested to add this to your shell's profile:

export LLVM_CONFIG="/usr/local/opt/llvm/bin/llvm-config"

(For the default shells, that's ~/.bash_profile on Mojave and below, and ~/.zprofile on Catalina and above.)

GNU/Linux

Install git, gcc, make and bison using your package manager.

If you have Clang and you want to use it, you can export and set the CC and CXX environment variables to clang and clang++ respectively.

Debian-based OSes (incl. Ubuntu, elementary...)

Phi has been tested and is working on Ubuntu 18.04, 19.04 and their derivatives.

Using apt...

    sudo apt-get install -y build-essential git make llvm-11-dev zlib1g-dev bison ruby

If you're into clang...

    sudo apt-get install clang lldb

Do note you'll need to expose LLVM Config to the compiler- it is suggested to add this to your shell's profile.

export LLVM_CONFIG="llvm-config-11"

Windows with MSYS2

First, get MSYS2-x86_64 if you haven't already.

pacman -S git make mingw-w64-x86_64-gcc bison mingw-w64-x86_64-llvm ruby

You can still also use Clang and lldb if you're into that:

pacman -S mingw-w64-x86_64-clang lldb

We are interested in supporting Visual Studio in the future.

Build Instructions

Run git submodule update --init --recursive --depth 1.

We use open source libraries for various functions, and they're all imported using git submodules.

You can then invoke either make or make release. The former produces a debug binary, which is slower but packs more features. It is more suitable for doing dev work on the actual compiler. If you intend on using the Phi compiler itself, we recommend make release.

Usage Instructions

./phic can be used to invoke Phi. It's a plain binary. You can write ./phi --help for more information, but the short story is, to invoke it write ./phi <phi source file>. Currently just the one is supported. If there are no errors returned, it creates a file with the same name as the filename given with ".sv" appended.

⚖️ Copyright & Licensing

©2019-2021 The Phi Authors. Phi is available under the Apache 2.0 license, available at the root of this project as 'License'.

Phi was partially developed as part of senior project coursework at the American University in Cairo.

Special Thanks

  • Prof. Shalan for consistent input and encouragement.
  • Genivia/RE-flex, our primary dependency, for not breaking the API and the CLI every three seconds like some libraries do.