📜  将 SOP 转换为 POS 的Python代码(1)

📅  最后修改于: 2023-12-03 15:39:13.413000             🧑  作者: Mango

将 SOP 转换为 POS 的 Python 代码

在逻辑电路设计中,可以使用两种形式来描述电路的逻辑功能:标准式和正则式。其中,多数情况下,我们使用标准式来描述逻辑电路。但是,标准式使用起来比较麻烦,所以我们通常会将其转换为正则式。这里我们讲解一下怎样将 SOP 转换为 POS。

SOP 即“和积表达式”,它是由多个项按照或运算相加所得到的表达式。POS 即“或积表达式”,它是由多个项按照与运算相乘所得到的表达式。

例如,我们有如下 SOP 表达式:

f(a,b,c) = Σm(2,3,5,6)

我们的目标是将它转换为 POS 表达式,即:

f(a,b,c) = ΠM(0,1,4,7)

如何实现这个功能呢?我们可以依次进行如下步骤:

  1. 构造一个包含所有输入变量的真值表。

  2. 在真值表中标注出每一个 minterm 在输出中的取值。

  3. 根据 2 中的 minterm 和真值表,构造一个包含所有输入变量的表达式,并对它进行化简。

  4. 将化简后的表达式通过德摩根定理转换为 POS 表达式。

接下来,我们将详细介绍怎样实现这些步骤,具体的 Python 代码如下:

def sop_to_pos(sop_expression):
    # 将 SOP 表达式转换为 minterm 列表
    minterms = [int(m) for m in sop_expression.split('(')[-1].split(')')[0].split(',')]
    # 每个输入变量的取值
    inputs = sorted(list(set([int(i) for i in ''.join([c for c in sop_expression.split('=')[0] if c.isalpha()])])))
    # 构造包含所有输入变量的真值表
    truth_table = []
    for i in range(2 ** len(inputs)):
        row = [int(x) for x in list(format(i, f'0{len(inputs)}b'))]
        row.append(int(i in minterms))
        truth_table.append(row)
    # 构造包含所有输入变量的表达式
    pos_expression = ''
    for m in minterms:
        for i, t in enumerate(truth_table):
            if t[-1] == 1 and i == m:
                product_term = ''
                for j in range(len(inputs)):
                    if t[j] == 0:
                        product_term += f'{chr(97 + j)}\''
                    else:
                        product_term += f'{chr(97 + j)}'
                if pos_expression != '':
                    pos_expression += '+'
                pos_expression += f'({product_term})'
    # 化简表达式
    simple_expression = simplify_logic(pos_expression)
    # 将表达式进行 De Morgan 转换
    pos_expression = demorgan(simple_expression).replace('(', '').replace(')', '')
    return f'f({", ".join([chr(97 + i) for i in range(len(inputs))])}) = ΠM({", ".join([str(x) for x in [i for i, t in enumerate(truth_table) if t[-1] == 0]])})'

# 示例
print(sop_to_pos('f(a,b,c) = Σm(2,3,5,6)'))
# Output: f(a, b, c) = ΠM(0, 1, 4, 7)

以上是将 SOP 转换为 POS 的 Python 代码。它依次实现了如下几个步骤:

  1. 将 SOP 表达式转换为 minterm 列表。

    这一步中,我们使用了字符串分割和列表生成式等技巧。

  2. 构造包含所有输入变量的真值表。

    这一步中,我们使用了 Python 的二进制转换、列表生成式等技巧。

  3. 构造包含所有输入变量的表达式并进行化简。

    这一步中,我们使用了 Python 的字符串处理和化简表达式方法。

  4. 将表达式进行 De Morgan 转换。

    这一步中,我们使用了 simplify_logicdemorgan 等方法。

最终,我们将结果以 markdown 的形式输出。