资源描述
常量、变量
常量就是它得值等于自身得表达式,如123,”abc”…ﻫ变量就是保存了其它值得表达式,如x=3, x即变量。
算术与逻辑操作符
函数名 语法 对应操作符
Data Access
arrayref a[index] [ ]
setarray a[index] = expr
bitfield1 x<bit> <>
setqbitfield1 x<bit>=expr
setqbitfield x<msb:lsb>=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++ ++
predecrement --s --
postdecrement s-- --
minus -n -
not !expr !
bnot ~x ~
Binary
expt n1 ** n2 **
times n1 * n2 *
quotient n1 / n2 /
plus n1 + n2 +
difference n1 - n2 -
leftshift x1 << x2 <<
rightshift x1 >> x2 >>
lessp n1<n2 <
greaterp n1>n2 >
leqp n1<=n2 <=
geqp n1>=n2 >=
equal g1 == g2 ==
nequal g1 != g2 !=
band x1 & x2 &
bnand x1 ~& x2 ~&
bxor x1 ^ x2 ^
bxnor x1 ~^ x2 ~^
bor x1 | x2 |
bnor x1 ~| x2 ~|
and x1 && x2 &&
or x1 || x2 ||
range g1 : g2 :
setq s = expr =
对于既有函数名又有操作符函数,采用函数名调用与采用操作符调用得效果就是一样得。ﻫ示例 lessp(3 1)=>nil 等同于 3<1=>nil
预定义算术函数
语法 结果
通用函数
add1(n) n + 1
sub1(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得随机数
srandom(x) 初始化随机数生成函数得x
位操作
含义 操作符
位与 &
位或 |
位异或 ^
左移位 >>
右移位 <<
取反 ~
真值、假值
§ 真值,除了nil以为得值都就是真值。
§ 假值,nil
条件控制函数
if, when, unless, cond
§ if
if函数得语法结构
if( condition1 then ;当condition1为真值时执行代码块expA
expA
else
if( condition2 then ;当condition2为真值时执行代码块expB
expB
else
…
expC
)
);end if
§ when
when函数语法结构
when( condition ;当condition为真值时执行代码块expA,否则跳过
expA
); end when
§ unless
unless语法结构
unless( condition ;当condition为假值时执行代码块expA,否则跳过
expA
); end unless
§ cond
cond语法结构
cond (
( condition1 expA、、、 ) ;当condition1为真值时执行代码块expA
( condition2 expB 、、、 ) ;…
( condition3 expC 、、、 ) ;…
( t expN ) ;之前得条件都不满足时默认执行expN
); end cond
[注]:";" 表示注释
循环控制函数
while,for,foreach
§ while
while语法结构
while( condition is true ;当condition为真值时反复执行代码块expA,否则结束循环
expA
)
§ for
for语法结构
for( i 1 5
println(i)
)
将输出
1
2
3
4
5
§ foreach
foreach就是简化版得for,上面得例子用foreach写如下
alist = ‘(1 2 3 4 5)
foreach( item alist
println( item )
)
foreach通常用于操作列表,因为它会遍历列表得每一个元素。
选择函数
§ caseq得用法类似cond,功能也类似。
caseq( var
(condition1 expA)
(condition2 expB)
…
) ;case语法结构
循环结构中得局部变量
使用关键字prog可以在循环结构中定义局部变量。关于prog得详细介绍请参考函数章节。
返回函数
表示返回值得关键字就是return。return可以强制一个prog结构立即结束,送出返回值,忽略剩余得循环操作。
示例 prog( ( )
for( i 0 10
when( oddp( i )
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("user" item) then
lRes = cons( item lRes)
println(item)
)
)
输出:
"whenuser" "usere" "ppuserd"
lRes =>("ppuserd" "usere" "whenuser")、
这里得关键命令就是rexMatchp,函数形式为rexMatchp(t_pattern S_target),这个命令将在第二个参数中查找满足第一个参数(模式)得条件,如果找到返回真值,否则返回假值。
§ 正则表达式(pattern)得组成字符
语法 含义
c 匹配任意非特殊字符
、 匹配任意字符
\ 用在特殊字符前面代表特殊字符本身,用在 <, >, (, ), and 1,、、、,9, 得含义在下面描述
[c、、、] 一对方括号中包含一些字符将匹配括号中得任意一个字符,如果第一个字符就是 ^ 则表示不匹配括号中得所有字符,[a-z]表示匹配a到z之间得任一字符,"-”表示范围。
* 用在一个以上描述得字符或pattern后表示匹配该字符或pattern0次或多次。
+ 类似*,区别在于匹配至少一次
\(、、\) 如果包含在这个符号中得字符串匹配上了,被匹配得字符可以被提取出来(最多支持9中匹配)
\n 与上一个符号对应,反斜杠后跟一个数字将可以提前到上一个符合保留得字符串
\<、、、\> 这个符号表示完全匹配一个字符串得开始与结尾
rs 2个正则表达式得组合将尽可能多得匹配r并匹配一个s
^, $ ^表示字符串得开始, $表示字符串得结尾
§ 常用正则匹配函数
rexpile,rexExecute,rexMatchp,rexSubstitute 示例: 使用 rexpile与rexExecute实现开头得示例
lStr = '("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、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得字符,+表示至少有一个这样得字符
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<->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 report得allegro命令就是reports "Dangling Lines Report"。ﻫ这个命令会在当前allegro工作得文件夹下产生一个叫dangling_lines、rpt得文件。
;------------------------------------------------
<<dangling line>>
Power TOP *(7710、00 -1865、00) to *(6705、00 -1615、00)
GND BOTTOM *(7890、00 -1774、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、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-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( "----- 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(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 2553、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中得特殊字符列表
字符 全名 含义
\ 反斜杠 辅助输出特殊字符
() 圆括号 组织数据列表与调用函数列表
[] 中括号 数组索引,超级右中括号
{} 大括号 使用progn时组织一系列表达式
' 单引号 单引号中得表达式不会被解析
" 双引号 字符串分界符
, 逗号 列表中可选得元素分界符; 在反引号作用范围内使用强制表达式解析
; 分号 行注释
: 冒号 位分隔符,范围操作
、 点号 getq操作
+,–,*,/ 算术运算 算术运算符; 同时"/*"与"*/"组合也用于多行注释
!,^,&,| 逻辑运算 逻辑运算符
<,>,= 关系运算 比较运算,赋值以及位运算
# # 用在第一列表示信号得特别解析
@ 用在第一个字符表示保留字;另外在反引号作用范围内使用将强制表达式解析
? 问号 如果就是第一个字符表示关键字
` 反引号 引号内得表达式不被解析
% 百分号
$ - 保留为将来使用
[注]:输出这些特殊字符都需要在字符前加"\"。
§ 注释
§ 行注释方法, 使用分号";",注释范围在分号当前行。
§ 多行注释,使用"/*"与"*/"对,注释范围在这这对符号内。
§ 空格,空格得限制比较少,只就是要注意下面几个情况
§ 函数名与跟在后面得圆括号之间不能有空格,如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 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 = 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,但就是在程序运行中列表得长度无限制。
文件系统接口
§ 路径
§ 绝对路径:Unix中以"/"开始得路径,Windows中以磁盘"C:, D:,、、、"开始得路径
§ 相对路径,不就是绝对路径得情况就就是相对路径
§ 以"~/"开始得路径表示被查询得路径就是用户得home文件夹;
§ 以"~username"开始得路径,如果username正好就是一个用户得名字,那么被查询得路径将就是该用户得home文件夹;
§ 以"、/"开始得路径表示被查询得位置就是当前得工作目录
§ 以"、、/"开始得路径表示被查询得位置为当前工作目录得父文件夹
§ Skill路径
§ skill支持用户定义若干不同得路径来存放skill源文件,并通过skill得路径管理函数来设置各个路径得访问顺序。如果同一个文件在不同路径下都存在,按照先到先得原则,即使用第一个被找到得文件。
§ 设置skill查询路径得函数setSkillPath, 如setSkillPath("、" "~" "C:/Skill"),就设置了3个skill查询路径,先后顺序分别为"、"-当前工作路径,"~"-home文件夹,"C:/Skill"-用户自定义文件夹。
§ 获取skill查询路径列表得函数getSkillPath,如setSkillPath("、" "~" "C:/Skill"); getSkillPath()=>("、" "~" "C:/Skill")
§ 安装路径
§ 获取安装路径函数getInstallPath,如getInstallPath()=>"C:/Cadence/Psd16、2"
§ 检测文件状态
§ 检测文件就是否存在函数is
§ 检测文件夹就是否存在函数isDir
§ 检测文件或文件夹得就是否可以被读取得函数isReadable
§ 检测文件或文件夹得就是否可以被写入得函数isWritable
§ 路径操作
§ 生成与删除文件夹
§ createDir(arg), 如createDir("c:/temp/skill"),将在c:/temp下创建一个skill文件夹;
§ deleteDir(arg),如deleteDir("c:/temp/skill"),将删除这个skill文件夹,如果这就是个空文件夹,且用户具有删除它得权限。
§ 删除文件函数deleteFile
§ 获取指定文件夹下所有文件名函数getDirFiles
§ 获取当前工作目录getWorkingDir
§ 改变工作目录changeWorkingDir
端口
所有数据得输入输出都就是经由一个被称为端口得东西实现得。
预定义得标准端口
端口名 作用
piport 标准输入端口,等同于C中得stdin
poport 标准输出端口,等同于C中得stdout
errport 错误输出端口,等同于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"
close(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 不改变浮点数精度得情况下,以最少得空间表示
%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, 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字符串 evalstring/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)
'("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(item) 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 fNum) ;设置局部变量
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 ); 建立输入端口
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
数字
§ 整数
进制列表: 前缀 示例[十进制值]
二进制 0b或0B 0b1010 [10]
八进制 0 012 [10]
十进制 10
十六进制 0x或0X 0x11 [17]
§ 浮点数
与其它得编程语言一样,如1、0,1、,0、5,、5,1e6……
§ 比例因子
比例因子
字符 全名 比例 示例
Y Yotta 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 Giga 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 micro 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 ]
展开阅读全文