cjdrake / pyeda

Python EDA
BSD 2-Clause "Simplified" License
301 stars 55 forks source link

Boolean expression in human readable format #189

Open YuriyTigiev opened 2 months ago

YuriyTigiev commented 2 months ago

Hello,

Please add a function that converts Boolean expressions to a human-readable string format using the operators &, ^, |, ~. I tried to write my own function, but I couldn't get it to work.

from pyeda.inter import expr
from pyeda.boolalg.expr import AndOp, OrOp, XorOp, NotOp, Variable

# Create Boolean variables
a, b, c, d = map(expr, "abcd")

# Construct Boolean expressions
expression_and = a & b
expression_or = a | b
expression_xor = a ^ c
nested_expression = (a & b) | (c & d)
negated_expression = ~a & b
complex_expression = a & (b | ~c) ^ d

def convert_expr_to_symbols(expression):
    if expression.is_zero() or expression.is_one():
        return str(expression)
    elif isinstance(expression, Variable):
        return str(expression)
    elif isinstance(expression, NotOp):
        return f"~{convert_expr_to_symbols(expression.x)}"
    elif isinstance(expression, AndOp):
        return ' & '.join(f"({convert_expr_to_symbols(term)})" if isinstance(term, (OrOp, XorOp)) else convert_expr_to_symbols(term) for term in expression.xs)
    elif isinstance(expression, OrOp):
        return ' | '.join(f"({convert_expr_to_symbols(term)})" if isinstance(term, (AndOp, XorOp)) else convert_expr_to_symbols(term) for term in expression.xs)
    elif isinstance(expression, XorOp):
        return ' ^ '.join(f"({convert_expr_to_symbols(term)})" if isinstance(term, (AndOp, OrOp)) else convert_expr_to_symbols(term) for term in expression.xs)
    else:
        raise ValueError(f"Unknown expression type: {expression}")

# Display the expressions with the desired symbols
print(f"AND expression: {convert_expr_to_symbols(expression_and)}")
print(f"OR expression: {convert_expr_to_symbols(expression_or)}")
print(f"XOR expression: {convert_expr_to_symbols(expression_xor)}")
print(f"Nested expression: {convert_expr_to_symbols(nested_expression)}")
print(f"Negated expression: {convert_expr_to_symbols(negated_expression)}")
print(f"Complex expression: {convert_expr_to_symbols(complex_expression)}")