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之外都需要一定的调试手段来分析到底错在哪.到目前为止我们的调试手段只有一种:根据程序执行时的出错现象假设错误原因,然后在代码 ...

  10. C语言入门(7)——自定义函数

    C源程序是由函数组成的.虽然在C语言入门系列前面几篇的程序中大都只有一个主函数main(),但实用程序往往由多个函数组成.函数是C源程序的基本模块,通过对函数模块的调用实现特定的功能.C语言中的函数相 ...

随机推荐

  1. meta头部标签意义作用!

    1.<meta name="viewport" id="viewport" content="width=device-width, initi ...

  2. NGUI 多场景情况下 管理多个界面

    简单的说就是在一个AllUI场景中,所有场景所需要的界面都挂在一个Empty GameObject下,然后这个Empty GameObject在代码中DontDestroyOnLoad,但是回到这个A ...

  3. 素数筛法--SPOJ Problem 2 Prime Generator

    质数(prime number)又称素数,除了1和它本身外,不能整除以其他自然数,换句话说就是该数除了1和它本身以外不再有其他的因数:否则称为合数.最小的质数是2. 要判断一个整数N是不是质数很简单, ...

  4. ArcGIS学习记录&mdash;dbf shp shx sbn sbx mdb adf等类型的文件的解释

    原文地址: ArcGIS问题:dbf shp shx sbn sbx mdb adf等类型的文件的解释 - Silent Dawn的日志 - 网易博客 http://gisman.blog.163.c ...

  5. 关于script,first,second,third=argv运行出错的问题

    from sys import argv input(argv) #python自带的IDLE直接执行不能提供命令行参数 script,first,second,third=argv print(&q ...

  6. Map map=new HashMap(); 为什么是这样

    Map是接口,hashMap是Map的一种实现.接口不能被实例化. Map map=new HashMap(); 就是将map实例化成一个hashMap.这样做的好处是调用者不需要知道map具体的实现 ...

  7. MYSQLI - mysqli操作数据库

    <?php //模型类 class Model { //数据库连接 private $_conn = NULL; //where语句 private $_where = NULL; //表名称 ...

  8. [WPF源代码]QQ空间相册下载工具

    放一个WPF源代码,源代码地址 http://download.csdn.net/detail/witch_soya/6195987 代码没多少技术含量,就是用WPF做的一个QQ空间相册下载工具,效果 ...

  9. break、continue以及return的区别

    break.continue以及return的区别如下: 1.break break用于完全结束一个循环,跳出循环体,不再执行下面的代码.对于多层循环嵌套,如果break语句出现在嵌套循环中的内循环时 ...

  10. Swagger2 添加HTTP head参数

    大家使用swagger往往会和JWT一起使用,而一般使用jwt会将token放在head里,这样我们在使用swagger测试的时候并不方便,因为跨域问题它默认不能自定义head参数.然后自己去网上找, ...