FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

VLSIの配置配線アルゴリズムMincut (Kernighan–Linのアルゴリズム)について復習

ちょっと諸事情で過去に勉強したアルゴリズムを復習したくて、Mincutアルゴリズムを再度勉強していた。

VLSIにおいて配置配線をする際に使用されるアルゴリズムとして有名なものに、Quadratic Placement & Mincutというものがある。 そのうちのMincutは、1つのグラフを、なるべく同じ大きさで、交差する辺を最小にしつつ分割するアルゴリズムだ。

以下のWikipediaが参考になる。

en.wikipedia.org

function Kernighan-Lin(G(V, E)) is
    determine a balanced initial partition of the nodes into sets A and B
    
    do
        compute D values for all a in A and b in B
        let gv, av, and bv be empty lists
        for n := 1 to |V| / 2 do
            find a from A and b from B, such that g = D[a] + D[b] − 2×c(a, b) is maximal
            remove a and b from further consideration in this pass
            add g to gv, a to av, and b to bv
            update D values for the elements of A = A \ a and B = B \ b
        end for
        find k which maximizes g_max, the sum of gv[1], ..., gv[k]
        if g_max > 0 then
            Exchange av[1], av[2], ..., av[k] with bv[1], bv[2], ..., bv[k]
    until (g_max ≤ 0)

    return G(V, E)

あるノード aに着目し、グループの中でまとまっている辺を I_aとし、グループから外に出る辺を E_aとする。この時の差分を D_a=I_a-E_aと計算する。また、 c(a, b)はノードaからbのコストを示す。

コメントにあるように、 D_a+D_b-2\times c(a, b)が最大となる a bを見つける。この式の意味は、内部に接続が多い方が Dが大きくなるため、内部へのパスが多い a bを選択し、かつ aから bへの接続のコストを引いたものなり、 a bを直接つなぐコスト以外の、内部の辺への寄与率を示したものになる。

つぎに、ここで選んだ a bを削除し、残ったノードに対して再度 Dを計算し直す。この際、 a bを選択した際の gの値を gv[i]として記憶しておく。選択した a av, 選択した b bvとしてリストに追加する。

この結果、 sum(g[0, g[i], …, g[k])]の値が最も大きくなる kを算出する。この値が正であれば、 av[0, av[1], …, av[2]] と  bv[0, bv[1], … bv[k]]を交換する。

上記のsumの値が最終的にマイナスになるまで繰り返すことでこのアルゴリズムは終了する。