介绍布尔代数最小项与最大项相关概念,以及Term类的实现。
参考链接:
1. 几个定义
2. Term
Term即是一个项,最大项或最小项。
由变量ABCD组成的项AB',包含如下信息:
1) 项中包含的变量
最小项由ABCD四个变量组成。项AB'只包含了AB两个变量。
在Term中,由mask决定项中有哪些变量:
a. mask为1的位对应的变量不在项中出现,如变量CD在项AB'中的mask为1;
b. mask为0的位对应的变量在项中出现;
2) 每个变量的值
项中的每个变量或者以原变量的形式出现(如A),或者以补变量的形式出现(如B')。
在Term中,值存在如下情况:
a. mask为1的变量,即不在项中出现的变量,其值为0;
b. mask为0的变量,即在项中出现的变量,其值为0或1;
3) 最大项和最小项
项中每个变量的关系,是与(乘)的关系,还是或(加)的关系;亦即项是最小项,还是最大项。
在Term中,没有表达这种关系。只表达了变量及其值。至于是最大项还是最小项,取决于如何使用。
如DecodeLogic中,无论是minTerms还是maxTerms都可以传给Simplify作为minterms参数:
Simplify定义如下:
3. BitPat与Term
BitPat通过term方法,转变为一个Term。其实现如下:
因为Term中的mask与BitPat中相反,所以Term中mask为1的位对应的变量是不存在的变量。与BitPat中的意义相反。
这里再提一下BigInt(2).pow(lit.getWidth) - (lit.mask + 1),其有两种理解方法:
1) 2的补码
mask补码 = 2^n - mask = ~mask + 1
即:~mask = 2^n - mask - 1 = 2^n - (mask + 1)
2) 1的补码
对mask求1的补码,即是按位取反,即~mask。
mask与~mask的和为n位全1的值,亦即2^n - 1。
如0101 + 1010 = 1111 = 2^4 - 1
所以:~mask + mask = 2^n - 1
可知:~mask = 2^n - 1 - mask = 2^n - (mask + 1)
其实2的补码的算法即取反加一,即是利用~mask + mask = 2^n - 1的特性:
mask补码 = 2^n - mask = 2^n - 1 + 1 - mask = (2^n - 1 - mask) + 1 = ~mask + 1.