硬件安全系列 逻辑电路基础知识介绍(二)
前言
第二部分 邏輯表示方式以及處理算法
Boolean Representation via BDDs and SAT
BDD Binary Decision Diagrams
BDD是什么。Binary Decision Diagrams 二進制決策圖
二進制決策圖是表示和操作布爾邏輯的最通用和有用的數據結構之一。
那么二進制決策圖長什么樣呢。
如圖所示,就是樹狀圖,每一個分支對應一個輸入的確定,從而確定輸出,這也表示了所有狀態下輸入和輸出的對應關系。但是呢,這樣的表示方法在輸入增加時,樹狀圖成指數增長,所以我們顯然需要一些方法來簡化。
忽略節點:當某一情況下的某一輸入對結果不發生影響時,我們忽略這一輸入對應的兩個分支。如圖所示
共用節點:共用節點存在兩種類型。第一種是由于輸出一定是0或者1,我們只需要將所有分支的最終輸出指向0或者1,就可以減少輸出的分支。第二種是對于多個輸入輸出對應關系,在經過一些0/1簡化后,可能存在相同狀況,即從某一分支開始,之后的部分邏輯關系完全一致,我們將這一部分邏輯關系用同一個樹狀圖表示,僅僅是前置的輸入指向不同。又或者是不同對應關系在最初的部分邏輯關系中存在相同情況,我們同樣可以將這一部分邏輯關系用同一個樹狀圖表示,僅僅是輸出指向不同節點。
接下來的圖片分別對應第一種類型和第二種類型的兩種情況
除此之外,輸入判斷的先后會對整個樹狀圖的大小有極其重要的影響。
如圖所示,當我們先判斷a_1,a_2,a_3……,然后判斷b_1,b_2,b_3….我們會發現,一直判斷到b_1才會出現第一個可能的輸出,然而在n次判斷后,這一次判斷的分支會存在2^(n+1),毫無疑問,這是一個巨大的工程量。而當我們先判斷a_1b_1時,無疑會減少一個巨大的分支。
SAT satisfiability
對于一個邏輯關系,我們往往需要的是該邏輯關系成立,比如network repair中z = ! (F xor G),我們特意在最后結尾添加非運算,使得真才是我們期待的結果。這既符合現實邏輯上的關系,又符合電子邏輯關系。
所以,對一個系統來說,有時候我們并不期望得到所有的結果,只需要知道這件事情在某種條件下能夠成立,我們去盡力滿足這個條件即可。因此,SAT被提了出來。
在一個概念被提出之后,我們需要做的就是找到一個方法實現這個概念。首先我們提出一個表達方式CNF Conjunctive Normal Form,連接的一般方式。其形式是XXX+XXXX+XXXX,語言描述就是多個命題的和。
為什么選擇和的形式呢。
因為or邏輯中有一出一,我們只需要判斷或者找到其中一個命題成立,這整個邏輯就成立。除此之外,每個命題都可以轉化成和的形式。AB可以轉化成(A+B)這是基于雙重否定消除(非非為本身)以及德摩根定律((AB) = A+B),(A+B)C 可以轉化成AC+BC 這是根據分配率得到。
我們用和的形式表示所有邏輯門(為了簡化表示,所以都轉化成AB的形式)
z=(x) [^x + z][x + ^z]
z=NOT(x) [x + z][x+z]
z=NOR(x_1,x_2…x_n) [(x_1+z)(x_2+z)…(x_n+z)][x_1+x_2+…+x_n+z]
z=NAND(x_1,x_2….x_n) [(x_1+z)(x_2+z)…(x_n+z)][x_1+x_2+…+x_n+z]
z=OR(x_1,x_2…x_n) [(x_1+z)(x_2+z)…(x_n+z)][x_1+x_2+…+x_n+z]
z=AND(x1,x…x_n) [(x_1+z)(x_2+z)…(x_n+z)][x_1+x_2+…+x_n+z]
由于AB可以轉化成和的形式,所以所有邏輯門可以轉化為和的形式,也就是說所有邏輯都可以用和的形式表示
接下來是運算。
對于邏輯電路的運算,我們已知的運算就是遞歸重復,也就是假設輸入實現得到輸出。我們依舊沿用這一方法,但是,當輸入過大時,這一方法工程量也會大,從而影響使用。所以我們需要尋找方法簡化他。
第一個方法Boolean Constraint Propagation邏輯約束傳遞
我們目標是結果返回為真,對于每一個邏輯單元,由于是and邏輯,所以我們需要所有輸入在邏輯單元中是真的表述,也就是對于a b來說a我們假設為1,b假設為0使得a為1,b為1。這一算法會基于某一個邏輯單元所擁有的輸入個數決定復雜程度
另一個方法是DPLL Algorithm DPLL算法
這一個算法并不基于和的形式,反而是基于積的形式([A+B][B+C]),對于這一形式,可能會存在B和B’的形式,也就是說期望某一個邏輯單元成立的同時,有其他的邏輯單元會期望另一個輸入在邏輯關系中必定為1。在上面的表達式[A+B][B+C]中,我們可以看到如果用B使得第一個單元為1,那么第二個單元的C必定為1。
我們期望的是,假設一個輸入,使得更多的單元能夠明確得到1或者明確依賴某一輸入使得結果為1。 所以我們在選擇假設輸入對象時,選擇在單元中出現更多的。
除此之外,基于and邏輯,有零出零。所以一旦可以確定某一單元整體結果為0,那么當前假設一定不滿足SAT。
基于上述描述,我們可以得到偽代碼
DPLL(clauses){if (clauses is a consistent set of literals){return true}else if(clauses contains an empty clause){return false}else{assign a popular input and DPLL(that clauses)} }上面的所有內容都是邏輯上的,接下來我們將邏輯應用到電路中。對于上面的所有邏輯,我們可以認為是如下圖的電路
也可以是
第一種叫做2-level logic
第二種叫做multi-level logic
對于電路來說,我們要做的是把他轉化成邏輯。也就是用A+BC這種形式表示電路邏輯。
轉化的方式就是我們接下來要討論的內容。
首先是針對2-level logic的轉化
對于邏輯我們可以用BDD表示,對于電路我們用TT真值表表示。
【網絡安全學習攻略】
和前面邏輯部分相似,我們只記錄結果為1的輸入
首先,我們必須承認表示相同結果的邏輯的表示可以是多樣的,其中包括a+a’可以當作1的因素。所以我們需要明確的是我們希望轉化的邏輯關系是電路表示的最簡關系。
如何找到最簡關系就是我們需要討論的內容
既然需要找到邏輯關系,我們首先要明白真值表中的行列格子表示了什么。
對于ab為00的那一列來說,就是a=0,b=0的情況下的邏輯關系。
同樣的對于cd的一行來說就是c=0,d=0的關系。
對于ab是00 01,cd是00 01的那一個田字格就是a=0,c=0的關系。其他的行列田字格意義類似。
其次,我們要找到一個可行的邏輯關系然后去簡化。
對于上圖中的關系,bd同時為1且ac為0結果才為1,ac同時為1且bd為0結果才為1,ab為1cd為0結果為0。我們可以得到邏輯關系a’bc’d+ab’cd’+abc’d’
那么對于程序來說,如何獲取呢。結合邏輯約束傳遞,首先,我們取一行存在1,且1越多越好(1越多該行優先級越高),對于該行輸入邏輯,若為1則a,非1則a’。對于同塊行列積運算,不同行列和運算。
接下來就是進行組合實現最優解。
也就是相當于a’bc’d+ab’cd’+abc’d’=bc’(a’d+ad’)+ab’cd’
當然也可以組合成ad’(b’c+bc’)+a’bc’d
這些組合就是期望1組合成完整田字格,除此之外還可以趨向組合成完整行列。
接下來是針對Multi-level logic
multi-level logic有更多的環節,如:f = ac+b ,g = f +a’c
我們可以將環節去掉,即直接用ac+b代替f寫入g中,再次我們可以得到更簡潔的表示ac+b+a’c = b+c
當然,這里還存在一種情況就是其中一個環節 f = ab+ac+ad
我們可以添加一個環節a,f = a(b+c+d)
那么我們如何使用程序實現這一目標呢。
首先我們要將邏輯和數理的關系明確:
基于前面分配律的存在,我們可以將and當作乘,or當作加。這樣我們就可以使用數理計算實現邏輯and和or的計算,但是,數理并不能表示非運算,這也就使得我們必須使用新的符號表示非運算的結果,并且忽視新符號與原要素的非關系。
接下來就是尋找滿足簡化條件的環節以及元素。
首先是添加環節的方法:添加一個環節需要滿足的條件是一個元素多次出現在和形式的邏輯單元中,如上面的例子所示。
要想知道如何用算法找到該元素必須找到該元素具有的特征:首先該元素一定在整個邏輯中出現了,也就是邏輯中的每一個元素都有可能多次出現,同時也只有邏輯中的元素才有可能。我們可以遍歷嘗試。(在這里我們將這個多次出現的元素集合記作divisor)
當將這一元素提出后,邏輯關系的表達式就可以變成F = D * Q + R(D就是divisor,Q是提出D元素后的邏輯的表達式,R是不包含D元素的其他邏輯的表達式集合)
for (each cube d in divisor D){let C = {cubes in F that comtain this product term d}if (C is empty){return (quotient = 0 ,reminder = F)} let C = cross out literals of cube d in each cube of Cif(d is first cube we have looked at in divisor D){let Q =C}else{Q = Q ^ C}R = F - (Q*D)return (quotient = Q ,reminder = R) }但是,有些時候不僅僅是一個元素可以提取,可能是多個元素組合可以提取,如F = axc + axd + axe + bc + bd + de,我們可以提取ax和b然后在提取(c+d+e)最后形成(ax+b)(c+d+e)
所以在找到一個元素之后,我們依舊要對剩余邏輯表達式進行分析
FindKernels(cube-free SOP expression F){K = emptyfor(each variable x in F){if(there are at least 2 cubes in F that have variable x){let S = {cubes in F that have variable x in them}let co = cube that results from intersection of all cubes in S that will be the product of just those literals that appear in each of these cubes in SK = k ∨ FindKernels(F / co)}}K = K ∨ Freturn K }不知道大家有沒有發現這一個方法有不足之處。
我們舉一個例子:F = axc + axd + axe + bc + bd + de
我們首先提取a:a(xc+xd+xe)+bc+bd+be
然后提取x:ax(c+d+e)+bc+bd+be
之后省略。
假設我們先提取x,再提取a,結果是不是依舊一樣呢。答案是是的。所以我們使用的方法存在冗余。
除此之外,對于同一個表達式有不同的提取方式,這不同的提取方式可能會造成最后結果的表達式不同
如:a’bc’d+ab’cd’+abc’d’=bc’(a’d+ad’)+ab’cd’=ad’(b’c+bc’)+a’bc’d
所以我們要找到一個最優的提取方式。
【網絡安全學習攻略】
如何處理呢。我們要找到那個出現次數最多的元素進行提取,并且一次提取最多個數元素。我們先對邏輯單元進行分析記錄元素出現次數。
我們可以使用如下圖的形式記錄
2-level logic
multi-level logic
然后先尋找元素最多的邏輯單元,依據邏輯單元中存在的元素找盡可能多符合相同存在元素的邏輯單元,一直到尋找完畢,對最終盡可能多的滿足的元素提取,然后重復上述操作。
【網絡安全學習攻略】
總結
以上是生活随笔為你收集整理的硬件安全系列 逻辑电路基础知识介绍(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 硬件安全系列 逻辑电路基础知识介绍(一)
- 下一篇: 硬件安全系列 逻辑电路基础知识介绍(三)