CIRCT

Circuit IR Compilers and Tools

Compiling CIRCT and PyCDE

PyCDE is compiled as a component of CIRCT which pulls in the LLVM/MLIR project as a submodule. As such, compiling it is complex and takes some time. If you’re not a CIRCT or PyCDE developer, use pip.

Cloning the repo 

If you havent already, you need to clone the CIRCT repo. Unless you already have contributor permissions to the LLVM project, the easiest way to develop (with the ability to create and push branches) is to fork the repo in your GitHub account. You can then clone your fork. The clone command should look like this:

git clone git@github.com:<your_github_username>/circt.git <optional_repo_name>

If you don’t envision needing that ability, you can clone the main repo following the directions in step 2 of the GettingStarted page.

After cloning, navigate to your repo root (circt is the default) and use the following to pull down LLVM:

git submodule update --init

PyCDE Installation 

Installing and Building with Wheels 

If you are using a fork, you’ll need the git tags since the package versioning step requires them:

git remote add upstream git@github.com:llvm/circt.git
git fetch upstream --tags

The simplest way to compile PyCDE for local use is to install it with the pip install command:

$ cd circt
$ pip install frontends/PyCDE --use-feature=in-tree-build

If you just want to build the wheel, use the pip wheel command:

$ cd circt
$ pip wheel frontends/PyCDE --use-feature=in-tree-build

This will create a pycde-<version>-<python version>-<platform>.whl file in the root of the repo.

Manual Compilation 

Follow these steps to setup your repository for installing PyCDE via CMake. Ensure that your repo has the proper Python requirements by running the following from your CIRCT repo root:

python -m pip install -r frontends/PyCDE/python/requirements.txt

Although not scrictly needed for PyCDE develoment, scripts for some tools you might want to install are located in utils/ (Verilator, OR-Tools):

utils/get-verilator.sh
utils/get-or-tools.sh

Install PyCDE with CMake. PyCDE requires cmake version >= 3.21:

mkdir build
cd build
cmake \
    -DCMAKE_BUILD_TYPE=Debug \
    -DLLVM_ENABLE_PROJECTS=mlir \
    -DLLVM_ENABLE_ASSERTIONS=ON \
    -DLLVM_EXTERNAL_PROJECTS=circt \
    -DLLVM_EXTERNAL_CIRCT_SOURCE_DIR=.. \
    -DMLIR_ENABLE_BINDINGS_PYTHON=ON \
    -DCIRCT_BINDINGS_PYTHON_ENABLED=ON \
    -DCIRCT_ENABLE_FRONTENDS=PyCDE
    -G Ninja ../llvm/llvm

Alternatively, you can pass the source and build paths to the CMake command and build in the specified folder:

cmake \
    -DCMAKE_BUILD_TYPE=Debug \
    -DLLVM_ENABLE_PROJECTS=mlir \
    -DLLVM_ENABLE_ASSERTIONS=ON \
    -DLLVM_EXTERNAL_PROJECTS=circt \
    -DMLIR_ENABLE_BINDINGS_PYTHON=ON \
    -DCIRCT_BINDINGS_PYTHON_ENABLED=ON \
    -DCIRCT_ENABLE_FRONTENDS=PyCDE \
    -G Ninja \
    -DLLVM_EXTERNAL_CIRCT_SOURCE_DIR=<your_circt_repo_root_path> \
    -B<path_to_desired_build_dir> \
    <your_circt_repo_root_path>/llvm/llvm

Afterwards, use the following commands to ensure that CIRCT and PyCDE are built and the tests pass:

ninja -C <path_to_your_circt_build> check-circt
ninja -C <path_to_your_circt_build> check-pycde
ninja -C <path_to_your_circt_build> check-pycde-integration

If you want to use PyCDE after compiling it, you must add the core CIRCT bindings and PyCDE to your PYTHONPATH. This is quite helpful if you are hacking on PyCDE as you don’t have to run an install after each Python file change since Ninja uses links in the build dir rather than copying the files as it does during install.

export PYTHONPATH="<full_path_to_your_circt_build>/tools/circt/python_packages/pycde"

If you are installing PyCDE through ninja install, the libraries and Python modules will be installed into the correct location automatically.