[ Skill ] Cadence Skill 语言入门
https://www.cnblogs.com/yeungchie/
写个大笔记,低速更新中 ...
Cadence Skill
Cadence 提供二次开发的 SKILL 语言,它是一种基于通用人工智能语言— Lisp 的交互式高级编程语言 ( LISP 即 List Processing-表处理,是最早和最重要的符号处理编程语言之一,它于1958年由美国的 J. McCarthy 提出,LISP 在人工智能AI方面获得广泛应用 ) 。
SKILL 语言支持一套类似 C 语言的语法,大大降低了初学者学习的难度,同时高水平的编程者可以选择使用类似 Lisp 语言的全部功能。所以 SKILL 语言既可以用作最简单的工具语言,也可以作为开发任何应用的、强大的编程语言。
SKILL 可以与底层系统交互,也提供了访问 Cadence 各个工具的丰富接口。用户可以通过 Skill 语言来访问,并且可以开发自己的基于 Cadence 平台的工具。
本教程编写环境是 Virtuoso IC618 平台的应用,可能存在某些特性不适用于旧版本。
如何查看官方资料
cdsFinder
- 用于模糊查找 Skill 函数,及查看简单介绍。
which cdsFinder
# $CDSHOME/tools/bin/cdsFinder
cdnshelp
- 用于查看更加详细的内容,以软件的使用手册。
which cdnshelp
# $CDSHOME/tools/bin/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
但下面教程里介绍语法部分使用的一些变量命名只是用于演示,命名就会比较随意了。
基础语法
hello world
举例三种 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
symbol
id
链表 LIST
定义方式
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 )
连接两个 list
append
listC = append( listA listB )
println( listC )
; ( 1 2 3 4 )
往 list 追加元素
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 )
翻转一个 list
reverse
listF = reverse( listE )
println( listF )
; ( 5 4 3 2 1 0 )
获取一个 list 元素个数
length
length( listF )
; 6
提取 list 中的元素
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
运算
赋值运算
算数运算
比较运算
逻辑运算
[ Skill ] Cadence Skill 语言入门的更多相关文章
- 踢爆IT劣书出版黑幕——由清华大学出版社之《C语言入门很简单》想到的(1)
1.前言与作者 首先声明,我是由于非常偶然的机会获得<C语言入门很简单>这本书的,绝对不是买的.买这种书实在丢不起那人. 去年这书刚出版时,在CU论坛举行试读推广,我当时随口说了几句(没说 ...
- 我为什么反对推荐新人编程C/C++语言入门?
虽然我接触编程以及计算机时间比较早,但是正式打算转入程序员这个行当差不多是大学第四年的事情 从03年接触计算机,07年开始接触计算机编程, 期间接触过的技术包括 缓冲区溢出(看高手写的shellcod ...
- 《C语言入门1.2.3—一个老鸟的C语言学习心得》—清华大学出版社炮制的又一本劣书及伪书
<C语言入门1.2.3—一个老鸟的C语言学习心得>—清华大学出版社炮制的又一本劣书及伪书 [薛非评] 区区15页,有80多个错误. 最严重的有: 通篇完全是C++代码,根本不是C语言代码. ...
- c语言入门教程 / c语言入门经典书籍
用C语言开始编写代码初级:C语言入门必备(以下两本书任选一本即可) C语言是作为从事实际编程工作的程序员的一种工具而出现的,本阶段的学习最主要的目的就是尽快掌握如何用c语言编写程序的技能.对c语言的数 ...
- 【转】c语言入门教程 / c语言入门经典书籍
用C语言开始编写代码 初级:C语言入门必备 (以下两本书任选一本即可) C语言是作为从事实际编程工作的程序员的一种工具而出现的,本阶段的学习最主要的目的就是尽快掌握如何用c语言编写程序的技能.对c语言 ...
- Swift语言入门之旅
Swift语言入门之旅 学习一门新的计算机语言,传统来说都是从编写一个在屏幕上打印"Hello world"的程序開始的.那在 Swift,我们使用一句话来实现它: printl ...
- 《Ruby语言入门教程v1.0》学习笔记-01
<Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...
- 【南阳OJ分类之语言入门】80题题目+AC代码汇总
小技巧:本文之前由csdn自动生成了一个目录,不必下拉一个一个去找,可通过目录标题直接定位. 本文转载自本人的csdn博客,复制过来的,排版就不弄了,欢迎转载. 声明: 题目部分皆为南阳OJ题目. 代 ...
- C语言入门(21)——使用DBG对C语言进行调试
C语言入门(21)--使用DBG对C语言进行调试 程序中除了一目了然的Bug之外都需要一定的调试手段来分析到底错在哪.到目前为止我们的调试手段只有一种:根据程序执行时的出错现象假设错误原因,然后在代码 ...
随机推荐
- 科普—为什么要用ECDSA加签及其数学上的验签证明
在上文介绍了ECDSA算法流程及模块划分,为了帮助一些小白弄懂啥是ECDSA,特此开一篇科普博文. 一.首先为啥要进行数字签名? 假设Alice要将一份合同m传输给Bob,合同上附有Alice的电子纸 ...
- JUC学习笔记(四)
JUC学习笔记(一)https://www.cnblogs.com/lm66/p/15118407.html JUC学习笔记(二)https://www.cnblogs.com/lm66/p/1511 ...
- insert()与substr()函数
insert()函数与substr()函数 insert()函数: insert ( pos, str2);--将字符串str2插入到原字符串下标为pos的字符前 insert (pos, n, c) ...
- Java面向对象14——接口
接口 package oop.demon01.demon09; //抽象思维~Java //interface 定义的关键字 , 接口都需要有实现类 public interface Use ...
- Linux上搭建zookeeper服务注册中心
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- MySQL-02-体系结构
MySQL体系结构 c/s模型介绍 连接MySQL # TCP/IP方式(远程.本地) mysql -uroot -pAlnk123 -h 10.0.0.51 -P3306 # Socket方式(仅本 ...
- Java调用阿里云短信接口发送手机验证码
前五步可参考阿里云服务文档:https://help.aliyun.com/document_detail/59210.html?spm=a2c4g.11174283.4.1.2b152c42DoJ7 ...
- STM32—时钟树(结合系统时钟函数理解)
时钟树的概念: 我们可以把MCU的运行比作人体的运行一样,人最重要的是什么?是心跳! 心脏的周期性收缩将血液泵向身体各处.心脏对于人体好比时钟对于MCU,微控制器(MCU)的运行要靠周期性的时钟脉冲来 ...
- 【TS】学习总结
[TS]学习总结 01-TypeScript编译环境 TypeScript全局安装 npm install typescript -g tsc --version //查看版本,安装成功 TypeSc ...
- tcp为什么要三次握手,tcp为什么可靠
转自 : https://www.cnblogs.com/LUO77/p/5771237.html大体看过,没有深入研究,有需要时继续看. 为什么不能两次握手:(防止已失效的连接请求又传送到服务器端, ...