作者 主題: SKILL劃多條PATH,超強版!! 新增自動打上VIA(完結篇)  (閱讀 5733 次)

0 會員 與 1 訪客 正在閱讀本文。

lkkl

  • 活潑的大學生
  • ***
  • 文章數: 431
    • 檢視個人資料
    • 我的線上小窩
這次功能超強的,我修正一些小問題,新增了可直接在menu選Layer,區分digital(min-rule)和analog繞線(width要幾個via寬....)
下一版,我想寫能在兩頭自動打上via,有3個檔要存在同一目錄,如下,3Q
下面有圖
http://www.taconet.com.tw/lkkllkkl/skill5.html
代碼: [選擇]
/*
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 作者:Y.P.LIN
 檔名: creat_path_multi.il(副檔是tec_route.il,route_menu.il)
 用途: LAYOUT輔助工具
 日期: 2007.12.11
 版本: 正式版2.00
 用法:在icfb,load本sKILL(例如 load "creat_path_multi.il" ),再開一個layout,LSW選LAYER,按<F8>,跳出視窗(輸入值)
      像在LAOUT劃一條PATH
 參考:雷奧星空論壇(http://www.armbell.com/forum/viewforum.php?f=13&mforum=iclayout)
     :中国集成电路教育网(http://www.icedu.net/Article/shuzi/houduan/Index.html)
     :google搜尋
     :cadence手冊(安裝目錄下/doc/sk開頭目錄)
 注  :本SKILL還在開發中,目前功能
     1. 劃多條可任意轉角PATH
     2. 會自動設最小rule
     3.可設定幾個via寬(自動抓rule)
     3.可設定space為min的幾倍
 聲明:1.程式著作為OPEN SOURCE,歡迎做任何修改,但上面"參考"不得做更動
      2.SKILL為CANDENCE所有
   ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   */

hiSetBindKey("Layout" "F8" "line()")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;enterpath;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(line()
let((path_width path_space path_number path_point width cvId xlayer layer purpose list_draw_layer
MultiItemFormI path_widthID path_spaceID path_numberID path_pointID)
cvId=getEditRep()
layer = car(leGetEntryLayer())          ; LSW layer
purpose = cadr(leGetEntryLayer())       ; LSW purpose
list_draw_layer=list(layer purpose)     ; 取得LSW LAYER
load("./route_menu.il")
route_menu();
path_width=MultiItemFormID->path_widthID->value                          ;視窗值
path_space=MultiItemFormID->path_spaceID->value                          ;視窗值
path_number=MultiItemFormID->path_numberID->value                        ;視窗值
path_point=MultiItemFormID->path_pointID->value
width=(path_width+path_space)*path_number-path_space              ;enterpath width
xlayer = MultiItemForm~>trCyclicField1~>value          ;取得cycle的值
type=MultiItemForm~>trConeRadioField~>value           ;取得radio值
layer=car(parseString( xlayer " / " ))
purpose=cadr(parseString( xlayer " / " ))
list_draw_layer=list(layer purpose)

procedure( pathDone( w done pts )
   if( done then
        printf("Path entered was %L.\n" pts)
get_draw_path(pts path_width path_space path_number list_draw_layer width);
    else
         println("Path entry aborted.")
     );if
     );procedure
    enterPath( ?prompts                                       ;enterpath
    list( "Enter the first point."
          "Enter the next point." )
    ?doneProc "pathDone"                                      ;enterpath會呼叫的程序
    ?wantPoints path_point                                    ;enterpath的點數目
    ?pathWidth width
    ?pathStyle "Truncate"                                     ;enterpath的style
    );enterpath
    );let
    );procedure_line
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;劃PATH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   
procedure(get_draw_path(path_list path_width path_space path_number list_draw_layer width)
   let((path_pitch len path_obj plogon_path list1 list2 move_d i list_new_get intil_d)
   path_pitch=path_width+path_space
   move_d=path_space+path_width/2
   len=length(path_list)
   intil_d=path_pitch-path_width/2
   path_obj=leCreatePath( cvId list_draw_layer path_list width);先劃一條sample的path
   plogon_path=dbConvertPathToPolygon(path_obj)                ;轉成polygon(目的取點)
   list1=plogon_path~>points                                   ;前半部list是path上方的點
   list2=reverse(list1)                                        ;反轉list前半部是path下方的點
   dbDeleteObject(plogon_path)                                 ;刪除sample的path
   for(i 1 path_number                                         ;只須處理一半
   list_new_get=get_new_path_list(list1 list2 path_pitch len intil_d i)               ;取得一組path新座標list
   list1=reverse(list_new_get)                                 ;取代下方的點
   leCreatePath( cvId list_draw_layer list_new_get path_width );以新座標劃一PATH
   );for
   );let
   );procedure
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;計算下一個path的點(list);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(get_new_path_list(list11 list22 path_pitch_g len_g intil_d test_i)
prog((xnew ynew listxy11 listxy22 x1 y1 x2 y2 list_new list_new_get d)
list_new=list()
for(i 1 len_g                                     
  listxy11=nth(i-1 list11)
  listxy22=nth(i-1 list22)                        ;上面一點
  x1=car(listxy11)                                ;下方x1
  y1=cadr(listxy11)                               ;下方y1
  x2=car(listxy22)                                ;上方x2
  y2=cadr(listxy22)                               ;上方y2
  if( test_i==1 then                                   ;第一次
     d=intil_d
     else
     d=0
     );if
  if( x2==x1 then                                    ;斜率無限大
    if(y2 > y1 then
       xnew=x1
       ynew=y1+path_pitch-d
       else
       xnew=x1
       ynew=y1-path_pitch+d
      );if
    else
      if(x2 > x1 then                                 ;正pitch
       m=(y2-y1)/(x2-x1)                              ;求得斜率
       xnew=x1+path_pitch-d                     ;新的x
       ynew=y1+m*(xnew-x1)                            ;新的y
       else                                           ;負pitch
       m=(y2-y1)/(x2-x1)                              ;求得斜率
       xnew=x1-path_pitch+d                     ;新的x
       ynew=y1+m*(xnew-x1)                            ;新的y
       );if

    );if
    list_new=xcons(list_new list(xnew ynew))   ;附加到list_new
     );for
  list_new_get=list_new   
  return(list_new_get)
  );prog
);procedure



代碼: [選擇]
/*
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 作者:Y.P.LIN
 檔名:tec_route.il
 用途:從technology取得route drc rule
 用法:呼叫tec_route(metal_set)會回傳一個metal_set的list(metal最小width metal最小space via最小width metal-enclose-via via-space)
      若不是metal則回傳default,list(1 1 .5 .5 .5)
 日期:2007.12.11
 參考:雷奧星空論壇(http://www.armbell.com/forum/viewforum.php?f=13&mforum=iclayout)
     :中国集成电路教育网(http://www.icedu.net/Article/shuzi/houduan/Index.html)
     :google搜尋
     :cadence手冊(安裝目錄下/doc/sk開頭目錄)
     聲明:1.程式著作為OPEN SOURCE,歡迎做任何修改,但上面"參考"不得做更動
           2.SKILL為CANDENCE所有
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/
;;hiSetBindKey("Layout" "F8" "tec_rule()")
procedure(tec_route(metal_set)
let((cvID tec_ID via_ID )
drc_list_path=list()
cvID = deGetCellView()
tec_ID=techGetTechFile(cvID) ;取得tec ID
;metal_set="METAL1"
rule_get(tec_ID metal_set)

);let
);proc
procedure(rule_get(tec_ID metal_set)
prog((via_route_list len via_cell_name via_view_name via_type via_enclose met1 via_o_name via_width metal_width metal_space via_space)
via_route_list=techGetPrViaTypes( tec_ID )                           ;取得route metal
len=length(via_route_list)                                        ;route metal數目
foreach(tec_i via_route_list
via_cell_name=car(car(tec_i))                                     ;via名稱(M2_M1)
via_view_name=cadr(car(tec_i))
via_type=techGetDeviceCParam( tec_ID via_cell_name via_view_name) ;取得via資訊
via_enclose=cadr(nth(5 via_type))                                 ;取得metal enclose via距離
;met2=cadr(nth(6 via_type))                                       ;取得metal2
met1=cadr(nth(7 via_type))                                        ;取得metal1
via_o_name=cadr(nth(8 via_type))                                  ;取得via名稱(VIA12)
via_space=techGetSpacingRule( tec_ID "minSpacing" via_o_name)     ;取得via最小space
via_width=techGetSpacingRule( tec_ID "minWidth" via_o_name)       ;取得via最小width
metal_width=techGetSpacingRule( tec_ID "minWidth" met1 )          ;取得metal最小width
metal_space=techGetSpacingRule( tec_ID "minSpacing" met1)         ;取得metal最小space
if( eq(metal_set met1) then
drc_list_path=list(metal_width metal_space via_width via_enclose via_space)             ;route drc list
);if
);for
if(eq(drc_list_path nil) then
return(list(1.0 1.0 .5 .5 .5))
else
return(drc_list_path)
);if
);let
);proc

代碼: [選擇]
/*
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 作者:Y.P.LIN
 檔名: route_menu.il(副檔是tec_route.il,route_menu.il)
 用途: 視窗工具
 日期: 2007.12.11
 參考:雷奧星空論壇(http://www.armbell.com/forum/viewforum.php?f=13&mforum=iclayout)
     :中国集成电路教育网(http://www.icedu.net/Article/shuzi/houduan/Index.html)
     :google搜尋
     :cadence手冊(安裝目錄下/doc/sk開頭目錄)
 聲明:1.程式著作為OPEN SOURCE,歡迎做任何修改,但上面"參考"不得做更動
      2.SKILL為CANDENCE所有
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/
;hiSetBindKey("Layout" "F8" "route_menu()")
procedure(route_menu()
let((masterlib cvID tec_ID lsw_layer LibraryNameID BrowserButtonID
trCyclicList trCyclicField1 trCyclicField2 layer purpose list_draw_layer drc_list
metal_width metal_space via_width via_enclose ana_width ana_space dig_width dig_space set_width set_space
aboutstrings AboutIconID myColorArray via_space)
masterlib=(geGetEditCellView)~>libName;取得lib名稱
cvID = deGetCellView()
tec_ID=techGetTechFile(cvID)
lsw_layer=get_car_list(leGetValidLayerList(tec_ID)) ;取得所有layer NAME
layer = car(leGetEntryLayer())          ; LSW layer
purpose = cadr(leGetEntryLayer())       ; LSW purpose
list_draw_layer=strcat(layer " / " purpose )     ; 取得LSW LAYER
load("./tec_route.il");        load SKILL(取得rule)
drc_list= tec_route(layer);
metal_width=nth(0 drc_list)
metal_space=nth(1 drc_list)
via_width=nth(2 drc_list)
via_enclose=nth(3 drc_list)
via_space=nth(4 drc_list)
ana_width=via_width+via_enclose*2              ;ANALOG WIDTH
ana_space=metal_space                          ;ANALOG SPACE
dig_width=metal_width                          ;DIGTIAL WIDTH
dig_space=metal_space+(ana_width-metal_width)/2;DIGTIAL SPACE
set_width=ana_width
set_space=ana_space
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;建立表單元件;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
path_widthID=hiCreateFloatField(
        ?name 'path_widthID
        ?prompt "path width :"
        ?value set_width
        ?defValue set_width
        ?range (range 0 100)
;?editable nil
)

path_spaceID=hiCreateFloatField(
        ?name 'path_spaceID
        ?prompt "path space :"
        ?value set_space
        ?defValue set_space
        ?range (range 0 100)
        ;?editable nil
)
path_numberID=hiCreateIntField(
        ?name 'path_numberID
        ?prompt "path number :"
        ?value 1
        ?defValue 1
        ?range (range 1 100)
        ;?editable nil
                        )
path_pointID=hiCreateIntField(
        ?name 'path_pointID
        ?prompt "path point number :"
        ?value 2
        ?defValue 2
        ?range (range 2 100)
        ;?editable nil
                        )
;;; creating the cyclic field
trCyclicField1 = hiCreateCyclicField(
   ?name       'trCyclicField1
   ?prompt     "Route Layer: "
   ;?choices    trCyclicList
   ?choices    lsw_layer
   ?value      list_draw_layer
   ?defValue   list_draw_layer
   ?callback   "set_route_rule(tec_ID)"
)
trCyclicField2=hiCreateCyclicField(
   ?name       'trCyclicField2
   ?prompt     "Analog space rate: "
   ;?choices    trCyclicList
   ?choices    '("1" "2" "3" "4" "5")
   ?value      "1"
   ?defValue   "1"
   ?callback   "set_route_rule(tec_ID)"
)
trCyclicField3=hiCreateCyclicField(
   ?name       'trCyclicField3
   ?prompt     "Analog width rate: "
   ;?choices    trCyclicList
   ?choices    '("1" "2" "3" "4" "5")
   ?value      "1"
   ?defValue   "1"
   ?callback   "set_route_rule(tec_ID)"
)


trConeRadioField = hiCreateRadioField(
   ?name      'trConeRadioField
   ?prompt    "Routing Type : "
   ?choices   list( "Digital" "Analog" )
   ?value     "Analog"
   ?defValue  "Analog"
   ?callback  '("set_route_rule(tec_ID)")     
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ICON;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

myColorArray=hiCreateColorArray()
myColorArray[0]=hiMatchColorByName("thistle");a
myColorArray[1]=hiMatchColorByName("red");b
myColorArray[2]=hiMatchColorByName("blue");c
myColorArray[3]=hiMatchColorByName("yellow");d
myColorArray[4]=hiMatchColorByName("white");e
myColorArray[5]=hiMatchColorByName("green");f
aboutstrings=
"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea\
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeaeeeeeeeeeeeebbbbbbbbeeeeeeeeeeee\
eeeeeeeeebb111bbbbbbbbbeeeeeeeeeeeeeeeeebbbbb1111bbbbbbbeeeeeeee\
eeeeeebbbbbbbbbb111bbb11bbeeeeeeeeeeebbbbbbbbbbbbb11bb11bbbeeeee\
eeeebbbbbbbbbbbbbbb11bbbbbbbeeeeeeeebbbbbbb11bbbbbbb11bbbb11eeee\
eeebbbbbbbb11bbbbbbbb11bbb111eeeeeebbbbbbbbbbbbbbbbbbb11bb111eee\
eebb111bbbbbbbbbbbbbbbb11bbbbbeeeebb111bbbbbbbb111bbbbbb1bbbbbee\
eebb111bbbbbbbb111bbbbbb11bbbbeeeebbbbbbbbbbbbb111bbbbbbb1bbbbbe\
eebbbbbbbbbbbbbbbbbbbbbbb11bbbbeeeabbbbbb111bbbbbbbbbbbbbb1bbbbe\
eeaa1bbbb111bbbbbbbbbbbbbb11bbbeeea11bbbb111bbbbbbbbbbbbbbb1b1ee\
ee11aabbbbbbbbbbb111bbbbbbb111eeeeeaaa11bbbbbbbbb111bbbbb1111b1e\
eeeeaa11bbbbbbbbb111bbbbb11bbb1eeeeee11aaabbbbbbbbbbbbbbb11bbb1e\
eeeeeeaaaa11abbbbbbbb1111111b11eeeeeeeeee11aaaaa111111aaaaa111aa\
eeeeeeeeeeaaaaaaa11aaaaaaaa1a1aaeeeeeeeeeeeeaaaa111aaaaaaaa1aaaa\
eeeeeeeeeeeeeeeeaaaaaaaaaaaaaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
abouticon=hiStringToIcon(myColorArray aboutstrings 32 32);

AboutIconID=hiCreateLabel(
   ?name 'NfmaoIcon
   ?labelText "nfmao"
   ?labelIcon abouticon
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;建立視窗;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MultiItemFormID=hiCreateAppForm(
?name 'MultiItemForm
?formTitle "Route Option"
?formType 'nonoptions
;?buttonLayout 'OKCancel
?callback list("")
?minSize 517:400
?fields list(
             list(trCyclicField1 0:170 150:30 100)
             list(trCyclicField2 300:120 200:30 120)
             list(trCyclicField3 300:170 200:30 120)
             list(trConeRadioField 0:120 200:30 100)
             list( path_widthID   0:20 200:30 100)
             list( path_spaceID 250:20 200:30 100)
             list( path_numberID 0:50 200:30 100)
             list( path_pointID 250:50 200:30 100)
             list( AboutIconID 220:250 200:30 100)
                    )
)
hiDisplayForm(MultiItemFormID);
);let
);proc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;取得所有layer;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(get_car_list(list)
prog((slist new_list list_i list_j list_ij)
new_list=list("none")
foreach(slist list
list_i=car(slist)
list_j=cadr(slist)
list_ij=strcat( list_i " / " list_j ) ;合併字串
new_list=cons(list_ij new_list)
)
return(new_list)
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;設定rule;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(set_route_rule(tec_ID)
let((layer type metal_layer drc_list metal_width metal_space via_width via_enclose ana_width ana_space dig_width
space_rate dig_space set_width set_space via_space)
layer = MultiItemForm~>trCyclicField1~>value          ;取得cycle的值
type=MultiItemForm~>trConeRadioField~>value           ;取得radio值
metal_layer=car(parseString( layer " / " ))           ;取得cycle的metal
metal_purpose=cadr(parseString( layer " / " ))
leSetEntryLayer( list(metal_layer metal_purpose) tec_ID);設定lsw layer
space_rate=MultiItemForm~>trCyclicField2~>value
width_rate=MultiItemForm~>trCyclicField3~>value
drc_list= tec_route(metal_layer)                            ;
metal_width=nth(0 drc_list)
metal_space=nth(1 drc_list)
via_width=nth(2 drc_list)
via_enclose=nth(3 drc_list)
via_space=nth(4 drc_list)
ana_width=(via_width*evalstring(width_rate)+via_enclose*2)+via_space*(evalstring(width_rate)-1)       ;ANALOG WIDTH
ana_space=metal_space*evalstring(space_rate)                                   ;ANALOG SPACE
dig_width=metal_width                          ;DIGTIAL WIDTH
dig_space=metal_space+(ana_width-metal_width)/2;DIGTIAL SPACE
set_width=ana_width
set_space=ana_space
case(type
  ("Analog"
  MultiItemForm->path_widthID->value=set_width
  MultiItemForm->path_spaceID->value=set_space
  )
  ("Digital"
  MultiItemForm->path_widthID->value=dig_width
  MultiItemForm->path_spaceID->value=dig_space
  )
);case
println(metal_layer)
println(type)
);let
);proc

« 上次編輯: 2007-12-30 22:48 由 lkkl »
愛護地球請用LINUX,省電又環保,大家共同為地球盡一份心力.
小弟的網頁
http://yplin123.googlepages.com/home
"資訊人權貴" 之家(令人佩服的洪朝貴老師)
http://people.ofset.org/~ckhung/

lkkl

  • 活潑的大學生
  • ***
  • 文章數: 431
    • 檢視個人資料
    • 我的線上小窩
修正按cancle扔會動作,新增自動打上VIA功能(最少2棵),若是狗骨頭VIA(digital),會自動挫開
下面有圖
http://www.taconet.com.tw/lkkllkkl/skill6.html
代碼: [選擇]
/*
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 作者:Y.P.LIN
 檔名: 主檔route_menu.il(副檔是creat_path_multi.il,tec_route.il)
 用途: 視窗工具
 日期: 2007.12.11
 版本: 正式版2.00
 用法:在icfb,load本sKILL(例如 load "route_menu.il" ),再開一個layout,LSW選LAYER,按<F8>,跳出視窗(輸入值)
      像在LAOUT劃一條PATH
 參考:雷奧星空論壇(http://www.armbell.com/forum/viewforum.php?f=13&mforum=iclayout)
     :中国集成电路教育网(http://www.icedu.net/Article/shuzi/houduan/Index.html)
     :google搜尋
     :cadence手冊(安裝目錄下/doc/sk開頭目錄)
 注  :本SKILL還在開發中,目前功能
     1. 劃多條可任意轉角PATH
     2. 會自動設最小rule
     3.可設定幾個via寬(自動抓rule)
     4.可設定space為min的幾倍
     5.可設自動打上VIA
 聲明:1.程式著作為OPEN SOURCE,歡迎做任何修改,但上面"參考"不得做更動
      2.SKILL為CANDENCE所有
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/
hiSetBindKey("Layout" "F8" "route_menu()")
load("./creat_path_multi.il")
load("./tec_route.il")
test_ID="nil"
procedure(route_menu()
let((masterlib cvID tec_ID lsw_layer LibraryNameID BrowserButtonID
trCyclicList trCyclicField1 trCyclicField2 layer purpose list_draw_layer drc_list
metal_width metal_space via_width via_enclose ana_width ana_space dig_width dig_space set_width set_space
aboutstrings AboutIconID myColorArray via_space)
masterlib=(geGetEditCellView)~>libName;取得lib名稱
cvID = deGetCellView()
tec_ID=techGetTechFile(cvID)
if( test_ID == "nil" then
 leSetEntryLayer(list(car(car(techGetPrRoutingLayers(tec_ID)))) tec_ID) ;
)
test_ID="FAIL"
lsw_layer=get_car_list(leGetValidLayerList(tec_ID)) ;取得所有layer NAME
layer = car(leGetEntryLayer())          ; LSW layer
purpose = cadr(leGetEntryLayer())       ; LSW purpose
list_draw_layer=strcat(layer " / " purpose )     ; 取得LSW LAYER
load("./tec_route.il");        load SKILL(取得rule)
drc_list= tec_route(layer);
metal_width=nth(0 drc_list)
metal_space=nth(1 drc_list)
via_width=nth(2 drc_list)
via_enclose=nth(3 drc_list)
via_space=nth(4 drc_list)
ana_width=via_width+via_enclose*2              ;ANALOG WIDTH
ana_space=metal_space                          ;ANALOG SPACE
dig_width=metal_width                          ;DIGTIAL WIDTH
dig_space=metal_space+(ana_width-metal_width)/2;DIGTIAL SPACE
set_width=ana_width
set_space=ana_space
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;建立表單元件;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
path_widthID=hiCreateFloatField(
        ?name 'path_widthID
        ?prompt "path width :"
        ?value set_width
        ?defValue set_width
        ?range (range 0 100)
;?editable nil
)

path_spaceID=hiCreateFloatField(
        ?name 'path_spaceID
        ?prompt "path space :"
        ?value set_space
        ?defValue set_space
        ?range (range 0 100)
        ;?editable nil
)
path_numberID=hiCreateIntField(
        ?name 'path_numberID
        ?prompt "path number :"
        ?value 1
        ?defValue 1
        ?range (range 1 100)
        ;?editable nil
                        )
path_pointID=hiCreateIntField(
        ?name 'path_pointID
        ?prompt "path point number :"
        ?value 2
        ?defValue 2
        ?range (range 2 100)
        ;?editable nil
                        )
;;; creating the cyclic field
trCyclicField1 = hiCreateCyclicField(
   ?name       'trCyclicField1
   ?prompt     "Route Layer: "
   ;?choices    trCyclicList
   ?choices    lsw_layer
   ?value      list_draw_layer
   ?defValue   list_draw_layer
   ?callback   "set_route_rule(tec_ID)"
)
trCyclicField2=hiCreateCyclicField(
   ?name       'trCyclicField2
   ?prompt     "Analog space rate: "
   ;?choices    trCyclicList
   ?choices    '("1" "2" "3" "4" "5")
   ?value      "1"
   ?defValue   "1"
   ?callback   "set_route_rule(tec_ID)"
)
trCyclicField3=hiCreateCyclicField(
   ?name       'trCyclicField3
   ?prompt     "Analog width rate: "
   ;?choices    trCyclicList
   ?choices    '("1" "2" "3" "4" "5")
   ?value      "1"
   ?defValue   "1"
   ?callback   "set_route_rule(tec_ID)"
)


trConeRadioField = hiCreateRadioField(
   ?name      'trConeRadioField
   ?prompt    "Routing Type : "
   ?choices   list( "Digital" "Analog" )
   ?value     "Analog"
   ?defValue  "Analog"
   ?callback  '("set_route_rule(tec_ID)")     
)
trBooleanButton = hiCreateBooleanButton(
   ?name        'trBooleanButton
   ?buttonText  "Auto Creat Via"
   ?value        t
   ?defValue     nil
   ?callback    "println( hiGetCurrentForm()->trBooleanButton-> value )"
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ICON;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

myColorArray=hiCreateColorArray()
myColorArray[0]=hiMatchColorByName("thistle");a
myColorArray[1]=hiMatchColorByName("red");b
myColorArray[2]=hiMatchColorByName("blue");c
myColorArray[3]=hiMatchColorByName("yellow");d
myColorArray[4]=hiMatchColorByName("white");e
myColorArray[5]=hiMatchColorByName("green");f
aboutstrings=
"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea\
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeaeeeeeeeeeeeebbbbbbbbeeeeeeeeeeee\
eeeeeeeeebb111bbbbbbbbbeeeeeeeeeeeeeeeeebbbbb1111bbbbbbbeeeeeeee\
eeeeeebbbbbbbbbb111bbb11bbeeeeeeeeeeebbbbbbbbbbbbb11bb11bbbeeeee\
eeeebbbbbbbbbbbbbbb11bbbbbbbeeeeeeeebbbbbbb11bbbbbbb11bbbb11eeee\
eeebbbbbbbb11bbbbbbbb11bbb111eeeeeebbbbbbbbbbbbbbbbbbb11bb111eee\
eebb111bbbbbbbbbbbbbbbb11bbbbbeeeebb111bbbbbbbb111bbbbbb1bbbbbee\
eebb111bbbbbbbb111bbbbbb11bbbbeeeebbbbbbbbbbbbb111bbbbbbb1bbbbbe\
eebbbbbbbbbbbbbbbbbbbbbbb11bbbbeeeabbbbbb111bbbbbbbbbbbbbb1bbbbe\
eeaa1bbbb111bbbbbbbbbbbbbb11bbbeeea11bbbb111bbbbbbbbbbbbbbb1b1ee\
ee11aabbbbbbbbbbb111bbbbbbb111eeeeeaaa11bbbbbbbbb111bbbbb1111b1e\
eeeeaa11bbbbbbbbb111bbbbb11bbb1eeeeee11aaabbbbbbbbbbbbbbb11bbb1e\
eeeeeeaaaa11abbbbbbbb1111111b11eeeeeeeeee11aaaaa111111aaaaa111aa\
eeeeeeeeeeaaaaaaa11aaaaaaaa1a1aaeeeeeeeeeeeeaaaa111aaaaaaaa1aaaa\
eeeeeeeeeeeeeeeeaaaaaaaaaaaaaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
abouticon=hiStringToIcon(myColorArray aboutstrings 32 32);

AboutIconID=hiCreateLabel(
   ?name 'NfmaoIcon
   ?labelText "nfmao"
   ?labelIcon abouticon
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;建立視窗;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ddd="GGGGGGGGGGG"
MultiItemFormID=hiCreateAppForm(
?name 'MultiItemForm
?formTitle "Route Option"
?formType 'nonoptions
; ?buttonLayout '(OKCancel
;         (Previous "println(ddd)")
;         (Next "myNextCB()")
;         (Some\ other\ button otherCB))
?callback "line()"
?minSize 517:400
?fields list(
             list(trCyclicField1 0:170 150:30 100)
             list(trCyclicField2 300:120 200:30 120)
             list(trCyclicField3 300:170 200:30 120)
             list(trConeRadioField 0:120 200:30 100)
             list( path_widthID   0:20 200:30 100)
             list( path_spaceID 250:20 200:30 100)
             list( path_numberID 0:50 200:30 100)
             list( path_pointID 250:50 200:30 100)
             list( AboutIconID 220:280 200:30 100)
             list( trBooleanButton 0:250 200:30 100)
                    )
)
hiDisplayForm(MultiItemFormID);
);let
);proc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;取得所有layer;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(get_car_list(list)
prog((slist new_list list_i list_j list_ij)
new_list=list("none")
foreach(slist list
list_i=car(slist)
list_j=cadr(slist)
list_ij=strcat( list_i " / " list_j ) ;合併字串
new_list=cons(list_ij new_list)
)
return(new_list)
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;設定rule;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(set_route_rule(tec_ID)
let((layer type metal_layer drc_list metal_width metal_space via_width via_enclose ana_width ana_space dig_width
space_rate dig_space set_width set_space via_space)
layer = MultiItemForm~>trCyclicField1~>value          ;取得cycle的值
type=MultiItemForm~>trConeRadioField~>value           ;取得radio值
metal_layer=car(parseString( layer " / " ))           ;取得cycle的metal
metal_purpose=cadr(parseString( layer " / " ))
leSetEntryLayer( list(metal_layer metal_purpose) tec_ID);設定lsw layer
space_rate=MultiItemForm~>trCyclicField2~>value
width_rate=MultiItemForm~>trCyclicField3~>value
drc_list= tec_route(metal_layer)                            ;
metal_width=nth(0 drc_list)
metal_space=nth(1 drc_list)
via_width=nth(2 drc_list)
via_enclose=nth(3 drc_list)
via_space=nth(4 drc_list)
ana_width=(via_width*evalstring(width_rate)+via_enclose*2)+via_space*(evalstring(width_rate)-1)       ;ANALOG WIDTH
ana_space=metal_space*evalstring(space_rate)                                   ;ANALOG SPACE
dig_width=metal_width                          ;DIGTIAL WIDTH
dig_space=metal_space+(ana_width-metal_width)/2;DIGTIAL SPACE
set_width=ana_width
set_space=ana_space
case(type
  ("Analog"
  MultiItemForm->path_widthID->value=set_width
  MultiItemForm->path_spaceID->value=set_space
  )
  ("Digital"
  MultiItemForm->path_widthID->value=dig_width
  MultiItemForm->path_spaceID->value=dig_space
  )
);case
println(metal_layer)
println(type)
);let
);proc

代碼: [選擇]
/*
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 作者:Y.P.LIN
 檔名: creat_path_multi.il
 日期: 2007.12.11
 版本: 正式版2.00
 用途:route_menu.il的load檔(creat path 程序)
 參考:雷奧星空論壇(http://www.armbell.com/forum/viewforum.php?f=13&mforum=iclayout)
     :中国集成电路教育网(http://www.icedu.net/Article/shuzi/houduan/Index.html)
     :google搜尋
     :cadence手冊(安裝目錄下/doc/sk開頭目錄)
 聲明:1.程式著作為OPEN SOURCE,歡迎做任何修改,但上面"參考"不得做更動
      2.SKILL為CANDENCE所有
   ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   */

;hiSetBindKey("Layout" "F8" "line()")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;enterpath;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(line()
let((path_width path_space path_number path_point width cvId xlayer layer purpose list_draw_layer
MultiItemFormI path_widthID path_spaceID path_numberID path_pointID)
cvId=getEditRep()
layer = car(leGetEntryLayer())          ; LSW layer
purpose = cadr(leGetEntryLayer())       ; LSW purpose
list_draw_layer=list(layer purpose)     ; 取得LSW LAYER
path_width=MultiItemFormID->path_widthID->value                          ;視窗值
path_space=MultiItemFormID->path_spaceID->value                          ;視窗值
path_number=MultiItemFormID->path_numberID->value                        ;視窗值
path_point=MultiItemFormID->path_pointID->value
width=(path_width+path_space)*path_number-path_space              ;enterpath width
xlayer = MultiItemForm~>trCyclicField1~>value          ;取得cycle的值
type=MultiItemForm~>trConeRadioField~>value           ;取得radio值
layer=car(parseString( xlayer " / " ))
purpose=cadr(parseString( xlayer " / " ))
list_draw_layer=list(layer purpose)

procedure( pathDone( w done pts )
   if( done then
        printf("Path entered was %L.\n" pts)
get_draw_path(pts path_width path_space path_number list_draw_layer width);
    else
         println("Path entry aborted.")
     );if
     );procedure
    enterPath( ?prompts                                       ;enterpath
    list( "Enter the first point."
          "Enter the next point." )
    ?doneProc "pathDone"                                      ;enterpath會呼叫的程序
    ?wantPoints path_point                                    ;enterpath的點數目
    ?pathWidth width
    ?pathStyle "Truncate"                                     ;enterpath的style
    );enterpath
    );let
    );procedure_line
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;劃PATH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   
procedure(get_draw_path(path_list path_width path_space path_number list_draw_layer width)
   let((path_pitch len path_obj plogon_path list1 list2 move_d i list_new_get intil_d)
   path_pitch=path_width+path_space
   move_d=path_space+path_width/2
   len=length(path_list)
   intil_d=path_pitch-path_width/2
   path_obj=leCreatePath( cvId list_draw_layer path_list width);先劃一條sample的path
   plogon_path=dbConvertPathToPolygon(path_obj)                ;轉成polygon(目的取點)
   list1=plogon_path~>points                                   ;前半部list是path上方的點
   list2=reverse(list1)                                        ;反轉list前半部是path下方的點
   dbDeleteObject(plogon_path)                                 ;刪除sample的path
   for(i 1 path_number                                         ;只須處理一半
   list_new_get=get_new_path_list(list1 list2 path_pitch len intil_d i list_draw_layer)               ;取得一組path新座標list
   list1=reverse(list_new_get)                                 ;取代下方的點
   leCreatePath( cvId list_draw_layer list_new_get path_width );以新座標劃一PATH
   );for
   );let
   );procedure
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;計算下一個path的點(list);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(get_new_path_list(list11 list22 path_pitch_g len_g intil_d test_i list_draw_layer)
prog((xnew ynew listxy11 listxy22 x1 y1 x2 y2 list_new list_new_get d via_number l_width l_space l_pitch l_name
metal_draw metal_rule  l_enclose list_new type m_space via_width via_pitch dd)
list_new=list()
metal_draw=car(list_draw_layer)
metal_rule=tec_route(metal_draw)
print(metal_draw)
via_number=evalstring(MultiItemForm~>trCyclicField3~>value) ;取得個數
type=MultiItemForm~>trConeRadioField~>value
m_space=nth(1 metal_rule)
l_width=nth(2 metal_rule)
l_space=nth(4 metal_rule )
l_pitch=l_width+l_space
l_name=nth(5 metal_rule )
l_enclose=nth(3 metal_rule)
via_width=2*l_enclose+2*l_width+l_space
via_pitch=via_width+m_space

for(i 1 len_g                                     
  listxy11=nth(i-1 list11)
  listxy22=nth(i-1 list22)                        ;上面一點
  x1=car(listxy11)                                ;下方x1
  y1=cadr(listxy11)                               ;下方y1
  x2=car(listxy22)                                ;上方x2
  y2=cadr(listxy22)                               ;上方y2
  if( test_i==1 then                                   ;第一次
     d=intil_d
     else
     d=0
     );if
  if( x2==x1 then                                    ;斜率無限大
    if(y2 > y1 then
       xnew=x1
       ynew=y1+path_pitch-d
       else
       xnew=x1
       ynew=y1-path_pitch+d
      );if
    else
      if(x2 > x1 then                                 ;正pitch
       m=(y2-y1)/(x2-x1)                              ;求得斜率
       xnew=x1+path_pitch-d                     ;新的x
       ynew=y1+m*(xnew-x1)                            ;新的y
       else                                           ;負pitch
       m=(y2-y1)/(x2-x1)                              ;求得斜率
       xnew=x1-path_pitch+d                     ;新的x
       ynew=y1+m*(xnew-x1)                            ;新的y
       );if

    );if
    list_new=xcons(list_new list(xnew ynew))   ;附加到list_new
if( (i==1 || i==len_g) && MultiItemForm->trBooleanButton->value then
   if( test_i==1 && i==1 then
    xi1=xnew
    yi1=ynew
    );
    if( test_i==1 && i==len_g then
    xf1=xnew
    yf1=ynew
     )
    if( test_i==1 && i==2 then
    xi2=xnew
    yi2=ynew
     );
    if( test_i==1 && i==len_g-1 then
    xf2=xnew
    yf2=ynew
       )

   case(type
  ("Analog"
     if(x2 == x1 then
       leCreateContact( deGetCellView() l_name xnew:ynew "R0" l_width l_width via_number 2 l_pitch l_pitch "center" "center" )
     else
       leCreateContact( deGetCellView() l_name xnew:ynew "R0" l_width l_width 2 via_number l_pitch l_pitch "center" "center" )
      );if
    )
  ("Digital"
    if( mod(test_i 2) == 0 then
      if( (i==1 && ( xi2 > xi1 || yi2 > yi1)) || (i==len_g && ( xi2 < xi1 || yi2 < yi1)) then
       dd=via_pitch
       else
       dd=-via_pitch
       );if
        else
       dd=0
      )
    if(x2 == x1 then
      leCreateContact( deGetCellView() l_name xnew+dd:ynew "R0" l_width l_width via_number 2 l_pitch l_pitch "center" "center" )
    else
      leCreateContact( deGetCellView() l_name xnew:ynew+dd "R0" l_width l_width 2 via_number l_pitch l_pitch "center" "center" )
    );if

  )
    );case

);if
     );for
  list_new_get=list_new   
  return(list_new_get)
  );prog
);procedure



代碼: [選擇]
/*
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 作者:Y.P.LIN
 檔名:tec_route.il
 用途:從technology取得route drc rule
 用法:呼叫tec_route(metal_set)會回傳一個metal_set的list(metal最小width metal最小space via最小width metal-enclose-via via-space via名稱)
      若不是metal則回傳default,list(1 1 .5 .5 .5 "nil")
 日期:2007.12.11
 參考:雷奧星空論壇(http://www.armbell.com/forum/viewforum.php?f=13&mforum=iclayout)
     :中国集成电路教育网(http://www.icedu.net/Article/shuzi/houduan/Index.html)
     :google搜尋
     :cadence手冊(安裝目錄下/doc/sk開頭目錄)
     聲明:1.程式著作為OPEN SOURCE,歡迎做任何修改,但上面"參考"不得做更動
           2.SKILL為CANDENCE所有
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/
;;hiSetBindKey("Layout" "F8" "tec_rule()")
procedure(tec_route(metal_set)
let((drc_list_path cvID tec_ID via_ID )
drc_list_path=list()
cvID = deGetCellView()
tec_ID=techGetTechFile(cvID) ;取得tec ID
;metal_set="METAL1"
rule_get(tec_ID metal_set)

);let
);proc
procedure(rule_get(tec_ID metal_set)
prog((via_route_list len via_cell_name via_view_name via_type via_enclose met1 via_o_name via_width metal_width metal_space via_space)
via_route_list=techGetPrViaTypes( tec_ID )                           ;取得route metal
len=length(via_route_list)                                        ;route metal數目
foreach(tec_i via_route_list
via_cell_name=car(car(tec_i))                                     ;via名稱(M2_M1)
via_view_name=cadr(car(tec_i))
via_type=techGetDeviceCParam( tec_ID via_cell_name via_view_name) ;取得via資訊
via_enclose=cadr(nth(5 via_type))                                 ;取得metal enclose via距離
;met2=cadr(nth(6 via_type))                                       ;取得metal2
met1=cadr(nth(7 via_type))                                        ;取得metal1
via_o_name=cadr(nth(8 via_type))                                  ;取得via名稱(VIA12)
via_space=techGetSpacingRule( tec_ID "minSpacing" via_o_name)     ;取得via最小space
via_width=techGetSpacingRule( tec_ID "minWidth" via_o_name)       ;取得via最小width
metal_width=techGetSpacingRule( tec_ID "minWidth" met1 )          ;取得metal最小width
metal_space=techGetSpacingRule( tec_ID "minSpacing" met1)         ;取得metal最小space
if( metal_set == met1 then
drc_list_path=list(metal_width metal_space via_width via_enclose via_space via_cell_name)             ;route drc list
);if
);for
if(eq(drc_list_path nil) then
return(list(1.0 1.0 .5 .5 .5 "nil"))
else
return(drc_list_path)
);if
);let
);proc

« 上次編輯: 2008-01-01 16:20 由 lkkl »
愛護地球請用LINUX,省電又環保,大家共同為地球盡一份心力.
小弟的網頁
http://yplin123.googlepages.com/home
"資訊人權貴" 之家(令人佩服的洪朝貴老師)
http://people.ofset.org/~ckhung/