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)

然后再注意命名不能过于简化,例如 abc,至少要让人能一眼看出来这个变量是干啥用的 ( 一眼不行看两眼 ),例如上面的 libNamecellNameviewName

但下面教程里介绍语法部分使用的一些变量命名只是用于演示,命名就会比较随意了。

基础语法

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 语言入门的更多相关文章

  1. 踢爆IT劣书出版黑幕——由清华大学出版社之《C语言入门很简单》想到的(1)

    1.前言与作者 首先声明,我是由于非常偶然的机会获得<C语言入门很简单>这本书的,绝对不是买的.买这种书实在丢不起那人. 去年这书刚出版时,在CU论坛举行试读推广,我当时随口说了几句(没说 ...

  2. 我为什么反对推荐新人编程C/C++语言入门?

    虽然我接触编程以及计算机时间比较早,但是正式打算转入程序员这个行当差不多是大学第四年的事情 从03年接触计算机,07年开始接触计算机编程, 期间接触过的技术包括 缓冲区溢出(看高手写的shellcod ...

  3. 《C语言入门1.2.3—一个老鸟的C语言学习心得》—清华大学出版社炮制的又一本劣书及伪书

    <C语言入门1.2.3—一个老鸟的C语言学习心得>—清华大学出版社炮制的又一本劣书及伪书 [薛非评] 区区15页,有80多个错误. 最严重的有: 通篇完全是C++代码,根本不是C语言代码. ...

  4. c语言入门教程 / c语言入门经典书籍

    用C语言开始编写代码初级:C语言入门必备(以下两本书任选一本即可) C语言是作为从事实际编程工作的程序员的一种工具而出现的,本阶段的学习最主要的目的就是尽快掌握如何用c语言编写程序的技能.对c语言的数 ...

  5. 【转】c语言入门教程 / c语言入门经典书籍

    用C语言开始编写代码 初级:C语言入门必备 (以下两本书任选一本即可) C语言是作为从事实际编程工作的程序员的一种工具而出现的,本阶段的学习最主要的目的就是尽快掌握如何用c语言编写程序的技能.对c语言 ...

  6. Swift语言入门之旅

    Swift语言入门之旅  学习一门新的计算机语言,传统来说都是从编写一个在屏幕上打印"Hello world"的程序開始的.那在 Swift,我们使用一句话来实现它: printl ...

  7. 《Ruby语言入门教程v1.0》学习笔记-01

    <Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...

  8. 【南阳OJ分类之语言入门】80题题目+AC代码汇总

    小技巧:本文之前由csdn自动生成了一个目录,不必下拉一个一个去找,可通过目录标题直接定位. 本文转载自本人的csdn博客,复制过来的,排版就不弄了,欢迎转载. 声明: 题目部分皆为南阳OJ题目. 代 ...

  9. C语言入门(21)——使用DBG对C语言进行调试

    C语言入门(21)--使用DBG对C语言进行调试 程序中除了一目了然的Bug之外都需要一定的调试手段来分析到底错在哪.到目前为止我们的调试手段只有一种:根据程序执行时的出错现象假设错误原因,然后在代码 ...

随机推荐

  1. 一个工业级、跨平台、轻量级的 tcp 网络服务框架:gevent

    前言 作为公司的公共产品,经常有这样的需求:就是新建一个本地服务,产品线作为客户端通过 tcp 接入本地服务,来获取想要的业务能力.与印象中动辄处理成千上万连接的 tcp 网络服务不同,这个本地服务是 ...

  2. Spring学习03(Bean的自动装配)

    6.Bean的自动装配 6.1 自动装配说明 自动装配是使用spring满足bean依赖的一种方法 spring会在应用上下文中为某个bean寻找其依赖的bean. Spring中bean的三种装配机 ...

  3. shell脚本——awk

    目录 一.awk 1.1.awk简介 1.2.基本格式 1.3.工作原理 1.4.常见的内建变量(可直接用) 按字段输出文本 1.5.awk和getline 有重定向符 无重定向符 1.6.指定分隔符 ...

  4. pikachu RCE远程系统命令执行

    远程系统命令执行 一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口比如我们常见的路由器.防火墙.入侵检测等设备的web管理界面上一般会给用户提供一个ping操作的web界 ...

  5. 06.SpringBoot核心技术

    目录 一.配置文件 二.Web开发 静态资源访问 欢迎页支持 自定义 Favicon 普通参数和基本注解 1.1 @PathVariable 1.2 @RequestHeader 1.3 @Reque ...

  6. 超过Numpy的速度有多难?试试Numba的GPU加速

    技术背景 Numpy是在Python中非常常用的一个库,不仅具有良好的接口文档和生态,还具备了最顶级的性能,这个库很大程度上的弥补了Python本身性能上的缺陷.虽然我们也可以自己使用Cython或者 ...

  7. 3 分钟了解 JSON Schema

    大家好,我不是鱼皮. 幸运又不幸,我是一名程序员,他也是一名程序员. 周末,我在开发网站,他在开发游戏,两个人一起写代码,一起写 Bug 头秃,竟也有了一丝别样的浪漫,好不自在! 今天,他遇到了一个后 ...

  8. 微信小程序中h5跳转到登录页面,登陆成功返回携带参数,h5刷新

    公司的一个小程序,要做一个活动,需要判断登录状态. 思路:h5跳转到登录页面,登陆成功携带token自动返回. 本来以为是个非常简单的功能,没想到..... 发帖记录一下 1.登录页面 用getCur ...

  9. asp.net core的输入模型验证

    数据验证特性RequiredAttribute:表示数据不能为空RegularExpressionAttribute:正则校验CompareAttribute:和某个属性比较RangeAttribut ...

  10. HTML <form> 标签的 method 属性

    定义和用法 method 属性规定如何发送表单数据(表单数据发送到 action 属性所规定的页面). 表单数据可以作为 URL 变量(method="get")或者 HTTP p ...