当前位置: 首页 > news >正文

经典的逻辑函数化简算法 Espresso

        经典的逻辑函数化简算法 Espresso。它虽然不是“唯一”的化简算法,但因其高效和强大的启发式能力,成为了该领域的标杆和事实标准。

1. 核心思想

        Espresso 的核心思想不是像奎因-麦克卢斯基算法那样追求绝对的数学最小化(这在计算上非常昂贵),而是通过一系列局部变换启发式搜索,快速找到一个接近最优的、非常简化的两级逻辑电路(与-或式或或-与式)。它直接处理立方体,非常适合于计算机实现。

基本概念:

立方体

        代表一个乘积项。例如,在一个三变量函数中,立方体 10- 表示 A·C'(其中 - 表示该变量不出现,1 表示原变量,0 表示反变量)。

覆盖

        一组立方体的集合,完整地描述了逻辑函数。覆盖中的每一个立方体都对应与或表达式中的一个乘积项。

 

2. Espresso 的主要变换算法原理

Espresso 算法的核心是三个主要的变换步骤,它们被循环迭代执行,直到覆盖不再改善为止。这三个步骤是:扩张、不可略约化、降低

步骤一:扩张

目标

        让每个立方体变得尽可能大(即覆盖更多的最小项),从而可能消除掉整个立方体。

原理

        对于一个立方体,尝试将其中的某个 0 或 1 变成 -(不关心)。如果这个新的、更大的立方体所覆盖的所有最小项,仍然被整个覆盖所包含(即不包含任何不属于函数的“关断”项),那么这个扩张就是合法的。通过扩张,小的立方体会被大的立方体“吞并”,从而可以被移除。

举例说明

假设我们有一个三变量函数的覆盖:
F = { 100, 101, 110, 111 }

  1. 观察立方体 100。它覆盖了最小项 A'B'C'

  2. 尝试扩张:将第一位 1 变成 -。得到新立方体 -00

  3. 检查 -00 覆盖了哪些最小项?000 和 100

    • 100 本来就在函数中

    • 000 在不在函数中?查看原始覆盖,没有 000,所以这个扩张是非法的,因为它引入了关断项

  4. 尝试另一个扩张:将第三位 0 变成 -。得到新立方体 10-

  5. 检查 10- 覆盖了 100 和 101

    • 100 在覆盖中

    • 101 也在覆盖中

    • 没有引入任何关断项。所以这个扩张是合法

  6. 用 10- 替换原来的 100 和 101。现在覆盖变为 F = { 10-, 110, 111 }

  7. 继续扩张 110。将第三位 0 变成 -,得到 11-。它覆盖 110 和 111,都在覆盖内。合法

  8. 用 11- 替换 110 和 111

  9. 最终覆盖变为 F = { 10-, 11- }

        可以看到,通过扩张,我们从4个立方体简化到了2个立方体。10- 就是 A·B'11- 就是 A·B

步骤二:不可略约化

目标

        找到当前覆盖的一个“最小”子集,即尝试移除某些立方体,看剩下的覆盖是否依然能完整表示该函数。

原理

        按某种顺序(通常是启发式的,如从最难被其他立方体覆盖的项开始)检查覆盖中的每一个立方体。如果移除该立方体后,剩下的覆盖依然能覆盖该立方体所覆盖的所有最小项,那么这个立方体就是“可略约的”,可以安全地移除。

举例说明

承接上例,我们有一个非常简单的覆盖:F = { 10-, 11- }

  1. 尝试移除 10-

    • 10- 覆盖了 100 和 101

    • 检查剩下的覆盖 { 11- } 能否覆盖 100 和 101

      • 11- 覆盖 110 和 111

      • 它无法覆盖 100 和 101

    • 所以 10- 是不可略约的,必须保留

  2. 尝试移除 11-

    • 11- 覆盖了 110 和 111

    • 检查剩下的覆盖 { 10- } 能否覆盖 110 和 111

      • 10- 覆盖 100 和 101

      • 无法覆盖 110 和 111

    • 所以 11- 也是不可略约

  3. 当前覆盖 { 10-, 11- } 已经是不可略约覆盖

再举一个需要略约的例子。假设有覆盖 F = { 00-, 1-1, -11 }

  1. 尝试移除 -11

    • -11 覆盖 011 和 111

    • 检查 { 00-, 1-1 } 能否覆盖 011 和 111

      • 011 不被 00-(覆盖000,001)覆盖,也不被 1-1(覆盖101,111)覆盖。失败。

    • 所以 -11 不可略约。

  2. 尝试移除 1-1

    • 1-1 覆盖 101 和 111

    • 检查 { 00-, -11 } 能否覆盖 101 和 111

      • 101 不被 00- 覆盖,也不被 -11(覆盖011,111)覆盖。失败。

    • 所以 1-1 不可略约。

  3. 尝试移除 00-

    • 00- 覆盖 000 和 001

    • 检查 { 1-1, -11 } 能否覆盖 000 和 001

      • 000 和 001 显然不被 1-1 或 -11 覆盖。失败。

  4. 看起来都不可略约?但注意,我们的覆盖可能不是最简的。实际上,-11 已经覆盖了 111,而 1-1 也覆盖了 111,存在冗余。IRR 的步骤顺序很重要。如果我们最后检查 1-1,并且发现 111 已经被 -11 覆盖,101 是唯一由 1-1 独覆盖的最小项吗?不是,101 只被 1-1 覆盖。所以它也不能被移除。

这个例子说明了 IRR 的复杂性,它依赖于一个“目标覆盖”来计算独覆盖顶点。在 Espresso 的流程中,EXPAND 之后可能已经消除了很多冗余,IRR 再进行最后的精简。

步骤三:降低

目标

        为下一次迭代的“扩张”创造机会。通过有意地将立方体“缩小”,可能会在后续的扩张中导向一个更全局优化的解。

原理

        与扩张相反。尝试将立方体中的 - 变回 0 或 1,使其仅覆盖其“独覆盖顶点”。如果一个最小项只被一个立方体覆盖,则该最小项称为该立方体的独覆盖顶点。降低操作确保该立方体仍然覆盖其至少一个独覆盖顶点。这个被缩小了的立方体在下一轮扩张时,有可能朝着一个新的、更好的方向扩张,从而找到更优的覆盖。

举例说明

假设一个覆盖 F = { 1-1, -11 }(这已经比较简化了)。

  1. 找出每个立方体的独覆盖顶点。

    • 1-1 覆盖了 101 和 111

      • 101 只被 1-1 覆盖吗?是的(-11 覆盖 011 和 111,不覆盖 101)。所以 101 是 1-1 的独覆盖顶点。

    • -11 覆盖了 011 和 111

      • 011 只被 -11 覆盖吗?是的(1-1 不覆盖 011)。所以 011 是 -11 的独覆盖顶点。

      • 111 被两个立方体同时覆盖,所以它不是独覆盖顶点。

  2. 执行降低。

    • 对于 1-1,为了使其仍然覆盖独覆盖顶点 101,我们可以将其降低为 101

    • 对于 -11,为了使其仍然覆盖独覆盖顶点 011,我们可以将其降低为 0-11(即 011)。

  3. 现在覆盖变成了 F = { 101, 011 }。这看起来是更差了。

  4. 但关键是下一步:现在进入下一轮循环,对 101 和 011 进行扩张

  5. 扩张 101

    • 尝试将第一位 1 变成 -,得到 -01。它覆盖 001 和 101001 是关断项吗?我们需要参考原始函数。假设不是,那么这是一个合法的、全新的扩张方向!最终可能扩张成一个像 -01 这样的项。

    • 同样,扩张 011 可能得到 -11

  6. 新的覆盖可能变为 F = { -01, -11 },这可能比最初的 { 1-1, -11 } 更好(例如,文字总数更少)。

 

3. 完整的 Espresso 算法流程

Espresso 通过循环调用这三个步骤,并辅以输出矫正来保证结果正确。

  1. 初始化:读入函数的初始覆盖(例如,由最小项组成)。

  2. 开始循环
    a. 扩张:对覆盖中的立方体进行扩张,使其尽可能大,消除冗余。
    b. 输出矫正:检查当前的覆盖是否依然正确地表示了原始函数。因为扩张和后续操作都是在“ON-Set”(函数值为1的集合)和“DC-Set”(不关心项集合)上进行的,需要确保没有覆盖到“OFF-Set”(函数值为0的集合)。这一步是质量的保证。
    c. 不可略约化:从当前覆盖中移除所有冗余的立方体。
    d. 降低:缩小立方体,为下一次迭代寻找新的优化路径。

  3. 终止条件:当一次完整的循环后,覆盖没有再发生任何改善时,算法停止。

4. 思路总结

Espresso 的强大之处在于它巧妙的启发式思想:

        扩张贪婪的化简,追求立竿见影的效果。

        不可略约化精益求精,剔除最后的冗余。

        降低以退为进,通过暂时“变差”来跳出局部最优解,寻找全局更优解。

        这种迭代优化策略使得 Espresso 能够在合理的时间内,对大规模的逻辑函数产生非常高质量(通常就是最优)的化简结果,从而成为 EDA 工具链中不可或缺的一部分。

http://www.dtcms.com/a/457603.html

相关文章:

  • ZKEACMS:基于ASP.Net Core开发的开源免费内容管理系统
  • 【QT常用技术讲解】opencv实现摄像头图像检测并裁剪物体
  • 深圳建网站哪个好网页设计实训总结3000字大学篇
  • 【密码学实战】openHiTLS mac命令行:消息认证码工具
  • 沙井网站建设石林县工程建设个体交易网站
  • Chromium 138 编译指南 - Android 篇:安装构建依赖项(七)
  • asp 绿色环保企业网站源码 v1.1golang 做网站
  • 第4章 C++多线程系统编程精要
  • 绵阳网站怎样做网站设计要交税吗
  • 同ip网站有什么影响网站建设论文500字
  • 基于springboot的家具商城销售系统
  • 手机版网站制作佛山建站软件
  • 厦门南希网站建设微信应用程序开发
  • 【STM32项目开源】基于STM32的智能厨房火灾燃气监控
  • 最新彩虹云商城二开Pro美化版 新增超多功能 全开源
  • 如何制作家具网站东莞设计网站建设方案
  • 商丘做网站的电话怎样建网站最快
  • 安徽住房与城乡建设部网站网站登记备案 个人
  • 嵌入式开发--温度、湿度、气压传感器BME280
  • 基于ZYNQ FPGA+AI+ARM 的卷积神经网络加速器设计
  • 自助建站之星wordpress图片弹出
  • JavaScript-防抖与节流
  • 广西南宁网站建设哪家好网站调用微信数据
  • 专业手机网站建设公司排名wordpress the7打开速度慢
  • 做网站的主要作用设计师培训学费
  • 【大模型】DeepSeek-V3.2-Exp中的DSA稀疏注意力设计
  • Vue组件通信完整教程
  • 代码随想录 637.二叉树的层平均值
  • Spring前置准备(七)——DefaultListableBeanFactory
  • Linux 进程间通信——System V