Cadence-skill语言简介

合集下载

(完整word版)cadence软件介绍

(完整word版)cadence软件介绍

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简介

cadence简介

三、电路图的输入
本章将通过画一个CMOS反相器来简单的介绍电路图设新建原理图,一是通过库管理器,另一种是通过CIW菜单新建。这里我们直接通过CIW来新建原理图。
在CIW窗口中,File->New->CellView,弹出新建对话框,如图3.1所示。
于Library Name栏选择自己的工作库,如mylib,在Cell Name栏输入原理图名字,如interver,于Tool栏选择电路编辑工具Composer-Schematic,此时View Name栏自动变为schematic。最后单击OK。这样就会弹出Composer主界面。如图3.2所示。
该窗口列出了当前已有的库。点击File->New->Library,打开New Library窗口,如图2.4所示。
在Name一栏输入要新建的库名,如mylib,然后单击OK确定。出现Technology File设置窗口,如图2.5所示。如果不做版图设计的话,就不需要tf文件。这里我们选择第一项Compile a new techfile,单击OK确定。出现Load Technology File窗口,如图2.6所示。
添加器件有三种方法,①菜单栏->Add->Instance,②键入快捷键i,③工具栏Instance,弹出的对话框如如图3.3所示。
点击Browse,弹出库浏览器,如图3.4所示。选中Show Categories可以分类显示器件,方便我们快速找到所要的器件。
依次点击analogLib->Actives->pmos4->symbol,再单击close。刚才的添加器件窗口发生变化,如图3.5所示。可以发现Library,Cell,View等都自动填上了相应的信息。同时多出了一些参数列表(拖动滚动条可以看到更多)。点击Hide隐藏当前窗口,此时鼠标对应有一个PMOS的symbol,此时按r键,可以旋转PMOS。移动PMOS到合适的位置点击鼠标左键将其放下。如果要放置更多的PMOS,继续点击鼠标左键,否则按ESC取消当前的放置器件命令。

cadence软件介绍

cadence软件介绍

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语言简介

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_skil

cadence_skil

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。

Cadenceskill语言简介

Cadenceskill语言简介

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章  Cadence系统简介

第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简介

cadence简介

EDA概述
• EDA技术特征:
(1)硬件采用工作站和PC机。 (2)具有IP模块化芯核的设计和可重复利用功能。 (3)EDA技术采用高级硬件描述语言描述硬件结构、参 数和功能,具有系统级仿真和综合能力。
EDA概述
• EDA工具一般由两部分组成:
逻辑工具 物理工具
物理工具主要实现物理布局布线。 逻辑工具基于网表、布尔逻辑、传输时序等概念。 该两部分由不同工具承担,利用标准化的网表文件进行 数据交换。
• Synopsys公司简介:
是为全球集成电路设计提供电子设计自动化(EDA) 软件工具的主导企业。为全球电子市场提供技术先进的 IC设计与验证平台,致力于复杂的芯片上系统(SoCs)的 开发。总部设在美国加利福尼亚州Mountain View,有 超过60家分公司分布在北美、欧洲、日本与亚洲。 提供前后端完整IC设计方案的领先EDA工具供应商。 是EDA历史上第一次由一家EDA公司集成了业界最好的 前端和后端设计工具。
第二章 EDA概述
• 电子设计自动化(EDA:Electronic Design Automation)就是利用计算机作为工作平台进 行电子自动化设计的一项技术。 • 涵盖内容:系统设计与仿真,电路设计与
仿真,印制电路板设计与校正,集成电 路版图设计数模混合设计,嵌入式系统 设计,软硬件系统协同设计,系统芯片 设计,可编程逻辑器件和可编程系统芯 片设计,专用集成电路设计等
EDA概述
• 软核IP(soft IP)是用可综合的硬件描述语言描述的 RTL级电路功能块,不涉及用与什么工艺相关的电路 和电路元件实现这些描述。 • 优点:设计周期短,设计投入少,不涉及物理实现, 为后续设计留有很大发挥空间,增大了IP的灵活性和 适应性。 • 缺点:会有一定比例的后续工序无法适应软核IP设计, 从而造成一定程度的软核IP修正,在性能上有较大的 不可预知性。

Cadence-使用参考手册

Cadence-使用参考手册

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工程师的青睐。

Allegroskill基本语法

Allegroskill基本语法
1.先执行一次cdr,读取后面的List单元。
2.对第1步读取的值,执行car,读取其第一元素。
3.对第2步读取的值,执行car,读取其第一元素。
实例:caaar('(((1 2 3)(4 5 6))(7 8 9))) => 1等同于car( car( car( l_list)))
caadr('(((1 2 3)(4 5 6))(7 8 9))) => 7等同于car( car( cdr( l_list)))
let( ()
println("Hello World!")
)
); end procedure
1.1.4
SKILL支持2种注释方式:
a. /*…*/用于注释多行,像C一样
b. ;用于注释单行,类似C的//
1.1.5
integer5
float5.0
string"abc defg"
list'(1 2 3 "a")
1.1 SKILL
SKILL是用于Cadence软件二次开发的语言。我们关于SKILL的介绍基于SKILL语言参考档和llegro SKILL的应用。
1.1.1
SKILL语法支持lisp格式的语法,但是我们不推荐,推荐类C的语法格式。
Lisp示例:(max 5 3) => 5
C示例:max(5 3) => 5
第一个位置保存List的首个数据元素,第二个位置保存后面的List单元(除第一个元素之外的所有元素组成的表),它可以为空数据。
用car函数可以得到保存在第一个位置的List元素:car( aList) => 2
用cdr函数可以得到保存在第二个位置的List单元:cdr( aList) => (3 4) List

学会skill语言(1)——学习前的准备

学会skill语言(1)——学习前的准备

学会skill语言(1)——学习前的准备在介绍「ocean脚本仿真」内容的时候已经对skill语言有了初步的了解,后台也有同学询问关于skill 语言的内容,接下来的一段时间小目同学就和大家一起学习关于skill语言的基础内容,希望通过学习,大家可以逐渐掌握skill语言并在工作和学习中灵活使用。

skill语言介绍skill语言是Cadence软件平台使用的一种语言,由Lisp﴾List Processing language﴿发展而来,对于有编程基础的同学来说很容易掌握。

在Cadence软件平台中无论用户在图形界面做的任何操作,在底层都是通过调用相应的skill函数或者程序实现功能的,可以认为Cadence软件平台上凡是可以通过图形界面实现的功能都可以使用相应的skill代码实现,对于图形界面不方便完成的操作也可以通过编写skill脚本完成。

使用CIW窗口CIW﴾Command Interpreter Window﴿是启动Virtuoso图形界面之后首先出现的窗口,在CIW中可以通过图形界面进行很多操作,也可以直接在CIW中输入指令操作Virtuoso,还可以通过CIW观察指令运行信息。

CIW窗口是skill语言学习过程中最有力的工具,任何skill语法都可以在CIW内得到验证。

通过设置可以让skill语言显示图形界面操作对应的skill代码,合理利用这一功能可以大大提高编写skill脚本的效率,特别对于不熟悉skill脚本的同学来讲,这一功能十分有用。

在CIW内输入相应的命令,回车之后运行结果会在输出窗口显示,包括命令运行结果以及返回值等。

在CIW内的菜单栏,通过选择:Options‐>Log Filter,打开Log文件设置窗口,通过勾选相应的选项,设置Log文件的输出内容,方便用户回顾软件运行情况,所有在CIW输出窗口显示的内容都会保存在该CIW相应的CDS.log文件内。

至于Log文件设置窗口中每个符号代表的意义可以通过符号后面的解释知晓,CDS.log文件中的每一行信息也都通过相应的符号进行注释。

Cadence skill语言简介

Cadence skill语言简介

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语言基础,入门是很容易的。

skill语言及IPC初探

skill语言及IPC初探

let( l_bindings g_expr1 ... ) => g_result
函数举例:
例1 x=5 let( ((x '(a b c)) y)
println( y ) x) => (a b c)
; Prints nil. ; Returns the value of x.
x y )
AXL-SKILL 运行方式
AXL-SKILL 初始化过程: 随着 PCB Editor 启动自动完成,当起动 PCB Editor 时, 1 首先读取 env 文件,取得配置变量信息, 2 然后 AXL ilinit file 文件,如:设置 skill 路径,载入 skill 程序等。可以创建 allegro.ilinit
prog( l_localVariables [ [ s_label ] g_expr1 ] ... )
深圳市中兴康讯电子有限公司内部资料 不得外传
收藏
Ö g_result / nil
prog 函数用来定义局部变量,并且支持跳转和返回。 函数的用法举例(函数的调用在稍后会介绍)
对象属性
对象属性分为系统属性和自定义属性
z 系统属性 如上表,每一种对象都对应有自己的一些系统属性,这些属性可以通过取得对象的 DBID 来用函数”->”直接访问
let( ((x 6) (z "return string"))
if( (equal x y)
then z
else nil)))
test( 8 6 )
; Call function test.
=> "return string"
; z is returned because 6 == 6.

Cadence Skill 语法详解(中文)

Cadence Skill 语法详解(中文)

常量、变量常量是它的值等于自身的表达式,如123,”abc”…变量是保存了其它值的表达式,如x=3, x即变量。

算术与逻辑操作符函数名语法对应操作符Data Accessarrayref a[index] [ ] setarray a[index] = exprbitfield1 x<bit> <> setqbitfield1 x<bit>=exprsetqbitfield x<msb:lsb>=exprquote 'expr 'getqq g.s .getq g->s -> putpropqq g.s=expr, g->s=expr putpropq d~>s, d~>s =expr ~>Unarypreincrement ++s ++ postincrement s++ ++ predecrement --s -- postdecrement s-- -- minus -n -not !expr !bnot ~x ~Binaryexpt n1 ** n2 ** times n1 * n2 * quotient n1 / n2 / plus n1 + n2 + difference n1 - n2 - leftshift x1 << x2 << rightshift x1 >> x2 >> lessp n1<n2 < greaterp n1>n2 > leqp n1<=n2 <= geqp n1>=n2 >= equal g1 == g2 == nequal g1 != g2 != band x1 & x2 & bnand x1 ~& x2 ~& bxor x1 ^ x2 ^ bxnor x1 ~^ x2 ~^ bor x1 | x2 | bnor x1 ~| x2 ~|and x1 && x2 &&or x1 || x2 ||range g1 : g2 :setq s = expr =对于既有函数名又有操作符函数,采用函数名调用和采用操作符调用的效果是一样的。

Cadence Skill 语法详解(中文)

Cadence Skill 语法详解(中文)

常量、变量常量是它的值等于自身的表达式,如123,”abc”…变量是保存了其它值的表达式,如x=3, x即变量。

算术与逻辑操作符函数名语法对应操作符Data Accessarrayref a[index] [ ] setarray a[index] = exprbitfield1 x<bit> <> setqbitfield1 x<bit>=exprsetqbitfield x<msb:lsb>=exprquote 'expr 'getqq g.s .getq g->s -> putpropqq g.s=expr, g->s=expr putpropq d~>s, d~>s =expr ~>Unarypreincrement ++s ++ postincrement s++ ++ predecrement --s -- postdecrement s-- -- minus -n -not !expr !bnot ~x ~Binaryexpt n1 ** n2 ** times n1 * n2 * quotient n1 / n2 / plus n1 + n2 + difference n1 - n2 - leftshift x1 << x2 << rightshift x1 >> x2 >> lessp n1<n2 < greaterp n1>n2 > leqp n1<=n2 <= geqp n1>=n2 >= equal g1 == g2 == nequal g1 != g2 != band x1 & x2 & bnand x1 ~& x2 ~& bxor x1 ^ x2 ^ bxnor x1 ~^ x2 ~^ bor x1 | x2 | bnor x1 ~| x2 ~|and x1 && x2 &&or x1 || x2 ||range g1 : g2 :setq s = expr =对于既有函数名又有操作符函数,采用函数名调用和采用操作符调用的效果是一样的。

cadence SKILL functions quick reference说明书

cadence SKILL functions quick reference说明书

6.2. A Quick Tour of SKILL® ProgrammingSKILL is the extension language for Cadence™ tools. With the extension capability, designers can readily add new capabilities with complex built-in functions to Cadence design tool suite. The power of SKILL is derived from these large libraries of subroutine calls to manipulate design data structures like nets, instances, cells, etc... Without these built-in routines, SKILL probably would not achieve its dominant role as it plays today in the EDA (Electronic Design Automation) for custom circuit area. The "Cadence SKILL Functions Quick Reference" is a very comprehensive manual with about 500 pages full built-in SKILL commands, and it is still growing (i.e. extendibility capability) every day. Luckily, most of us need to know only a handful of SKILL commands to be able to start exploring around.If you are proficient in other scripting languages and you plan for a "quick" pickup and run with SKILL language just like picking up one more programming language to deal with, you will get a little jolt unless you have prior experience with LISP programming language or one of its derivative dialects like Scheme. Even though the author was proficient other scripting languages before plunging into SKILL, it took the author a while longer to learn how to "tame" the basics of SKILL syntax, compared to absorbing other languages.Using SKILL in practical application would involve handling the Cadence database (CDB) or OpenAccess (OA) design structure. This would require an extra step of learning process, especially understanding the Cadence® Design Framework II Tech DB CellView Information Model. This section will discuss the basics of SKILL programming only and does not involve in any database. Its goal is to get the novice reader familiar with the foundations of SKILL syntax before plunging into the real applications in the regular SKILL chapters.As a scritping language, SKILL can also be used as a Shell language like the Unix Bash or C shells. As a shell language, you can run SKILL shell in batch or interactive mode. To run SKILL in interactive mode from a Unix/Linux terminal:Unix> .....installed cadence path...../tools/dfII/bin/skillYou can also launch and execute SKILL commands from Bash scripts or other shell scripts. To run SKILL shell in batch mode, the first line of the SKILL script must start with a #! directive:#!.....installed cadence path...../tools/dfII/bin/skillFirst, you need to know the base directory where the Cadence software is installed. The SKILL executable binary should be in (Cadence installed directory)/tools/dfII/bin/skill. Ask your system administrator about the Cadence installed directory. Or if you happen to be able to logon to Cadence, you can execute command "getInstallPath" at the CIW (Command Interpreter Window or Cadence Interface Window as some would call) to tell youwhere the base Cadence install full pathname is located.z ciw> getInstallPath()This chapter is to introduce to the novice readers the "pure" SKILL programming. Pure SKILL is the virgin SKILL code with no (DB) database access or other enhancement goodies that turn raw SKILL into a powerful in IC design tool environment that most IC designers are familiar with.We will go over the basic command constructs of SKILL scripting language. All examples in this chapter do not involve any database access or library setup. A good way to get a feel of the power of any programming language is to dive in and explore the data structure of that programming language. Since SKILL is originated from LISP (i.e. LIS t P rocessing or LISt Programming), we will have many problems dealing with the SKILL list data structure and its manipulation.6.2.1 SKILL: Interactive shell commands at a glanceThis session is to provide sample SKILL commands so the readers can get the feel of the SKILL programming environment. The task is to let the readers get familiar with the SKILL code syntax. If you get problem understanding the code snippets, don't worry. Keep on reading and come back later. We also attach some one-liner code snippets of other scripting languages (Perl, Ruby, Python) at the end of some examples. This is for command-to-command reference purpose if you know one the common scripting languages. If you have previously exposed to Scheme or LISP, you will see that many SKILL command constructs are similar to Scheme or LISP.Once you try and execute the commands below successfully, you can grab and save the commands into a file for later execution. You execute these below commands in CIW window or at SKILL shell window. To run SKILL on shell window, read section 6.2.7 for more information.Depending on your style, you have the choice to put parentheses "inside" or "outside" the command construct. For example, the three below commands are equivalent with various placements of parentheses.z for( i 1 3 print( x ) )z for( i 1 3 ( print x ) )z( for i 1 3 ( print x ) )If after you enter the command and see no response from the system, the system may be still waiting for you to enter more commands. Try to hit symbol "]" (i.e. super right parenthesis) to close all parentheses to see if that fixes the problem.unix> skill#invoke SKILL interactive mode>#SKILL prompt in interactive mode> 8 * 11.1#arithmetic: (8 * 11.1)88.8 #x=let((a b) a=4 b=6 a-b)> a=5 b=6#assign variable: x={a=5 b=6 a+b}> print a+b#add variable: (print a+b)11* Perl: $a=5; $b=6; print $a+$b* Ruby: a=5; b=6; print a+b* Python: a=5; b=6; print a+b* Tcl: set a 5 ; set b 6 ; puts [expr $a + $b]--1-- for loop> for( i 1 3 printf("%5.2f\n" i*1.1 ))# for( .. )> ( for i 1 3 printf("%5.2f\n" i*1.1 ))# (for .. )> ( for i 1 3 (printf "%5.2f\n" i*1.1 ))# (for .. (..) )1.102.203.30*Perl: for ($i=1; $i<=3; $i++) { printf("%5.2f\n", $i*1.1 )}*ruby: 1.upto(3) { |i| printf("%5.2f\n", i*1.1 )}*Python: for i in range(1,4): print "%5.2f\n" %(i*1.1),*Tcl:for{set i 1}{$i<=3}{incr i}{puts[format"%5.2f"[expr $i*1.1]]} --2-- foreach looping with immediate items with list(. . .)> foreach(i list("the" "cad") print(upperCase(i)) ) "THE" "CAD"*Perl: foreach $i ("the","cad") {print uc($i) }*Ruby: ["the","cad"].each { |i| print i.upcase }*Python: for i in ("the","cad"): print i.upper()*Tcl: foreach i [list the cad] {puts [string toupper $i]}--3-- foreach looping with immediate items with list `( . . .)> n=0 foreach(i `(0 1 2 3) n=n+i printf("%L %L\n" i n ) )0 01 12 33 6*Perl: foreach $i qw(0 1 2 3) {$n+=$i;printf("%s %s\n", $i,$n)}*Ruby: n=0 ; [0,1,2,3].each { |i| n+=i ;printf("%d %d\n", i,n )}*Python: n=0 ; for i in [0,1,2,3]: n+=i ;print "%d %d" %(i,n)*Tcl: set n {0}; foreach i [list 0 1 2 3] {incr n $i ;puts "$i $n"} --4-- Looping a list> x=list("THE" "CAD")> for(i 0 length(x)-1 printf("%L \n" lowerCase(nth(i x)) i ) ) "the" 0"cad" 1*Perl: for($i=0;$i<=$#x;$i++) {printf("%s\n",lc($x[$i]))}*Ruby: x.each_with_index do |y,i| printf("%s\n",x[i].downcase) end *Python: for i,y in enumerate(x): print "%s" %(x[i].lower())*Tcl:for {set i 0}{$i < [llength $x]}{incr i} {* puts [format "%s" [string tolower [lindex $x $i]]]}--5-- when> x=5 when( 9 > x print("Larger than") print(x) )"Larger than" 5* Perl: $x=5; if (9 > $x) {print "larger than $x" }* Ruby: x=5; if 9 > x then print "larger than #{x}" end* Python: x=5; if 9 > x : print "larger than %s" %(x)* Tcl: set x {5}; if { 9 > $x } { puts "larger than $x"}--6-- if then else> x=5 if( x > 9 then print("High") else print("Low") )> x=5 (if x > 9 print("High") print("Low") )"Low"* Perl: $x=5; if ($x > 9) {print "high"} else {print "low"}* Ruby: x=5; if x > 5 then print "high" else print "low" end* Python: x=5; if x>9: print "high";else: print "low"* Tcl: set x {5}; if {$x>9} {puts "high"} else {puts "low"}--7-- Set default if variable not declared> if( !boundp('x) x=5 )> when( !boundp('x) x=5 )> boundp('x) || (x=5)> unless( boundp('x) x=5 )5* Perl: $y=7 if !defined $y* Ruby: y=7 if y==nil* Python: try: y; except NameError: y=7--8-- Substring & strcatciw> strcat( substring( "conne ction" 1 5) "CTION" ) conneCTION* Perl: print substr("connection",0,5) . "CTION"* Ruby: x="connection"; print x[0:5] + "CTION"* Python: x="connection"; print x[0:5] + "CTION"* Tcl: set y [string range "connection" 0 4]CTION; puts $y--9-- foreach( mapcar ...) to return the corresponding results x=foreach( mapcar i '(1 2 3 4) i*i ) ) print x(1 4 9 16)* Perl: @x=map { $_*$_ } qw(1 2 3 4);* Ruby: x=[1,2,3,4].map do |y| y*y end* Python: x=[i*i for i in [1,2,3,4]]--10-- no mapcar; no change; return original elementsy=foreach(i '(1 2 3 4) i*i ) print y(1 2 3 4)* Perl: @x=grep { $_*$_ } qw(1 2 3 4);--11-- setof to filter out elementssetof( i '( 1 2 3 4 5 6 7 8 9) ( i > 3 && i <= 7 )(4 5 6 7)* Perl: grep { $_ > 3 && $_ <= 7 } 1..9* Ruby: print (1..9).to_a.find_all { |x| x > 3 && x <=7 }* Python: print [x for x in range(1,10,1) if x > 3 and x <= 7 ]--12-- substitute "BAD" to "good" in a list> print subst( "good" "BAD" list( "A9" "78" "BAD" "34" ))( "A9" "78" "good" "34" )*Perl: @x=qw(A9 78 BAD 34);print map { s/BAD/good/;$_ } @x;*Ruby:x=%w[A9 78 BAD 34];print x.map{|x| x.to_s.gsub("BAD","good")} *Python: print [y.replace("BAD","good") for y in x]--13-- Change din<2> to din_2> buildString( parseString("din<2>" "<>") "_")din_2*Perl: join( "_", split("[<>]","din<2>") )*Ruby: print "din<2>".split(/[<>]/).join("_")*Python: print "_".join(pile(r"[<>]+").split("din<2>"))--14-- Change in<2> to in_2_ with rexCompile/rexReplace> rexCompile("[<>]") print rexReplace("in<2> "_" 0)in_2_* Perl: s/[<>]/_/g* Ruby: print "din<2>".gsub!(/[<>]/,"_")* Python: print re.sub(r"[<>]","_","din<2>")--15-- rexMatchList to filter out elements from a list> print rexMatchList("^[A-D][0-9]$" list( "A9" "B32" "D2"))("A9" "d2")*Perl: print grep { /^[A-D][0-9]$/ } qw( A9 B32 D2) ;*Ruby: print ["A9","B32","D2"].grep(/^[A-Z][0-9]$/)*Python:[i for i in["A9","B32","D2"]if re.search(r"^[A-Z][0-9]$",i)]--16-- System call to execute Perl script to convert <..> to [..] unix> cat f1din<2>ciw> system( strcat( "perl -pe 's/</[/;s/>/]/' f1 > f2" ) )unix> cat f2din[2]* Perl -pe 's/</[/;s/>/]/' f1 > f2* Ruby -pe 'gsub!("<","[").gsub!(">","]")' f1 > f2* Python: fh=open("f2","w"); for i in open("f1"):* fh.write(i.replace("<","[").replace(">","]") )--17-- Emulate Unix: " grep hello file_in > file_out "> system( strcat(" grep hello file_in > file_out"))> fhr = infile( "/usr/quan/file_in")> fhw = outfile( "/usr/quan/file_out")> when( fhrwhile( gets( line fhr)if( rexMatchp("hello" line) fprintf( fhw "%s" line )) ) )> close(fhr) close(fhw)*Perl -ne 'print if /hello/' file_in > file_out*Ruby -ne 'print if /hello/' file_in > file_out*Python: fh=open("f2","w") ; for i in open("f1"):* if "hello" in i: fh.write(i.replace("<","[").replace(">","]") ) --18-- Expand bus "din<3:5>" to ( "din[3]" "din[4]" "din[5]")> str="din<3:5>"> f=parseString( str "<:>")> start=evalstring(nth(1 f)))> end =evalstring(nth(2 f)))> for(i 0 abs(start-end)sprintf(newPin "%s[%d]" nth(0 f) start+i )printf("%L \n" newPin))"din[3]""din[4]""din[5]"*Perl: $str="din<3:5>"; @f=split("[<:>]",$str);* for ($i=$f[1];$i<=$f[2];$i++) {printf("%s[%d]\n", $f[0],$i)}*Ruby: str="din<3:5>";f=str.split(/[<:>]/)* f[1].upto(f[2]) { |i| print f[0]+"[#{i}]\n" }*Python: f=pile(r"[<:>]+").split("din<3:5>")* for i in range(int(f[1]),int(f[2])+1): print "%s[%d]" %(f[0],i) --19-- Sort keys in association list (sort options: 'lessp nil)>print sortcar(list( '("A9" 45) '("C43" 56) '("B5" 23)) 'alphalessp) (("A9" 45) ("B5" 23) ("C43" 56))* Perl: %h=(A9=>45, C43=>56, B5=>23);* map { print "\($_=>$h{$_}\) " } sort{$a<=>$b} keys %h;--20-- Sort value in association list> procedure( sortcadr( a b) cadr(a) < cadr(b) )> print sort( list( '("A9" 45) '("C43" 56) '("B5" 23) ) 'sortcadr ) (("B5" 23) ("A9" 45) ("C43" 56))* Perl: %h=(A9=>45, C43=>56, B5=>23);* map { print "\($_=>$h{$_}\) " } sort{$h{$a}<=>$h{$b}} keys %h;--21-- cond> x=-5cond( ( (x<=0) x=abs(x) )( t x=x+2 ))5* Perl: switch: {$x<0 && do {$x=abs($x);last switch};do {$x+=2}}* Ruby: x=-5; case x ; when -10..2,1,0: x=x.abs; else x=x-2;end* Python: no case statement. use "if-then-else" or "try".> x=5 cond( ((x<=0) x=abs(x)) (t x=x+2) )7* Perl: switch: {if ($x < 0) {$x=abs($x);last}; $x+=2 }--22-- rplaca to replace the first element; replace "a" with "xx" rplaca( '( a b c d) "xx") => '( "xx" b c d)* Perl: @a=qw(a b c d); splice(@a,0,1,"xx");--23-- rplacd to replace the rest of the list, except first element rplacd( '( a b c d) list("xx") ) => '( a "xx")* Perl: @a=qw(a b c d); splice(@a,1,$#a,"xx");--24-- Get Cadence install directory name> getInstallpath()("/project/vendors/tools/cadence/IC5141ISR0106/tools.sun4v/dfII") --25-- setInstallPath> setInstallPath(append( list("/usr/quan") getInstallPath() )--26-- Get executable SKILL path> getSkillPath()("." "~" "/local/skill/codes")--27-- setSkillPath to set executable PATH for SKILL programs> setSkillPath( cons( "/usr/quan" getSkillPath() )--28-- Get Cadence install directory name with getShellEnvVar> getShellEnvVar("CDS_INST_DIR")("/project/vendors/tools/cadence/IC5141ISR0106")--29-- Get full-path filename of where icfb is invoked> simplifyFilename(getWorkingDir())"/usr/quan"--30-- alias> alias(lf listFunctions)> alias(h help)> lf("ToString")# list all cmds with ToString intToString timeToString--31-- help> help("stringToSymbol")stringToSymbol(t_string)=> s_symbolNameConverts a string to a symbol of the same name.--32-- procedure> procedure( add( x y )x+y)> add( 5 6)11--33-- define> ( define mult( x y )( x*y ))> ( mult 5 6 )30--34-- loadunix> cat mySKill.ilprint "Hello, the World"alias(lf listFunctions)ciw> load("mySkill.il")"Hello, the World"--35-- List Addressing> car( '(a b c d e )) ; return 1st item => a> cdr( '(a b c d e )) ; return rest of list => '(b c d e) > car(cdr('(a b c d e)) ; return 2nd item => b> nth( 2 '(a b c d e)) ; return 2nd item => b> cons( 9 '(b c d )) ; insert into a list => '(9 b c d)> cons( 'a '(b c d )) ; insert into a list => '(a b c d)> cons( '(b c d) '(a) ) ; insert into a list => '((b c d) a) > append( list(a b) '(c d) ) ; merge lists => '( a b c d) > listA= cons( car(listA) cdr(listA)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

相关文档
最新文档