cadence skill
list
1.创建list:在script中尽量使用list,避免使用**’**
2.cons添加一个元素到list头部:cons(1 list)
3.append合并(lista listb)
4.car访问第一个元素;cdr访问除了第一个元素以外的其他元素;nth访问某个元素;会经常用到:ll-x:caar ;ur-x:caadr; ll-y:cadar; ur-y:cadadr
5.member检查元素(顶层元素)是否在指定的list中,返回搜索值到结尾的list
6.length计算元素个数;
7.bBox=list(-100:-100 100:100);当LF = -100:-100,UR = 100:100时,bBox=list(LF UR) //**即bBox=list((-100 -100) (100 100))
1.print(),可以输出到port file;
2.println(),在显示的数据后多加个换行,可以输出到port file;
3.printf(),格式化输出结果. 但不能输出到port file; // %[-][width][.precision]conversion_code.对于precision,d:整数;f:浮点数;s:字符串;
4.fscanf(file*stream *format [argument]):根据指定的数据格式,从输入流中读取数据,将其存储在argument文件中;
5.gets(nextline inPort)函数:从input port中读取行,以回车结束读取;//skill的gets()和c语言中的gets()用法不一样
if(),when(),unless()
1.if(…then…else…):if后不能有空格;必须要有then,否则会error;
2.when:当只有then的表达式时,就选when
3.
case(),for(),foreach()
1:case(shapeType)函数提供分支选项,一般情况下不单独使用;
2.foreach(variable list)循环
function skills
1.group statements:用{}的形式,将多个statements汇集到一个statement中.这样的方式和按部就班地写是一样的.以下两段代码的输出结果是一样的.
Boxlist=list(list(100:100 200:300) list(100:110 200:370))
foreach(bBox Boxlist
bBoxHeight={
lly=cadar(bBox)
ury=cadadr(bBox)
ury-lly
}
println(bBoxheight)
);foreach
Boxlist=list(list(100:100 200:300) list(100:110 200:370))
foreach(bBox Boxlist
lly=cadar(bBox)
ury=cadadr(bBox)
BboxHeight=ury-lly
println(BboxHeight)
);foreach
2.用procedure定义函数
prodedure( function (variable)
);procedure
Boxlist=list(list(100:100 200:300) list(100:110 200:370))
procedure(bBoxHeight(bBox)
lly=cadar(bBox)
ury=cadadr(bBox)
ury-lly
);procedure
foreach(bBox Boxlist
println(bBoxHeight(bBox))
);foreach
syntax
1.操作符(operator)
2.comments: /* and */进行段落注释;在每一行分号后进行注释,一行写不完,用""代表下一行和这一行是一句话.
3.转义字符串:
\n 换行
\t 横向一个制表位置
\v 纵向一个制表位置
\b 退格
\r 回车
\f 换页Filter函数
主要应用的函数
setof( s_formalVar l_valueList g_predicateExpression)
其中, s_formalVar 变量为局部变量,作用于 g_predicateExpression 表达式中;l_valueList 变量为要过滤的List;g_predicateExpression变量为自定义的过滤表达式。setof函数会把l_valueList中的所有元素赋值给s_formalVar局部变量,并将此变量带入到g_predicateExpression表达式中,如果表达式返回的值为nil,在List中会将此素过滤。
setof( x '(1 2 3 4) (x > 2) ) => (3 4)
setof( x '(1 2 3 4) (x < 3) ) => (1 2)
setof( x '( 1 2 3 4 5 6 ) oddp(x)) => ( 1 3 5 )
2.ddGetObj()
:根据给定的lib名导入lib,读取lib信息
3.deOpenCellView()和dbOpenCellViewByType()
:分别是定义window和读取cell
4.leSetLayerSelectable(layername t)
:使要改动layer使可选状态
5.geSelectAllFig()
:如果之前已经读入了cellview,不需要在括号内部填写cellname,默认是当前的cell
6.leHiSize()
:在此之前指定sizevalue后,用这个函数可以实现layer size的改动,但是必须调用window
7.geSave()
:保存修改后的结果
8.leCloseWindow()
:关闭打开的window
9.结构体在skill中的用法:
libID~>cells;将cells这个栏位的值(并不只是cell名字,而是对象)传“回”给libID
cellname~>views~>name;将views下面的name栏位的值传“回”给cellname
cellList~>name;将cellList中的name栏位的值传“回”给cellList
10.leSearchHierarchy()
:用来搜寻指定cell中特定条件的layer,结果是很多的对象(cell中该layer的对象)
layerL=leSearchHierarchy(cellview list(-1000:-1000 1000:1000) 32 "rectangle" list(list("layer" "==" list("CT" "drawing"))));这里的坐标指的是设定一个范围,在这个范围内搜寻;
以下是一段修改layer size大小的代码:
procedure(SizeLayerInLib(libname layername sizevalue)
libID=ddGetObj(libname);导入lib,读取lib信息
cellList=nil;预定义一个空的cell list
foreach(cellname libID~>cells
if(setof(viewname cellname~>views~>name viewname=="layout")
then cellList=cons(cellname cellList)
);end if
);end foreach 通过不断循环,从lib的所有cell中筛选出有layout的cell
foreach(cellname cellList~>name
SizeLayerInCell(libname cellname layername sizevalue);调用对cell做操作的函数
);end foreach
);end procedure
procedure(SizeLayerInCell(libname cellname layername sizevalue)
WINDOW_ID=deOpenCellView(libname cellname "layout" "maskLayout" list(0:0 1000:1000) "a");打开1000*1000大小的window
CELL_VIEW=dbOpenCellViewByType(libname cellname "layout" nil "a");打开一个cellview
geDeselectAllFig();所有的object都先设置成不可选
leSetAllLayerSelectable(nil);所有的layer shapes都先设置为不可选
leSetLayerSelectable(layername t);使我们要选的layer shapes是可选
geSelectAllFig();使这个cell中所有的object都是可选
leSizeShapeForm->sizeValue->value=sizevalue;指定sizevalue
leHiSize();进行size操作
geSave();保存操作结果
leCloseWindow();关掉打开的window
);end procedure