顯示文章

這裡允許您檢視這個會員的所有文章。請注意, 您只能看見您有權限閱讀的文章。


主題 - lkkl

頁: [1] 2 3 ... 5
1
Linux 討論版 / wine 1.0已經發佈了.
« 於: 2008-06-30 11:46 »
http://www.winehq.org/
XP應該可以不用裝了,用linux+wine 1.0 應該可跑很多xp的軟體
vista太浪費資源,應該不符合現代高漲的節約能源,石油漲到快嚇死人了.
要實際測看看,若可以,我電腦以後就只灌linux(快又好用)

2
雜七雜八 / 手機ROM集散地
« 於: 2008-06-10 19:49 »
http://www.pdaclan.com/
這是對岸專門"在"討論手機,會釋出非官方的ROM(比官方的版本新,更強的OS,也有針對繁體的OS),真的"蠻"厲害的,我的手機GSMART T600,之前手機反應有點"慢",換了 技嘉T600繁"體"212集成版,變超快,而且msd卡已經可讀到8G,本來買這支是有數位電視才買,但不太滿意(wifi"爛",反應有點"慢",耗電,sim卡座設計不良),可是有新ROM更新感覺這隻手機t600有點活過來了,哈哈哈,快去瞧瞧吧,(補充一下之前t600,SIM卡有時會讀不到,換新ROM,現在sim卡已經OK,待機時間也變長了,gsmart t600是真的活過來了)



這是我用t600看rm的影片,哇夠清晰的,放大到寬螢幕依然清晰無比

更新ROM,已經支援8G記憶卡
(slime改正錯字)

3
雜七雜八 / linux真恐怖
« 於: 2008-06-01 16:10 »

4
再來一個TCL自動打上所有GATE的POLY CONTACT,下面連結:
http://yplin123.googlepages.com/pc.htm

5
google好好窩,有提供網上10幾種免費服務,GMAIL,100M網頁空間(page crator),部落格,網上論壇,還可網上賺錢(AdSense)......
快去申請一個帳戶,就可申請其他服務,這麼好康的事 ,快去吧!!下面試申請網址,小弟的網頁就是申請的
https://www.google.com/accounts/ManageAccount

6
最後我要取得滑鼠拖曳區域的方塊(就是enterbox,其實和skill是大同小異),那就用
代碼: [選擇]
enterBox -handle $winId -cv $cvId

滑鼠拖曳後就會回傳一個bBox,那我就在這個bBox內的metal才打上via,就這麼間單,就完成一個超強的creat via,你還可以舉一反三,改成打POLY CONTACT ,目前都還沒做shape判斷(POLYGON RECTANGLE PATH),其實是很簡單,取得obj的shape,然後在個別處理,PATH先打成POLYGON,POLYGGON在切成RECTANGLE,至於45度應該還可以克服(用斜率), 弧度這個我就沒折,至於其他小細節 ,有空再來說,先來看這個tcl實際跑的情形,我是用WINK(linux上一套很好用能把螢幕畫面錄製成flash檔swf)把實際畫面抓成flash,這樣看的較清楚.
下面是實際上的成果(fash檔插到html)


http://yplin123.googlepages.com/cv.htm

7
下面的圖右邊有4塊metal1(藍色),當我load creatvia.tcl左邊terminal會顯示metal1 的bbox點,和bbox中心點,可用dbTraverse,getBBoxCenter ,取得 ,目前到此,再來我只要算幾個VIA打上去就可,不過這樣就只能是rectangle,還必須做後續判斷.下一次再說.


8
程式討論版 / LAYOUT超強的自動Creat VIA
« 於: 2008-05-25 17:25 »
這個是用SKILL寫的,首先會用EnterBox,取出overlap metal的區域,然後計算坐標,Rotate幾次,打幾個Via,是很複雜的運算,這個自動打VIA,會自動選打哪一層VIA,所選區域metal都會打上Via(比laker的一次只能打一塊metal來的強),也可以打一圈,這個我寫有一段時間了 ,有一點不太記得細節,反正就是很好用.

下面有flash檔:

http://yplin123.googlepages.com/skill.htm

9
流程是,我從menu叫出一個GUI介面,然後選NETLIST檔(文字檔),就會叫出所有SUBCK NAME,重設gtCreateListBoxField的choice,
點choice,會在重設右邊令一個choice,顯示是Open_Spice,Open_Layout(當cell view存在時),Creat_Layout(當cell view不存在時),當我選Open_Spice會打開CELL SUBCKT的NETLIST,Open_Layout則會打開CELL已存在的Layout,Creat_Layout則會開一個新的CELL的cell view,並把 CELL NETLIST的MOS自動create 到layout cell view不用人去建device.
這是reset from value的寫法,你用gtGet可以取得form obj,再用gtSet去設定form,還有另外一種,但那種不能用proc
代碼: [選擇]
set objjjj [gtGet -obj $objjj -attr sellayoutId]
gtSet -obj $objjjj -attr value -value "Open_Spice"
下一個目標,我會把元件的gate sourse drain都打上netlist 的net點當我接線的時候會去hieghleight 那個點,不過這好像有點難,可能要一段時間

再來來說SKILL和TCL寫的差別,觀念感覺是同一個模子刻出來的(本來就是),可是我還是比較喜歡SKILL,比較嚴謹,debug較快,tcl的語法比較鬆,debug較難 ,寫程式只要有google就可以了,以前你手邊可能要一本工具書,都拜網際網路之賜 .


下面的圖是實際跑的情況
flash
http://yplin123.googlepages.com/laker.htm
圖片


http://www.taconet.com.tw/lkkllkkl/LAKER2.html

10
程式討論版 / LAKER用BMP檔做IC LOGO
« 於: 2008-05-17 01:03 »
我先把LAYTOOLS(menu),當開LAKER->File->open,就會掛上去LAYTOOLS這個menu,選Bitmap,就會開啟視窗,選bmp(file),LAYER
,按OK,就會把BMP檔轉成LAYOUT(這個轉檔程式,是我拿demo稍做修改的,)
一開LAKER,要source tcl,你只要修改laker.rc如下
代碼: [選擇]
[SourceTcl]
Source1 = bmp.tcl
# Source2 = bb.tcl
下面有圖
http://www.taconet.com.tw/lkkllkkl/LAKER1.html

11
程式討論版 / LAKER 從netlist 自動產生device
« 於: 2008-05-10 22:12 »
之前有用SKILL寫一些LAYOUT TOOL,這次來用tcl寫LAKER上LAYOUT應用,劃LAYOUT,若有用virtuso(icfb)的layoutxl+pdk的人應該知道那應該是劃LAYOUT的王道,若是用AKER我至少也要想辦法不用人去建device,讓電腦幫我建,因此才來寫個程式,前提必須要有MCELL
,且technology file要寫進去(若沒寫進去,就自己寫進去就好)
再來你要去處理nsetlist,如何去抓.SUBKCT CELLNAME到.ENDS的元件,你可以用sed較方便,如下
代碼: [選擇]
exec sed -n "/\.SUBCKT $subcktname\ /,/\.ENDS.*/p" test_T > test_
再來只是把處理好的CELLNAME file
用tcl去抓width length M,然後用laker指令去產生而已,夠簡單了吧!
代碼: [選擇]
...............................
lakerCreateTransistor -point ($pmx,$pmy) -device $pmos_type -gates 1 -param $pmos_param                         
lakerCreateText -layerName $ptext_layer -point ($pmx,$pmy) -height $ptext_height -text $pmos_name
.............................................
...............
下面是半成品,目前只能產生PD ND device(我還在試電容,電阻的MCELL怎麼寫)
建一個TEST LIB -> 建一個 N_COMP_5V33P 的CELL NAME -> layout視窗上load creatmos.tcl -> 自動從netlist抓資料產生
PD ND MOS元件,如下面連結(有圖)
http://www.taconet.com.tw/lkkllkkl/LAKER.html

12
這次功能超強的,我修正一些小問題,新增了可直接在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


13
我加上自動去抓tecnology(layout view因此任何製程都適用)的rule去設定width space,是metal最小space,寬是一個via寬度,這樣劃bus真是太方便了,我準備在寫2層疊,2個via寬...,但要先看選單式 menu(目前還在看),敬請期待,這有2個檔須分別存成(creat_path_multi.il和tec_route.il)在同一目錄,load ("creat_path_multi.il"),按F8
我分開寫成2個檔,是較像物件導向寫法,看得較簡潔
這有圖
http://www.taconet.com.tw/lkkllkkl/skill4.html
1.抓rule檔SKILL-tec_route.il:
代碼: [選擇]
/*
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 作者: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)
      若不是metal則回傳default,list(1 1 .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_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_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)             ;route drc list
);if
);for
if(eq(drc_list_path nil) then
return(list(1.0 1.0 .5 .5))
else
return(drc_list_path)
);if
);let
);proc

2.主檔creat_path_multi.il
代碼: [選擇]
/*
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 作者:Y.P.LIN
 檔名: creat_path_multi.il(另一rute rule檔是tec_route.il)
 用途: LAYOUT輔助工具
 日期: 2007.12.11
 版本: 正式版1.50
 用法:在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
 聲明:1.程式著作為OPEN SOURCE,歡迎做任何修改,但上面"參考"不得做更動
      2.SKILL為CANDENCE所有
   ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   */

hiSetBindKey("Layout" "F8" "line()")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;enterpath;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(line()
let((path_width path_space path_number path_point width cvId layer purpose list_draw_layer)
cvId=getEditRep()
layer = car(leGetEntryLayer())          ; LSW layer
purpose = cadr(leGetEntryLayer())       ; LSW purpose
list_draw_layer=list(layer purpose)     ; 取得LSW LAYER
path_Form(layer)
path_width=pathForm->path_widthID->value                          ;視窗值
path_space=pathForm->path_spaceID->value                          ;視窗值
path_number=pathForm->path_numberID->value                        ;視窗值
path_point=pathForm->path_pointID->value
width=(path_width+path_space)*path_number-path_space              ;enterpath width


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)
   path_pitch=path_width+path_space
   move_d=path_space+path_width/2
   len=length(path_list)
   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)               ;取得一組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)
prog((xnew ynew listxy11 listxy22 x1 y1 x2 y2 list_new list_new_get)
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( x2==x1 then                                    ;斜率無限大
    if(y2 > y1 then
       xnew=x1
       ynew=y1+path_pitch
       else
       xnew=x1
       ynew=y1-path_pitch
      );if
    else
      if(x2 > x1 then                                 ;正pitch
       m=(y2-y1)/(x2-x1)                              ;求得斜率
       xnew=x1+path_pitch                             ;新的x
       ynew=y1+m*(xnew-x1)                            ;新的y
       else                                           ;負pitch
       m=(y2-y1)/(x2-x1)                              ;求得斜率
       xnew=x1-path_pitch                             ;新的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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;輸入框;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(procedure path_Form(layer)
 (prog (drc_list path_widthID path_spaceID path_numberID path_pointID)
         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)
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 5
        ?defValue 5
        ?range (range 1 100)
        ;?editable nil
                        )
path_pointID=hiCreateIntField(
        ?name 'path_pointID
        ?prompt "path point number :"
        ?value 5
        ?defValue 5
        ?range (range 1 100)
        ;?editable nil
                        )



pathFormID=hiCreateForm(
    'pathForm
    "CREAT MULTI PATH"
    (list "()")
list(   
    (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)
   )
   nil nil
)

(hiDisplayForm pathForm)

);prog
);proc_form




14
我再寫了一個可劃任意轉角的多重path
原理:用enterpath,劃一條樣本PATH,轉PLOYGON取點,用2點決定斜率,y2=y1+m(x2-x1),在判定x-ptch正負(有點複雜請參考code碼)
下面有圖
http://www.taconet.com.tw/lkkllkkl/skill3.html
代碼: [選擇]
/*
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 作者:Y.P.LIN
 檔名: creat_path_multi.il
 用途: LAYOUT輔助工具
 日期: 2007.12.11
 版本: 正式版1.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還在開發中,目前功能
      劃多條可任意轉角PATH
 聲明:1.程式著作為OPEN SOURCE,歡迎做任何修改,但上面"參考"不得做更動
      2.SKILL為CANDENCE所有
   ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   */

hiSetBindKey("Layout" "F8" "line()")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;enterpath;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(line()
let((path_width path_space path_number path_point width cvId layer purpose list_draw_layer)
path_Form()
path_width=pathForm->path_widthID->value                          ;視窗值
path_space=pathForm->path_spaceID->value                          ;視窗值
path_number=pathForm->path_numberID->value                        ;視窗值
path_point=pathForm->path_pointID->value
width=(path_width+path_space)*path_number-path_space              ;enterpath width


cvId=getEditRep()
layer = car(leGetEntryLayer())          ; LSW layer
purpose = cadr(leGetEntryLayer())       ; LSW purpose
list_draw_layer=list(layer purpose)     ; 取得LSW LAYER

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)
   path_pitch=path_width+path_space
   move_d=path_space+path_width/2
   len=length(path_list)
   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                                         ;只須處理一半
   get_new_path_list(list1 list2 path_pitch len)               ;取得一組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)
let((xnew ynew listxy11 listxy22 x1 y1 x2 y2)
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( x2==x1 then                                    ;斜率無限大
    if(y2 > y1 then
       xnew=x1
       ynew=y1+path_pitch
       else
       xnew=x1
       ynew=y1-path_pitch
      );if
    else
      if(x2 > x1 then                                 ;正pitch
       m=(y2-y1)/(x2-x1)                              ;求得斜率
       xnew=x1+path_pitch                             ;新的x
       ynew=y1+m*(xnew-x1)                            ;新的y
       else                                           ;負pitch
       m=(y2-y1)/(x2-x1)                              ;求得斜率
       xnew=x1-path_pitch                             ;新的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   
  println(list_new_get)
  );let
);procedure
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;輸入框;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(procedure path_Form()
 (prog (slot_widthID slot_heighID slot_width_pitchID slot_heigh_pitchID slotFormID)

path_widthID=hiCreateFloatField(
        ?name 'path_widthID
        ?prompt "path width :"
        ?value 1.0
        ?defValue 1.0
        ?range (range 0 100)
;?editable nil
)

path_spaceID=hiCreateFloatField(
        ?name 'path_spaceID
        ?prompt "path space :"
        ?value 1.0
        ?defValue 1.0
        ?range (range 0 100)
        ;?editable nil
)
path_numberID=hiCreateIntField(
        ?name 'path_numberID
        ?prompt "path number :"
        ?value 5
        ?defValue 5
        ?range (range 1 100)
        ;?editable nil
                        )
path_pointID=hiCreateIntField(
        ?name 'path_pointID
        ?prompt "path point number :"
        ?value 5
        ?defValue 5
        ?range (range 1 100)
        ;?editable nil
                        )



pathFormID=hiCreateForm(
    'pathForm
    "CREAT MULTI PATH"
    (list "()")
list(   
    (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)
   )
   nil nil
)

(hiDisplayForm pathForm)

);prog
);proc_form

15
修正一些BUG,修改->挖slot挖中間,可輸入對話框,下拉式選單
這有圖
http://www.taconet.com.tw/lkkllkkl/skill2.html

代碼: [選擇]
/*
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 作者:Y.P.LIN
 檔名: CUT.il
 用途: LAYOUT輔助工具
 日期: 2007.12.11
 版本: 正式版1.00
 用法:在icfb,load本sKILL(例如 load "CUT.il" ),再開一個layout,視窗上多一個選單,選取rectangle(可複選),
      選LAYOUT-TOOLS,再選SLOT,會跳出輸入框,在按OK(挖slot面積大時可能要等待一些時間)
 參考:雷奧星空論壇(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.切RECTANGLE的4個角     
     2.polygon的90度角都可切
     3.挖SLOT
 聲明:1.程式著作為OPEN SOURCE,歡迎做任何修改,但"參考"不得做更動
      2.SKILL為CANDENCE所有
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;快速鍵;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;hiSetBindKey("Layout" "None<Btn2Down>" "trSimpleMenu()");設定快速鍵為滑鼠中鍵(Layout視窗有效)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;把polygon切成rectangle&&挖slot;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;注意切開一定要從右向左切(因為左邊會保持原來SHAPE_ID);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(getrec(obj)                                              ;切rectangle程序
      let((list_xy getshape_point sort_point a_sort_point          ;宣告local變數
           cut_line rec_get type xyBox y1 y2) 
           type=obj~>objType
   if(equal(type "polygon") then
            xyBox=obj~>bBox                               ;取得shape的BOX
                    y1 = cadr(car(xyBox))                          ;最小y
                    y2 = cadr(cadr(xyBox))                         ;最大y
                    getshape_point=obj~>points                     ;取得每個角的點(pologon)是一組list
            sort_point=sortcar(getshape_point 'lessp)      ;根據第1項排序
            a_sort_point = reverse( sort_point )           ;反轉list
                    foreach(list_xy a_sort_point                   ;把點的list逐一丟入變數list_xy
            x=car(list_xy)                                 ;取得x
    cut_line=list((x:y1) (x:y2))                   ;垂直線
                    rec_get= leChopShape( shape cut_line nil nil ) ;根據x垂直切開(右邊是一定是rectangle)
    slot_rec(rec_get)                        ;
                    );foreach
    );if
           if(equal(type "rect") then                              ;rect
           slot_hole(obj)
   );if
        );let
      );procedure
procedure(slot_rec(obj)                                            ;slot
let((shape type)
   foreach(shape obj
   type=shape~>objType                                             ;取得物件型態
    if(equal(type "rect") then                                     ;是rectangle才挖slot
      slot_hole(shape);
      );if
  );foreach
  );let
)

procedure(slot_hole(rect_shape)                                            ;挖洞
let((slotx sloty pitchx pitchy slot_width slot_heigh xint yint             ;local變數
    slot_pitchx slot_pitchy x1 y1 x2 y2 withx heighy x0 y0 slot_list)
;slot_width=5                                                               ;slot的長
;slot_heigh=2                                                               ;slot的高
;slot_pitchx=15                                                             ;slot的pitch
;slot_pitchy=12                                                             ;slot的pitch
slot_width=slotForm->slot_widthID->value                              ;取得輸入框的值
slot_heigh=slotForm->slot_heighID->value
slot_pitchx=slotForm->slot_width_pitchID->value
slot_pitchy=slotForm->slot_heigh_pitchID->value
xyBox=rect_shape~>bBox                                                     ;取得BOX
     x1 = car(car(xyBox))
     y1 = cadr(car(xyBox))
     x2 = car(cadr(xyBox))
     y2 = cadr(cadr(xyBox))
withx=x2-x1                                                                ;矩型長
heighy=y2-y1                                                               ;矩型寬
if(heighy > withx then                                                     ;判定往y軸較長(設定挖的距離,pitch)
slotx=slot_heigh
sloty=slot_width
pitchx=slot_pitchy
pitchy=slot_pitchx
y1=y1+int((heighy-int(heighy/pitchy)*pitchy)/2+(pitchy-sloty)/2)            ;y1+(被除數-商X除數)/2[目的是挖在中間]
x1=x1+int((withx-int(withx/pitchx)*pitchx)/2+(pitchx-slotx)/2)              ;x1+(被除數-商X除數)/2[目的是挖在中間]
else
slotx= slot_width                                                          ;x軸較長(挖x較長)
sloty=slot_heigh
pitchx=slot_pitchx
pitchy=slot_pitchy
y1=y1+int((heighy-int(heighy/pitchy)*pitchy)/2+(pitchy-sloty)/2)            ;y1+(被除數-商X除數)/2[目的是挖在中間記得轉整數(OFFGRIDE)]
x1=x1+int((withx-int(withx/pitchx)*pitchx)/2+(pitchx-slotx)/2)              ;x1+(被除數-商X除數)/2[目的是挖在中間]
);if


xint=x1                                                                       ;開始的x座標
yint=y1                                                                       ;開始的y座標
while(y1+(pitchy-sloty)/2+sloty <= y2                                                ;當y還未超過box
    y0=y1
    y1=y1+pitchy                                                              ;加上pitch
    while(x1+(pitchx-slotx)/2+slotx <= x2                                            ;當x還未超過box
     x0=x1                                                 
     x1=x1+pitchx
     slot_list=list((x0:y0) (x0+slotx:y0) (x0+slotx:y0+sloty) (x0:y0+sloty))
     leChopShape( rect_shape slot_list  t t)
    );while
   x1=xint                                                                    ;重設x1
   );while
   y1=yint
   );let
)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;list((0 0) (1 1) .........)轉成布林lis(t t ....);;;;;;;;;;;;;;;;
procedure(contains_even(list)
      prog( ()
          result=list()
          foreach(element list
          if(element != nil
  result = cons( t result )
            )
            ) /* end foreach */
           return(result)
) /* end prog */
) /* end contains_pass */
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cut矩型的4個角;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(cut(xyBox)                                                  ;取得四邊行CUT點座標的程序
let((d x1 x2 y y2 cut1 cut2 cut3 cut4)
d=cutForm->cutID->value                                               ;取得輸入框的值(切的距離)
x1 = car(car(xyBox))                                   
y1 = cadr(car(xyBox))
x2 = car(cadr(xyBox))
y2 = cadr(cadr(xyBox))
cut1=list((x1:y1) (x1+d:y1) (x1:y1+d) (x1:y1))                        ;cut lin1座標list(是一個封閉cycle)
cut2=list((x2:y1) (x2-d:y1) (x2:y1+d) (x2:y1))                        ;cut lin2座標list(是一個封閉cycle)
cut3=list((x1:y2) (x1+d:y2) (x1:y2-d) (x1:y2))                        ;cut lin3座標list(是一個封閉cycle)
cut4=list((x2:y2) (x2-d:y2) (x2:y2-d) (x2:y2))                        ;cut lin4座標list(是一個封閉cycle)
leChopShape( shape cut1  t t)                                         ;cut一邊,第一個t只是一個封閉cycle,第2個t指移除(remove)
leChopShape( shape cut2  t t)                                         ;cut一邊
leChopShape( shape cut3  t t)                                         ;cut一邊
leChopShape( shape cut4  t t)                                         ;cut一邊
);let
)

procedure(cut_rectangle()
  let((selobj type selobjbox)
  cutForm()
  selobj=geGetSelSet()                                 ;取得選的物件
  foreach(shape selobj                                 ;把每一個物件逐一丟到shape變數
          type=shape~>objType                          ;取得物件型態
  if(equal(type "rect") then                   ;判定rectangle
          selobjbox=shape~>bBox                        ;取得物件的BOX(指方形座標2點->list)
          cut(selobjbox);                              ;呼叫cut程序,且給一個參數selobjx
  );endif
         );foreach
  );let
 );procedure
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;切polygon的角;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(chop()
let((selobj type l_selArray)
   cutForm()
   d=cutForm->cutID->value                             ;取得輸入框的值
   selobj=geGetSelSet()                                ;取得選的物件
   foreach(shape selobj                                ;把每一個物件逐一丟到shape變數
   type=shape~>objType                                 ;取得物件型態
   if(equal(type "polygon") then                       ;判定polygon (注意rectangle無法用~>points取點)
   getshape_point_list=shape~>points                   ;取得每個角的點(pologon)是一組list
   l_selArray= contains_even(getshape_point_list)      ;把上面取得點轉成布林list
   leModifyCorner( shape l_selArray t d )              ;切角的函數l_seArray指布林list[list(t t ....)],t指chamer[或nil]
   );endif
   );foreach
   );let
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;挖slot;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(slotget()
 let((selobj shape slot_width slot_heigh slot_pitchx slot_pitchy)
   slotFormget()
   slot_width=slotForm->slot_widthID->value                              ;取得輸入框的值
   slot_heigh=slotForm->slot_heighID->value
   slot_pitchx=slotForm->slot_width_pitchID->value
   slot_pitchy=slotForm->slot_heigh_pitchID->value
   if((slot_pitchy > slot_heigh+5)&&(slot_pitchx > slot_width+5) then
   selobj=geGetSelSet()                                  ;取得選的物件
    foreach(shape selobj                                 ;把每一個物件逐一丟到shape變數
     getrec(shape)
     );foreach
     else
     waring()
     )
     );let
    );procedure


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;表單;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
trA_MenuItem = hiCreateMenuItem(                          ;menu項目
   ?name 'trA_MenuItem
   ?itemText "cut_rectangle"                              ;menu項目標題
   ?callback "cut_rectangle()" ;;; prints B in the CIW    ;選項後的動作(呼叫cut_rectangle()程序)
   )
trB_MenuItem = hiCreateMenuItem(                          ;menu項目
   ?name 'trB_MenuItem
   ?itemText "chop_any_polygon"                           ;menu項目標題
   ?callback "chop()" ;;; prints B in the CIW             ;選項後的動作(呼叫chop()程序)
    )

trC_MenuItem = hiCreateMenuItem(                          ;menu項目
   ?name 'trC_MenuItem
   ?itemText "SLOT"                                       ;menu項目標題
   ?callback  "slotget()"                                    ;選項後的動作(呼叫slotget()程序)
    )

trD_MenuItem = hiCreateMenuItem(                          ;menu項目
   ?name 'trD_MenuItem
   ?itemText "About"                                ;menu項目標題
   ?callback  "about()"                             ;選項後的動作(在CIW視窗印出Hello World!!)
   )

;;; creating the reminder list
procedure(about()
trReminders = '( "PRODUTS:Y.P.LIN" )
foreach( reminderText trReminders ; for each reminder
   hiDisplayAppDBox(
       ?name      gensym( 'trReminderDialogBox ) ; unique variable
       ?dboxBanner "about.."
       ?dboxText reminderText
       ?callback print( "OK" ) ; dynamically built callback
       ?dialogType hicWarningDialog
       ?dialogStyle 'modeless
       ?buttonLayout 'YesNo
        )
       ) ; foreach
       printf( "%s completed" trReminders )
)
procedure(waring()
trReminders = "Waring!! pitch must is longer than slot"
 hiDisplayAppDBox(
       ?name      gensym( 'trReminderDialogBox ) ; unique variable
       ?dboxBanner "about.."
       ?dboxText trReminders
       ?callback print( "OK" ) ; dynamically built callback
       ?dialogType hicWarningDialog
       ?dialogStyle 'modeless
       ?buttonLayout 'YesNo
           )
       printf( "%s completed" trReminders )
);procedure

;procedure(trSimpleMenu()                                ;產生meun表單的程序
; let((simpleMenuID)                                     ;宣告區域(local)變數
; word="Hello wodr!!"                                    ;字串變數
; simpleMenuID=hiCreateMenu(                             ;產生一個menu
; 'simpleMenu                                            ;GLOBAL(ID)
; "LAYOUT TOOLS"                                          ;標題
; '(trA_MenuItem trB_MenuItem trC_MenuItem trD_MenuItem) ;LIST(表單的項目)
; )

; hiDisplayMenu(simpleMenuID)                            ;根據menuID在螢幕顯示
;);let
;);proce

hiCreatePulldownMenu(
'usrPulldownMenu
"LAYOUT-TOOLS"
list(trA_MenuItem trB_MenuItem trC_MenuItem trD_MenuItem)
)
procedure(InsertBannerMenu(lViewProp)
wCellView = getq(lViewProp window)
hiInsertBannerMenu(
wCellView
'usrPulldownMenu
length( hiGetBannerMenus(wCellView))
)
)
deRegUserTriggers(
"maskLayout"
nil
nil
'InsertBannerMenu
)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;slot輸入框;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(procedure slotFormget()
 (prog (slot_widthID slot_heighID slot_width_pitchID slot_heigh_pitchID slotFormID)

slot_widthID=hiCreateIntField(
        ?name 'slot_widthID
        ?prompt "slot width  distance(5~100) :"
        ?value 20
        ?defValue 20
        ?range (range 5 100)
;?editable nil
)
slot_heighID=hiCreateIntField(
        ?name 'slot_heighID
        ?prompt "slot heigh distance(1~5) :"
        ?value 2
        ?defValue 2
        ?range (range 1 5)
        ;?editable nil
)
slot_width_pitchID=hiCreateIntField(
       ?name 'slot_width_pitchID
       ?prompt "slot width picth(>slot width distancr)(15~110) :"
       ?value 30
       ?defValue 30
       ?range (range 15 110)
       ;?editable nil
)

slot_heigh_pitchID=hiCreateIntField(
      ?name 'slot_heigh_pitchID
      ?prompt "slot heigh picth(>slot heigh distancr)(6~36) :"
      ?value 10
      ?defValue 10
      ?range (range 6 36)
      ;?editable nil
  )

slotFormID=hiCreateForm(
    'slotForm
    "LAYOUT SLOT"
    (list "()")
list(   
    (list slot_widthID 0:20 520:30 320)
    (list slot_heighID 0:50 520:30 320 )
    (list slot_width_pitchID 0:80 520:30 320 )
    (list slot_heigh_pitchID 0:110 520:30 320 )
   )
   nil nil
)

(hiDisplayForm slotFormID)

);prog
);proc


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cut(chop)輸入框;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(procedure cutForm()
 (prog (cutID)

cutID=hiCreateFloatField(
        ?name 'cutID
        ?prompt "cut distance :"
        ?value .5
        ?defValue .5
        ?range (range .1 100.0)
        ;?editable nil
)

cutFormID=hiCreateForm(
    'cutForm
     "LAYOUT CUT(or CHOP) distance"
    (list "(cut)")
     list(
          (list cutID 0:20 320:30 120)
         )
        nil nil
      )
  (hiDisplayForm cutFormID)
  );prog
 );proc



/*
/////////////////////////////////////////////////
Thanks for your enjoy!!
////////////////////////////////////////////////
*/


16
slot我寫好了,這有圖
http://www.taconet.com.tw/lkkllkkl/skill1.html
代碼: [選擇]
/*
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 作者:Y.P.LIN
 File name : CUT.il
 POP menu Write by nfmao
 Date: 2007.12.11
 Ver : 0.01
 用法:在icfb,load本sKILL(例如 load "CUT.il" ),再開一個layout,選取rectangle(可複選),按滑鼠中鍵(會跳初選單),再選chop
 參考:雷奧星空論壇(http://www.armbell.com/forum/viewforum.php?f=13&mforum=iclayout)
     :中国集成电路教育网(http://www.icedu.net/Article/shuzi/houduan/Index.html)
     :cadence手冊(安裝目錄下/doc/sk開頭目錄)
 注:本SKILL還在開發中,目前功能
   1.切RECTANGLE的4個角     
   2.polygon的90度角都可切
   3.挖SLOT
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;把polygon切成rectangle&&挖slot;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;注意切開一定要從右向左切(因為左邊會保持原來SHAPE_ID);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(getrec(obj)                                              ;切rectangle程序
      let((list_xy )                                               ;宣告local變數
           type=obj~>objType
   if(equal(type "polygon") then
                    getshape_point=obj~>points                     ;取得每個角的點(pologon)是一組list
            sort_point=sortcar(getshape_point 'lessp)      ;根據第1項排序
            a_sort_point = reverse( sort_point )           ;反轉list
                    foreach(list_xy a_sort_point                   ;把點的list逐一丟入變數list_xy
            x=car(list_xy)                                 ;取得x
    cut_line=list((x:-100000) (x:100000))          ;(註是否再寫最小y最大y,考慮中)
                    rec_get= leChopShape( shape cut_line nil nil ) ;根據x垂直切開(右邊是一定是rectangle)
    slot_rec(rec_get)                        ;
                    );foreach
    );if
           if(equal(type "rect") then                              ;rect
           slot_hole(obj)
   );if
        );let
      );procedure
procedure(slot_rec(obj)                                            ;slot
let(let(shape x1 y1 x2 y2 d)
  d=.5
   foreach(shape obj
   type=shape~>objType                                             ;取得物件型態
    if(equal(type "rect") then                                     ;是rectangle才挖slot
      slot_hole(shape);
      );if
  );foreach
  );let
)

procedure(slot_hole(rect_shape)                                   ;挖洞
let((slotx sloty pitchx pitchy)
slotx=5                                                           ;預設x軸較長設
sloty=2
pitchx=15
pitchy=12
xyBox=rect_shape~>bBox                                             ;取得BOX
     x1 = car(car(xyBox))
     y1 = cadr(car(xyBox))
     x2 = car(cadr(xyBox))
     y2 = cadr(cadr(xyBox))
x1=pitchx-slotx+x1
y1=pitchy-sloty+y1
withx=x2-x1
heighy=y2-y1
if(heighy > withx then                                              ;判定往y軸較長(設定挖的距離,pitch)
slotx=2
sloty=5
pitchx=12
pitchy=15
);if
xint=x1                                                             ;開始的x座標
yint=y1                                                             ;開始的y座標
while(y1+pitchy < y2                                                ;當y還未超過box
    y0=y1
    y1=y1+pitchy                                                    ;加上pitch
    while(x1+pitchx < x2                                            ;當x還未超過box
     x0=x1                                                 
     x1=x1+pitchx
     slot_list=list((x0:y0) (x0+slotx:y0) (x0+slotx:y0+sloty) (x0:y0+sloty))
     xrect_shape=leChopShape( rect_shape slot_list  t t)
    );while
   x1=xint                                                          ;重設x1
   );while
   );let
)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;list((0 0) (1 1) .........)轉成布林lis(t t ....);;;;;;;;;;;;;;;;
procedure(contains_even(list)
      prog( ()
      result=list()
      foreach(element list
         if(element != nil
result = cons( t result )
            )
            ) /* end foreach */
           return(result)
) /* end prog */
) /* end contains_pass */
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cut矩型的4個角;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(cut(xyBox)                                                  ;取得四邊行CUT點座標的程序
d=0.5                                                                 ;切的距離(自己設)
x1 = car(car(xyBox))                                   
y1 = cadr(car(xyBox))
x2 = car(cadr(xyBox))
y2 = cadr(cadr(xyBox))
cut1=list((x1:y1) (x1+d:y1) (x1:y1+d) (x1:y1))                        ;cut lin1座標list(是一個封閉cycle)
cut2=list((x2:y1) (x2-d:y1) (x2:y1+d) (x2:y1))                        ;cut lin2座標list(是一個封閉cycle)
cut3=list((x1:y2) (x1+d:y2) (x1:y2-d) (x1:y2))                        ;cut lin3座標list(是一個封閉cycle)
cut4=list((x2:y2) (x2-d:y2) (x2:y2-d) (x2:y2))                        ;cut lin4座標list(是一個封閉cycle)
leChopShape( shape cut1  t t)                                         ;cut一邊,第一個t只是一個封閉cycle,第2個t指移除(remove)
leChopShape( shape cut2  t t)                                         ;cut一邊
leChopShape( shape cut3  t t)                                         ;cut一邊
leChopShape( shape cut4  t t)                                         ;cut一邊
)

procedure(cut_rectangle()
  let((selobj selobjbox)
  selobj=geGetSelSet()                                 ;取得選的物件
  foreach(shape selobj                                 ;把每一個物件逐一丟到shape變數
          type=shape~>objType                          ;取得物件型態
  if(equal(type "rect") then                   ;判定rectangle
          selobjbox=shape~>bBox                        ;取得物件的BOX(指方形座標2點->list)
          cut(selobjbox);                              ;呼叫cut程序,且給一個參數selobjx
  );endif
         );foreach
  );let
 );procedure
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;切polygon的角;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(chop()
   d=0.5
   selobj=geGetSelSet()                                ;取得選的物件
   foreach(shape selobj                                ;把每一個物件逐一丟到shape變數
   type=shape~>objType                                 ;取得物件型態
   if(equal(type "polygon") then                       ;判定polygon (注意rectangle無法用~>points取點)
   getshape_point_list=shape~>points                   ;取得每個角的點(pologon)是一組list
   l_selArray= contains_even(getshape_point_list)      ;把上面取得點轉成布林list
   leModifyCorner( shape l_selArray t d )              ;切角的函數l_seArray指布林list[list(t t ....)],t指chamer[或nil]
   );endif
   );foreach
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;挖slot;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(slot()
 let((selobj shape)
   selobj=geGetSelSet()                                  ;取得選的物件
    foreach(shape selobj                                 ;把每一個物件逐一丟到shape變數
     getrec(shape)
     );foreach
     );let
    );procedure


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;表單;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
trA_MenuItem = hiCreateMenuItem(                          ;menu項目
   ?name 'trA_MenuItem
   ?itemText "cut_rectangle"                              ;menu項目標題
   ?callback "cut_rectangle()" ;;; prints B in the CIW    ;選項後的動作(呼叫chop()程序)
   )
trB_MenuItem = hiCreateMenuItem(                          ;menu項目
   ?name 'trB_MenuItem
   ?itemText "chop_any_polygon"                                       ;menu項目2標題
   ?callback "chop()" ;;; prints B in the CIW             ;選項後的動作(呼叫chop()程序)
    )

trC_MenuItem = hiCreateMenuItem(                          ;menu項目
   ?name 'trC_MenuItem
   ?itemText "SLOT"                                       ;menu項目標題
   ?callback  "slot()"                                    ;選項後的動作(在CIW視窗印出Hello World!!)
    )

trD_MenuItem = hiCreateMenuItem(                          ;menu項目
   ?name 'trD_MenuItem
   ?itemText "Hello World"                                ;menu項目標題
   ?callback  "println(word)"                             ;選項後的動作(在CIW視窗印出Hello World!!)
   )


procedure(trSimpleMenu()                                ;產生meun表單的程序
 let((simpleMenuID)                                     ;宣告區域(local)變數
 word="Hello wodr!!"                                    ;字串變數
simpleMenuID=hiCreateMenu(                              ;產生一個menu
 'simpleMenu                                            ;GLOBAL(ID)
 "Simple Menu"                                          ;標題
 '(trA_MenuItem trB_MenuItem trC_MenuItem trD_MenuItem) ;LIST(表單的項目)
 )

hiDisplayMenu(simpleMenuID)                             ;根據menuID在螢幕顯示
);let
);proce

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;快速鍵;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
hiSetBindKey("Layout" "None<Btn2Down>" "trSimpleMenu()");設定快速鍵為滑鼠中鍵(Layout視窗有效)


/*
/////////////////////////////////////////////////
Thanks for your enjoy!!
////////////////////////////////////////////////
*/


17
POLYGON挖SLOT原理,取得POLYGON的點,然後先將POLYGON由右往左切成RECTANGLE(要排序才能由右往左切),再來就剩RECTANGLE就間單多了,目前我只先寫隨便挖個洞,還沒寫完,讓大家參考,3Q

這有圖片可看
http://www.taconet.com.tw/lkkllkkl/skill.html

代碼: [選擇]
/*
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 作者:Y.P.LIN
 File name : CUT.il
 POP menu Write by nfmao
 Date: 2007.12.11
 Ver : 0.01
 用法:在icfb,load本sKILL(例如 load "CUT.il" ),再開一個layout,選取rectangle(可複選),按滑鼠中鍵(會跳初選單),再選chop
 參考:雷奧星空論壇(http://www.armbell.com/forum/viewforum.php?f=13&mforum=iclayout)
     :中国集成电路教育网(http://www.icedu.net/Article/shuzi/houduan/Index.html)
     :cadence手冊(安裝目錄下/doc/sk開頭目錄)
 注:本SKILL還在開發中,目前功能
   1.切RECTANGLE的4個角     
   2.polygon的90度角都可切
   3.挖SLOT
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;把polygon切成rectangle&&挖slot;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;注意切開一定要從右向左切(因為左邊會保持原來SHAPE_ID);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(getrec(obj)                                              ;切rectangle程序
      let((list_xy )                                               ;宣告local變數
           type=obj~>objType
   if(equal(type "polygon") then
                    getshape_point=obj~>points                     ;取得每個角的點(pologon)是一組list
            sort_point=sortcar(getshape_point 'lessp)      ;根據第1項排序
            a_sort_point = reverse( sort_point )           ;反轉list
                    foreach(list_xy a_sort_point                   ;把點的list逐一丟入變數list_xy
            x=car(list_xy)                                 ;取得x
    cut_line=list((x:-100000) (x:100000))          ;(註是否再寫最小y最大y,考慮中)
                    rec_get= leChopShape( shape cut_line nil nil ) ;根據x垂直切開(右邊是一定是rectangle)
    slot_rec(rec_get)                        ;
                    );foreach
    );if
           if(equal(type "rect") then                              ;rect
           slot_hole(obj)
   );if
        );let
      );procedure
procedure(slot_rec(obj)                                            ;slot
let(let(shape x1 y1 x2 y2 d)
  d=.5
   foreach(shape obj
   type=shape~>objType                                             ;取得物件型態
    if(equal(type "rect") then                                     ;是rectangle才挖slot
      slot_hole(shape);
      );if
  );foreach
  );let
)

procedure(slot_hole(rect_shape)                                   ;挖洞
xyBox=rect_shape~>bBox
     x1 = car(car(xyBox))
     y1 = cadr(car(xyBox))
     x2 = car(cadr(xyBox))
     y2 = cadr(cadr(xyBox))
     slot_list=list((x1+d:y1+d) (x2-d:y1+d) (x2-d:y2-d) (x1+d:y2-d))
     leChopShape( rect_shape slot_list  t t)
)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;list((0 0) (1 1) .........)轉成布林lis(t t ....);;;;;;;;;;;;;;;;
procedure(contains_even(list)
      prog( ()
      result=list()
      foreach(element list
         if(element != nil
result = cons( t result )
            )
            ) /* end foreach */
           return(result)
) /* end prog */
) /* end contains_pass */
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cut矩型的4個角;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(cut(xyBox)                                                  ;取得四邊行CUT點座標的程序
d=0.5                                                                 ;切的距離(自己設)
x1 = car(car(xyBox))                                   
y1 = cadr(car(xyBox))
x2 = car(cadr(xyBox))
y2 = cadr(cadr(xyBox))
cut1=list((x1:y1) (x1+d:y1) (x1:y1+d) (x1:y1))                        ;cut lin1座標list(是一個封閉cycle)
cut2=list((x2:y1) (x2-d:y1) (x2:y1+d) (x2:y1))                        ;cut lin2座標list(是一個封閉cycle)
cut3=list((x1:y2) (x1+d:y2) (x1:y2-d) (x1:y2))                        ;cut lin3座標list(是一個封閉cycle)
cut4=list((x2:y2) (x2-d:y2) (x2:y2-d) (x2:y2))                        ;cut lin4座標list(是一個封閉cycle)
leChopShape( shape cut1  t t)                                         ;cut一邊,第一個t只是一個封閉cycle,第2個t指移除(remove)
leChopShape( shape cut2  t t)                                         ;cut一邊
leChopShape( shape cut3  t t)                                         ;cut一邊
leChopShape( shape cut4  t t)                                         ;cut一邊
)

procedure(cut_rectangle()
  let((selobj selobjbox)
  selobj=geGetSelSet()                                 ;取得選的物件
  foreach(shape selobj                                 ;把每一個物件逐一丟到shape變數
          type=shape~>objType                          ;取得物件型態
  if(equal(type "rect") then                   ;判定rectangle
          selobjbox=shape~>bBox                        ;取得物件的BOX(指方形座標2點->list)
          cut(selobjbox);                              ;呼叫cut程序,且給一個參數selobjx
  );endif
         );foreach
  );let
 );procedure
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;切polygon的角;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(chop()
   d=0.5
   selobj=geGetSelSet()                                ;取得選的物件
   foreach(shape selobj                                ;把每一個物件逐一丟到shape變數
   type=shape~>objType                                 ;取得物件型態
   if(equal(type "polygon") then                       ;判定polygon (注意rectangle無法用~>points取點)
   getshape_point_list=shape~>points                   ;取得每個角的點(pologon)是一組list
   l_selArray= contains_even(getshape_point_list)      ;把上面取得點轉成布林list
   leModifyCorner( shape l_selArray t d )              ;切角的函數l_seArray指布林list[list(t t ....)],t指chamer[或nil]
   );endif
   );foreach
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;挖slot;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(slot()
 let((selobj shape)
   selobj=geGetSelSet()                                  ;取得選的物件
    foreach(shape selobj                                 ;把每一個物件逐一丟到shape變數
     getrec(shape)
     );foreach
     );let
    );procedure


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;表單;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
trA_MenuItem = hiCreateMenuItem(                          ;menu項目
   ?name 'trA_MenuItem
   ?itemText "cut_rectangle"                              ;menu項目標題
   ?callback "cut_rectangle()" ;;; prints B in the CIW    ;選項後的動作(呼叫chop()程序)
   )
trB_MenuItem = hiCreateMenuItem(                          ;menu項目
   ?name 'trB_MenuItem
   ?itemText "chop_any_polygon"                                       ;menu項目2標題
   ?callback "chop()" ;;; prints B in the CIW             ;選項後的動作(呼叫chop()程序)
    )

trC_MenuItem = hiCreateMenuItem(                          ;menu項目
   ?name 'trC_MenuItem
   ?itemText "SLOT"                                       ;menu項目標題
   ?callback  "slot()"                                    ;選項後的動作(在CIW視窗印出Hello World!!)
    )

trD_MenuItem = hiCreateMenuItem(                          ;menu項目
   ?name 'trD_MenuItem
   ?itemText "Hello World"                                ;menu項目標題
   ?callback  "println(word)"                             ;選項後的動作(在CIW視窗印出Hello World!!)
   )


procedure(trSimpleMenu()                                ;產生meun表單的程序
 let((simpleMenuID)                                     ;宣告區域(local)變數
 word="Hello wodr!!"                                    ;字串變數
simpleMenuID=hiCreateMenu(                              ;產生一個menu
 'simpleMenu                                            ;GLOBAL(ID)
 "Simple Menu"                                          ;標題
 '(trA_MenuItem trB_MenuItem trC_MenuItem trD_MenuItem) ;LIST(表單的項目)
 )

hiDisplayMenu(simpleMenuID)                             ;根據menuID在螢幕顯示
);let
);proce

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;快速鍵;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
hiSetBindKey("Layout" "None<Btn2Down>" "trSimpleMenu()");設定快速鍵為滑鼠中鍵(Layout視窗有效)


/*
/////////////////////////////////////////////////
Thanks for your enjoy!!
////////////////////////////////////////////////
*/



18
程式討論版 / 一個sKILL範列,切4邊行的角
« 於: 2007-12-08 19:46 »
最近才剛在看SKILL,cadence的pdf檔寫的好爛,一個leChopShape試好久才試出來,這是我最近寫的,還有註解
代碼: [選擇]
/*
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 作者:Y.P.LIN
 File name : CUT.il
 POP menu Write by nfmao
 Date: 2007.12.11
 Ver : 0.01
 用法:在icfb,load本sKILL(例如 load "CUT.il" ),再開一個layout,選取rectangle(可複選),按滑鼠中鍵(會跳初選單),再選chop
 參考:雷奧星空論壇(http://www.armbell.com/forum/viewforum.php?f=13&mforum=iclayout)
     :中国集成电路教育网(http://www.icedu.net/Article/shuzi/houduan/Index.html)
     :cadence手冊(安裝目錄下/doc/sk開頭目錄)
 注:本SKILL還在開發中,目前只能切RECTANGLE的4個角
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cut矩型的4個角;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
procedure(getXY(xyBox)                                ;取得四邊行CUT點座標的程序
d=0.5                                                 ;切的距離(自己設)
x1 = car(car(xyBox))
y1 = cadr(car(xyBox))
x2 = car(cadr(xyBox))
y2 = cadr(cadr(xyBox))
cut1=list((x1:y1) (x1+d:y1) (x1:y1+d) (x1:y1))                        ;cut lin1座標list(是一個封閉cycle)
cut2=list((x2:y1) (x2-d:y1) (x2:y1+d) (x2:y1))                        ;cut lin2座標list(是一個封閉cycle)
cut3=list((x1:y2) (x1+d:y2) (x1:y2-d) (x1:y2))                        ;cut lin3座標list(是一個封閉cycle)
cut4=list((x2:y2) (x2-d:y2) (x2:y2-d) (x2:y2))                        ;cut lin4座標list(是一個封閉cycle)
)

procedure(chop()
   selobj=geGetSelSet()                                ;取得選的物件
   foreach(shape selobj                                ;把每一個物件逐一丟到shape變數
   ;leChopShape( selobj list(0:0 100:100 ) nil nil 10 )
   selobjbox=shape~>bBox                               ;取得物件的BOX(指方形座標2點->list)
   getXY(selobjbox);                                   ;呼叫getXY程序,且給一個參數selobjx
   leChopShape( shape cut1  t t)                       ;cut一邊,第一個t只是一個封閉cycle,第2個t指移除(remove)
   leChopShape( shape cut2  t t)                       ;cut一邊
   leChopShape( shape cut3  t t)                       ;cut一邊
   leChopShape( shape cut4  t t)                       ;cut一邊
   println(x1);
   println(y1);
   println(x2);
   println(y2);
   );foreach
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;表單;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
trA_MenuItem = hiCreateMenuItem(                          ;menu項目1
   ?name 'trA_MenuItem
   ?itemText "chop"                                       ;menu項目2標題
   ?callback "chop()" ;;; prints B in the CIW             ;選項後的動作(呼叫chop()程序)
   )
trB_MenuItem = hiCreateMenuItem(                          ;menu項目2
   ?name 'trB_MenuItem
   ?itemText "Hello World"                                ;menu項目1標題
   ?callback  "println(word)"                     ;選項後的動作(在CIW視窗印出Hello World!!)
   )


procedure(trSimpleMenu()                                ;產生meun表單的程序
 let((simpleMenuID)                                     ;宣告區域(local)變數
 word="Hello wodr!!"                                    ;字串變數
simpleMenuID=hiCreateMenu(                              ;產生一個menu
 'simpleMenu                                            ;GLOBAL(ID)
 "Simple Menu"                                          ;標題
 '(trA_MenuItem trB_MenuItem)                           ;LIST(表單的項目)
 )

hiDisplayMenu(simpleMenuID)                             ;根據menuID在螢幕顯示
);let
);proce

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;快速鍵;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
hiSetBindKey("Layout" "None<Btn2Down>" "trSimpleMenu()");設定快速鍵為滑鼠中鍵(Layout視窗有效)


/*
/////////////////////////////////////////////////
Thanks for your enjoy!!
////////////////////////////////////////////////
*/

19
Linux 討論版 / fedora 7(x86_64)裝flashplayer
« 於: 2007-06-21 14:32 »
網路上找到的
用rpm裝下面:
http://gwenole.beauchesne.info/projects/nspluginwrapper/files/nspluginwrapper-0.9.91.4-1.x86_64.rpm
http://gwenole.beauchesne.info/projects/nspluginwrapper/files/nspluginwrapper-i386-0.9.91.4-1.x86_64.rpm
再下載下面source
http://fpdownload.macromedia.com/get/flashplayer/current/install_flash_player_9_linux.tar.gz
tar -zxvf install_flash_player_9_linux.tar.gz
cp install_flash_player_9_linux/libflashplayer.so ~/.mozilla/plugins/
nspluginwrapper -i ~/.mozilla/plugins/libflashplayer.so

21
Linux 討論版 / beryl教學
« 於: 2007-05-13 23:39 »
登入自動啟動beryl
1.gnome桌面(系統->偏好設定->作業階段->初始啟動程式加入beryl,beryl-manager

2.kde桌面(cd ~/.kde/Autostart,然後在此放一個sheell script,記得chmod u+x filename)
 
beryl.sh
代碼: [選擇]

#!/bin/sh
beryl-manager
beryl


beryl設定管理者
1.開啟下雪
其餘功能->選取snow->Shotcuts->Key Binding 連點滑鼠左鍵(<super> F3把熱鍵改F3),然後按F3,你的桌面就會下雪
2水波效果
同上,看Key Bindings是<shift>F9,按<shift>F9,就會有水波效果
3.其他都類似

下面網址的3d-5.png有下雪和水波的桌面超炫
http://www.taconet.com.tw/lkkllkkl/picture

23
如題,3Q

24
程式討論版 / 好強的AWK
« 於: 2007-05-01 17:48 »
代碼: [選擇]


[yplin@localhost ~]$ cat test
rect 1 2 3 4 5 6 7 8
rect 11 21 31 41 51 61 71 81
[yplin@localhost ~]$
[yplin@localhost ~]$ awk '/rect/{ print expr ($5 + $6)/2 , expr ($7 + $8)/2,$9 }' test
4.5 6.5 8
46 66 81
[yplin@localhost ~]$

25
NetPanzer用yum安裝就可,"蠻"刺激的線上即時戰略游戲
1,用滑"鼠"左鍵拖曳,可選單位,Ctrl+1,Ctrl+2...........Ctrl+9,可建立Group
2,1,2,3.....9,選"Group"
3,按住a,然後點滑"鼠"左"鍵",攻擊目標
4,生產工場(廠?),按滑"鼠"左"鍵"拖曳,到位"置",生產目標
其"餘"請"按"F1(help)有英文說明

偷偷告訴你們秘"訣",要一直重"複"移動攻擊,不然會被打假的,還有轉彎時要選敵人攻擊後再轉"彎",因為轉"彎"時會停一下就會被對方打到,祝大家玩"得"愉快.


slime 修改了錯字, 因為我覺得原文很難理解....

26
我感覺FEDORA會把DEBUG,傳回去,我都會用YUM更新到最新,但是有時更新完會有一點小問題,但下次更新就會好了,好奇怪窩,譬如有硬體抓不到,下一次就會幫你DEBUG,我開機所有都是OK的所以我覺得用FEDORA,就是要一直更新,電腦才會是最佳的狀態,個人的感覺,不知道對不對,還是錯覺??

27
Linux 討論版 / 安裝beryl的佈景主題
« 於: 2007-03-24 19:05 »

http://gnome-look.org/index.php?xcontentmode=103
下載beryl的佈景主題(有的真的是超漂亮的)

然後在beryl管理者,按滑鼠右健,選Emerald主題管理者,然後按import(就是導入),去選downlad的那個檔案,在主題選項就會看到,就這麼簡單.

28
我是看電玩通的功略A處用瑪夏擋住第2,3回,在換洽普站在A處用手斧,幹掉拿練達之書的斧手(不必用盜賊偷),不同的地方,B處用哈爾擋住,不用攻進去,再來最妙的地方來了,愛琳西亞,和馬夏先清D處的(打帶跑飛回高處,配合咒歌),d處清完,用馬夏和烏鴉載友軍去D處右方(車子附近),把其他引過來,最後是愛琳西亞載盜賊下去,莉蕥昵再下去用咒歌,讓愛琳西亞和盜賊再次行動,此時盜賊一次就能偷盜龍盾,再來就用愛琳西亞和哈爾直皆幹掉BOSS就過關了,真是太佩服我自己能想出來,這款遊戲真是戰略性太高了,不輸在下圍棋和象棋.(註:龍盾是一定要用偷的,若用卡利兒遠距離魔法幹掉是拿不到的)

29
雜七雜八 / FC6 GNOME DESKTOP
« 於: 2007-03-01 19:02 »




30


頁: [1] 2 3 ... 5