https://www.cnblogs.com/yeungchie/
写个大笔记,低速更新中 …
Cadence 提供二次开发的 SKILL 语言,它是一种基于通用人工智能语言— Lisp 的交互式高级编程语言 ( LISP 即 List Processing-表处理,是最早和最重要的符号处理编程语言之一,它于1958年由美国的 J. McCarthy 提出,LISP 在人工智能AI方面获得广泛应用 ) 。
SKILL 语言支持一套类似 C 语言的语法,大大降低了初学者学习的难度,同时高水平的编程者可以选择使用类似 Lisp 语言的全部功能。所以 SKILL 语言既可以用作最简单的工具语言,也可以作为开发任何应用的、强大的编程语言。
SKILL 可以与底层系统交互,也提供了访问 Cadence 各个工具的丰富接口。用户可以通过 Skill 语言来访问,并且可以开发自己的基于 Cadence 平台的工具。
本教程编写环境是 Virtuoso IC618 平台的应用,可能存在某些特性不适用于旧版本。
用于模糊查找 Skill 函数,及查看简单介绍。
which cdsFinder
用于查看更加详细的内容,以软件的使用手册。
which cdnshelp
由于 Skill 语言是基于 Lisp ,因此它支持 函数表示法
和 前缀表示法
来书写代码。
函数表示法
func( arg1 arg2 ... )
前缀表示法
( func arg1 arg2 ... )
以上的两种表示法可以同时存在,因此在编写代码时候最好注意格式的统一。
推荐统一使用 函数表示法
,并需要注意函数名和括号之间不能有空格。
错误写法 :
func ( arg1 arg2 )
func
后面多了一个空格,这会将arg1
作为函数名
其次函数和变量的命名风格,Skill 中一般是使用 驼峰命名法 ( Camel-Case ),函数名中的每一个逻辑断点首字母大写,开头第一个单词全部小写,一般代表 函数/变量 的类别、作者,像我写的函数和全局变量一般都习惯用 yc
开头。
这也是现在更为流行的一种命名方式,相对于传统的 下划线命名法,不会使较长的命名显得更长,且更加能提高可读性,当代码量上来的时候,满屏的下划线看起来会非常蛋疼。
下面是一个对比
驼峰命名法
geGetEditCellView()
dbOpenCellViewByType(libName cellName viewName nil mode)
下划线命名法 ( 不推荐 )
ge_get_edit_cell_view()
db_open_cell_view_by_type(lib_name cell_name view_name nil mode)
然后再注意命名不能过于简化,例如 a
,b
,c
,至少要让人能一眼看出来这个变量是干啥用的 ( 一眼不行看两眼 ),例如上面的 libName
,cellName
,viewName
但下面教程里介绍语法部分使用的一些变量命名只是用于演示,命名就会比较随意了。
举例三种 print 写 hello world,后面会具体讲几种 print 函数的区别。
print( "hello world" )
println( "hello world" )
printf( "%s\n" "hello world" )
; 这是单行注释
/*
这是多行注释
*/
可以用函数 type
查看一个数据的类型标识。
type( 'YEUNGCHIE ) ; symbol
type( "YEUNGCHIE" ) ; string
type( list( "YEUNGCHIE" )) ; list
用 println
打印一个数据的内容,同时也能够从打印结果观察到数据类型。
println( 'YEUNGCHIE ) ; YEUNGCHIE
println( "YEUNGCHIE" ) ; "YEUNGCHIE"
println( list( "YEUNGCHIE" )) ; ( YEUNGCHIE )
官方的教程中一般会用来表明函数需要的输入数据是什么类型的( 标在前缀 )。
前缀
内部命名
数据类型
d
dbobject
id , Cadence 数据对象
x
integer
整数
f
flonum
浮点数
n
number
整数 或者 浮点数
g
general
通用的 , 任何数据类型
l
list
链表
p
port
I / O 句柄
t
string
字符串
s
symbol
" 符号 "
S
stringSymbol
" 符号 " 或者 字符串
u
function
函数对象 , 函数名 或者 lambda对象
字符串用双引号括起来。
"YEUNGCHIE"
; "YEUNGCHIE"
strcat
a = "YEUNG"
b = "CHIE"
c = strcat( a b )
println( c )
; "YEUNGCHIE"
strlen
下面的 c 沿用上面的变量 c,为了教程不写得过于繁杂、重复。
println(strlen( c ))
; 9
数字分为 整数数字 和 浮点数字。
18
也可以直接编写成 二进制 ( 0b
前缀 )、八进制 ( 0
前缀 )、十六进制 ( 0x
前缀 ),但默认会输出成 十进制
0b10010 ; 18
024 ; 20
0xFE ; 254
3.14
浮点数也可以使用 科学计数法 和 单位后缀 来表示
1e-06 ; 0.000001
1u ; 0.000001
list( arg1 arg2 list( arg3 arg4 ) ... )
listA = list( 1 2 )
; ( 1 2 )
'( "value1" sym1 (1 2) ... )
这种表达方式需要注意,它不适用于变量元素,例如上面
sym1
并不会带入变量值,而是 symbol 类型'sym1
listB = '( 3 4 )
; ( 3 4 )
arg1 : arg2
仅在只有两个元素时使用,通常用来表达一个坐标点
point = 1 : 2
; ( 1 2 )
append
listC = append( listA listB )
println( listC )
; ( 1 2 3 4 )
append1
往末尾追加
listD = append1( listC 5 )
println( listD )
; ( 1 2 3 4 5 )
cons
往开头追加
listE = cons( 0 listD )
println( listE )
; ( 0 1 2 3 4 5 )
reverse
listF = reverse( listE )
println( listF )
; ( 5 4 3 2 1 0 )
length
length( listF )
; 6
car 提取第一个元素
car( listF )
; 5
cdr 提取除了第一个元素之后的 list
cdr( listF )
; ( 4 3 2 1 0 )
cadr 及其更多组合
cadr( listF )
其实就是 car(cdr( listF ))
的简写
cadr( listF ) ; 4
caddr( listF ) ; 3
nth 根据索引提取
nth( 0 listF ) ; 5
nth( 1 listF ) ; 4
nth( length(listF)-1 listF ) ; 0
数组 和 向量 不常用,了解一下长什么样就行。
定义
declare
declare( ARRAY[10] )
赋值
ARRAY[2] = 4
ARRAY[3] = 5
引用
println( ARRAY[2] * ARRAY[3] )
; 20
println( ARRAY[0] )
; unbound
println( ARRAY[11] )
; *Error* arrayref: array index out of bounds - ARRAY[11]
定义
makeVector
VECTOR = makeVector( 10 )
赋值
VECTOR[2] = 4
VECTOR[3] = 5
引用
println( VECTOR[2] * VECTOR[3] )
; 20
println( VECTOR[0] )
; unbound
println( VECTOR[11] )
; *Error* arrayref: array index out of bounds - VECTOR[11]
某些情况下可能需要用到哈希来优化代码结构和速度等等。
makeTable
HASH = makeTable( 'HASH )
HASH[1] = "ONE"
HASH["2"] = 2
HASH[cvId] = "cellName"
查看一个哈希的所有 key / value
HASH~>?
; ( "2" 1 db:0x21cfda1a )
HASH~>??
; ( "2" 2 1 "ONE" db:0x21cfda1a "cellName" )
遍历一个哈希
foreach( key HASH
printf( "key: %A , value: %A\n" key HASH[key] )
)
; key: db:0x21cfda1a , value: "cellName"
; key: 1 , value: "ONE"
; key: "2" , value: 2
手机扫一扫
移动阅读更方便
你可能感兴趣的文章