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. .NET Core/.NET5/.NET6 开源项目汇总12:WPF组件库2

    系列目录     [已更新最新开发文章,点击查看详细] WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET Frame ...

  2. LaTex公式语法教程及手册(附emlogpro公式显示插件katex说明)

    目录 第一列 第二列 第三列 效果 求和(使用\sum标签) 文本效果 本插件简介 积分(使用\int标签) 文本大小 LaTex是什么 空格 特殊符号 LaTex公式使用教程及手册 定界符 LaTe ...

  3. ElementUi 表单验证失败后 页面滚动到表单验证失败位置

    1.应用场景 当进行长表单验证时 用户填写到了单子的最下面 可是已经滚动过去的部分单子验证失败 为了友好的用户体验 这时候就需要滚动到验证失败位置 2.解决思路 elementUi本身并没有提供相关获 ...

  4. Mina的JMX支持

    以下是一个增加了JMX支持的Mina Echo Server. package org.apache.mina.echoServer; import java.lang.management.Mana ...

  5. 流动的观察者模式 | Flutter 设计模式

    观察者模式,又称发布订阅模式,是一种行为设计模式--你可以定义一种订阅机制,可在对象事件发生时通知多个 观察 该对象的其他对象. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主 ...

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

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

  7. IP笔记

    自动专用IP地址APIPA的范围是B类地址块169.254.0.0--169.254.255.255

  8. SpringBoot Spring Security 核心组件 认证流程 用户权限信息获取详细讲解

    前言 Spring Security 是一个安全框架, 可以简单地认为 Spring Security 是放在用户和 Spring 应用之间的一个安全屏障, 每一个 web 请求都先要经过 Sprin ...

  9. NOIP 模拟 $13\; \text{卡常题}$

    题解 一道环套树的最小点覆盖题目,所谓环套树就是有在 \(n\) 个点 \(n\) 条边的无向联通图中存在一个环 我们可以发现其去掉一条环上的边后就是一棵树 那么对于此题,我们把所有 \(x\) 方点 ...

  10. NB-IoT四大关键特性及实现告诉你,为啥NB

    摘要:NB- IoT 网络是基于4G网络演进过来的,所以它在上行和下行的复用技术上还是沿用了4G的OFDMA和SC-FDMA. 本文分享自华为云社区<一文了解NB-IoT四大关键特性以及实现技术 ...