Skill语言及IPC初探.docx
- 文档编号:4009151
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:11
- 大小:155.63KB
Skill语言及IPC初探.docx
《Skill语言及IPC初探.docx》由会员分享,可在线阅读,更多相关《Skill语言及IPC初探.docx(11页珍藏版)》请在冰豆网上搜索。
Skill语言及IPC初探
Skill语言及IPC初探
引言
Skill是一种解释性的脚本语言,运行于cadence设计环境,是cadence设计工具的API,skill程序可以对cadence设计工具进行功能的扩充,实现功能的定制,提高设计效率和水平。
基于公司目前的pcb设计工具多为cadence产品,因此提高对skill的运用,可以充分发挥cadence设计工具的功能,其作用不言而喻。
笔者经过了一定时间的熟悉,总结了一下,抛砖引玉,希望能和大家共同学习和讨论,促进和提高skill的应用水平。
Skill语法概要
Skill是”嵌入式”的高级开发语言,运行于cadence的设计工具上,且是一种交互式的设计语言。
作为一种程序语言,它具备了高级语言的常用特征。
Cadence公司认为是类C语言风格,在笔者看来,更加类似vbscript、javascript甚至pl/sql。
在处理内存管理上不用过多的留意,因为skill的内置解释器已经做了处理。
需要做的只是利用提供的系统函数实现自己的业务需求。
变量
像一些松散的高级程序语言一样,变量不需要定义,为隐含定义,第一次出现就可以赋值。
变量命名第一个字符不允许是数字。
如:
vTmp=3,表示vTmp已经定义了为一数字类型值等于3。
像所有程序语言一样,skill变量也要分为全局变量和局部变量。
●全局变量
全局变量一般用在程序中作为一个存储变量、标志等变量共享,或者为了传递的方便。
其生存周期和进程一样。
在skill中,如果不出现在prog()和let()函数的参数定义中出现的变量都为全局变量。
Prog和let函数是主要目的用来定义局部变量。
其中prog函数允许多点的返回。
从程序设计角度来讲,尽量避免使用全局变量,因为全局变量总是难以清楚的跟踪控制,容易导致变量被修改,使得存储值发生变化。
●局部变量
局部变量作用于函数体内,在其他语言中也可以作用于代码块中,如在c/c++中,函数体内大括号{}之间的变量,在出了”}”外,该变量随即实效,可以以这个名字重新定义变量了。
这里介绍两个函数:
prog()和let()
prog(
l_localVariables
[
[s_label]
g_expr1
]...
)
⇨g_result/nil
prog函数用来定义局部变量,并且支持跳转和返回。
函数的用法举例(函数的调用在稍后会介绍)
prog((xy) ;Declareslocalvariablesxandy.
x=5 ;Initializexto5.
y=10 ;Initializeyto10.
return(x+y)
)
说明:
1“;”表示注释,和c/c++中不同。
每一行结束一回车换行判断。
2在上述函数中,两个变量xy为局部变量,作用域为prog函数体,函数返回一个值。
3返回值用函数return,如在c/c++中用returnx+y
4对于返回值的类型不需要声明
let(
l_bindings
g_expr1...
)
=>g_result
函数举例:
例1
x=5
let(((x'(abc))y)
println(y) ;Printsnil.
x)
=>(abc) ;Returnsthevalueofx.
例2
procedure(test(xy)
let(((x6)(z"returnstring"))
if((equalxy)
thenz
elsenil)))
test(86) ;Callfunctiontest.
=>"returnstring" ;zisreturnedbecause6==6.
说明:
例1中,函数let对局部变量x赋值为列表(abc),因此在函数let内返回x值时不会受外部全局变量x的影响,返回了(abc)
例2中,传入的x值是8,在let函数中x为局部变量并且被赋值6,因此比较相同返回returnstring
变量类型
Skill中也提供对整型、浮点数字、字符等常用变量类型的支持。
也提供了专有的变量类型如dbobject、symbol等。
数据结构
●DisembodiedPropertyLists
是一个可以增删字段的记录,套用原话
AdisembodiedpropertyliststartswithaSKILLdataobject,usuallynil,followedbyalternatingname/valuepairs.ThepropertynamesmustsatisfytheSKILLsymbolsyntaxtobevisibletothearrowoperator.Thefirstelementofthedisembodiedlistdoesnothavetobenil.ItcanbeanySKILLdataobject
●结构体
同c/c++结构体,定义方式略有不同
如:
结构体sLine
defstruct(sLinex0y0x1y1widthlayers)
make_sLine(?
x01?
y02?
x13?
y14?
width0.3?
layers5)
访问成员方式:
sLine->
●数组
定义数组declare(aLine[27]),下标从0开始
控制语句
●分支
if
Thereareexactlytwovaluestoconsider,trueandfalse.
when
Therearestatementstocarryoutwhenthetestprovestrue.
unless
Therearestatementstocarryoutunlessthetestprovestrue.
cond
Thereismorethanonetestcondition,butonlythestatementsofonetestaretobecarriedout.
If语句
用法举例
如:
if(donetheni=0elsei=1)
注意:
if和”(”之间不能有空格
Case/caseq语句
用法举例
如:
case(form->curField
("done"
;printf("field/value%s\n",)
)
("cancel"
axlFormClose(form)
)
);endcase
同理:
case和”(”之间不能有空格
●循环
循环语句和其他语言分别不大,比较容易掌握
While
while(i ... i++ ) For for(i1length(myList) evaluateList(i) ) 函数调用 Skill的函数调用比较有特色,大体分为2种: 1func(arg1arg2...) 2(funcarg1arg2...) 需要留意1中,函数名和(之间不能有空格,据笔者测试发现,1也可以这样写 func(arg1,arg2,...) I/O文件管理 设置skillpath 两种写法: 1setSkillPath('(".""e: /cpu/test1")) 2setSkillPath(".e: /cpu/test1") 需要注意: 路径表示方法应用unix/linux下的反斜杠”/” 写文件 OpeninganOutputPorttoWriteaFile(outfile) p=outfile("e: /test/out.il""w")绝对路径或者p=outfile("out.il")当前目录 fprintf(p,”test”) close(p) 读文件 OpeninganInputPorttoReadaFile(infile) infile("e: /test/input.il") 文件操作的函数比较多,请参考联机帮助 Skill的操控对象 AXL-SKILL AXL-SKILL适合于PCBEditor环境中使用,是skill语言在PCBEditor中的扩展,对PCB设计来讲AXL-SKILL是最主要的语言了,它可以访问并操作PCBEditordatabase、display和userinterfaces。 在PCBEditor环境中,可以使用skill核心函数和axl-Skill扩展函数。 AXL-SKILL运行方式 AXL-SKILL初始化过程: 随着PCBEditor启动自动完成,当起动PCBEditor时, 1首先读取env文件,取得配置变量信息, 2然后AXLilinitfile文件,如: 设置skill路径,载入skill程序等。 可以创建allegro.ilinit文件,如果没有的话 3allegro.ilinit一般存放在$HOME/pcbenv目录下 如: 可以在allegro.ilinit文件中载入一个skill程序 setSkillPath("c: /skillcode") load(“test.il”) AXL-SKILL操作的对象 PCBEditor将所有的设计数据以一定个格式存放在database中,database物理文件就是DesignFiles,包括两类: Layout和Symbol 可以通过axl-skill函数操作这些数据。 每一个PCBEditordatabaseobject都对应一个dbid Dbid是一种内部数据结构,用来描述一个对象,每一种对象对应的固有属性,可以通过成员访问符来访问: -> 如: 取得一个组的成员 v_lgroup=axlSelectByName("GROUP""title_group") if(v_lgroup! =nilthen axlDeleteObject(car(v_lgroup)->groupMembers) ) Dbid有点类似于句柄的概念,但对对象的访问显得比较直接。 AXL-SKILL可以进行操作的对象,如下表 对象分类 对象名 Figureobjects Arcs,Branches,DesignFiles,Drcs,Lines,Paths,Polygons,Ppins,Shapes,Symbols,Tees,Vias,Pads,Padstacks,Symdefs Logicalobjects Components,Functions,FunctionPins,Nets Propertydictionaryobjects / Parameterobjects Design,Display,LayerGroup,Layer,TextblockGroup,Textblock 对象属性 对象属性分为系统属性和自定义属性 ●系统属性 如上表,每一种对象都对应有自己的一些系统属性,这些属性可以通过取得对象的DBID来用函数”->”直接访问 ●自定义属性 自定义属性是用户创建维护的附加于对象上的一种,可以存储一些信息。 自定义属性的访问需要通过axl-skill函数来进行,以->无法直接取得。 自定义属性的创建步骤: 1在Propertydictionaryobjects中创建一个属性名及其类型 如: 定义一个DESIGNS自定义属性”test” axlDBCreatePropDictEntry(“test”,"STRING","DESIGNS") DESIGNS为其中一种,详见联机帮助 2增加属性到所属的对象上 axlDBAddProp((listnil),list(v_namev_value)) 3访问自定义属性 访问自定义属性需要从自定义属性列表中查找,匹配到需要找的属性,然后取值 如: vList=axlDBGetProperties(car(list(nil)),list("user")) if(vList==nilthenreturn(nil)) foreach(propvList if(sprintf(nil,"%s",car(prop))==v_namethen vValue=cadr(prop) return(vValue) );endif );endforeach Skill与其他程序的交互 同步访问方式 借助于Skill进程间通信可以实现skill程序和子进程的交互访问,根据cadence技术文档看,进程间通讯可以借助于管道技术,但笔者尝试了几次,都没有成功,因此本文就只从标准输入输出来实现进程间的通讯。 标准输入/输出(stdin/stdio) 缺省情况下,stdin是指键盘录入,stdio是指屏幕输出。 Skill借助于stdin/stdio来实现程序间的信息传递。 在skill程序中使用进程间通讯的函数,发送和接收从标准输入输出口过来的数据,在子程序中,可以编写程序读取或发送来自于输入/输出口的数据。 Skill进程间通信 进程间通讯函数 ipcBeginProcess(t_command) 开始一个skill的进程,通过stdin/stdio与子程序进行通讯,函数参数详见帮助 ipcReadProcess(o_childId) 从一个进程读取数据,读取来自子程序从stdio传送过来的数据 ipcWriteProcess(o_childId) 向子程序通过stdin写数据,发送的字符串以”\n”为结束符 ipcCloseProcess(o_childId) 关闭子程序的stdin口 函数调用示意图: 单向调用 调用外部程序 System(t_command) System函数是skill的内部函数,等同于c/c++中的system函数,其用法也是一样,都为同步调用,在调用对返回结果不做判断的程序时比较方便。 如: 调用一个控制台程序 System(“cmd”) 显示如下: 调用一个UI程序 system("e: /temp/FileUpdate.exe") 显示如下: 通过对skill进程间通讯函数的使用,可以将cadence工具和其他语言开发的程序进行有效的交互,从而可以充分利用其他程序语言开发一定功能的外部程序,来弥补skill语言本身的限制,提高对工具的利用率。 还有一些进程间的函数和异步访问方式等,本文没有提及到,在需要时可以根据功能选择使用。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Skill 语言 IPC 初探