Cadence Skill Programming

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))

print

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:300list(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:300list(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:300list(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函数

主要应用的函数

  1. 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	
多年以来,Cadence 公司的 CAD 工具 一直是世界上使用最广泛,功能最强大的IC设计工具。而为了应对IC的复杂度越来越高, 设计的困难度也越来越高的情况,Cadence的CAD整合开发环境也越来越庞大,所提供的功能也日益强大,造成使用者在维护及管理上的一大负担。再则, 每一家的设计公司的在设计的流程中多多少少都会有一些小步骤,无法用 Cadence 工具提供的基本做法来达成; 或者是不同公司的工具之间资料转换的问题。工程师遇到此类问题可能需要通过人工的方式去完成连接设计流程中相连的两个步骤; 或是干脆去开发一些小软件来完成这些特定的工作,而此时使用者可能会面临如何将自己开发的软件的I/O 与Cadence 工具的整合环境相连结的问题。一般的做法是产生一些资料档来做资料交换的中介,这些资料档的格式可能是 Cadence 支持的一标准数据格式,也可以是使用者自订的数据格式。这样子是一种间接的做法,因为使用者无法直接去存取 Cadence 环境的内部资料,所以在处理上的弹性会小很多,也较不方便。 为了方便使用者使用整个 CADENCE tools 的整合开发环境,以解决上述的困扰,CADENCE 公司遂发展了 SKILL 语言。 SKILL 是一种高级的、交互式的语言,是用于 CADENCE tool 的整合开发环境内的命令语言(command language)。 SKILL 采用人工智能语言 LISP 的语法为蓝本,再加上常用的 C 语言的部份语法设计而成。 SKILL 语言提供许多的接口函数,能让使用者可以编程直接去存取CADENCE 整合环境内的电路资料内容; 也可以让使用者去开发将自己开发的应用程式并入CADENCE tool 的整合环境里。有了 SKILL 言,使用者可以让 CADENCE tool 更充份地融入整个设计流程之中,减少琐碎 的人工转换时间,提升公司的生产力。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值