Skip to content

UVA-LavaLab/PIMsynth

Repository files navigation

PIMsynth: Bit-Serial Compiler

License

Prerequisite

A Linux environment with apptainer is recommended to ease the build of third-party dependencies:

$ apptainer --version apptainer version 1.3.3 

How to build

Check out this repo and all git submodules:

git clone --recurse-submodules https://github.com/UVA-LavaLab/PIMsynth.git 

Build apptainer sif image:

./apptainer-build.sh 

Build all git submodules:

./apptainer-run.sh build_all.sh 

Run an example:

cd testbench/ ../apptainer-run.sh ./run_benchmark.sh inv_nand 4 digital add_int32 

Methodology

 *.v (verilog input) | v yosys | v *.blif (tech-independent) | v <-- *.genlib (bit-serial ISA) abc | v *.blif (DAG) | v blif translator | v *.c (IR-1, before scheduling) | v clang/llvm | v *.s (IR-2, after scheduling) | v asm translator | v *.hpp (bit-serial micro-program) --> test generator --> PIMeval simulation 

Source Code Organization

Main bit-serial compilation flow:

  • bit_serial_compiler.py: Main entry to call bit-serial compiler

Third-party dependencies:

  • yosys: Yosys logic synthesizer
  • abc: ABC logic synthesizer
  • llvm-project: LLVM compiler
  • PIMeval-PIMbench: PIM simulator and benchmarks

Source files:

  • src-genlib/: GenLib standard library definitions as bit-serial ISA for logic synthesis
  • src-verilog
    • benchmarks: RTL of PIM operations optimized for bit-serial compilation
    • submodules: Foudamental RTL modules (IMPL_TYPE: 0 xor-preferred, 1 maj-preferred)
  • src/
    • blif-translator/: Translating BLIF DAG into IR-1 for scheduling
    • asm-parser/: Translating IR-2 (assembly code after scheduling, register allocation and spilling) into PIM microprograms
    • test-gen/: PIM test program generator
  • testbench/
    • run_benchmark.sh: Helper script to compile a benchmark Verilog with a specific bit-serial ISA and number of registers

For developers

Setup fetch/push remote (skip if you don't modify these git submodules):

# for each git submodule, use originial url to fetch, and use local url to push cd llvm-project git remote set-url --push origin https://github.com/UVA-LavaLab/PIMsynth.git git remote -v cd abc git remote set-url --push origin https://github.com/UVA-LavaLab/PIMsynth.git git remote -v cd yosys git remote set-url --push origin https://github.com/UVA-LavaLab/PIMsynth.git git remote -v cd PIMeval-PIMbench git remote set-url --push origin https://github.com/UVA-LavaLab/PIMsynth.git git remote -v 

Build apptainer sif image:

# command to build apptainer sif image apptainer build myapptainer.sif myapptainer.def # command to run apptainer apptainer exec myapptainer.sif <command> # helper utility to build apptainer sif image ./apptainer-build.sh # helper utility to run apptainer ./apptainer-run.sh <command> 

Build LLVM (must be under llvm-build):

mkdir llvm-build cd llvm-build ../apptainer-run.sh cmake ../llvm-project/llvm -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" -G "Unix Makefiles" ../apptainer-run.sh make -j10 

Build abc:

cd abc ../apptainer-run.sh make -j10 

Build yosys:

cd yosys # in case yosys/abc submodule has not been checked out git submodule update --init # build ../apptainer-run.sh make -j10 

Build PIMeval:

cd PIMeval-PIMbench ../apptainer-run.sh make -j10 

Run bit-serial compiler after building all submodules:

cd testbench/ ../apptainer-run.sh ./run_benchmark.sh inv_nand 4 digital add_int32 

Bit-Serial Compiler UI

 --------------------- | Bit-Serial Compiler | --------------------- usage: bit_serial_compiler.py [-h] [--verilog [files] [[files] ...]] [--genlib [file]] [--blif [file]] [--c [file]] [--asm [file]] [--num-regs N] [--output [filename]] [--outdir [path]] [--from-stage [stage]] [--to-stage [stage]] [--clang-g] options: -h, --help show this help message and exit --verilog [files] [[files] ...] Input Verilog files --genlib [file] Input GenLib file --blif [file] Input BLIF file --c [file] Input C file --asm [file] Input ASM file --num-regs N Number of registers 2~7 --output [filename] Output filename without suffix --outdir [path] Output location, default current dir --from-stage [stage] From stage: verilog (default), blif, c, asm, pim --to-stage [stage] To stage: verilog, blif, c, asm, pim (default) --clang-g Toggle clang -g, default true how to use: Input requirements: --from-stage verilog require --verilog and --genlib --from-stage blif require --blif --from-stage c require --c --from-stage asm require --asm 

Citation

If you use this repository in your research, please cite our paper:

@article{guo2025pimsynth, title={PIMsynth: A Unified Compiler Framework for Bit-Serial Processing-In-Memory Architectures}, author={Guo, Deyuan and Gholamrezaei, Mohammadhosein and Hofmann, Matthew and Venkat, Ashish and Zhang, Zhiru and Skadron, Kevin}, journal={IEEE Computer Architecture Letters}, year={2025}, publisher={IEEE} } 

Contact

  • Deyuan Guo - dg7vp AT virginia DOT edu
  • Mohammadhosein Gholamrezaei - uab9qt AT virginia DOT edu
  • Kevin Skadron - skadron AT virginia DOT edu

About

Bit-serial compiler for PIM

Resources

License

Stars

Watchers

Forks

Contributors 2

  •  
  •