第五章 避開障礙物且符合長度之匯流排繞線
5.2 避開障礙物之匯流排繞線
最大流量問題(Maximum Flow Problem),在日常生活中隨處可見,例如:兩地來 往之間的車流量或者河川上游到河川下游的水流量等等,皆是最大流量的問題,而最 大流量圖形中各點分支邊上的數目就是該路徑上的最大容量。如圖 5-3,便是一個典
42
型的最大流量問題(Maximum Flow Problem)的圖形。
在避開障礙物之匯流排繞線(Obstacle-Aware Bus Routing)中,不做任何的符合長 度的動作。在此,僅利用最大流量問題(Maximum Flow Problem)在每條線段所必須經 過的區域路徑(Region Path)上,找出一條盡量不做其他多餘繞道動作的最短路徑。
圖 5-3 最大流量問題之圖形
首先,根據每個障礙物的垂直水平延伸線,將繞線平面切割成許多小矩形,觀察 這些小矩形,如果兩條垂直或水平延伸線剛好落在兩個障礙物或一個障礙物及一個外 部邊界的邊界上,,我們稱為獨立區域,因為這些區域要跟其他區域做合併的話勢必 會是一個狹長型的區域,所以這種區域要優先被獨立出來當作是一個切割區域,如圖 5-4 中灰色區域所示。
圖 5-4 繞線平面及其切割完成圖
而剩下的矩形,將會經由合併的動作形成一塊面積較大的獨立區域或者最大結合 的區域。因此,除了一開始的獨立區域之外,剩下的矩形會先經由合併先結合成較大
43
的獨立區域,最後才會形成最大面積的結合區域(maximum combined region)。
如圖 5-4 為例,經過合併之後,可以找到額外的獨立區域,如圖 5-5(a)黃色區域 所示,而接下來的空間經由合併可以依序的形成最大面積的矩形區域,如圖 5-5(b)灰 色以外部分所示。因此,我們就可以依序的得到如圖 5-5(c)所示的切割結果,其中 R1、 R3、R5、R8、R9及 R11為獨立區域,而 RS、RT、R2、R4、R6、R7及 R10為最大結合 區域。
RS
R4
R1
R2 R3
RT
R5
R6
R7
R9
R10 R11
R8
(a) (b) (c)
圖 5-5 不同端點位置之切割方式
然而,為了滿足流量問題中單一起點到單一終點的特性,我們要將兩組端點都分 配到同一個切割區域中。因此,如果起始端點或終點端點分佈在不同切割區域中,我 們要把這些區域做合併,形成一個不規則形的區域,如圖 5-6 所示。最後一條線段的 端點位在不同的切割區域,透過合併,使得所有線段的端點都在同一切割區域。
圖 5-6 利用障礙物相對關係切割之結果
44
在完成切割之後,先建立相鄰關係圖(Adjacent Graph),而兩相鄰區域邊上的權重 即為兩相鄰區域之相鄰格子數,如圖 5-7(a)所示。而在建立完相鄰關係圖(Adjacent Graph)之後,導入流量(Flow)的概念,匯流排(Bus)線段從 VS經由相鄰區域到 VT,如 圖 5-7(b)所示,而為了避免線段過於集中在某處,依照區域分支容量的總合,平均分 配到相鄰的區域中,直到所有線段都到 VT為止。
首先,定義當前區域(Current Region)為線段目前所在之區域。針對每個當前區域 (Current Region),除了來源區域之外,將其他分支的容量相加總起來,即相鄰區域的 相鄰格子總數,如果大於當前區域(Current Region)中的線段總數的話,依照每個分支 容量與所有分支容量總合的比率乘以線段數目,可以計算出該相鄰之區域該分配幾條 線段。而分支上的容量減去分配線段的數目,即為剩餘的容量,最後,有分配到線段 之相鄰區域會被設為當前區域(Current Region);反之,如果相鄰格子的總數小於當前 區域(Current Region)中線段總數,則代表當前區域(Current Region)分支總容量小於線 段總數,即流出小於流入,如果這種情況發生,把所有分支容量用光之後,將多出來 的線段回傳至來源區域,並將當前區域(Current Region)與來源區域間的分支容量設為 零以及來源區域從設為當前區域(Current Region)。以此類推,直到當前區域(Current Region)剩下終點區域 VT為止。然而,如果 VS的分支容量總和除以線段總數小於 1 的話,代表該繞線平面無法將所有線段連線成功。
以圖 5-7(a)為例,一開始當前區域(Current Region)為 VS,相鄰區域為 V1和 V7, 而相鄰格子總數為 8,大於 VS中線段總數 6。根據比率計算得知,V1分配兩條線段 而 V7分配四條線段,扣除分配線段後,VS到 V1容量剩下 0 而 VS到 V7容量剩下 2。
最後,V1 和 V7 被設為當前區域(Current Region),以此類推,直到當前區域(Current Region)剩下終點區域 VT為止,如圖 5-8 所示為各線段從 VS到 VT的流量圖。最後,
根據每階段各相鄰區域所分配到的線段數目以及各相鄰區域由上而下的排序,分配指 定的線段給各相鄰之區域,得到結果如下:
45
Net1:VS V1 V2 V4 VT
Net2:VS V1 V2 V4 VT
Net3:VS V7 V9 V4 VT
Net4:VS V7 V10 V11 VT
Net5:VS V7 V10 V11 VT
Net6:VS V7 V10 V8 V6 V5 VT
(a) (b)
圖 5-7 匯流排之繞線平面的相鄰關係圖及最大流量的有向圖
圖 5-8 最大流量問題之結果
46
再依據每條線段所經過的區域路徑(Region path),找出一條盡量不做任何多餘繞 線的最短路徑(Minimum Length)。為了保證在匯流點(Confluence,該區域中的線段來 自不同的區域)中的每條線段沒有任何交錯(Crossing)的情形發生。然而,會有交錯 (Crossing)的情形發生則是因為,在同一區域中,沒有留下適當的空間給後面的線段。
因 此 , 在 此 考 慮 兩 端 點 為 對 角 的 矩 形 之 範 圍 並 根 據 該 線 段 所 經 過 的 空 間 (Space-List)找出一條適當的路徑。而在這條路徑中,根據兩端點相關位置不同而有不 同方向的走位,例如:起點在終點的右上角,那麼線段會經由向左以及向下而到終點,
以此類推,而且不做任何多餘繞道增加長度的走法。然而,針對該線段所經過的每個 區域 Ri中,如果該線段在 Ri區域中不是最後一條線而終點在起點的右邊,那麼該線 段在兩端點為對角之矩形範圍內會貼著上一條線段或者邊界順時針的繞線,如圖 5-9(c)所示,而如果終點在起點的左邊,則會變成逆時針貼著上一條線段或邊界繞線,
如圖 5-9(b)所示,直到下一個空間區域之邊上為止;如果該線段在 Ri區域中是最後一 條線而終點在起點的右邊,則會是逆時針貼著邊界繞線,如圖 5-10(c)所示,而如果 終點在起點的左邊,則會是順時針貼著邊界繞線,如圖 5-10(b)所示。
(a) (b) (c)
圖 5-9 線段非最後一條線的走法
(a) (b) (c)
圖 5-10 線段為最後一條線的走法
47
如果兩端點為對角之矩形範圍內找不到一條經過該線段之空間區域(Space-List) 的路徑,那麼會將該矩形範圍擴大,直到找到一條經過該線段之空間區域(Space-List) 的路徑為止。
以圖 5-11 為例,Net1 所經過的空間區域為 RS、R1、R2、R4以及 RT因為在 Net1 在 RS、R1、R2、R4以及 RT中都不是最後一條線段,而終點又在起點的右方,因此會 在兩端點為對角的矩形範圍中,依序在每個經過的空間區域中做順時針貼著邊界的繞 線,以此類推,如圖 5-11 所示。然而,Net6 因為所經過的空間區域(Space-List)RS、 R7、R10、R8、R6、V5以及 VT中,在一開始的兩端點為對角所形成的矩形範圍內找不 到一條路徑,因此擴大該矩形範圍,直到找到一條經過空間區域的線段為止,如圖 5-12 所示。
圖 5-11 根據經過空間之路徑分配
圖 5-12 延伸矩形範圍以求得適當路徑
48
當所有線段都經由各自的區域路徑而找到一條路徑的時候,由於下一章節產生長 度匹配之繞線(Length-Matching Generation)的流程,為了使外圍線段有足夠的空間使 用,因此必須將整個繞線平面中剩下的可用空間盡可能的往外移動。換句話說就是將 線段在不做任何額外繞線之下,根據所經過的空間(Space-List)將每條線的路徑分配完 之後,如圖 5-13(a)所示。為了確保外圍的線段有多餘的空間可以使用以及將一些零 星的空格盡量挪到外圍,因此,必須將已經分配好的線段集中(Centralization)在整個 繞線平面的中間,如圖 5-13(b)所示。
(a) (b)
圖 5-13 各線段分配完成的路徑以及集中各路徑之繞線平面
因此,整個避開障礙物之匯流排繞線的演算法如下所示:
避開障礙物之匯流排繞線:
反覆的矩形切割;
建立相鄰關係圖;
移除不可繞之區域;
從起始端點區域到終點端點區域,依據廣度搜尋建立流向圖;
在有向圖中:
起始端點區域之線段數目為匯流排之線段總數;
目前區域之串列 = 起始端點區域;
區域 i = 目前區域串列中的第一個;
49
while( 目前區域串列不是空的 ){
區域 i 之相鄰區域的相關位置順時針排序;
n =與區域 i 相鄰區域之相鄰格子總數 / 區域 i 中線段總數;
if( n > 1 ){
根據相鄰區域的排序,每 n 格分配 1 線段數目給該相鄰之區域;
除了終點區域之外,
將有被分配到線段之相鄰區域加到目前區域串列的後方;
將相鄰區域之來源區域設為區域 i;
將區域 i 從目前區域串列中移除;
指標指向目前區域串列中的下一個區域;
} else{
if(區域 i 為起始端點區域) 容量不夠無法繞線成功;
else{
每相鄰 1 格,分配 1 條線段給該相鄰區域;
除了終點區域之外,
將有被分配到線段之相鄰區域加到目前區域串列的後方;
將相鄰區域之來源區域設為區域 i;
多出來的線段回傳至區域 i 的來源區域;
將來源區域加到目前區域串列的前方;
指標指向目前區域串列中的下一個區域;
} } }
從起點區域到終點區域;
根據起點終點相對位置的關係,分配特定線段給相鄰之區域;
for( 每一條線段 ){
兩端點為對角的矩形中在所分配之區域中;
while( 沒路徑 ) 擴大矩形範圍;
while( 線段未達終點 ){
if( 線段非該區域之最後一條線段 ) 特定順或逆時針邊界繞線;
else
特定逆或順時針邊界繞線;
} }
50
for( 每一個切割區域 ){
從中間線段到兩側外圍線段;
外圍線段貼著中間線段;
}