{"id":13774417,"url":"https://github.com/stanford-centaur/pono","last_synced_at":"2026-05-05T02:01:34.078Z","repository":{"id":42669919,"uuid":"206835806","full_name":"stanford-centaur/pono","owner":"stanford-centaur","description":"Pono: A flexible and extensible SMT-based model checker","archived":false,"fork":false,"pushed_at":"2026-01-29T21:33:13.000Z","size":5830,"stargazers_count":117,"open_issues_count":29,"forks_count":37,"subscribers_count":7,"default_branch":"main","last_synced_at":"2026-01-30T04:49:32.163Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stanford-centaur.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-09-06T16:41:11.000Z","updated_at":"2026-01-23T01:17:44.000Z","dependencies_parsed_at":"2024-06-18T23:47:08.469Z","dependency_job_id":"cae1cf5d-71d5-46fe-b78a-ca95c889d2da","html_url":"https://github.com/stanford-centaur/pono","commit_stats":null,"previous_names":["upscale-project/pono"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/stanford-centaur/pono","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stanford-centaur%2Fpono","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stanford-centaur%2Fpono/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stanford-centaur%2Fpono/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stanford-centaur%2Fpono/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stanford-centaur","download_url":"https://codeload.github.com/stanford-centaur/pono/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stanford-centaur%2Fpono/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30026166,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-02T23:36:48.274Z","status":"ssl_error","status_checked_at":"2026-03-02T23:33:36.569Z","response_time":60,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-03T17:01:26.547Z","updated_at":"2026-03-02T23:50:15.874Z","avatar_url":"https://github.com/stanford-centaur.png","language":"C++","funding_links":[],"categories":["Formal Verification","C++"],"sub_categories":[],"readme":"[![CI](https://github.com/stanford-centaur/pono/actions/workflows/ci.yml/badge.svg)](https://github.com/stanford-centaur/pono/actions/workflows/ci.yml)\n[![License](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)](https://github.com/stanford-centaur/pono/blob/main/LICENSE)\n\n# Pono: A Flexible and Extensible SMT-Based Model Checker\n\nPono is a performant, adaptable, and extensible SMT-based model checker implemented in C++. It leverages [Smt-Switch](https://github.com/stanford-centaur/smt-switch), a generic C++ API for SMT solving. Pono was developed as the next\ngeneration of [CoSA](https://github.com/cristian-mattarei/CoSA) and thus was originally named _cosa2_.\n\n[Pono](http://wehewehe.org/gsdl2.85/cgi-bin/hdict?e=q-11000-00---off-0hdict--00-1----0-10-0---0---0direct-10-ED--4--textpukuielbert%2ctextmamaka-----0-1l--11-en-Zz-1---Zz-1-home-pono--00-3-1-00-0--4----0-0-11-10-0utfZz-8-00\u0026a=d\u0026d=D18537) is the Hawaiian word for proper, correct, or goodness. It is often used colloquially in the moral sense of \"goodness\" or \"rightness,\" but also refers to \"proper procedure\" or \"correctness.\" We use the word for multiple meanings. Our goal is that Pono can be a useful tool for people to verify the _correctness_ of systems, which is surely the _right_ thing to do.\n\n## Publications\n\n* Makai Mann, Ahmed Irfan, Florian Lonsing, Yahan Yang, Hongce Zhang, Kristopher Brown, Aarti Gupta, Clark W. Barrett: [Pono: A Flexible and Extensible SMT-Based Model Checker](https://link.springer.com/chapter/10.1007/978-3-030-81688-9_22). CAV 2021.\n  * Evaluated [software artifact](https://figshare.com/articles/software/CAV_2021_Artifact_Pono_Model_Checker/14479542).\n* Makai Mann, Amalee Wilson, Yoni Zohar, Lindsey Stuntz, Ahmed Irfan, Kristopher Brown, Caleb Donovick, Allison Guman, Cesare Tinelli, Clark W. Barrett: [Smt-Switch: A Solver-Agnostic C++ API for SMT Solving](https://link.springer.com/chapter/10.1007/978-3-030-80223-3_26). SAT 2021.\n* Makai Mann: [Augmenting transition systems for scalable symbolic model checking](https://searchworks.stanford.edu/view/13972018). PhD thesis, Stanford University, 2021.\n\n## Awards\n\nPono was awarded the Oski Award under its original name _cosa2_ at [HWMCC'19](http://fmv.jku.at/hwmcc19/) for solving the largest number of benchmarks overall.\n\n## Setup\n\n* [optional] Install bison and flex\n  * If you don't have flex installed globally, run `./contrib/setup-flex.sh`\n  * Bison should be available in your OS package manager (Linux) or Homebrew (macOS).\n* Run `./contrib/setup-smt-switch.sh` -- it will build smt-switch with Bitwuzla\n  * [optional] to build with MathSAT (required for interpolation-based model checking) you need to obtain the libraries yourself\n    * note that MathSAT is under a custom non-BSD compliant license and you must assume all responsibility for meeting the conditions\n    * download the solver from https://mathsat.fbk.eu/download.html, unpack it and rename the directory to `./deps/mathsat`\n    * then add the `--with-msat` flag to the `setup-smt-switch.sh` command.\n* Run `./contrib/setup-btor2tools.sh`.\n* Run `./configure.sh`.\n  * if building with mathsat, also include `--with-msat` as an option to `configure.sh`\n* Run `cd build`.\n* Run `make`.\n* [optional] Run `make check` to build and run the tests.\n\n### Dependencies\n\n* Please see the [README of smt-switch](https://github.com/stanford-centaur/smt-switch#dependencies) for required dependencies.\n* Note to Arch Linux users: building Pono will fail if the static library of [GMP](https://gmplib.org/), which is required by [cvc5](https://github.com/cvc5/cvc5/blob/main/INSTALL.rst), is not installed on your system. You can fix it by installing `libgmp-static` from [AUR](https://aur.archlinux.org/packages/libgmp-static).\n\n### Docker\n\nWe provide a Dockerfile for building a container image with Pono and all its dependencies.\nTo build the image locally, run:\n\n```bash\ndocker build -t pono .\n```\n\n(You can replace `docker` with `podman` if you prefer a Docker-compatible alternative.)\n\nNote that the Docker image does not include the MathSAT backend due to licensing restrictions.\nIf you need MathSAT support, please modify the Dockerfile manually to include it.\n\nFor your convenience, we publish the image built from the latest commit of main branch to GitHub Container Registry.\nYou can pull the image with:\n\n```bash\ndocker pull ghcr.io/stanford-centaur/pono:latest\n```\n\n### Profiling\n\nWe link against the [gperftools library](https://github.com/gperftools/gperftools)\nto generate profiling data. To enable profiling, run `./configure.sh`\nwith flag `--with-profiling` and recompile Pono by running `make` in\nthe `build` directory. This assumes that you have installed the\ngperftools library before, e.g., on Ubuntu, run `sudo apt-get install\ngoogle-perftools libgoogle-perftools-dev`.\n\nTo profile, run `./pono --profiling-log=\u003clog-file\u003e ...` where\n`\u003clog-file\u003e` is the path to a file where profiling data is\nwritten. After normal or abnormal (e.g. via sending a signal)\ntermination of Pono, the collected profile data can be analyzed by\nrunning, e.g., `google-pprof --text ./pono \u003clog-file\u003e` to produce a\ntextual profile. See `man google-pprof` for further options.\n\nIn general, see\n[https://github.com/gperftools/gperftools/tree/master/docs](https://github.com/gperftools/gperftools/tree/master/docs)\nfor further information about gperftools.\n\ngperftools is licensed under a BSD 3-clause license, see\n[https://github.com/gperftools/gperftools/blob/master/COPYING](https://github.com/gperftools/gperftools/blob/master/COPYING).\n\n## Existing code\n\n### Transition Systems\n\nThere are two Transition System interfaces:\n\n* FunctionalTransitionSystem in fts.*\n* TransitionSystem in rts.*\n\n### Smt-Switch\n\n[Smt-switch](https://github.com/stanford-centaur/smt-switch) is a C++ solver-agnostic API for SMT solvers. The main thing to remember is that everything is a pointer. Objects might be \"typedef-ed\" with `using` statements, but they're still `shared_ptr`s. Thus, when using a solver or a term, you need to use `-\u003e` accesses.\n\nFor more information, see the example usage in the [smt-switch tests](https://github.com/stanford-centaur/smt-switch/tree/master/tests/btor).\nOther useful files to visit include:\n\n* `smt-switch/include/solver.h`: this is the main interface you will be using\n* `smt-switch/include/ops.h`: this contains all the ops you might need\n  * Note: create indexed ops like `Op(Extract, 7, 4)`\n\n## Python bindings\n\nTo build the `pono` python bindings, first make sure that you have [Cython](https://cython.org/) version \u003e= 3.0.0 installed. Then ensure that `smt-switch` and its python bindings are installed. Finally, you can configure with `./configure.sh --python` and then build normally. The bindings will be built under 'build/python', from where you can install them using `pip`. The sequence of commands would be as follows:\n\n```bash\n# Optional recommended step: start a python virtualenv\n# If you install in the virtualenv, you will need to activate it each time before using pono\n# and deactivate the virtualenv with: deactivate\npython3 -m venv env\nsource ./env/bin/activate\n# Install Python dependencies.\npip install Cython\n# This will download and build smt-switch with bitwuzla and cvc5 in deps/smt-switch.\n./contrib/setup-smt-switch.sh --python\n# Install the smt-switch Python bindings in the virtualenv.\npip install ./deps/smt-switch/build/python\n# Download and build the btor2tools dependency.\n./contrib/setup-btor2tools.sh\n# Configure and build Pono.\n./configure.sh --python\nmake -C build -j4  # change the `-j4` to match the number of CPU cores on your system.\n# Install the built Python bindings in the virtualenv (including the `pytest` dependency for testing).\npip install './build/python[test]'\n# Test the bindings.\npytest ./tests\n```\n\n## Documentation\n\nTo generate documentation from the C++ source files, install [Doxygen](https://www.doxygen.nl/index.html), configure with `./configure.sh --docs`, then build the `docs` target:\n\n```\n# Install Doxygen\n# Ubuntu\nsudo apt-get install doxygen\n# Arch Linux\nsudo pacman -S doxygen\n# macOS\nbrew install doxygen\n\n# Build documentation\n./configure.sh --docs\ncmake --build build -t docs\n\n# Open the HTML index\n# Linux\nxdg-open build/html/index.html\n# macOS\nopen build/html/index.html\n```\n\n## Generating BTOR2 from Verilog\n\nThe best tool for creating BTOR2 from Verilog is [Yosys](https://github.com/YosysHQ/yosys). Yosys has an excellent manual [here](https://yosyshq.readthedocs.io/projects/yosys/en/latest/).\nYou can also run yosys interactively by running yosys with no arguments. Then you can view help messages for each command with: `help \u003ccommand\u003e`. Running `help` with no arguments lists all commands.\n\nA particularly useful command if you're having trouble is `show`, which can show the current state of the circuit in Yosys.\n\n### Yosys Quick Start\n\nBelow is an example file with comments explaining each command that produces a BTOR2 file for [./samples/counter-false.v](./samples/counter-false.v). This should be enough for most use cases.\n\nOnce you have `yosys` installed, copy the text below into `gen-btor.ys` in the top-level of this repository. Then, running `yosys -s gen-btor.ys` will produce the BTOR2 file.\n\n```\n# read in the file(s) -- there can be multiple\n# whitespace separated files, and you can\n# escape new lines if necessary\nread -formal ./samples/counter-false.v;\n\n# prep does a conservative elaboration\n# of the top module provided\nprep -top counter;\n\n# this command just does a sanity check\n# of the hierarchy\nhierarchy -check;\n\n# If an assumption is flopped, you might\n# see strange behavior at the last state\n# (because the clock hasn't toggled)\n# this command ensures that assumptions\n# hold at every state\nchformal -assume -early;\n\n# this processes memories\n# nomap means it will keep them as arrays\nmemory -nomap;\n\n# flatten the design hierarchy\nflatten;\n\n# (optional) uncomment and set values to simulate reset signal\n# use -resetn for an active low pin\n# -n configures the number of cycles to simulate\n# -rstlen configures how long the reset is active (recommended to keep it active for the whole simulation)\n# -w tells it to write back the final state of the simulation as the initial state in the btor2 file\n# another useful option is -zinit which zero initializes any uninitialized state\n# sim -clock \u003cclockpin\u003e -reset \u003cresetpin\u003e -n \u003cnumber of cycles\u003e -rstlen \u003cnumber of cycles\u003e -w \u003ctop_module\u003e\n\n# (optional) use an \"explicit\" clock\n# e.g. every state is a half cycle of the\n# fastest clock\n# use this option if you see errors that\n# refer to \"adff\" or asynchronous components\n# IMPORTANT NOTE: the clocks are not\n# automatically toggled if you use this option\n# clk2fflogic;\n\n# This turns all undriven signals into\n# inputs\nsetundef -undriven -expose;\n\n# This writes to a file in BTOR2 format\nwrite_btor counter-false.btor2\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstanford-centaur%2Fpono","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstanford-centaur%2Fpono","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstanford-centaur%2Fpono/lists"}