• Rocket


     
    讨论指令解码部分遗留的几个问题。
     
     
    1. 最小项与蕴含项之间的关系
     
    参考链接:
     
    按其中的描述:
     
    An implicant covers one or more minterms in a sum of products of a Boolean function.
    即一个蕴含项覆盖布尔函数的一个或多个最小项。如果最小项中包含全部的变量,则蕴含项中则可以吸收掉一个或多个变量。
     
    从形式上看,最小项用于与或(SoP)表达式的布尔函数,最大项用于或与(PoS)表达式的布尔函数。而蕴含项既可以是SoP中的sum term,也可以是PoS中的product term。
     
    在与或表达式中,如果蕴含项为1,则布尔函数的值取1。同样,如果蕴含项是一个最小项,那么这个最小项为1,也能使布尔函数的值为1。
     
    Term类表达的是一个蕴含项,包含变量是否出现以及取值信息,不包含与或表达式、或与表达式的信息。所以Term即可表达一个最小项,也可以表达一个最大项,取决于如何使用。
     
    Term表达最小项时其mask为全0。
     
     
    2. 默认无关值与解码结果0/1如何区分?
     
    调用SimplifyDC时,默认值为不关心:
     
    SimplifyDC返回要比对的Term序列,而logic返回的是一个bit,其取值只有0和1两种。而dTerm中对应的变量值为x,即不关心。
     
    也就是说在decode_table的定义中,变量对应的比特为x,而解码输出的结果为0/1,两者并不一致。
     
    如下:
     
    logic只能输出0/1,无法输出x。那么使用时如何区分呢?
     
    会使用到这个x吗?
    应该是不使用的。既然是不关心,那么这个x就应该是不被使用的,相关的逻辑不被使能。
     
    能使用这个x吗?
    不能。在Scala中,想要比对X或者DW_X,这都没有问题。但译码结果最终要在电路中使用。电路中能把x用于比对吗?与一个未知的值相比较,结果也是未知。与门、或门中倒是可以用x,但需要另一个输入为0或者1,也就是说这个x的值,也是不关心的。即便把x变为0或者1,与门、或门的输出也是不会变的。
     
    所以SimplifyDC中,只比对minTerms中的项,而把maxTerms和dcTerms对应的译码结果输出为0,是没有问题的。对于dcTerms而言,无论结果是0/1/x,都不关心。
     
     
    3. Term.intersects
     
    1) 实现中的小问题
     
    Term.intersects的实现如下:
     
    如果this和x没有相同的变量呢?
     
    如:this.mask = 1100, x.mask = 0011,
    则:~mask & ~x.mask = 0,
    则:(value ^ x.value) & 0 = 0,
    则:0 == 0返回真
    也就是说:没有任何相同变量的两个项相交。
     
    这显然是不合理的。
     
    既然这里Term.intersects这样实现,而又没有发现问题。那么推测可能的原因是:在指令编码时保证必然有相同的变量出现在两个项中。
     
     
    2) 相交即相等?
     
    相交显然是不同于相等的。
     
    在SimplifyDC中,如果判断某一个化简项在maxTerms中存在相交项,则不能进行化简。只进行相交判断,而不进行相等判断,就做出了不能进行化简决定,是不是用力太猛?
     
    原因在于SimplifyDC输出的结果是minTerms化简之后剩余的项。在logic()中生成比对逻辑时,只会对minTerms进行相等判断,而没有机会对maxTerms进行相等判断。
     
     
    4. maxTerms如何使用?
     
    1) maxTerms是最大项?
     
    非要对应成或与表达式中的最大项,比较难以理解。
    可以简单理解为若maxTerms中的项匹配,则译码结果为0。
     
    2) 是否所有的minTerms都与maxTerms进行了相交判断(intersects)?
     
    a. 最开始的每一个minTerms和maxTerms都进行了判断
     
     
    b. 第一次化简产生的新项没有进行判断
     
     
    合并产生的新项直接存入单元格(i+1, j)中,并没有进行判断。后续轮到该单元格时,判断的是其翻转一个变量值之后的新项。
     
    事实上无需进行判断。
     
    合并之前的两项a, b只有一个变量对应的比特有差异,一个值为0,一个值为1。两者都与maxTerms中的项不相交。
     
    根据maxTerms中的项是否存在这个变量,存在两种情况:
    i. 存在这个变量(mask对应位为0):那么这个变量必然不是不相交的关键变量,必然还存在其他共同的变量值不同;
    i. 不存在这个变量(mask对应位为1):那么这个变量也不是关键变量,必然还存在其他共同的变量值不同;
    综合这两种情况,a和b合并之后产生的新项也必然与maxTerms中的所有项都不相交。
     
    c. 第二次化简产生的新项也没有进行判断
     
     
    根据b中的论述,无论是原有的质项,还是化简产生的新的质项,与所有的maxTerms都是不相交的。
     
    同样根据b中的论述,如果翻转一个变量值产生的新项与maxTerms都不相交,那么合并之后产生的新项也与maxTerms不相交。
     
    d. 第三次化简产生的新项也没有进行判断
     
     
    解释如同c。
     
     
    5. Simplify为什么不像SimplifyDC那样翻转变量值进行化简?
     
    因为传给Simplify的是minTerms和dcTerms,没有maxTerms,所以只能根据minTerms和dcTerms进行合并化简。
     
    翻转变量值可能与maxTerms产生重叠。如第3节中的论述,重叠是不被允许的。
     
     
    6. 模型层与构建层
     
    BitPat和Term使用的是BigInt,所以Simplify的执行在构建层。而模型直接使用其简化结果进行构建(logic方法)。
     
     
  • 相关阅读:
    log4j 日志配置
    找出两个列表元素中相同的元素
    列表元素去重
    hdu 2149 Public Sale(巴什博弈变形)
    POJ 3169 Layout (差分约束+SPFA)
    hdu 1494 跑跑卡丁车(动态规划)
    hdu 3177 Crixalis's Equipment(贪心)
    HDU 1576 A/B(扩展欧几里德变形)
    POJ 1061青蛙的约会(扩展欧几里德)
    IE6下的CSS多类选择符
  • 原文地址:https://www.cnblogs.com/wjcdx/p/10296514.html
Copyright © 2020-2023  润新知