
認識SkillSKILL 語言是Cadence 提供給用戶的一個開發接口利用其本身提供的接口函數和SKILL語言完成自動化操作的功能。可為PCB 工程師們提高工作效率縮短工程圖面開發周期減少出錯率等品質保證等各方面都有一定的幫助。Skill 是嵌入式的高級開發語言支持一套類似C 語言的語法大大降低了初學者學習的難度同時高水平的編程者可以選擇使用類似Lisp 語言的全部功能。所以SKILL 語言既可以用作最簡單的工具語言也可以作為開發任何應用的、強大的編程語言。SKILL 可以與底層系統交互也提供了訪問Cadence 各個工具的豐富接口。在Cadence 環境下允許Skill 自定義用戶界面并包含強大的跟蹤、調試和分析工具。Skill 還可以讓你訪問和控制所有的工具、配置用戶環境、設計數據庫。用戶可以通過Skill 語言來訪問并且可以開發自己的基于Cadence 平臺的快捷、實用工具。Cadence 提供二次開發的SKILL 語言它是一種基于通用人工智能語言——Lisp 的交互式高級編程語言(LISP 即List Processing表處理是最早和最重要的符號處理編程語言之一它于1958 年由美國的J. McCarthy 提出LISP 在人工智能AI 方面獲得廣泛應用)。在Allegro 菜單欄調用skill本小結介紹如何編輯菜單文件.men文件。使得可以通過Allegro菜單欄上的命令調用skillC:\Cadence\SPB_17.4\share\pcb\text\cuimenus\allegro.men為文件路徑認識了解編輯菜單欄先看一下men文件里的內容一行一行來進行了解之后就可以知道從哪里下手了。BEGIN與END菜單定義的開始與結束所有菜單項都包含在這對關鍵字之間。POPUP File定義一個下拉菜單顯示文本為File其中表示后面的字符串可以被作為快捷鍵打開菜單。MENUITEM New..., new菜單項顯示New...定義快捷鍵N。點擊后發送命令字符串new該命令對應 Allegro 內部的“新建”功能。MENUITEM Open, open菜單項顯示Open點擊后執行命令open打開文件。MENUITEM Open Project..., open project菜單項顯示Open Project...執行命令open project打開項目。#ifndef _ORCAD_STANDARD || _ORCAD_PROFESSIONAL || _ALLEGRO_ARTIST條件編譯指令如果沒有定義_ORCAD_STANDARD、_ORCAD_PROFESSIONAL或_ALLEGRO_ARTIST這些宏即當前不是 OrCAD Standard / Professional / Allegro Artist 版本則編譯后續代碼直到對應的#endif。#ifdef allegro_pulse_enable如果定義了宏allegro_pulse_enable通常表示啟用了 Pulse 功能Pulse 是 Cadence 的云協作平臺則包含下面的菜單項。MENUITEM Open from Pulse..., pulse_designs菜單項顯示Open from Pulse...執行命令pulse_designs用于從 Pulse 云平臺打開設計。兩個#endif分別結束#ifdef和#ifndef條件塊。#ifdef _allegro_option_multiuser如果定義了多用戶選項宏表示當前版本支持 Symphony 多用戶協同設計則包含以下兩個菜單項。MENUITEM Symphony Connect..., muconnect顯示Symphony Connect...執行命令muconnect連接到 Symphony 服務器。MENUITEM Start Symphony Server..., muserver顯示Start Symphony Server...執行命令muserver啟動 Symphony 服務器。#endif結束條件塊。MENUITEM SEPARATOR添加一個水平分隔線用于將菜單項分組。MENUITEM Save, save菜單項Save執行命令save。MENUITEM Save As..., save_as菜單項Save As...執行命令save_as。同樣僅在非 OrCAD 版本且啟用 Pulse 時顯示這些菜單項。菜單項分別執行pulse_copy_as另存為到 Pulse、pulse_commit提交、pulse_version_control版本控制。MENUITEM Update Layout..., design sync eco顯示Update Layout...執行命令design sync eco用于從原理圖同步 ECO 到 PCB。MENUITEM Update Schematic..., design sync back_annotate顯示Update Schematic...執行命令design sync back_annotate將 PCB 更改反向標注到原理圖。OPUP Import定義一個名為Import的子菜單I作為快捷鍵。內容在BEGIN與END之間。菜單欄調用skill步驟分為以下1創建文件夾把所有.il放到該文件夾下后續所有skill都可以放在其中。2修改allegro.ilinit文件內容對自定義存放.il文件進行統一的注冊并調用。3修改MEN文件來調用skill文件。skill_函數 通過菜單欄點擊跳轉到對應的網站; 打開公司或常用網站defun( OpenMyWebsite ()axlHttp(https://www.example.com)); 注冊為 Allegro 命令axlCmdRegister(open_my_website OpenMyWebsite)修改men文件在菜單欄可以直接跳轉POPUP My LinksBEGINMENUITEM Visit My Website, open_my_websiteENDSKILL命令的使用1 查看skill文件的路徑skill getSkillPath()會返回一個地址例如(. C:/Users/name/pcbenv C:/Cadence/SPB_17.4/share/local/pcb/skill ...)2 修改skill路徑在allegro.ilinit文件中動態添加最靈活推薦開發時使用allegro.ilinit是 Allegro 啟動時自動加載的 SKILL 初始化文件。如果沒有allegro.ilinit這個文件可以創建一個通過以下命令修改文件內容添加路徑。; 1. 設置SKILL搜索路徑將你的專屬文件夾添加進去setSkillPath(buildString(append1(getSkillPath() C:/Allegro-Skill-Files))); 2. (可選) 自動加載新路徑下的所有 .il 文件foreach(dir getSkillPath()when(isDir(dir)foreach(file rexMatchList(\\.il$ getDirFiles(dir))load(file))))最后進行在使用查看路徑命令驗證一下如果被正確添加那么就ok。3 檢查所有通過注冊的skill命令skill axlCmdList()4 注冊命令行axlCmdRegister(open_my_website OpenMyWebsite)1-SKILL_輸入層數并切換到指定層; change_layer.il; 層顯示切換腳本適用于 Allegro 17.4; 用法; l 1 2 3 - 僅顯示指定 ETCH 層相關對象; l - 清空所有顯示; lt 1 2 3 - 顯示指定 ETCH 層同時顯示 TOP 層絲印、板框等; lt - 顯示 TOP 層 ETCH 及 TOP 非電氣層; lb 1 2 3 - 顯示指定 ETCH 層同時顯示 BOTTOM 層絲印、板框等; lb - 顯示 BOTTOM 層 ETCH 及 BOTTOM 非電氣層;; 加載方式; 1. 將本文件放入 SKILL 搜索路徑如 $HOME/pcbenv; 2. 在 allegro.ilinit 中添加 load(change_layer.il); 3. 或臨時在命令行執行 skill load(change_layer.il); 注冊命令axlCmdRegister(l l_cmd)axlCmdRegister(lt lt_cmd)axlCmdRegister(lb lb_cmd); 主命令l只顯示 ETCH 層相關defun(l_cmd (rest args); 清空顯示axlVisibleDesign(nil); 如果有層號參數則顯示對應 ETCH 層when(argsforeach(item argslayerNum evalstring(item)when(numberp(layerNum)showlayer_etch(layerNum)))); 刷新顯示axlVisibleUpdate(t)); lt 命令顯示指定 ETCH 層默認 TOP并顯示 TOP 非電氣層defun(lt_cmd (rest args); 清空顯示axlVisibleDesign(nil); 如果沒給層號默認使用 TOP 層if(args nil then; 查找 TOP 層在 ETCH 層列表中的位置allLayer axlGetParam(paramLayerGroup:ETCH)-groupMemberstopIndex 1 ; 默認第一個層for(i 1 length(allLayer)when(upperCase(nthelem(i allLayer)) TOPtopIndex i))showlayer_etch(topIndex)else; 有參數則顯示指定層號foreach(item argslayerNum evalstring(item)when(numberp(layerNum)showlayer_etch(layerNum)))); 顯示 TOP 非電氣層和板框等show_top_extra(); 刷新顯示axlVisibleUpdate(t)); lb 命令顯示指定 ETCH 層默認 BOTTOM并顯示 BOTTOM 非電氣層defun(lb_cmd (rest args); 清空顯示axlVisibleDesign(nil); 如果沒給層號默認使用 BOTTOM 層if(args nil thenallLayer axlGetParam(paramLayerGroup:ETCH)-groupMembersbottomIndex length(allLayer) ; 默認最后一個層for(i 1 length(allLayer)when(upperCase(nthelem(i allLayer)) BOTTOMbottomIndex i))showlayer_etch(bottomIndex)else; 有參數則顯示指定層號foreach(item argslayerNum evalstring(item)when(numberp(layerNum)showlayer_etch(layerNum)))); 顯示 BOTTOM 非電氣層和板框等show_bottom_extra(); 刷新顯示axlVisibleUpdate(t)); 顯示指定 ETCH 層相關的對象不包含全局參考層defun(showlayer_etch (layerNum); 獲取所有 ETCH 層成員按順序排列allLayer axlGetParam(paramLayerGroup:ETCH)-groupMembers; 檢查層號是否有效when(layerNum 1 layerNum length(allLayer); 獲取層名layerName nthelem(layerNum allLayer)etchlayer strcat(ETCH/ layerName); 顯示該層的走線、引腳、過孔、邊界、DRC 等axlVisibleLayer(etchlayer t)axlVisibleLayer(strcat(PIN/ layerName) t)axlVisibleLayer(strcat(VIA CLASS/ layerName) t)axlVisibleLayer(strcat(BOUNDARY/ layerName) t)axlVisibleLayer(strcat(DRC ERROR CLASS/ layerName) t)axlVisibleLayer(strcat(route keepout/ layerName) t)axlVisibleLayer(strcat(via keepout/ layerName) t)axlVisibleLayer(strcat(CONSTRAINT REGION/ layerName) t); 如果是平面層額外顯示反焊盤層when(axlDBGetLayerType(etchlayer) PLANEaxlVisibleLayer(ANTI ETCH/ALL t)); 顯示 PLAN 層如果存在planlayer strcat(PLAN/ layerName)when(axlLayerGet(planlayer)axlVisibleLayer(planlayer t)); 激活該 ETCH 層為當前層axlSetActiveLayer(etchlayer))); 顯示 TOP 面非電氣層及板框等全局層defun(show_top_extra (); 板框全局axlVisibleLayer(BOARD GEOMETRY/Design_Outline t); 布線允許/禁止區域axlVisibleLayer(route keepout/all t)axlVisibleLayer(route keepin/all t)axlVisibleLayer(CONSTRAINT REGION/ALL t); TOP 絲印axlVisibleLayer(PACKAGE GEOMETRY/SILKSCREEN_TOP t)axlVisibleLayer(REF DES/SILKSCREEN_TOP t) ; 如果存在該層; TOP 阻焊axlVisibleLayer(SOLDERMASK_TOP t); TOP 鋼網axlVisibleLayer(PASTEMASK_TOP t); TOP 裝配層axlVisibleLayer(PACKAGE GEOMETRY/ASSEMBLY_TOP t)axlVisibleLayer(MANUFACTURING/ASSEMBLY_TOP t); TOP 禁止測試點層可選axlVisibleLayer(MANUFACTURING/NO_PROBE_TOP t)); 顯示 BOTTOM 面非電氣層及板框等全局層defun(show_bottom_extra (); 板框全局axlVisibleLayer(BOARD GEOMETRY/Design_Outline t); 布線允許/禁止區域axlVisibleLayer(route keepout/all t)axlVisibleLayer(route keepin/all t)axlVisibleLayer(CONSTRAINT REGION/ALL t); BOTTOM 絲印axlVisibleLayer(PACKAGE GEOMETRY/SILKSCREEN_BOTTOM t)axlVisibleLayer(REF DES/SILKSCREEN_BOTTOM t); BOTTOM 阻焊axlVisibleLayer(SOLDERMASK_BOTTOM t); BOTTOM 鋼網axlVisibleLayer(PASTEMASK_BOTTOM t); BOTTOM 裝配層axlVisibleLayer(PACKAGE GEOMETRY/ASSEMBLY_BOTTOM t)axlVisibleLayer(MANUFACTURING/ASSEMBLY_BOTTOM t); BOTTOM 禁止測試點層axlVisibleLayer(MANUFACTURING/NO_PROBE_BOTTOM t))