☰
SKILL语言零基础入门:设计平台脚本自动化与批量检查指南
2026/10/28 11:46:58 网站建设 项目流程

简介:《sklanguser+Cadence SKILL Language User Guide(翻译)》是一份面向英语阅读能力有限、具备一定 C 语言基础的技术人员的 Cadence SKILL 语言中文参考指南,依据产品版本 6.1.6(2014 年 11 月)整理。内容围绕集成电路设计自动化中的脚本开发需求展开,涵盖 SKILL 语言简介、许可说明、语法约定与代码示例、数据类型标识符、安装与环境配置、SKILL 与 Lisp 的关系,以及技术支持与延伸学习资源,适合初学者搭建语法框架,也便于有经验用户按章节查阅和核对概念。压缩包共 1 个 PDF 文件,约 68.23MB,单文件结构便于检索、标注和离线阅读。已有 527 人学习,可作为英文原版手册的辅助译本使用;读者可从中获取较完整的中文术语参照、目录导览和配置要点,但需留意机器翻译可能带来的表达偏差与版本时效,关键语法和示例仍应结合官方文档复核。

1. 先弄明白它是什么:SKILL 语言就是给设计工具下命令的方言

第一次翻开这份《SKILL 语言使用指南》的中文翻译版,很多人会卡在同一页:每个汉字都认识,连起来却不知道它在讲什么。原因不复杂,它默认你已经坐在某个电路设计平台前面了。SKILL 语言就是这类设计平台内置的脚本语言,长得像 Lisp,作用像“快捷键的进阶版”——你平时用鼠标点十几下才做完的事,它可以一句话交代清楚。这份使用指南从语法约定、列表、判断循环一路讲到自定义函数和文件读写,适合完全没写过脚本、但每天要在设计工具里重复劳动的人。翻译版是机器翻译打底再顺过的,个别句子别扭,照着例子敲一遍就顺了。

2. 为什么零基础也值得学:三个真实麻烦和一门不太一样的语言

很多人对脚本语言的第一反应是“那是程序员的事”。可在这类设计平台里,写脚本的人往往不是程序员,而是天天用工具的画图人、验证人、整理数据的人。他们学 SKILL 的动机朴素得不能再朴素:手太累了。这一章先把“值不值得学”讲透,再讲“需要多少底子”,最后说清楚它和你听说过的语言差在哪里,免得你带着错误的预期一头扎进去。

2.1 它到底替你解决哪三件事

第一件是重复操作。设计平台里大量动作是固定套路:选中一类对象、改某个属性、确认、下一个。做十次还行,做三百次就是折磨,而且人一累就出错。SKILL 能把这一整套写成一条命令,你敲一次,它跑三百遍,中途不会手抖点错。这是最直接的价值,也是大多数人学它的起点。

第二件是批量检查。规则类的工作特别适合交给脚本,比如“把所有名字里带某个前缀的对象找出来”“统计某一层上图形的数量”“检查某些参数有没有超出范围”。人眼扫一遍要半小时还不敢保证不漏,脚本跑一遍几秒钟,结果还稳定。血泪经验是:凡是“按某个规则逐个看一遍”的活,都不该由人来干。

第三件是把经验固化下来。老手脑子里有很多“遇到这种情况就这么处理”的判断,这些判断不写下来,人一走就没了。写成一个小函数,新同事调用一下就能得到同样的结果,相当于把你的经验存成了一份后悔药。这件事的价值会随着时间放大,前期看不出,半年后差距明显。

2.2 学之前需要多少编程底子

说句让人安心的话:需要的底子比你想的少。你只要知道“变量是存东西的盒子”“函数是打包好的一段操作”“循环是把同一件事重复做”这三个概念,剩下的都能在读例子时补上。这三个概念不需要会写代码才能理解,日常做表格、用公式、批量改名,本质上都在用它们。

如果你以前接触过 C 语言,迁移会更快一些,因为函数、参数、返回值这些词你已经有画面感了。这份使用指南本身也是按这个前提写的,它默认读者对“什么是一个函数调用”不陌生。但即便你完全没碰过 C,只要能耐心照着例子敲,语法层面的门槛并不高——SKILL 的语法规则少,没有复杂的类型声明,也没有繁琐的编译步骤。

真正需要提前做好心理准备的,是它的写法长相。第一次看到满屏括号,多数人会觉得玄学。这个不适应期大概持续两三天,敲够二十个小例子就过去了。别在第一天就下结论说“我不适合”,那是括号的问题,不是你的问题。

2.3 它和你听过的语言差在哪

最大的差别是括号的位置。你熟悉的语言大概长这样:area = width * height;,函数调用是doSomething(a, b);。SKILL 里更常见的是doSomething(a b)——函数名在前,参数用空格隔开,整体用括号包住。同时它也支持width * height这种中缀写法,所以初学时会看到两种风格混在一起,容易懵。记住一条就行:算术用中缀,函数调用用“名字(参数)”。

第二个差别是“一切皆列表”。SKILL 继承了 Lisp 的血统,代码本身也是列表,数据也是列表。你写list(1 2 3)造出来的是列表,你用car取第一个元素、用cdr取剩下的部分,这些操作和你处理代码结构用的是同一套工具。刚开始会觉得抽象,用顺了会发现它省事:不用为每种数据结构记一套不同的方法。

第三个差别是没有类型声明,也没有显式的 return。变量拿到什么就是什么,函数最后一行表达式算出来的值,就是它的返回值。这带来两个后果:写起来快,但出错时报错信息不一定直白。所以后面第 5 章专门列了排查清单,新手翻车基本都翻在那几条上。

提示:不要一上来就去啃手册里“语言特征”那一章的类型表和转义序列表。那些是查的,不是背的。先把能跑的例子跑通,遇到看不懂的类型再回头查,效率高得多。

3. 第一个例子怎么跑:从一道加法到一个能加载的文件

这一章开始动手。目标很小:让工具替你做一次计算,把结果打印出来,最后把这段代码存成文件、重新加载一遍。做完这三步,你就已经跨过了“我不会”那道坎,剩下的都是在这个骨架上加肉。

3.1 找到能敲 SKILL 的那扇窗

SKILL 不是独立安装的软件,它住在设计平台里面。你打开工具后,通常会有一个命令输入窗口(不同平台叫法不一样,有的叫控制台,有的叫命令解释器),光标在那里闪,等你输入。这个窗口就是你和 SKILL 对话的地方:你敲一句,它算一句,立刻把结果吐回来。

找不到窗口的话,先在菜单里翻“窗口”或“工具”这一类入口。找到了先别急着敲代码,敲一个最简单的1 + 1试试水。如果它回了你2,说明环境是通的,可以往下走。如果没反应或者报错,先确认你所在的窗口是不是命令窗口,而不是日志窗口——日志窗口只能看,不能输入。

这一步看着 trivial,但它是新手最容易卡住的地方:很多人拿到手册后一直在读,读了三章也没找到能敲字的地方,于是放弃。别做这种人,先找到窗口,五分钟的事。

3.2 第一行代码:让工具替你算个数

在命令窗口里输入下面这一行,然后回车。

; 最基础的一次求值:中缀写法,和普通算术一样 1 + 2

回车后窗口会返回3。这不是什么高深的东西,但它验证了三件事:窗口是活的、解释器在正常工作、你能把一行东西送进去再拿回结果。学任何语言的第一步都是这个“回声”,它比任何文档都让人安心。

接着试一个函数调用,感受一下括号的位置:

; 函数名在前,参数用空格隔开,整体用括号包住 plus(1 2)

这一行返回的结果同样是3。两种写法做同一件事,这是 SKILL 的特点:中缀写法适合读,函数写法适合嵌进别的表达式里。初学阶段两种都用,哪种读着顺用哪种,不用纠结“标准写法”是哪个。

3.3 变量、打印和返回值

算完加法,试试把值存起来再算。变量在 SKILL 里不需要声明类型,直接赋值就行。

; 赋值:把数字存进变量,等号两边可以留空格 width = 10 height = 20 ; 用变量参与计算,结果再存回另一个变量 area = width * height ; 打印:%d 是整数占位符,\n 表示换行 printf("面积是 %d\n" area)

逐行解释一下。width = 10这行执行完,窗口会回显10,因为赋值表达式本身的值就是赋进去的那个值,这是 Lisp 系语言的共同习惯。area = width * height算出200并存进area。最后一行printf是格式化输出,%d的位置会被area的值替换掉,\n负责在结尾换行——不加\n的话,下一次输出会和这一行糊在一起,看起来像乱码。

再补一个字符串的例子,因为后面写工具时经常要拼提示信息:

; strcat 把多个字符串接成一个 name = "demo" println(strcat("当前模块:" name))

strcat负责连接,println打印完自动换行,比printf少写一个\n。参数说明很简单:strcat接受任意多个字符串,从左到右拼起来;println接受一个值,转成可读形式输出。

3.4 存成文件再加载:让代码活下来

在窗口里敲的代码,窗口一关就没了。真实使用中要把代码写进文本文件,再让平台加载它。用任意纯文本编辑器新建一个文件,把下面的内容写进去,保存为first.il(放在一个你记得住的目录,路径里尽量别带空格)。

; first.il —— 第一个可以反复加载的小文件 procedure( rectArea(w h) ; 函数体只有一行表达式,它就是返回值 w * h ) printf("3x4 的面积是 %d\n" rectArea(3 4))

回到命令窗口,用load把这个文件读进来:

; 加载文件:参数是文件的完整路径,字符串要用双引号包住 load("/your/path/first.il")

加载成功后,你会看到那行打印结果。load做的事就是“把这个文件里的内容当成你刚刚一行一行敲进去的代码执行一遍”。参数只有一个:文件路径字符串。路径写错会报找不到文件,这时候先检查是不是少了引号、是不是用了相对路径但当前目录不对——用完整路径最省事。

到这里,你已经完成了一个完整循环:写代码、存文件、加载、看到结果。接下来所有内容都是在这个循环上加东西。

4. 入门必会的四件事:列表、判断、循环、自定义函数

这一章是入门阶段的主体。四件事各占一节,每节都给能直接敲的例子。不需要一次全记住,跟着敲一遍,知道“遇到这类问题该翻哪一节”就够了。

4.1 列表:SKILL 里装东西的万能盒子

列表是 SKILL 的核心数据结构,你可以把它理解成一个有序的盒子,什么都能往里放:数字、字符串、别的列表。造一个列表有三种常见写法,效果有细微差别。

; 用 list 函数造,参数会被求值 a = list(1 2 3) ; 用单引号造,内容原样保留,不求值 b = '(1 2 3) ; 用 cons 往已有列表头部塞一个元素 c = cons(0 a)

跑完之后a是(1 2 3),b也是(1 2 3),c是(0 1 2 3)。list和'的区别在初学阶段感受不明显,等你往列表里放变量名的时候就明白了:list(x)放进去的是x的值,'(x)放进去的是符号x本身。入门阶段先用list,不容易出错。

取元素靠三个函数:car拿第一个,cdr拿除第一个以外的剩下部分,cadr拿第二个。长度用length。

; 取第一个、取剩下的、取第二个、量长度 car(a) ; 返回 1 cdr(a) ; 返回 (2 3) cadr(a) ; 返回 2 length(a) ; 返回 3

这套命名来自 Lisp 传统,cadr其实就是“先 cdr 再 car”的缩写。刚开始觉得别扭,用一周就成肌肉记忆了。需要提醒的是cdr返回的永远是列表,哪怕只剩一个元素也是(3),不是3——这个差别在写判断条件时经常导致翻车。

4.2 判断:if、when、unless、case 什么时候用哪个

四个判断形式,按场景选,选对了代码短一半。

if是三段式:条件、成立做什么、不成立做什么。

; if:条件为真走第一支,否则走第二支 if( area > 100 printf("面积偏大\n") printf("面积正常\n") )

when和unless是if的简化版,只关心一边。条件成立才执行用when,条件不成立才执行用unless。

; when:只有条件成立时才执行函数体 when( area > 100 printf("超过阈值,记一笔\n") ) ; unless:只有条件不成立时才执行 unless( area > 100 printf("没超,不用管\n") )

case适合“一个值对应多种情况”的分支,比一串if清爽。它的写法是“待判断的值 + 若干组(匹配值 表达式)+ 一个默认分支”。

; case:按 layer 的取值走不同分支,t 是兜底 case( layer ("M1" println("第一层金属")) ("M2" println("第二层金属")) (t println("其他层,走默认处理")) )

参数说明:case的第一个参数是被判断的值,后面每个括号是一组“匹配值 + 要做的事”,最后一组的t表示“以上都不匹配时走这里”。t在 SKILL 里就是“真”,用它当兜底是固定套路。忘了写兜底分支,遇到意外值就什么都不做,问题会被悄悄吞掉,这是很常见的坑。

4.3 循环:for 数着走,foreach 挨个走

循环只有两个常用形式,分清楚使用场景就不容易错。

for用于“从几数到几”,适合按下标跑固定次数。

; for:从 1 数到 5,两头都算上 for( i 1 5 printf("第 %d 次\n" i) )

参数是“循环变量、起点、终点”,循环体写在后面。这里的i是循环变量,跑完一轮自动加一。要注意终点是包含的,1 5会跑五次,不是四次。

foreach用于“把列表里的元素挨个拿出来”,是处理列表的主力。

; foreach:依次取出列表里的每个元素 foreach( item list(10 20 30) printf("元素:%d\n" item) )

参数是“临时变量名、要遍历的列表”,每一轮item会被赋成当前元素。这两个循环都不需要你手动维护计数器,也就不会出现“忘了加一导致死循环”这种经典事故——这算是 Lisp 系语言送给新手的礼物。

4.4 定义自己的函数:procedure 加三种参数写法

写到最后,你会发现有些操作要反复用,这时候就该把代码收进函数里。定义函数用procedure,最后一行表达式的值就是返回值。

; 定义:函数名、参数列表、函数体 procedure( rectArea(w h) w * h ) ; 调用:参数用空格隔开 rectArea(3 4) ; 返回 12

参数说明:w和h是形参,调用时按位置传。函数体可以有多行,但只有最后一行的值会被当成返回值,前面几行如果只是打印或者赋值,不会影响返回值。

实际写工具时,参数个数往往不固定。SKILL 给了三种可选写法,掌握后能省很多重复代码。@rest把多余参数打包成列表:

; @rest:把所有传进来的数字加起来,个数不限 procedure( sumAll(@rest nums) let( ((total 0)) foreach( n nums total = total + n ) total ) ) sumAll(1 2 3 4) ; 返回 10

let在这里的作用是声明局部变量total并初始化为0,作用范围只在这个函数内部。不写let直接赋值,total会变成全局变量,跑到别的地方干扰别人——这是新手最常见的污染源,第 5 章会专门讲。

@optional给参数一个默认值,调用时可以不传:

; @optional:unit 不传就默认用 "um" procedure( withUnit(value @optional (unit "um")) sprintf("%s%s" value unit) ) withUnit("10") ; 返回 "10um" withUnit("10" "mil") ; 返回 "10mil"

@key则让参数按名字传,适合参数多、顺序容易记混的场景:

; @key:调用时用 名字 值 的形式传参 procedure( describeBox(@key width height (layer "M1")) sprintf("宽 %s 高 %s 层 %s" width height layer) ) describeBox(?width "10" ?height "20")

@key的调用语法里,实参前面带问号,这是 SKILL 的固定写法,第一次见容易懵,照抄两次就习惯了。这三种参数写法不用一次学完,先会procedure加位置参数,遇到需求再回来查。

5. 新手最容易翻车的五个地方:一份照着查的排查清单

前面四章的例子都是“正确路径”。真实情况是,新手第一次自己写代码时,八成的失败集中在五个地方。这一章按“现象 → 原因 → 解决”的格式列出来,出问题时对着找,比漫无目的地改快得多。

5.1 敲代码时最容易犯的三个语法错

现象一:敲完回车,光标往下走了一行,什么都没发生。原因几乎永远是括号没闭合——解释器认为你这个表达式还没写完,正在等你继续输入。解决方法是数左括号和右括号的数量,或者用编辑器的括号匹配功能高亮检查。养成一个习惯:每写完一对括号就先把它闭合,再往中间填内容,比写完再补要省事得多。

现象二:报错说找不到某个函数。先看拼写,再看大小写。SKILL 对函数名大小写敏感,printf写成Printf就是不认识。还有一种情况是你以为加载了文件,其实load那行报错被忽略过去了,函数根本没定义成功。解决方法是重新执行一次load,并确认返回值不是错误提示。

现象三:变量用着用着变成了nil,后面一算就报错。原因是没有赋初值就用。SKILL 里没赋值的变量取出来是nil,nil参与算术运算会直接报错。解决方法是在函数开头用let把要用的变量全部初始化一遍,哪怕初值是0或者"",也比空着强。

5.2 跑起来之后最容易懵的两个现象

现象四:改了一个函数,别的地方跟着出问题。九成是全局变量污染。你在函数里直接写total = 0,这个total就成了全局的,另一个函数里也用了同名的total,两边互相踩。解决方法是:函数内部临时用的变量,一律用let或prog包起来声明成局部,用完自动消失,不给别人添麻烦。这条建议值一份后悔药的钱。

现象五:输出糊成一团,或者中文变成问号。前者是打印时忘了加换行,printf记得在字符串末尾写\n,println自带换行。后者通常是文件编码和窗口编码不一致,把源文件统一存成 UTF-8 再试一次。还有一个隐藏情况:文件路径里有空格或者中文目录,load认不出来,把文件挪到纯英文路径下最稳。

注意:报错信息看不懂的时候,别急着重写整段代码。先把出错的那一行单独拎出来,在命令窗口里直接敲一遍,看它到底返回什么。把大问题缩成一行,是排查中最有效的一招。

6. 下一步学什么:从抄例子到写出自己的第一个小工具

入门阶段最怕的不是学不会,而是学完不知道往哪走。这里给一条我自己踩过坑之后总结的路径,按周推进,不追求快,追求每一周都有能跑起来的东西。

第一周只做一件事:把手册里的例子抄一遍,不看答案。抄的时候故意改改参数,看看结果怎么变。抄代码不是低效行为,它是建立语感的过程,就像学外语要先跟读。

第二周开始碰文件读写。手册里“文件输入/输出”那一章讲得比较细,你先掌握三个动作就够:把内容写进文件、从文件里一行行读出来、把读到的内容塞进列表。这三个动作组合起来,就能做“把一批数据导出成报表”这种实用小事。

第三周找一个真实的小需求练手,别找大的。比如“统计当前设计里某一类对象一共有多少个”,逻辑就是遍历、判断、累加、打印。写完之后你会遇到一堆小问题,正是这些问题逼你把let、foreach、if真正用熟。

阶段重点内容判断是否过关的标准
第一周语法约定、函数调用、变量能独立写出十行以内的小例子并跑通
第二周列表操作、文件读写能把文件内容读成列表再写回文件
第三周控制流程、自定义函数能写一个带参数、有返回值的函数
第四周参数写法、局部变量、错误排查能看懂别人的脚本并改出自己想要的效果

再往后,可以回头看手册里讲命名约定和函数前缀的那部分。这部分初读没感觉,等你写了十几个函数之后再看,会发现它讲的是“怎么让代码不打架”,很实用。另外,遇到别人写好的脚本,别只运行,打开读一遍,看它怎么组织函数、怎么处理异常值,进步比闷头写快。

最后说一句我自己的教训。刚开始学的时候,我图快,所有变量都直接赋值,不写let,跑小例子完全没问题。等到把几个脚本拼在一起用,变量互相覆盖,查了整整一个下午才找到原因。从那以后,我每写一个函数,都会先把局部变量用let圈起来,再加一句打印验证,形成固定动作,再也没在这上面翻过车。慢就是快,这句话在脚本上格外灵。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询