1、常量、变量 常量就是它得值等于自身得表达式,如123,”abc”…ﻫ变量就是保存了其它值得表达式,如x=3, x即变量。 算术与逻辑操作符 函数名 语法 对应操作符 Data Access arrayref a[index] [ ] setarray a[index] = expr bitfield1 x<bit> <> setqbitfield1 x=expr setqbitfield x<msb:lsb
2、>=expr quote 'expr ' getqq g、s 、 getq g->s -> putpropqq g、s=expr, g->s=expr putpropq d~>s, d~>s =expr ~> Unary preincrement ++s ++ postincrement s++ ++ predecrem
3、ent --s -- postdecrement s-- -- minus -n - not !expr ! bnot ~x ~ Binary expt n1 ** n2 ** times n1 * n2 * quotient n1 / n2
4、 / plus n1 + n2 + difference n1 - n2 - leftshift x1 << x2 << rightshift x1 >> x2 >> lessp n1<n2 < greaterp n1>n2 > leqp n1<=n2 <= geqp n1>=n2
5、 >= equal g1 == g2 == nequal g1 != g2 != band x1 & x2 & bnand x1 ~& x2 ~& bxor x1 ^ x2 ^ bxnor x1 ~^ x2 ~^ bor x1 | x2 | bnor x1 ~| x2
6、 ~| and x1 && x2 && or x1 || x2 || range g1 : g2 : setq s = expr = 对于既有函数名又有操作符函数,采用函数名调用与采用操作符调用得效果就是一样得。ﻫ示例 lessp(3 1)=>nil 等同于 3<1=>nil 预定义算术函数 语法 结果 通用函数 add1(n) n + 1 sub1
7、n) n – 1 abs(n) 绝对值 exp(n) 自然对数得n次方 log(n) max(n1 n2 、、、) min(n1 n2 、、、) mod(x1 x2) 取模运算 round(n) sqrt(n) sxtd(x w) 将x右扩展W个符号位 zxtd(x w) 与上面得功能相同,速度更快 三角函数 sin(n),cos(n),tan(n) asin(n),acos(n),atan(n) 随机数生成函数 random(x) 产生0~x-1得随机数 s
8、random(x) 初始化随机数生成函数得x 位操作 含义 操作符 位与 & 位或 | 位异或 ^ 左移位 >> 右移位 << 取反 ~ 真值、假值 § 真值,除了nil以为得值都就是真值。 § 假值,nil 条件控制函数 if, when, unless, cond § if if函数得语法结构 if( condition1 then ;当condition1为真值时执行代码块expA expA else
9、 if( condition2 then ;当condition2为真值时执行代码块expB expB else … expC ) );end if § when when函数语法结构 when( condition ;当condition为真值时执行代码块expA,否则跳过 expA ); end when
10、 § unless unless语法结构 unless( condition ;当condition为假值时执行代码块expA,否则跳过 expA ); end unless § cond cond语法结构 cond ( ( condition1 expA、、、 ) ;当condition1为真值时执行代码块expA ( condition2 expB 、、、 ) ;… ( condition3
11、 expC 、、、 ) ;… ( t expN ) ;之前得条件都不满足时默认执行expN ); end cond [注]:";" 表示注释 循环控制函数 while,for,foreach § while while语法结构 while( condition is true ;当condition为真值时反复执行代码块expA,否则结束循环 expA ) § for for语法结构 for( i 1 5
12、 println(i) ) 将输出 1 2 3 4 5 § foreach foreach就是简化版得for,上面得例子用foreach写如下 alist = ‘(1 2 3 4 5) foreach( item alist println( item ) ) foreach通常用于操作列表,因为它会遍历列表得每一个元素。 选择函数 § ca
13、seq得用法类似cond,功能也类似。 caseq( var (condition1 expA) (condition2 expB) … ) ;case语法结构 循环结构中得局部变量 使用关键字prog可以在循环结构中定义局部变量。关于prog得详细介绍请参考函数章节。 返回函数 表示返回值得关键字就是return。return可以强制一个prog结构立即结束,送出返回值,忽略剩余得循环操作。 示例 prog( ( ) for( i 0 10 when( oddp( i )
14、 return( i ) ) ; when ) ; for ) ; prog 这个for循环不会运行10次,首次oddp(i)为真值得时候循环就会结束。 正则表达式 在很多得skill应用中都会用到正则表达式,比如在一个字符串数组中查找带有关键字user得字符串。示例: lStr = '("hello" "whenuser" "usere" "ffus er" "ppuserd" "uster"); lRes = nil foreach( item lStr if( rexMatchp
15、"user" item) then lRes = cons( item lRes) println(item) ) ) 输出: "whenuser" "usere" "ppuserd" lRes =>("ppuserd" "usere" "whenuser")、 这里得关键命令就是rexMatchp,函数形式为rexMatchp(t_pattern S_target),这个命令将在第二个参数中查找满足第一个参数(模式)得条件,如果找到返回真值,否则返回假值。 § 正则表达式(pattern)得组成字符 语法 含义
16、 c 匹配任意非特殊字符 、 匹配任意字符 \ 用在特殊字符前面代表特殊字符本身,用在 <, >, (, ), and 1,、、、,9, 得含义在下面描述 [c、、、] 一对方括号中包含一些字符将匹配括号中得任意一个字符,如果第一个字符就是 ^ 则表示不匹配括号中得所有字符,[a-z]表示匹配a到z之间得任一字符,"-”表示范围。 * 用在一个以上描述得字符或pattern后表示匹配该字符或pattern0次或多次。 + 类似*,区别在于匹配至少一次 \(、、\)
17、 如果包含在这个符号中得字符串匹配上了,被匹配得字符可以被提取出来(最多支持9中匹配) \n 与上一个符号对应,反斜杠后跟一个数字将可以提前到上一个符合保留得字符串 \<、、、\> 这个符号表示完全匹配一个字符串得开始与结尾 rs 2个正则表达式得组合将尽可能多得匹配r并匹配一个s ^, $ ^表示字符串得开始, $表示字符串得结尾 § 常用正则匹配函数 rexpile,rexExecute,rexMatchp,rexSubstitute 示例: 使用 rexpile与rexExecute实现开头得示例 lStr = '(
18、"hello" "whenuser" "usere" "ffus er" "ppuserd" "uster"); lRes = nil rexpile("user") foreach( item lStr if( rexExecute(item) then lRes = cons( item lRes) println(item) ) ) 将得到与前一个示例一样得结果。示例: 使用rexSubstitute提取字符, 在给定格式得列表中提取symbol名字与对应得坐标 lStr = list("C17x855
19、00y-2790、00" "C676x3499、50y-2676、40" "Q690x3406、00y-2701、00" “C666x3535、00y-3135、00” “C785x1929、00y-3750、00” “U628x3865、00y-2025、00” “C737x3010、00y-3155、00” “R754x2770、00y-2730、00”) rexpile( "\\([A-Z]+[0-9]+\\)x\\([0-9、-]+\\)y\\([0-9、-]+\\)") ; \\(、、、\\) 结构表示匹配得部分将可以用\\1、、9提取出来 ; [A-Z]表示匹配A~Z得字符,
20、表示至少有一个这样得字符 foreach( item lStr when( rexExecute( item ) str1 = rexSubstitute( "\\1" ) str2 = rexSubstitute( "\\2" ) str3 = rexSubstitute( "\\3" ) printf("%s<->%s<->%s\n" str1 str2 str3) ) ); 将输出: C17<->855、00<->-2790、00 C676<->3499、50<->-2676、40 Q690<->
21、3406、00<->-2701、00 C785<->1929、00<->-3750、00 U628<->3865、00<->-2025、00 C737<->3010、00<->-3155、00 R754<->2770、00<->-2730、00 § 更多示例,参考Skill正则表达式应用举例 Skill正则表达式应用举例 处理Dangling Line Report allegro得report命令在report dangling line得时候也会同时report dangling via 出来。 如果您record过script,就会发现产生dangling line r
22、eport得allegro命令就是reports "Dangling Lines Report"。ﻫ这个命令会在当前allegro工作得文件夹下产生一个叫dangling_lines、rpt得文件。
;------------------------------------------------
<
23、4、00) to *(6575、00 -2045、00) 1V5 INT3 *(7860、00 -1930、00) to *(6675、00 -2660、00) 12V INT5 *(7830、00 -1930、00) to *(6705、00 -2660、00) << Dangling Vias >> GND VIA24C12P (5505、00 -320、00) 1V5 VIA24C12P (5465、
24、00 -320、00) 现在我想用正则表达式来找到Via得信息,而排除line得以及一些其它得文字信息。 下面就是我想到得patten:ﻫ "^[ A-Z0-9_]+[ ]+[A-Z0-9_]+[ ]+([-0-9、]+ [-0-9、]+)$" 在skill环境下简单试一下 rexMatchp("^[ A-Z0-9_<>*]+[ ]+[A-Z0-9_]+[ ]+([-0-9、]+ [-0-9、]+)$" “ 1V5 VIA24C12P (5465、00 -320、00)” )=>t rexMatchp("^[ A-Z0-9_<>*]+[ ]+[A-Z0-
25、9_]+[ ]+([-0-9、]+ [-0-9、]+)$" “ 1V5 VIA24C12P (5465、00 -320、00)to(5465、00 -320、00)” )=>nil 所以就是满足我们得要求得! 完整得提取程序: axlShell( "reports \"Dangling Lines Report\"" ) pDanglingFile= infile( "、/dangling_lines、rpt" ) dl_list = nil unless( getc( pDanglingFile ) axlMsgPut(
26、 "----- Errors found in Dangling Line Report -----" ) while( gets( dl_entry pDanglingFile ) when( rexMatchp("^[ A-Z0-9_<>*]+[ ]+[A-Z0-9_]+[ ]+([-0-9、]+ [-0-9、]+)、$" dl_entry ) ;;因为gets读进来得dl_entry还带了个"\n",所以必须在之前定义得patten后面再加上一个“、"来匹配它 dl_entry = buildString( parseString(
27、dl_entry) " ") ;;因为report结果里面得via net, padstack以及坐标间隔很大,这个让间隔变小一点 dl_list = cons( dl_entry dl_list ) ) ) close(pDanglingFile) dl_list = sort(dl_list nil) ;根据字符串大小得默认排序 ) 这样就得到了dangling via得列表了。接下来得操作就随个人了,比如把它显示到一个form里面。 另一个例子 "From: C803、1 (3313、000 25
28、53、921) To: U1802、C3 (7321、024 -1296、024)" rexpile("\\(([-0-9、]+ [-0-9、]+)\\)[^(]+\\(([-0-9、]+ [-0-9、]+)\\)") 这样就可以得到带括号得坐标 rexpile("(\\([-0-9、]+ [-0-9、]+\\))[^(]+(\\([-0-9、]+ [-0-9、]+\\))") 得到不带括号得坐标 特殊字符,注释,空格,圆括号与其它标记法得使用 § 特殊字符 SKill中得特殊字符列表 字符 全名 含义 \ 反斜杠 辅助输出特殊字符 ()
29、 圆括号 组织数据列表与调用函数列表 [] 中括号 数组索引,超级右中括号 {} 大括号 使用progn时组织一系列表达式 ' 单引号 单引号中得表达式不会被解析 " 双引号 字符串分界符 , 逗号 列表中可选得元素分界符; 在反引号作用范围内使用强制表达式解析 ; 分号 行注释 : 冒号 位分隔符,范围操作 、 点号 getq操作 +,–,*,/ 算术运算 算术运算符; 同时"/*"与"*/"组合
30、也用于多行注释 !,^,&,| 逻辑运算 逻辑运算符 <,>,= 关系运算 比较运算,赋值以及位运算 # # 用在第一列表示信号得特别解析 @ 用在第一个字符表示保留字;另外在反引号作用范围内使用将强制表达式解析 ? 问号 如果就是第一个字符表示关键字 ` 反引号 引号内得表达式不被解析 % 百分号 $ - 保留为将来使用 [注]:输出这些特殊字符都需要在字符前加"\"。 § 注释 § 行注释方法, 使用分号";",注释范围在分号当前行。 § 多行注释,
31、使用"/*"与"*/"对,注释范围在这这对符号内。 § 空格,空格得限制比较少,只就是要注意下面几个情况 § 函数名与跟在后面得圆括号之间不能有空格,如max(4 2)就是对得,而max (4 2)则就是错得; § 表示负数得符号"-"与数字之间不能有空格,如-5, -(a*b)有效,而- 5,- (a*b)无效; § 表示算术运算得"+ - * /"在2个数字之间得位置要对称,如a - b, a-b有效,而a -b无效。 § 圆括号 § 圆括号在skill中用于函数调用,分隔多个表达式,控制表达式得解析顺序 § skill中调用函数有2种方式,max(a b)与(max a
32、 b)都有效。 § 超级右中括号,不推荐使用 § 在使用了很多"("得表达式后,可以用"]"来代表很多个用于结尾得")"。 如f1( f2( f3( f4( x ) ) ) )等效于f1( f2( f3( f4( x ]。 § 反引号,逗号与逗号加@ 示例1、 y = 1 '(x y z) => (x y z) ;反引号使得表达式不被解析,所以其中得y不会被1代替 '(x ,y z) => (x 1 z) ;增加一个逗号在反引号表达式中,逗号后面得表达式将被解析 示例2、 x
33、 1 y = '(a b c) '(,x ,y z) => (1 (a b c) z);逗号后得表达式都被解析了 '(,x ,y z) => (1 a b c z) ;","得作用与逗号一样,只就是被解析对象就是列表,且解析出来得元素代替了原来得列表 § 续行符"\" § 使用"\"可以让在一行得文字多行表示, 如 string = "This is \ a test、" => "This is a test、" § 初始化列表得最大长度6000,但就是在程序运行中列表得长度无限制。 文
34、件系统接口 § 路径 § 绝对路径:Unix中以"/"开始得路径,Windows中以磁盘"C:, D:,、、、"开始得路径 § 相对路径,不就是绝对路径得情况就就是相对路径 § 以"~/"开始得路径表示被查询得路径就是用户得home文件夹; § 以"~username"开始得路径,如果username正好就是一个用户得名字,那么被查询得路径将就是该用户得home文件夹; § 以"、/"开始得路径表示被查询得位置就是当前得工作目录 § 以"、、/"开始得路径表示被查询得位置为当前工作目录得父文件夹 § Skill路径 § skill支持用户定义若干不同得路径来存放skil
35、l源文件,并通过skill得路径管理函数来设置各个路径得访问顺序。如果同一个文件在不同路径下都存在,按照先到先得原则,即使用第一个被找到得文件。 § 设置skill查询路径得函数setSkillPath, 如setSkillPath("、" "~" "C:/Skill"),就设置了3个skill查询路径,先后顺序分别为"、"-当前工作路径,"~"-home文件夹,"C:/Skill"-用户自定义文件夹。 § 获取skill查询路径列表得函数getSkillPath,如setSkillPath("、" "~" "C:/Skill"); getSkillPath()=>("、" "~" "C:
36、/Skill") § 安装路径 § 获取安装路径函数getInstallPath,如getInstallPath()=>"C:/Cadence/Psd16、2" § 检测文件状态 § 检测文件就是否存在函数is § 检测文件夹就是否存在函数isDir § 检测文件或文件夹得就是否可以被读取得函数isReadable § 检测文件或文件夹得就是否可以被写入得函数isWritable § 路径操作 § 生成与删除文件夹 § createDir(arg), 如createDir("c:/temp/skill"),将在c:/temp下创建一个skill文件夹; § del
37、eteDir(arg),如deleteDir("c:/temp/skill"),将删除这个skill文件夹,如果这就是个空文件夹,且用户具有删除它得权限。 § 删除文件函数deleteFile § 获取指定文件夹下所有文件名函数getDirFiles § 获取当前工作目录getWorkingDir § 改变工作目录changeWorkingDir 端口 所有数据得输入输出都就是经由一个被称为端口得东西实现得。 预定义得标准端口 端口名 作用 piport 标准输入端口,等同于C中得stdin poport 标准输出端口,等同于C中得stdout er
38、rport 错误输出端口,等同于C中得stderr ptport 跟踪信息端口,等同于C中得stderr § 打开端口 § 打开一个文件读取端口infile infile("~/test/input、il")=> port:"~/test/input、il" § 打开一个文件输出端口outfile p = outfile("~/test/out、il" "w") => port:"~/test/out、il" § 关闭端口close p = outfile("~/test/out、il" "w") => port:"~/test/out、il" clos
39、e(p) I/O § 输出 § 非格式化输出 print("hello") ; 输出 "hello" println("hello") ; 输出 "hello"加换行 § 格式化输出 常见格式化输出规范 格式 参数类型 输出结果 %d fixnum 十进制整数 %o fixnum 八进制整数 %x fixnum 十六进制整数 %f flonum 浮点数,格式为[-]ddd、ddd %e flonum 浮点数,格式为[-]d、ddde[-]ddd %g flonum 不改变浮点数精度得情况下,以最少得空间表示
40、 %s string, symbol 输出字符串 %c string, symbol 输出第一个字符 %n fixnum, flonum 数字 %L list 数据得默认形式输出 %P list 点Point %B list Box 示例 printf( "hello, %s" "Willy" )=> "hello, Willy" printf( "%d == %x" 20 20 )=> "20 == 14" ;把一个十进制书转换成16 sprintf( sMsg "hello, %s" "You" )=> sMsg="hello,
41、You" fprintf( port "1st line, %d words" 10 ); 输出"1st line, 10 words"到文件 printf( " \"%s\"" "c:\\text、il"); 输出 "c:\text、il",这里带了双引号 § 输入 输入函数列表 输入源 读取函数(评估版) 读取函数(未评估版) 操作函数 File文件 load/loadi lineread in String字符串 evalst
42、ring/loadstring/errsetstring linereadstring instring/gets/getc/fscanf/close 文件输入输出示例 § 创建文件并输出数据到该文件得函数 procedure( DataOut() lData = list( '("just" 10 5、5) '("for" 20 10、2) '("test" 30 15、0) '("use" 40 17、8)
43、 '("done" 50 1、2) ); 定义数据列表lData fDataOut = strcat( getTempDir() "、/" "data、txt") ; 输出文件名与路径,%temp%/data、txt。 pDataOut = outfile( fDataOut "w" ); 建立输出端口 foreach( item lData fprintf( pDataOut "%s %d %0、2f\n" ; 输出数据到文件端口 car(i
44、tem) cadr(item) caddr(item) ; item=>每一个在lData中得列表 ); end fprintf ); end foreach close( pDataOut ) ; 关闭端口 printf( "I- output data from lData list to , done!" fDataOut ); 输出提示信息 ); end procedure § 从指定文件读取数据 procedure( DataIn() prog( (fDataIn pDataIn lData sWord nNum f
45、Num) ;设置局部变量 fDataIn = strcat( getTempDir() "、/" "data、txt") ; 输入文件 unless( isFile( fDataIn ) ; 如果文件不存在则跳转到函数末尾,结束函数 printf("E- %s does not exist, double check please!" fDataIn) go(SkipToEnd) ; 在prog中支持go操作 ) pDataIn = infile( fDataIn ); 建立输入端口
46、 lData = nil 初始化列表变量 while( fscanf( pDataIn "%s %d %0、2f" sWord nNum fNum ) ; 安照数据文件格式读取 lData = cons( list( sWord nNum fNum ) lData ) ); end while ; 读取完毕lData里得数据将与上例中得一样 close( pDataIn ) SkipToEnd ); end prog ); end procedure
47、 数字 § 整数 进制列表: 前缀 示例[十进制值] 二进制 0b或0B 0b1010 [10] 八进制 0 012 [10] 十进制 10 十六进制 0x或0X 0x11 [17] § 浮点数 与其它得编程语言一样,如1、0,1、,0、5,、5,1e6…… § 比例因子 比例因子 字符 全名 比例 示例 Y Yotta
48、 1、00E+24 10Y [ 10e+25 ] Z Zetta 1、00E+21 10Z [ 10e+22 ] E Exa 1、00E+18 10E [ 10e+19 ] P Peta 1、00E+15 10P [ 10e+16 ] T Tera 1、00E+12 10T [ 10e+13 ] G Gi
49、ga 1、00E+09 10G [ 10e+10 ] M Mega 1、00E+06 10M [ 10e+7 ] k or K kilo 1、00E+03 10k [ 10e+4 ] % percent 1、00E-02 5% [ 0、05 ] m milli 1、00E-03 5m [ 5、0e-3 ] u m
50、icro 1、00E-06 1、2u [ 1、2e-6] n nano 1、00E-09 1、2n [ 1、2e-9 ] p pico 1、00E-12 1、2p [ 1、2e-12 ] f femto 1、00E-15 1、2f [ 1、2e-15 ] a atto 1、00E-18 1、2a [ 1、2e-18 ]






