Cadence-skill语言简介
- 格式:doc
- 大小:6.12 MB
- 文档页数:18
1.Allegro PCB Design CISAllegro PCB Design CISAllegro Designer Entry CIS集成强大的原理图设计功能,其特点主要是具有快捷的元件信息管理系统(CIS),并具有通用PCB设计入口。
扩展的CIS功能可以方便地访问本地元件优选数据库和元件信息。
通过减少重新搜索元件信息或重复建库,手动输入元件信息,维护元件数据的时间,从而可以提高生产率。
无论是设计全新的模拟,数字,或混合信号电路,还是修改现有电路板的电路原理图,或进行层次结构电路图设计,Allegro Designer Entry CIS提供电路设计从构思到生产所需的一切。
Allegro Designer Entry CIS是全球应用最多且经过生产验证的原理图输入工具和强大的元件信息管理系统。
优点1、提供快捷,直观的,具备完备功能的原理图编辑工具2、通过层次式和变体(基于同一原理图,不同机型导出)设计提高复杂原理图的设计效率3、具备强大功能的CIS,帮助加速设计进程,降低项目成本4、原理图提供的自动缩放/搜索/导航功能,结合Allegro PCB Editor之间的交互探测和交互摆放,和集成的AMS—Simulatuor帮助提供设计的可生产性5、减少重复搜寻元件信息的时间,接收来自MRP,ERP和PLM的数据和支持关系型数据库使智能选择元件成为可能6、通过直接访问ActiveParts和ActiveParts门户网站,提供给选择原理图设计所需要的元件和直接获取器件供应商元件数据更大的便利,ActiveParts提供了超过200万份的元器件数据7、通过FPGA输出/输入双向数据流程自动整合可编程门阵列(FPGA)和可编程逻辑器件(PLD),从而缩短设计时间功能特色全功能原理图编辑器Allegro Designer Entry CIS,带有拼接式和层次式的原理图页面编辑器,它具有快捷、直观的原理图编辑的特点。
1.Allegro PCB Design CISAllegro PCB Design CISAllegro Designer Entry CIS集成强大的原理图设计功能,其特点主要是具有快捷的元件信息管理系统(CIS),并具有通用PCB设计入口。
扩展的CIS功能可以方便地访问本地元件优选数据库和元件信息。
通过减少重新搜索元件信息或重复建库,手动输入元件信息,维护元件数据的时间,从而可以提高生产率。
无论是设计全新的模拟,数字,或混合信号电路,还是修改现有电路板的电路原理图,或进行层次结构电路图设计,Allegro Designer Entry CIS 提供电路设计从构思到生产所需的一切.Allegro Designer Entry CIS是全球应用最多且经过生产验证的原理图输入工具和强大的元件信息管理系统。
优点1、提供快捷,直观的,具备完备功能的原理图编辑工具2、通过层次式和变体(基于同一原理图,不同机型导出)设计提高复杂原理图的设计效率3、具备强大功能的CIS,帮助加速设计进程,降低项目成本4、原理图提供的自动缩放/搜索/导航功能,结合Allegro PCB Editor之间的交互探测和交互摆放,和集成的AMS—Simulatuor帮助提供设计的可生产性5、减少重复搜寻元件信息的时间,接收来自MRP,ERP和PLM的数据和支持关系型数据库使智能选择元件成为可能6、通过直接访问ActiveParts和ActiveParts门户网站,提供给选择原理图设计所需要的元件和直接获取器件供应商元件数据更大的便利,ActiveParts提供了超过200万份的元器件数据7、通过FPGA输出/输入双向数据流程自动整合可编程门阵列(FPGA)和可编程逻辑器件(PLD),从而缩短设计时间功能特色全功能原理图编辑器Allegro Designer Entry CIS,带有拼接式和层次式的原理图页面编辑器,它具有快捷、直观的原理图编辑的特点。
Cadence skill语言简介Cadence提供二次开发的SKILL语言,它是一种基于通用人工智能语言—Lisp 的交互式高级编程语言(LISP即List Processing-表处理,是最早和最重要的符号处理编程语言之一,它于1958年由美国的J. McCarthy提出,LISP在人工智能AI方面获得广泛应用)。
SKILL语言支持一套类似C语言的语法,大大降低了初学者学习的难度,同时高水平的编程者可以选择使用类似Lisp语言的全部功能。
所以SKILL语言既可以用作最简单的工具语言,也可以作为开发任何应用的、强大的编程语言。
SKILL可以与底层系统交互,也提供了访问Cadence各个工具的丰富接口。
用户可以通过Skill语言来访问,并且可以开发自己的基于Cadence平台的工具。
1. Skill语言和Lisp语言的关系Skill函数提供两种表示法,一种是代数表示法,现在大多数语言采取这种方式,即func( arg1 arg2 ...),另一种是前缀表示法,类似于Lisp语言,即(func arg1 arg2 ...)。
这里举个例子作为对比:1.代数表示法procedure( fibonacci(n)if( (n == 1 || n == 2) then1else fibonacci(n-1) + fibonacci(n-2)))2.前缀表示法(defun fibonacci (n)(cond((or (equal n 1) (equal n 2)) 1)(t (plus (fibonacci (difference n 1))(fibonacci (difference n 2))))))这里可以看到类似Lisp语言的表示法后面有很多右括号,而且函数和参数容易混淆,所以一般推荐还是用常用的类C语言代数表示法Skill程序就像一个list表,类似Lisp语言,程序的操作就像操作数据(list)一样,可以生成,修改,求值等2. 关于Skill函数SKILL语言支持一套类似C语言的语法,初学者有了一定的C语言基础,入门是很容易的。
cadence_skilBR 6/001SKILL –Cadence Extension LanguageSKILL is powerful extension language that can be used to add new capabilities to Cadence toolsSKILL is based upon LISP, will look very strange if you are not already familiar with LISP –LISP is a interpreted language that is popular among the AI community–LISP has a built-in eval function that can be used to execute LISP code that is dynamically generated–The basic data structure in LISP is the list, with many built-in functions for manipulaing list data structures–SKILL also supports a syntax form that is more ‘Pascal’-likeThe key to SKILL’s power is a large set of library functions that allow you to manipulate data structures such as cells, nets, mask information, etc.BR 6/002To Get Help On SkillTo get help on SKILL, click on the Help menu from within the Cadence layout editor, then on “Openbook Main Menu ”. Choose the ‘SKILL and SKILL PI to open the Skill documentation.Herefirst,ThenhereA Sample SKILL FunctionThis SKILL function will create a padframe with X numberof pads per side:procedure(placePadFrame(@optional no_pads)(if(null no_pads)then(setq no_pads(enterNumber?prompts'("Please enter the number of pads on a side"))))(setq xpointh291)(setq ypointh201)(setq xpointv201)(setq ypointv291)(for i1no_pads(dbCreateInst(getEditRep)(dbOpenCellViewByType"tutorial" "PADNC""layout")nil(list xpointh ypointh)"R180") (dbCreateInst(getEditRep)(dbOpenCellViewByType"tutorial" "PADNC""layout")nil(list xpointh-90ypointh+no_pads*90)"R0") (setq xpointh xpointh+90))BR 6/003SKILL function (cont)(for i1no_pads(dbCreateInst(getEditRep)(dbOpenCellViewByType"tutorial" "PADNC""layout")nil(list xpointv ypointv-90)"R90") (dbCreateInst(getEditRep)(dbOpenCellViewByType"tutorial" "PADNC""layout")nil(list xpointv+no_pads*90ypointv)"R270") (setq ypointv ypointv+90))(dbCreateInst(getEditRep)(dbOpenCellViewByType"tutorial""PADFC" "layout")nil(list xpointv-300ypointv-90)"R0") (dbCreateInst(getEditRep)(dbOpenCellViewByType"tutorial""PADFC" "layout")nil(list xpointh-90ypointv+210)"R270") (dbCreateInst(getEditRep)(dbOpenCellViewByType"tutorial""PADFC" "layout")nil(list xpointh+210201)"R180") (dbCreateInst(getEditRep)(dbOpenCellViewByType"tutorial""PADFC" "layout")nil(list201-99)"R90"))BR 6/004BR 6/005Comments on SKILL functionContained in file called ‘pads.il’–To load function, in icfb command line type “load pads.il”–To execute function, have a layout view open and type “placePadFrame 10” if you want 10 pads per sideUses the dbCreateInst function for instance creation–Documented in DFII SKILL Functions ReferenceFunction parameters are:–d_cellview -cellview where instance is placed–d_master –master cell view of the instance to be created–t_name –instance name. If ‘nil’ is used, then generate an instance name –l_point –origin of new instance as 2-element list –orientation of new instance as a string, some possible strings are “R0”, “R90”, “R180”, “R270”BR 6/006dbCreateInstThe function getEditRep was used to return the currently open cell viewThe function dbOpenCellViewByType was used to specify the master view of the instance to be placed.–The minimum set of parameters to dbOpenCellViewByType arelibrary_name, cell_name, view_name–See docs for other optional parametersThe list function used to create a list required to pass instance origin–(list first_elem second_elem .. N_elem)returns a N-element listCreating an Rows x Cols Array of Instances procedure(placeArray(@optional cols rows cellname x_width y_height) (setq ypnt0)(for i1rows(setq xpnt0)(for j1cols(dbCreateInst(getEditRep)(dbOpenCellViewByType"tutorial" cellname"layout")nil(list xpnt ypnt)"R0") (setq xpnt xpnt+x_width))(setq ypnt ypnt+y_height)))Tested with standard cell instance via:placeArray 20 4 “INVX1” 4.8 21.6BR 6/007 placeArray20 4 “INVX1” 4.8 21.6BR 6/008。
Cadence skill语言简介Cadence提供二次开发的SKILL语言,它是一种基于通用人工智能语言—Lisp的交互式高级编程语言(LISP即List Processing-表处理,是最早和最重要的符号处理编程语言之一,它于1958年由美国的J. McCarthy提出,LISP在人工智能AI方面获得广泛应用)。
SKILL语言支持一套类似C语言的语法,大大降低了初学者学习的难度,同时高水平的编程者可以选择使用类似Lisp语言的全部功能。
所以SKILL语言既可以用作最简单的工具语言,也可以作为开发任何应用的、强大的编程语言。
SKILL可以与底层系统交互,也提供了访问Cadence各个工具的丰富接口。
用户可以通过Skill语言来访问,并且可以开发自己的基于Cadence平台的工具。
1. Skill语言和Lisp语言的关系Skill函数提供两种表示法,一种是代数表示法,现在大多数语言采取这种方式,即func( arg1 arg2 ...),另一种是前缀表示法,类似于Lisp语言,即(func arg1 arg2 ...)。
这里举个例子作为对比:1.代数表示法procedure( fibonacci(n)if( (n == 1 || n == 2) then1else fibonacci(n-1) + fibonacci(n-2)))2.前缀表示法(defun fibonacci (n)(cond((or (equal n 1) (equal n 2)) 1)(t (plus (fibonacci (difference n 1))(fibonacci (difference n 2))))))这里可以看到类似Lisp语言的表示法后面有很多右括号,而且函数和参数容易混淆,所以一般推荐还是用常用的类C语言代数表示法Skill程序就像一个list表,类似Lisp语言,程序的操作就像操作数据(list)一样,可以生成,修改,求值等2. 关于Skill函数SKILL语言支持一套类似C语言的语法,初学者有了一定的C语言基础,入门是很容易的。
第1章Cadence系统简介1.1 Cadence系统概述1.1.1博大精深的Cadence系统Cadence系统是一个大型的EDA软件,它几乎可以完成电子设计的方方面面,包括ASIC设计、FPGA设计和PCB板设计。
与另一EDA软件Synopsys相比,Cadence的综合工具略为逊色。
然而,Cadence在仿真、电路图设计、自动布局布线、版图设计及验证等方面却有着绝对的优势。
Cadence与Synopsys的结合可以说是EDA设计领域的黄金搭档。
此外,Cadence公司还开发了自己的编程语言skill,并为其编写了编译器。
由于skill语言提供编程接口甚至与C语言的接口,故而可以Cadence为平台进行扩展,用户还可以开发自己的基于Cadence 的工具。
实际上,整个Cadence软件可以理解为一个搭建在skill语言平台上的可执行文件集。
所有的Cadence工具都是用Skill语言编写的,但同时由于Cadence 的工具太多而显得有点凌乱。
这给初学者带来了更多的麻烦。
Cadence包含的工具较多,包括了EDA设计的各个方面。
本讲义旨在介绍Cadence的入门知识,所以不可能面面具到,只能根据ASIC设计流程,介绍ASIC 设计者常用的一些工具,例如仿真工具Verilog-XL,布局布线工具Preview和Silicon Ensemble,电路图设计工具Composer,电路模拟工具Analog Artist,版图设计工具Virtuoso Layout Editor,版图验证工具Diva与Dracula,最后简单介绍一下Skill语言的编程。
Cadence特点:1.全球最大的EDA公司2.提供系统级至版图级的全线解决方案3.系统庞杂,工具众多,不易入手4.除综合外,在系统设计,在前端设计输入和仿真,自动布局布线,版图设计和验证等领域居行业领先地位5.具有广泛的应用支持6.电子设计工程师必须掌握的工具之一Cadence功能:1.系统级设计:System-Level Design2.功能验证:Function Verification3.仿真:Simulation4.综合:Synthesis5.布局布线:Place-and-Route6.模拟、射频、混合信号设计:Analog,RF,and Mixed-Signal Design7.物理验证与分析:Physical Verification and Analysis8.打包:IC Packaging9.PCB设计:PCB DesignIC设计工具排行榜:1.VHDL仿真:Cadence→IKOS→Vantage→Synopsys2.行为综合:Synopsys→Alta3.逻辑综合:Synopsys→Compass→Mentor Graphics4.可测性设计:Synopsys→Sunrise→Compass5.低功耗设计:Synopsys→Epic6.布局布线:Cadence→Avant!→Mentor Graphics7.后仿真:Synopsys→Cadence→Compass→IKOS→Vantage1.1.2ASIC设计流程图1.1 ASIC典型设计流程设计流程是规范设计活动的准则,好的设计流程对于产品的成功至关重要。
Cadence 使用参考手册邓海飞微电子学研究所设计室20XX7月目录概述11.1 Cadence概述11.2 ASIC设计流程1第一章Cadence 使用基础52.1 Cadence 软件的环境设置52.2 Cadence软件的启动方法102.3库文件的管理122.4文件格式的转化132.5 怎样使用在线帮助132.6 本手册的组成14第二章Verilog-XL 的介绍153. 1 环境设置153.2 Verilog-XL的启动153.3 Verilog-XL的界面173.4 Verilog-XL的使用示例183.5 Verilog-XL的有关帮助文件19第四章电路图设计与电路模拟214.1 电路图设计工具Composer (21)4.1.1 设置214.1.2 启动224.1.3 用户界面与使用方法224.1.4 使用示例244.1.5 相关在线帮助文档244.2 电路模拟工具Analog Artist (24)4.2.1 设置244.2.2 启动254.2.3 用户界面与使用方法254.2.5 相关在线帮助文档25第五章自动布局布线275.1 Cadence中的自动布局布线流程275.2 用AutoAbgen进行自动布局布线库设计28第六章版图设计与其验证306.1 版图设计大师Virtuoso Layout Editor (30)6.1.1 设置306.1.2 启动306.1.3 用户界面与使用方法316.1.4 使用示例316.1.5 相关在线帮助文档326.2 版图验证工具Dracula (32)6.2.1 Dracula使用介绍326.2.2 相关在线帮助文档33第七章skill语言程序设计347.1 skill语言概述347.2 skill语言的基本语法347.3 Skill语言的编程环境347.4面向工具的skill语言编程35附录1 技术文件与显示文件示例60附录2 Verilog-XL实例文件721.Test_memory.v (72)2.SRAM256X8.v (73)3.ram_sy1s_8052 (79)4.TSMC库文件84附录3 Dracula 命令文件359概述作为流行的EDA工具之一,Cadence一直以来都受到了广大EDA工程师的青睐。
Cadence skill语言简介Cadence提供二次开发的SKILL语言,它是一种基于通用人工智能语言—Lisp的交互式高级编程语言(LISP即List Processing-表处理,是最早和最重要的符号处理编程语言之一,它于1958年由美国的J. McCarthy提出,LISP在人工智能AI方面获得广泛应用)。
SKILL语言支持一套类似C语言的语法,大大降低了初学者学习的难度,同时高水平的编程者可以选择使用类似Lisp语言的全部功能。
所以SKILL语言既可以用作最简单的工具语言,也可以作为开发任何应用的、强大的编程语言。
SKILL可以与底层系统交互,也提供了访问Cadence各个工具的丰富接口。
用户可以通过Skill语言来访问,并且可以开发自己的基于Cadence平台的工具。
1. Skill语言和Lisp语言的关系Skill函数提供两种表示法,一种是代数表示法,现在大多数语言采取这种方式,即func( arg1 arg2 ...),另一种是前缀表示法,类似于Lisp语言,即(func arg1 arg2 ...)。
这里举个例子作为对比:1.代数表示法procedure( fibonacci(n)if( (n == 1 || n == 2) then1else fibonacci(n-1) + fibonacci(n-2)))2.前缀表示法(defun fibonacci (n)(cond((or (equal n 1) (equal n 2)) 1)(t (plus (fibonacci (difference n 1))(fibonacci (difference n 2))))))这里可以看到类似Lisp语言的表示法后面有很多右括号,而且函数和参数容易混淆,所以一般推荐还是用常用的类C语言代数表示法Skill程序就像一个list表,类似Lisp语言,程序的操作就像操作数据(list)一样,可以生成,修改,求值等2. 关于Skill函数SKILL语言支持一套类似C语言的语法,初学者有了一定的C语言基础,入门是很容易的。
Cadence的工具可以通过CIW,Bindkey,Form,Menu等多种方式调用skill函数,送到skill语言的解释器来执行各种操作。
其中CIW(Command Interpreter Window),即启动Icfb的第一个窗口,包含一些常用的menu,一个输入行,以及一个输出区域,这里是常用的debug skill程序的地方,当然cadence 也提供了Tools->Skill Development,有兴趣的话可以深入研究一下2.1 Skill函数的查阅方法Skill语言有n多函数,加上众多工具的接口函数,可以用成千上万来形容,初学者可能会感到晕头转向,无从下手。
其实只要了解基本的变量,控制语句,输入输出以及一些常用工具的基本函数就可以了,大多数函数都可以用到再查阅。
开始学习skill时可以仔细看看SKILL Language User Guide,其他的可以用到时再查阅,这里列出几个经常会用到的文档:SKILL Language Reference -Skill语言相关的函数,Cadence User Interface SKILL Functions Reference -Cadence应用程序图形界面接口函数,Design Framework II SKILL Functions Reference,SKILL Custom Layout Reference,SKILL Schematic Composer Reference分别是Cadence的Design Framework II,版图,电路的接口函数。
当然还有其他众多工具的接口函数,因此Skill需要方便的函数查阅方法,这里列出3种:1.最简单的方法,看~/CDS.log文件或者CIW的输出区域,把Options-> LogFilter 都选上。
这里一般可以查阅在图形界面下运行的函数,如图,我们可以看到画path线的函数以及输出结果等2.在CIW里输入命令startFinder,或者在Terminal上输入cdsFinder& . Finder适用于至少知道函数名的一部分,这里可以查到函数的用法简介。
例如上图我们看到画path 的函数是leHiCreatePath(),但这是图形方式的函数,对应skill方式的函数呢用法呢,可以在Finder中输入CreatePath,这样我们就可以看到包含有CreatePath的所有函数,如图,leCreatePath即是我们想找的函数,这里可以看到简单的用法介绍3.上面我们查到的关于函数用法的介绍很简单,如何知道其详细介绍呢。
当然如果你知道函数在那个文档里,直接打开就行了,如果不知道,就需要打开help的search功能,这里可以查到详细的功能用法。
运行cdsdoc&, 点击Search打开Cadence help的搜索功能,工具会自动启动一个http服务,同时打开搜索网页,启动服务后,你也可以在windows的IE里输入http://hostname:9000/search.htm,同样可以打开搜索页面,需要注意的是,在C:\WINNT\system32\drivers\etc\hosts文件中需要加入hostname对应的ip,如:127.0.0.1 localhost10.0.10.2 host1Cadence help的搜索功能默认是用Netscape打开搜索网页,如果没有装Netscape,可能会打不开网页。
可以先打开firefox,mozila等浏览器,再启动cadence doc搜索http 服务,这样就可以打开搜索网页了3. Skill语言简介Skill语言的很多地方和C语言差不多,如变量,函数,控制结构,输入输出等,详细的介绍可以参考User Guide,这里只作简单介绍。
3.1. Skill的变量不需要事先声明,Skill第一次用到是会自动生成变量。
变量可以由字符、数字、“_”和“?”组成,注意第一个字符不能是数字和”?”。
由于Cadence所开发的Skill中的变量、函数都是第一个字母小写,以_为开头的是Cadence的专用函数,为了避免冲突,建议大家函数和变量命名都以大写字母开头。
3.2. Skill的函数的调用方式有三种,strcat( "Hello" "," " everyone" "!" ) ;常见的类C格式( strcat "Hello" "," " everyone" "!" ) ;类Lisp语言的格式strcat "Hello" "," " everyone" "!" ;上面的括号可以省略返回的结果都是=> "Hello, everyone!"推荐使用第一种方式,需要注意的是函数和第一个括号之间没有空格,否则会报错如:strcat ( "Hello" "," " everyone" "!" )=> *Error* eval: not a function - "Hello"这是调用skill函数的一个常见问题,其它的问题还有:a. 软件没响应,比如在CIW中输入段代码,软件没有反映,什么结果也没有,一般是因为( )或者”“不成对造成的,一般可以通过键入]来解决,它表示补充完不对称的括号(可以代替任意多个右括号),如果还没有响应,键入“]这时大部分情况下,系统会有响应b. 数据类型不匹配,如:strcat( "Mary had a" 5 )=>*Error* strcat: argument #2 should be either a stringor a symbol (type template = "S") – 53.3. Skill List是Skill基于Lisp(List Processing)语言的表现,它是skill数据对象的一个有序集合,skill数据甚至程序本身都可以看作是一个list,这是C语言中所没有的概念。
下面是skill list的简单例子List Explanation(1 2 3) A list containing the integer constants 1, 2, and 3(1) A list containing the single element 1( ) An empty list (same as the special atom nil)(1 (2 3) 4) A list containing another list as its second elementA). 创建list有以下几种基本的方法:➢Specify all the elements of the list literally with the single quote ( ‘) operator.➢Specify all the elements as evaluated arguments to the list function.➢Add an element to an existing list with the cons function.➢Merge two lists with the append function.1).用'和 list 定义一个list,注意两者的差别a = 1 => 1b = 2 => 2'( a b 3 ) => ( a b 3 )list( a b 3 ) => ( 1 2 3 )2).用cons命令添加一个元素到一个list的头部result = '( 2 3 ) => ( 2 3 )result = cons( 1 result ) => ( 1 2 3 )3).用append命令合并两个listLista = '( 4 5 6 ) => ( 4 5 6 )Listb = '( 1 2 3 ) => ( 1 2 3 )Listc = append( Lista Listb) => ( 4 5 6 1 2 3 )B). 访问list或者list中某些元素的方法:car访问list的第一个元素numbers = '( 1 2 3 ) => ( 1 2 3 )car( numbers ) => 1cdr访问list除了第一个元素外的其他元素,注意返回仍然是个listnumbers = '( 1 2 3 ) => ( 1 2 3 )cdr( numbers ) => ( 2 3 )nth用索引访问list的某个元素,注意索引从0开始numbers = '( 1 2 3 ) => ( 1 2 3 )nth( 1 numbers ) => 2member检查指定的元素是否在指定的list中,它只检查顶层元素的元素,返回值是从搜到值开始到结尾的listnumbers = '( 1 2 3 ) => ( 1 2 3 )member( 4 numbers ) => nilmember( 2 numbers ) => ( 2 3 )length计算list所包含元素的个数numbers = '( 1 2 3 ) => ( 1 2 3 )length( numbers ) => 3C). 关于xy坐标或者bBox边界list的访问在版图设计中,关于坐标的list是最长见的,它是一组2维的list,常见的表示方法有:用 : 表示一个坐标的list,其结果和list命令一样,用xCoord和yCoord命令可以访问xy坐标xValue = 300yValue = 400aCoordinate = xValue:yValue => ( 300 400 )xCoord( aCoordinate ) => 300yCoord( aCoordinate ) => 400用list命令和'来表示一个bBox,list命令先计算变量或者表达式,然后赋给list,' 表示的list和字面的一样,不会计算变量或者表达式的值bBox = list( 300:400 500:450 ) ;含有 : 的bBox含有变量用listlowerLeft = 300:400upperRight = 500:450bBox = list( lowerLeft upperRight )' 表示的list严格按字面意思bBox = '(( 300 400 ) ( 500 450 ))通过car和cdr的组合可以访问bBox每一个元素,而且有相关的简化函数,如下表:List的相关操作有很多,这里就不详细介绍了,可以参考User Guide里的Advanced List Operations3.4. Skill的输入输出1). 输出显示数据:print 和println 函数都可以用来显示单个数据,println可以在显示的数据后多加一个回车for( i 1 3 print( "hello" )) ;Prints hello three times. "hello""hello""hello"for( i 1 3 println( "hello" )) ;Prints hello three times."hello""hello""hello"printf函数是格式化的输出,下面的例子是一定格式输出图形层的统计printf( "\n%-15s %-15s %-10d %-10d %-10d %-10d"layerName purpose rectCount labelCount lineCount miscCount)对应参数的意义如下,printf需要注意输出类型的对应%[-][width][.precision]conversion_code[-] = left justify[width] = minimum number of character positions[.precision] = number of characters to be printedconversion_code :d - decimal(integer)f - floating points - string or symbolc - charactern - numericL - list (Ignores width and precision fields.)P - point list (Ignores width and precision fields.)B - Bounding box list (Ignores width and precision.)2). 输出数据到一个文件:outfile定义输出接口文件,print println fprintf输出到接口文件,close关闭打开的接口,见下面的例子myPort = outfile( "/tmp/myFile1" )for( i 1 3println( list( "Number:" i) myPort ))close( myPort )输出到文件/tmp/myFile1.("Number:" 1)("Number:" 2)("Number:" 3)myPort = outfile( "/tmp/myFile2" )for( i 1 3fprintf( myPort "Number: %d\n" i ) ;注意printf函数不能输出到port)close( myPort )输出到文件/tmp/myFile2.Number: 1Number: 2Number: 33). 从文件读取数据:intfile定义输入接口文件,gets一次从接口文件读取一行字符串,fscanf根据指定的格式从接口文件读取,close关闭打开的接口打开~/.cshrc,输出文件的每一行inPort = infile( "~/.cshrc" )when( inPortwhile( gets( nextLine inPort )println( nextLine ))close( inPort ))打开~/.cshrc,输出文件中的每一个字符串inPort = infile( "~/.cshrc" )when( inPortwhile( fscanf( inPort "%s" word )println( word ))close( inPort ))3.5. Skill的控制结构SKILL中只有nil 是假(FALSE),其余的任何值都是真(TRUE)。