Skip to main content

Python Electronic Design Automation

Project description

PyEDA is a Python library for electronic design automation.

Read the docs!

https://travis-ci.org/cjdrake/pyeda.png?branch=master

Features

  • Symbolic Boolean algebra with a selection of function representations:

    • Logic expressions

    • Truth tables, with three output states (0, 1, “don’t care”)

    • Reduced, ordered binary decision diagrams (ROBDDs)

  • SAT solvers:

  • Formal equivalence

  • Multi-dimensional bit vectors

  • DIMACS CNF/SAT parsers

  • Logic expression parser

Download

Bleeding edge code:

$ git clone git://github.com/cjdrake/pyeda.git

For release tarballs and zipfiles, visit PyEDA’s page at the Cheese Shop.

Installation

Latest released version using setuptools:

$ easy_install pyeda

Latest release version using pip:

$ pip install pyeda

Installation from the repository:

$ python setup.py install

Logic Expressions

Invoke your favorite Python terminal, and invoke an interactive pyeda session:

>>> from pyeda.inter import *

Create some Boolean expression variables:

>>> a, b, c, d = map(exprvar, "abcd")

Construct Boolean functions using overloaded Python operators: ~ (NOT), | (OR), ^ (XOR), & (AND), >> (IMPLIES):

>>> f0 = ~a & b | c & ~d
>>> f1 = a >> b
>>> f2 = ~a & b | a & ~b
>>> f3 = ~a & ~b | a & b
>>> f4 = ~a & ~b & ~c | a & b & c
>>> f5 = a & b | ~a & c

Construct Boolean functions using standard function syntax:

>>> f10 = Or(And(Not(a), b), And(c, Not(d)))
>>> f11 = Implies(a, b)
>>> f12 = Xor(a, b)
>>> f13 = Xnor(a, b)
>>> f14 = Equal(a, b, c)
>>> f15 = ITE(a, b, c)

Construct Boolean functions using higher order operators:

>>> f20 = Nor(a, b, c)
>>> f21 = Nand(a, b, c)
>>> f22 = OneHot(a, b, c)
>>> f23 = OneHot0(a, b, c)

Investigate a function’s properties:

>>> f0.support
frozenset({a, b, c, d})
>>> f0.inputs
(a, b, c, d)
>>> f0.top
a
>>> f0.degree
4
>>> f0.cardinality
16
>>> f0.depth
2

Factor complex expressions into only OR/AND and literals:

>>> f11.factor()
Or(~a, b)
>>> f12.factor()
Or(And(~a, b), And(a, ~b))
>>> f13.factor()
Or(And(~a, ~b), And(a, b))
>>> f14.factor()
Or(And(~a, ~b, ~c), And(a, b, c))
>>> f15.factor()
Or(And(a, b), And(~a, c))

Restrict a function’s input variables to fixed values, and perform function composition:

>>> f0.restrict({a: 0, c: 1})
Or(b, ~d)
>>> f0.compose({a: c, b: ~d})
Or(And(~c, ~d), And(c, ~d))

Test function formal equivalence:

>>> f2.equivalent(f12)
True
>>> f4.equivalent(f14)
True

Investigate Boolean identities:

# Law of double complement
>>> ~~a
a

# Idempotent laws
>>> a | a
a
>>> a & a
a

# Identity laws
>>> a | 0
a
>>> a & 1
a

# Dominance laws
>>> a | 1
1
>>> a & 0
0

# Commutative laws
>>> (a | b).equivalent(b | a)
True
>>> (a & b).equivalent(b & a)
True

# Associative laws
>>> a | (b | c)
Or(a, b, c)
>>> a & (b & c)
And(a, b, c)

# Distributive laws
>>> (a | (b & c)).to_cnf()
And(Or(a, b), Or(a, c))
>>> (a & (b | c)).to_dnf()
Or(And(a, b), And(a, c))

# De Morgan's laws
>>> Not(a | b).factor()
And(~a, ~b)
>>> Not(a & b).factor()
Or(~a, ~b)

# Absorption laws
>>> (a | (a & b)).absorb()
a
>>> (a & (a | b)).absorb()
a

Perform Shannon expansions:

>>> a.expand(b)
Or(And(a, ~b), And(a, b))
>>> (a & b).expand([c, d])
Or(And(a, b, ~c, ~d), And(a, b, ~c, d), And(a, b, c, ~d), And(a, b, c, d))

Convert a nested expression to disjunctive normal form:

>>> f = a & (b | (c & d))
>>> f.depth
3
>>> g = f.to_dnf()
>>> g
Or(And(a, b), And(a, c, d))
>>> g.depth
2
>>> f.equivalent(g)
True

Convert between disjunctive and conjunctive normal forms:

>>> f = ~a & ~b & c | ~a & b & ~c | a & ~b & ~c | a & b & c
>>> g = f.to_cnf()
>>> h = g.to_dnf()
>>> g
And(Or(a, b, c), Or(a, ~b, ~c), Or(~a, b, ~c), Or(~a, ~b, c))
>>> h
Or(And(~a, ~b, c), And(~a, b, ~c), And(a, ~b, ~c), And(a, b, c))

Multi-Dimensional Bit Vectors

Create some four-bit vectors, and use slice operators:

>>> A = bitvec('A', 4)
>>> B = bitvec('B', 4)
>>> A
[A[0], A[1], A[2], A[3]]
>>> A[2:]
[A[2], A[3]]
>>> A[-3:-1]
[A[1], A[2]]

Perform bitwise operations using Python overloaded operators: ~ (NOT), | (OR), & (AND), ^ (XOR):

>>> ~A
[~A[0], ~A[1], ~A[2], ~A[3]]
>>> A | B
[Or(A[0], B[0]), Or(A[1], B[1]), Or(A[2], B[2]), Or(A[3], B[3])]
>>> A & B
[And(A[0], B[0]), And(A[1], B[1]), And(A[2], B[2]), And(A[3], B[3])]
>>> A ^ B
[Xor(A[0], B[0]), Xor(A[1], B[1]), Xor(A[2], B[2]), Xor(A[3], B[3])]

Reduce bit vectors using unary OR, AND, XOR:

>>> A.uor()
Or(A[0], A[1], A[2], A[3])
>>> A.uxor()
Xor(A[0], A[1], A[2], A[3])
>>> A.uand()
And(A[0], A[1], A[2], A[3])

Create and test functions that implement non-trivial logic such as arithmetic:

>>> from pyeda.logic.addition import *
>>> S, C = ripple_carry_add(A, B)
# Note "1110" is LSB first. This says: "7 + 1 = 8".
>>> S.vrestrict({A: "1110", B: "1000"}).to_uint()
8

Other Function Representations

Consult the documentation for information about truth tables, and binary decision diagrams. Each function representation has different trade-offs, so always use the right one for the job.

PicoSAT SAT Solver C Extension

PyEDA includes an extension to the industrial-strength PicoSAT SAT solving engine.

Use the satisfy_one method to finding a single satisfying input point:

>>> f = OneHot(a, b, c)
>>> f.satisfy_one()
{a: 0, b: 0, c: 1}

Use the satisfy_all method to iterate through all satisfying input points:

>>> list(f.satisfy_all())
[{a: 0, b: 0, c: 1}, {a: 0, b: 1, c: 0}, {a: 1, b: 0, c: 0}]

For more interesting examples, see the following documentation chapters:

Execute Unit Test Suite

If you have Nose installed, run the unit test suite with the following command:

$ make test

If you have Coverage installed, generate a coverage report (including HTML) with the following command:

$ make cover

Perform Static Lint Checks

If you have Pylint installed, perform static lint checks with the following command:

$ make lint

Build the Documentation

If you have Sphinx installed, build the HTML documentation with the following command:

$ make html

Python Versions Supported

PyEDA is developed using Python 3.2+. It is NOT compatible with Python 2.7.

Contact the Authors

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

pyeda-0.19.0.zip (257.0 kB view details)

Uploaded Source

pyeda-0.19.0.tar.gz (218.3 kB view details)

Uploaded Source

pyeda-0.19.0.tar.bz2 (181.7 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pyeda-0.19.0.win-amd64-py3.3.exe (406.2 kB view details)

Uploaded Source

pyeda-0.19.0.win-amd64-py3.2.exe (408.2 kB view details)

Uploaded Source

pyeda-0.19.0.win32-py3.3.exe (350.8 kB view details)

Uploaded Source

pyeda-0.19.0.win32-py3.2.exe (355.9 kB view details)

Uploaded Source

File details

Details for the file pyeda-0.19.0.zip.

File metadata

  • Download URL: pyeda-0.19.0.zip
  • Upload date:
  • Size: 257.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for pyeda-0.19.0.zip
Algorithm Hash digest
SHA256 a120d61591840afb9fb73df08c8b331fae97280c2325fd6e1c46899fc3cf1065
MD5 b13d5fd2b563826e5692b46047d01ade
BLAKE2b-256 b814f941f55c67c84daea269042d0babc672d3269bcde434d9719b203cc4b667

See more details on using hashes here.

File details

Details for the file pyeda-0.19.0.tar.gz.

File metadata

  • Download URL: pyeda-0.19.0.tar.gz
  • Upload date:
  • Size: 218.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for pyeda-0.19.0.tar.gz
Algorithm Hash digest
SHA256 5dd296a9b268e586c902f5505430d550661c7206da618eca7203001d17d79b41
MD5 4e82cb97601aa5af2adaf109f53d00fa
BLAKE2b-256 2b7364f2f19d11fc78e71db0dec125981322864c0cda50a9de0a7381ddeec60e

See more details on using hashes here.

File details

Details for the file pyeda-0.19.0.tar.bz2.

File metadata

  • Download URL: pyeda-0.19.0.tar.bz2
  • Upload date:
  • Size: 181.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for pyeda-0.19.0.tar.bz2
Algorithm Hash digest
SHA256 62c848c49668d19f8dcf878e12c1077f4ddc8b01252692fa9701fbf7af2deb01
MD5 6872c4b85ae5cdb55b0d488dd48e733e
BLAKE2b-256 f9150590a040e91538e6a33be1bf36656b79be850ac7a2bc986e88379aa28f1f

See more details on using hashes here.

File details

Details for the file pyeda-0.19.0.win-amd64-py3.3.exe.

File metadata

File hashes

Hashes for pyeda-0.19.0.win-amd64-py3.3.exe
Algorithm Hash digest
SHA256 e9931d706656e307ef15c6b180ae49a8e195be4abb7aaf0b4071e7a20ca645f2
MD5 e3e0dadabe19da3ba98c9d5d9cfe203b
BLAKE2b-256 8cfe78997e8b898499e1ecfe4df51dac17ec133356df424bfd11e7bca55f577d

See more details on using hashes here.

File details

Details for the file pyeda-0.19.0.win-amd64-py3.2.exe.

File metadata

File hashes

Hashes for pyeda-0.19.0.win-amd64-py3.2.exe
Algorithm Hash digest
SHA256 ea83feba84902f4009250b36408558b88a4cc037185707d2f966c203774d30c0
MD5 bc21b4c380c6ef5892acdf62e9db2b4f
BLAKE2b-256 ce133036fd172351e21b669ce173dd80ff3656054a3f8ecbed27b0348432c606

See more details on using hashes here.

File details

Details for the file pyeda-0.19.0.win32-py3.3.exe.

File metadata

File hashes

Hashes for pyeda-0.19.0.win32-py3.3.exe
Algorithm Hash digest
SHA256 191233b78f92f45948725d0ac0f5108fc1a3a5b7ea82b5e2053d8479a32e541e
MD5 9c34609adfd006cbc66201eb39de761d
BLAKE2b-256 401b200b2abf64758f06f750f45ef6c4172d6cc65515a0a66248ad48e819a4c0

See more details on using hashes here.

File details

Details for the file pyeda-0.19.0.win32-py3.2.exe.

File metadata

File hashes

Hashes for pyeda-0.19.0.win32-py3.2.exe
Algorithm Hash digest
SHA256 3cb808f00cde9a67745863c686e10a675e3413156289587a235878a7b9c5e41a
MD5 92ea08b058d6b9385b3d22c2d7bcd6df
BLAKE2b-256 052131f3514c7d8dd340a4008529074165071d09b74e81ce34b7066da65d705b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page