Ejemplo n.º 1
0
def test_boolfunc():
    # __invert__, __or__, __and__, __xor__
    f = ~a | b & c ^ d
    assert expr2bdd(expr("~a | b & c ^ d")) is f

    # support, usupport, inputs
    assert f.support == {a, b, c, d}
    assert f.usupport == {a.uniqid, b.uniqid, c.uniqid, d.uniqid}

    # restrict
    assert f.restrict({}) is f
    assert f.restrict({a: 0}) is one
    assert f.restrict({a: 1, b: 1}) is c ^ d
    assert f.restrict({a: 1, b: 1, c: 0}) is d
    assert f.restrict({a: 1, b: 1, c: 0, d: 0}) is zero

    # compose
    assert f.compose({a: w}) is ~w | b & c ^ d
    assert f.compose({
        a: w,
        b: x & y,
        c: y | z,
        d: x ^ z
    }) is ~w | x ^ z ^ x & y & (y | z)

    # satisfy_one, satisfy_all
    assert zero.satisfy_one() is None
    assert one.satisfy_one() == {}
    g = a & b | a & c | b & c
    assert list(g.satisfy_all()) == [{
        a: 0,
        b: 1,
        c: 1
    }, {
        a: 1,
        b: 0,
        c: 1
    }, {
        a: 1,
        b: 1
    }]
    assert g.satisfy_count() == 3
    assert g.satisfy_one() == {a: 0, b: 1, c: 1}

    # is_zero, is_one
    assert zero.is_zero()
    assert one.is_one()

    # box, unbox
    assert BinaryDecisionDiagram.box('0') is zero
    assert BinaryDecisionDiagram.box('1') is one
    assert BinaryDecisionDiagram.box("") is zero
    assert BinaryDecisionDiagram.box("foo") is one
Ejemplo n.º 2
0
def test_boolfunc():
    # __invert__, __or__, __and__, __xor__
    f = ~a | b & c ^ d
    assert expr2bdd(expr("~a | b & c ^ d")) is f

    # support, usupport, inputs
    assert f.support == {a, b, c, d}
    assert f.usupport == {a.uniqid, b.uniqid, c.uniqid, d.uniqid}

    # restrict
    assert f.restrict({}) is f
    assert f.restrict({a: 0}) is one
    assert f.restrict({a: 1, b: 1}) is c ^ d
    assert f.restrict({a: 1, b: 1, c: 0}) is d
    assert f.restrict({a: 1, b: 1, c: 0, d: 0}) is zero

    # compose
    assert f.compose({a: w}) is ~w | b & c ^ d
    assert f.compose({a: w, b: x&y, c: y|z, d: x^z}) is ~w | x ^ z ^ x & y & (y | z)

    # satisfy_one, satisfy_all
    assert zero.satisfy_one() is None
    assert one.satisfy_one() == {}
    g = a & b | a & c | b & c
    assert list(g.satisfy_all()) == [
               {a: 0, b: 1, c: 1},
               {a: 1, b: 0, c: 1},
               {a: 1, b: 1}
           ]
    assert g.satisfy_count() == 3
    assert g.satisfy_one() == {a: 0, b: 1, c: 1}

    # is_zero, is_one
    assert zero.is_zero()
    assert one.is_one()

    # box, unbox
    assert BinaryDecisionDiagram.box('0') is zero
    assert BinaryDecisionDiagram.box('1') is one
    assert BinaryDecisionDiagram.box("") is zero
    assert BinaryDecisionDiagram.box("foo") is one
Ejemplo n.º 3
0
Test binary decision diagrams
"""

from pyeda.boolalg.bdd import (
    bddvar,
    expr2bdd,
    bdd2expr,
    upoint2bddpoint,
    ite,
    BinaryDecisionDiagram,
    BDDNODEZERO,
    BDDNODEONE,
)
from pyeda.boolalg.expr import expr, OrOp, AndOp

zero = BinaryDecisionDiagram.box(0)
one = BinaryDecisionDiagram.box(1)
a, b, c, d, w, x, y, z = map(bddvar, 'abcdwxyz')


def test_expr2bdd():
    assert expr2bdd(expr("a ^ b ^ c")) is a ^ b ^ c

    assert expr2bdd(expr("~a & ~b | a & ~b | ~a & b | a & b")) is one
    assert expr2bdd(expr("~(~a & ~b | a & ~b | ~a & b | a & b)")) is zero

    f = expr2bdd(expr("~a & ~b & c | ~a & b & ~c | a & ~b & ~c | a & b & c"))
    g = expr2bdd(expr("a ^ b ^ c"))

    assert f is g
Ejemplo n.º 4
0
"""
Test binary decision diagrams
"""

from pyeda.boolalg.bdd import (
    bddvar, expr2bdd, bdd2expr, upoint2bddpoint, ite,
    BinaryDecisionDiagram,
    BDDNODEZERO, BDDNODEONE,
)
from pyeda.boolalg.expr import expr, OrOp, AndOp


zero = BinaryDecisionDiagram.box(0)
one = BinaryDecisionDiagram.box(1)
a, b, c, d, w, x, y, z = map(bddvar, 'abcdwxyz')

def test_expr2bdd():
    assert expr2bdd(expr("a ^ b ^ c")) is a ^ b ^ c

    assert expr2bdd(expr("~a & ~b | a & ~b | ~a & b | a & b")) is one
    assert expr2bdd(expr("~(~a & ~b | a & ~b | ~a & b | a & b)")) is zero

    f = expr2bdd(expr("~a & ~b & c | ~a & b & ~c | a & ~b & ~c | a & b & c"))
    g = expr2bdd(expr("a ^ b ^ c"))

    assert f is g

    assert f.node.root == a.uniqid

    assert f.node.lo.root == b.uniqid
    assert f.node.hi.root == b.uniqid