Allegro skill基本语法.docx
- 文档编号:30154847
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:21
- 大小:25.62KB
Allegro skill基本语法.docx
《Allegro skill基本语法.docx》由会员分享,可在线阅读,更多相关《Allegro skill基本语法.docx(21页珍藏版)》请在冰豆网上搜索。
Allegroskill基本语法
1.1SKILL语言简介
SKILL是用于Cadence软件二次开发的语言。
我们关于SKILL的介绍基于SKILL语言参考档和AllegroSKILL的应用。
1.1.1语法格式
SKILL语法支持lisp格式的语法,但是我们不推荐,推荐类C的语法格式。
Lisp示例:
(max53)=>5
C示例:
max(53)=>5
Max是求最大值的函数,lisp格式的不便阅读。
1.1.2简单的SKILL运行环境
Allegro的SKILL运行环境:
在Allegro的命令窗口输入settelskill窗口就可以用来运行就可以打开一个新的窗口,这个SKILL命令。
窗口的大小可以手动调节。
1.1.3LoadSkill
可以直接在SKILLdevelopment里面运行SKILL,可以把写好的代码放load命令一次性装载。
在说明load之前,先说一下getSkillPath和setSkillPath这2个函数。
因为load要找到SKILL来装载,通常我们都不喜欢通过绝对路径来装载一个文件,因为那样包含的字符太多了。
文件getSkillPath()将得到当前Allegro设置的SKILL加载路径,而setSkillPath用来指定加载路径。
目前先不用考虑这个setSkillPath。
我的Allegro当前默认的SKILL路径是Allegro的工作路径和C:
\home\pcbenv\skill这样我先把hello.il文件放在C:
\home\pcbenv\skill\函数。
下面,下一步来加载这个文件,然后运行定义的函数
Hello.il的源代码:
procedure(hello()
let(()
println("HelloWorld!
")
)
);endprocedure
1.1.4注释
SKILL支持2种注释方式:
a./*…*/用于注释多行,像C一样
b.;用于注释单行,类似C的//
1.1.5基本的数据类型
integer5
float5.0
string"abcdefg"
list'(123"a")
boolent/nil
1.1.6变量
SKILL的变量定义比较随便,不需要指定其类型,赋什么类型的值就是什么类型。
示例:
变量名可以包含字母、数字、下划线以及问号,数字和问号不可以作为变量的第一个字符。
不过为了规范编程和方便阅读,对于不同类型的数据的变量都使用简写的方式来代表,比如定义一个浮点数的变量,那么推荐使用f作为前缀。
如fPrice,lCoordinate,sMessage,iAge/nAge,bCheck...
1.1.7操作符
数学运算+,-,*,/,++,**
比较运算>,<,=,>=,<=,==
逻辑运算||,&&,!
赋值=
1.1.8输出数据
示例:
%d---integer,%f---float,%s---string,%L---多种数据格式
1.2List数据类型
List是CadenceSKILL中常用的数据类型。
可以把List可以有多种类型的常量组成的列表。
理解为一个数据结构表,它可以是空的,也可以有多种类型的常量组成的列表例如:
'(12abc"PCB")
在上面这个List中包含的数据有整数、字符、字符串。
在List中也可以包含List类型的数据。
例如:
'(1(2aa)b)
1.2.1创建List数据
创建新的List数据可以用单引号'或者函数list来新建一个List数据类型的变量。
例如:
aList='(12abc)=>(12abc)
bList=list(12'a'b'd)=>(12abd)
cList='(1(2aa)b)=>(1(2aa)b)
注意:
当有字符出现的时候,用list函数创建必须在字符前加单引号。
1.2.2List在内存中的储存方式
我们可以把List看做是一个List单元,其中一个List单元占用两个内存位置。
这样便于理解。
第一个位置保存List的首个数据元素,第二个位置保存后面的List单元(除第一个元素之外的所有元素组成的表),它可以为空数据。
用car函数可以得到保存在第一个位置的List元素:
car(aList)=>2
用cdr函数可以得到保存在第二个位置的List单元:
cdr(aList)=>(34)List
中可以包含有子List,例如:
bList='(1(234)5)=>(1(234)5)
bList在内存中的储存方式如下图所示:
List中可以同时包含List和字符,例如:
bList='(1(2aa)b)=>(1(2aa)b)
bList在内存中的储存方式如下图所示:
1.2.3读取List元素
1)读取List中的第一个元素使用car函数可以读取List中的第一个元素。
例:
car('(abc))=>a
z='(123)=>(123)
y=car(z)=>1
y=>1
z=>(123)
car(nil)=>nil
2)读取List中后面的List单元使用cdr函数可以读取List中后面的List
单元。
例:
cdr('(abc))=>(bc)
z='(123)
cdr(z)=>(23)
3)对List重复混合使用car或者cdr函数读取car和cdr函数混合使用,组合的格式为:
ca|d[a|d][a|d][a|d]r,以c开头,r中间可以由多个结尾,a或d组成函数。
例如:
caadr功能等同于car(car(cdr(l_list))),caadr对函数List的操作顺序为:
1.先执行一次cdr,读取后面的List单元。
2.对第1步读取的值,执行car,读取其第一元素。
3.对第2步读取的值,执行car,读取其第一元素。
实例:
caaar('(((123)(456))(789)))=>1等同于car(car(car(l_list)))
caadr('(((123)(456))(789)))=>7等同于car(car(cdr(l_list)))
caar('(((123)(456))(789)))=>(123)等同于car(car(l_list))
cadr('(123))=>2等同于car(cdr(l_list))
4)按元素序号读取List中的元素用nthelem并输入所有读取的元素序号,即可读取该编号位置的元素。
如nthelem(1l_list)同于等car(l_list)。
实例:
nthelem(1'(abc))=>a
z='(123)
nthelem(2z)=>2
类似的函数还有nthcdr。
实例:
nthcdr(3'(abcd))=>(d)
z='(123)
nthcdr(2z)=>(3)
5)读取List中最后一个List单元用last函数可以读取List中最后一个元素单元,其数据类型也是一个List。
实例:
last('(abc))=>(c)
z='(123)
last(z)=>(3)
1.2.4修改List单元
1)rplaca函数用rplaca函数可以替换List中的第一个元素。
aList='(123)=>(123)
bList=rplaca(aList4)=>(423)
aList=>(423)
eq(aListbList)=>t
2)rplacd函数用rplacd函数可以替换List中后面的List单元。
aList='(123)=>(123)
bList=rplacd(aList'(45))=>(145)
aList=>(145)
eq(aListbList)=>t
1.2.5添加List元素和合并List
1)在List前添加元素(cons,xcons)用cons函数可以添加元素到List前。
aList='(234)
aList=cons(1aList)=>(1234)
xcons函数和cons函数的功能一样,但格式有所区别,前面的变量为List素。
,后面的变量为添加的元xcons('(bc)'a)=>(abc)
2)在List后添加元素(append1)用append1函数可以添加元素到List后。
append1('(123)4)=>(1234)
3)合并List(ncons,append)
cList='(12)
dList='(345)
eList='(67)
append(cListdList)=>(12345)
cList=>(12)
dList=>(345)
append函数只能合并两个List,并且不改变所合并List变量的值。
nconc(cListdListeList)=>(1234567)
cList=>(1234567)
dList=>(34567)
eList=>(67)
nconc函数可以合并多个List,但会改变所合并List变量的值。
1.2.6List元素排序
1)倒序排列(reverse)
aList='(123)
aList=reverse(aList)=>(321)
anotherList='(12(345)6)
reverse(anotherList)=>(6(345)21)
anotherList=>(12(345)6)
2)按条件排序(sort)
sort的书写格式为:
sort(l_datau_comparefn),其中第一个变量l_data为List量变量,第二个变u_comparefn为对比函数。
对比函数也可以是自定义函数。
sort('(4321)'lessp)=>(1234)
sort('(dbca)'alphalessp)=>(abcd)
sort('("U5""U10""U1""U5""U2")'axlStrcmpAlpNum)
=>("U1""U2""U5""U5""U10")
当List元素都是由List组成的时候,还可以使用sortcar函数对比子List的第一个元素排序。
sortcar('((4four)(3three)(2two))'lessp)
=>((2two)(3three)(4four)
sortcar('((d4)(b2)(c3)(a1))nil)
=>((a1)(b2)(c3)(d4))
1.2.7查找List元素
1)member函数
member函数从List到返回第一个元素查找到最后,如果找到返回找到的元素开始直到最后的元素,找不返回nil。
member(3'(23435))=>(3435)
member(6'(23435))=>nil
2)assoc函数
assoc函数的书写格式为:
assoc(g_keyl_alist),g_key变量为所查找的关键值,l_alist是为一个由多个List组成的List,格式为:
((key1value1)(key2value2)(key3alue3)...)。
assco返回查找到的子List。
aList='((1"one")(2"two")(3"three"))
assoc(2aList)=>(2"two")
assoc(5aList)=>nil
1.2.8过滤List元素
1)按条件过滤List元素(setof)setof函数的书写格式为:
setof(s_formalVarl_valueListg_predicateExpression)其中,s_formalVar变量为局部变量,作用于
g_predicateExpression表达式中;l_valueList变量为要过滤的List变量;g_predicateExpression变量为自定义表达式。
setof函数会把l_valueList历赋值给变量中的所有元素,遍s_formalVar局部变量,带入到g_predicateExpression表达式中,如果表达式返回的值为nil输出的新,在List中会将其元素过滤。
setof(x'(1234)(x>2))=>(34)
setof(x'(1234)(x<3))=>(12)
setof(x'(123456)oddp(x))=>(135)
2)exists函数
exists函数和setof函数区别在于exists函数查找List余元素组成的新中满足条件的第一个元素,并返回其元素和其List。
exists(x'(1234)(x>2))=>(34)
exists(x'(4345)(x<4))=>(345)
exists(x'(1234)(x>4))=>nil
3)forall函数
forall函数判断List中所有的元素是否全部满足表达式,全部满足返回
t,不是就返回nil。
forall(x'(1234)(x>0))=>t
forall(x'(1234)(x<4))=>nil
forall(x'(2468)evenp(x))=>t
forall(x'(2478)evenp(x))=>nil
1.2.9移除List元素
1)remove函数
remove函数可以移除List中所指定的元素,如果List中没有所指定的元素,那么返回原
List。
remove函数不会改变原List变量的值。
aList='(12345)
remove(3aList)=>(1245)
aList=>(12345)
remove('(12)'(1(12)3))=>(13)
1.2.10遍历List元素
1)foreach函数
foreach(x'(1234)println(x))
1
2
3
4
=>(1234)
foreach((xy)'(123)'(456)(printlnx+y))
5
7
9
=>(123)
2)mapc函数
mapc('list'(123)'(987))=>(123)
mapc('(lambda(xy)(print(listxy)))'(123)'(987))
(19)(28)(37)
=>(123)
3)map函数
map('list'(123)'(987))
=>(123)
map('(lambda(xy)(print(appendxy)))'(123)'(987))
(123987)(2387)(37)
=>(123)
4)mapcar函数
mapcar('plus'(123)'(987))
=>(101010)
mapcar('list'(abc)'(123)'(xyz))
=>((a1x)(b2y)(c3z))
mapcar('lambda((x)plus(x1))'(246))
=>(357)
5)maplist函数
maplist('length'(123))
=>(321)
maplist('list'(abc)'(123))
=>(((abc)(123))((bc)(23))((c)(3)))
6)mapcan函数
mapcan('list'(123)'(abc))
=>(1a2b3c)
mapcan((lambda(n)(and(pluspn)(listn)))'(1-23-45))
=>(135)
1.2.11遍历List元素实例
1)得到List中字符串的长度
假设,有一个由字符串元素组成的List变量stringList:
下面写一段代码,它的功能是输出stringList中每个字符串元素的字符长度:
如果在没有熟悉mapcar函数的情况下,可能会使用以下代码:
使用mapcar函数的代码:
其实mapcar函数就已经包含遍历List的功能,可以简化代码如下:
2)将List中的所有元素(包括子List中的元素)重新组合成新List
假设,有一个由List组成的List变量x:
下面写一个函数flatten,它的功能是将List中的所有元素重新组合成新List,如下:
下面用mapcan函数,代码如下:
但上面的代码有一个问题,它改变了x变量的值,运行flatten(x)后,x的值如下:
可以使用copy函数复制List副本来避免改变原list值,代码:
上面的代码运行结果如下:
3)将List中的所有元素(多重List)重新组合成新List
假设,有一个由List和多重List组成的List变量x:
下面写一个函数flatten,它的功能是将List中的所有元素重新组合成新List,如下:
可以重复调用自身函数来解决多重List读取的难题,代码如下:
1.3流程控制
注:
下面的一些示例包含多行语句,但是allegro的skill调试窗口不支持多行的调试,所以多于多行的情况,要么把所有的代码重新编辑为一行,或者将代码放到一个文件里面,采用第一章里面说的load的办法来调试。
1.3.1逻辑值(t,nil)
在第一节说到关系操作和逻辑操作,结合这些操作和条件选择及循环控制命令可以选择程序运行。
关系操作和逻辑操作的结果是真值或假值,前面说到skill的boolean型数据有2种,一种是t表示真值,一种是nil表示假值,其实skill中把一切非nil的结果都当作真值,而不是仅仅局限于t。
1.3.2分支控制
1.3.2.1 单分支命令(when,unless)
when(bCondition ;bCondition为逻辑表达式,nil或其它(真值)
expressions ;bCondition为真的时候执行when里面的命令
)
示例nCount=5
when(nCount>=5
println(“nCountisnolessthan5”)
)
=>“nCountisnolessthan5”
unless(bCondition
expressions ;bCondition为假(nil)的时候执行unless里面的命令
)
示例nCount=5
unless(nCount<5
println(“nCountisnolessthan5”)
)
注意到when和unless的2个示例的区别了吗?
其实when==(!
unless),也就是说when在condition为
真的时候执行内部的表达式,而unless是在condition为假的时候执行表达式。
unless算是when的一
个补充,判断nil的情况比用wehn要简洁。
1.3.2.2双分支命令(if)
if(bConditionthen
exp1 ;bCondition为真的时候执行
else
if(bConditionthenexp1;bCondition为真的时候执行else
exp2 ;bCondition为假的时候执行
)
示例nAge=17
if(nAge<18then
print(“E-not18yearsold,cannotwatchthismovie!
\n”)
else
print(“I-enjoythemovie!
\n”)
)
=>“E-not18yearsold,cannotwatchthismovie!
”
如果用when来写的话,就要写2个when语句。
when(nAge<18
print(“E-not18yearsold,cannotwatchthismovie!
\n”)
)
when(nAge>=18
print(“I-enjoythemovie!
\n”)
1.3.2.3多分支命令(cond,case)
sSymbol=“test”
cond((!
sSymbolprintln(“itisnil”))
(numberp(sSymbol)println(“itisanumber”))
(stringp(sSymbol)println(“itisanumber”))
(tprintln(“Idonotcarethetype”)
);endcond
=>itisastring。
cond命令里面有多个程序块,程序会逐个判断里面各个块里面的程序,然后退出块的条件,直到找到一个逻辑为真的块,执行cond。
cond就像是ifthenelse的多次叠加。
case(type(sSymbol)
(“fixnum”
printl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Allegro skill基本语法 skill 基本 语法