收藏 分销(赏)

Cadence-Skill-语法详解(中文).doc

上传人:丰**** 文档编号:4096013 上传时间:2024-07-29 格式:DOC 页数:38 大小:92.50KB 下载积分:12 金币
下载 相关 举报
Cadence-Skill-语法详解(中文).doc_第1页
第1页 / 共38页
Cadence-Skill-语法详解(中文).doc_第2页
第2页 / 共38页


点击查看更多>>
资源描述
常量、变量 常量就是它得值等于自身得表达式,如123,”abc”…ﻫ变量就是保存了其它值得表达式,如x=3, x即变量。 算术与逻辑操作符 函数名    语法       对应操作符      Data Access arrayref    a[index]      [ ] setarray    a[index] = expr bitfield1     x<bit>   <> setqbitfield1 x<bit>=expr setqbitfield   x<msb:lsb>=expr quote     'expr        ' getqq  g、s      、 getq    g->s           -> putpropqq     g、s=expr, g->s=expr putpropq   d~>s, d~>s =expr  ~>           Unary preincrement  ++s     ++ postincrement s++              ++ predecrement --s       -- postdecrement   s--           -- minus       -n        - not        !expr        ! bnot        ~x        ~     Binary expt     n1 ** n2   ** times    n1 * n2    * quotient   n1 / n2     / plus   n1 + n2   + difference   n1 - n2    - leftshift    x1 << x2       << rightshift    x1 >> x2     >> lessp    n1<n2           < greaterp     n1>n2     > leqp    n1<=n2         <= geqp       n1>=n2       >= equal   g1 == g2    == nequal g1 != g2 != band        x1 & x2     & bnand         x1 ~& x2     ~& bxor       x1 ^ x2       ^ bxnor     x1 ~^ x2       ~^ bor     x1 | x2      | bnor    x1 ~| x2      ~| and      x1 && x2      &&  or          x1 || x2      || range   g1 : g2       : setq        s = expr       = 对于既有函数名又有操作符函数,采用函数名调用与采用操作符调用得效果就是一样得。ﻫ示例 lessp(3 1)=>nil 等同于 3<1=>nil 预定义算术函数 语法    结果    通用函数 add1(n)   n + 1 sub1(n) n – 1 abs(n)   绝对值 exp(n)      自然对数得n次方 log(n) max(n1 n2 、、、) min(n1 n2 、、、) mod(x1 x2)    取模运算 round(n) sqrt(n) sxtd(x w)   将x右扩展W个符号位 zxtd(x w) 与上面得功能相同,速度更快  三角函数 sin(n),cos(n),tan(n) asin(n),acos(n),atan(n)   随机数生成函数 random(x)   产生0~x-1得随机数 srandom(x) 初始化随机数生成函数得x 位操作 含义 操作符 位与    & 位或      | 位异或 ^ 左移位    >> 右移位   << 取反 ~ 真值、假值 § 真值,除了nil以为得值都就是真值。 § 假值,nil 条件控制函数 if, when, unless, cond § if if函数得语法结构      if( condition1 then   ;当condition1为真值时执行代码块expA     expA   else     if( condition2 then ;当condition2为真值时执行代码块expB       expB     else     …            expC    )      );end if § when when函数语法结构     when( condition   ;当condition为真值时执行代码块expA,否则跳过        expA       ); end when § unless unless语法结构     unless( condition   ;当condition为假值时执行代码块expA,否则跳过   expA    ); end unless § cond cond语法结构     cond (          ( condition1 expA、、、 ) ;当condition1为真值时执行代码块expA   ( condition2 expB 、、、 ) ;…           ( condition3 expC 、、、 )  ;…        ( t expN )   ;之前得条件都不满足时默认执行expN       ); end cond [注]:";" 表示注释 循环控制函数 while,for,foreach § while while语法结构 while( condition is true ;当condition为真值时反复执行代码块expA,否则结束循环      expA     ) § for for语法结构   for( i 1 5         println(i)    ) 将输出       1    2   3      4     5 § foreach foreach就是简化版得for,上面得例子用foreach写如下 alist = ‘(1 2 3 4 5)   foreach( item alist         println( item )   ) foreach通常用于操作列表,因为它会遍历列表得每一个元素。 选择函数 § caseq得用法类似cond,功能也类似。  caseq( var (condition1 expA)   (condition2 expB) … ) ;case语法结构 循环结构中得局部变量 使用关键字prog可以在循环结构中定义局部变量。关于prog得详细介绍请参考函数章节。 返回函数 表示返回值得关键字就是return。return可以强制一个prog结构立即结束,送出返回值,忽略剩余得循环操作。 示例 prog( ( )        for( i 0 10    when( oddp( i )     return( i )   ) ; when        ) ; for     ) ; prog 这个for循环不会运行10次,首次oddp(i)为真值得时候循环就会结束。 正则表达式 在很多得skill应用中都会用到正则表达式,比如在一个字符串数组中查找带有关键字user得字符串。示例: lStr = '("hello" "whenuser" "usere" "ffus er" "ppuserd" "uster");   lRes = nil foreach( item lStr if( rexMatchp("user" item) then       lRes = cons( item lRes)   println(item)    ) ) 输出: "whenuser" "usere" "ppuserd" lRes =>("ppuserd" "usere" "whenuser")、 这里得关键命令就是rexMatchp,函数形式为rexMatchp(t_pattern S_target),这个命令将在第二个参数中查找满足第一个参数(模式)得条件,如果找到返回真值,否则返回假值。 § 正则表达式(pattern)得组成字符 语法     含义 c    匹配任意非特殊字符 、      匹配任意字符 \   用在特殊字符前面代表特殊字符本身,用在 <, >, (, ), and 1,、、、,9, 得含义在下面描述 [c、、、]  一对方括号中包含一些字符将匹配括号中得任意一个字符,如果第一个字符就是 ^ 则表示不匹配括号中得所有字符,[a-z]表示匹配a到z之间得任一字符,"-”表示范围。 *    用在一个以上描述得字符或pattern后表示匹配该字符或pattern0次或多次。  +     类似*,区别在于匹配至少一次 \(、、\)  如果包含在这个符号中得字符串匹配上了,被匹配得字符可以被提取出来(最多支持9中匹配) \n    与上一个符号对应,反斜杠后跟一个数字将可以提前到上一个符合保留得字符串 \<、、、\> 这个符号表示完全匹配一个字符串得开始与结尾 rs     2个正则表达式得组合将尽可能多得匹配r并匹配一个s ^, $     ^表示字符串得开始, $表示字符串得结尾 § 常用正则匹配函数 rexpile,rexExecute,rexMatchp,rexSubstitute 示例: 使用 rexpile与rexExecute实现开头得示例 lStr = '("hello" "whenuser" "usere" "ffus er" "ppuserd" "uster");  lRes = nil rexpile("user") foreach( item lStr    if( rexExecute(item) then         lRes = cons( item lRes)     println(item)   ) ) 将得到与前一个示例一样得结果。示例: 使用rexSubstitute提取字符, 在给定格式得列表中提取symbol名字与对应得坐标 lStr = list("C17x855、00y-2790、00" "C676x3499、50y-2676、40" "Q690x3406、00y-2701、00" “C666x3535、00y-3135、00” “C785x1929、00y-3750、00” “U628x3865、00y-2025、00” “C737x3010、00y-3155、00” “R754x2770、00y-2730、00”) rexpile( "\\([A-Z]+[0-9]+\\)x\\([0-9、-]+\\)y\\([0-9、-]+\\)") ; \\(、、、\\) 结构表示匹配得部分将可以用\\1、、9提取出来 ; [A-Z]表示匹配A~Z得字符,+表示至少有一个这样得字符 foreach( item lStr when( rexExecute( item )  str1 = rexSubstitute( "\\1" )   str2 = rexSubstitute( "\\2" ) str3 = rexSubstitute( "\\3" )       printf("%s<->%s<->%s\n" str1 str2 str3) ) ); 将输出: C17<->855、00<->-2790、00 C676<->3499、50<->-2676、40 Q690<->3406、00<->-2701、00 C785<->1929、00<->-3750、00 U628<->3865、00<->-2025、00 C737<->3010、00<->-3155、00 R754<->2770、00<->-2730、00 § 更多示例,参考Skill正则表达式应用举例 Skill正则表达式应用举例 处理Dangling Line Report allegro得report命令在report dangling line得时候也会同时report dangling via 出来。 如果您record过script,就会发现产生dangling line report得allegro命令就是reports "Dangling Lines Report"。ﻫ这个命令会在当前allegro工作得文件夹下产生一个叫dangling_lines、rpt得文件。 ;------------------------------------------------ <<dangling line>>      Power TOP        *(7710、00 -1865、00) to *(6705、00 -1615、00) GND   BOTTOM   *(7890、00 -1774、00) to *(6575、00 -2045、00) 1V5  INT3   *(7860、00 -1930、00) to *(6675、00 -2660、00) 12V    INT5    *(7830、00 -1930、00) to *(6705、00 -2660、00) << Dangling Vias >> GND      VIA24C12P        (5505、00 -320、00) 1V5   VIA24C12P    (5465、00 -320、00) 现在我想用正则表达式来找到Via得信息,而排除line得以及一些其它得文字信息。 下面就是我想到得patten:ﻫ "^[ A-Z0-9_]+[ ]+[A-Z0-9_]+[ ]+([-0-9、]+ [-0-9、]+)$" 在skill环境下简单试一下 rexMatchp("^[ A-Z0-9_<>*]+[ ]+[A-Z0-9_]+[ ]+([-0-9、]+ [-0-9、]+)$" “  1V5       VIA24C12P (5465、00 -320、00)” )=>t rexMatchp("^[ A-Z0-9_<>*]+[ ]+[A-Z0-9_]+[ ]+([-0-9、]+ [-0-9、]+)$" “  1V5          VIA24C12P       (5465、00 -320、00)to(5465、00 -320、00)” )=>nil 所以就是满足我们得要求得! 完整得提取程序: axlShell( "reports \"Dangling Lines Report\"" ) pDanglingFile= infile( "、/dangling_lines、rpt" ) dl_list = nil unless( getc( pDanglingFile ) axlMsgPut( "----- Errors found in Dangling Line Report -----" )   while( gets( dl_entry pDanglingFile )     when( rexMatchp("^[ A-Z0-9_<>*]+[ ]+[A-Z0-9_]+[ ]+([-0-9、]+ [-0-9、]+)、$" dl_entry )  ;;因为gets读进来得dl_entry还带了个"\n",所以必须在之前定义得patten后面再加上一个“、"来匹配它        dl_entry = buildString( parseString(dl_entry) " ")  ;;因为report结果里面得via net, padstack以及坐标间隔很大,这个让间隔变小一点       dl_list = cons( dl_entry dl_list )    )   )   close(pDanglingFile)   dl_list = sort(dl_list nil)  ;根据字符串大小得默认排序 ) 这样就得到了dangling via得列表了。接下来得操作就随个人了,比如把它显示到一个form里面。 另一个例子 "From: C803、1 (3313、000 2553、921) To: U1802、C3 (7321、024 -1296、024)" rexpile("\\(([-0-9、]+ [-0-9、]+)\\)[^(]+\\(([-0-9、]+ [-0-9、]+)\\)") 这样就可以得到带括号得坐标 rexpile("(\\([-0-9、]+ [-0-9、]+\\))[^(]+(\\([-0-9、]+ [-0-9、]+\\))") 得到不带括号得坐标 特殊字符,注释,空格,圆括号与其它标记法得使用 § 特殊字符 SKill中得特殊字符列表 字符  全名 含义 \    反斜杠  辅助输出特殊字符 ()  圆括号  组织数据列表与调用函数列表 [] 中括号 数组索引,超级右中括号 {}   大括号   使用progn时组织一系列表达式 '  单引号   单引号中得表达式不会被解析 "   双引号  字符串分界符 ,   逗号         列表中可选得元素分界符; 在反引号作用范围内使用强制表达式解析 ; 分号       行注释 :    冒号     位分隔符,范围操作 、   点号       getq操作 +,–,*,/ 算术运算   算术运算符; 同时"/*"与"*/"组合也用于多行注释 !,^,&,| 逻辑运算   逻辑运算符 <,>,=  关系运算  比较运算,赋值以及位运算 #   #   用在第一列表示信号得特别解析      @ 用在第一个字符表示保留字;另外在反引号作用范围内使用将强制表达式解析 ?   问号  如果就是第一个字符表示关键字 `   反引号 引号内得表达式不被解析 %   百分号  $     -  保留为将来使用 [注]:输出这些特殊字符都需要在字符前加"\"。 § 注释 § 行注释方法, 使用分号";",注释范围在分号当前行。 § 多行注释,使用"/*"与"*/"对,注释范围在这这对符号内。 § 空格,空格得限制比较少,只就是要注意下面几个情况 § 函数名与跟在后面得圆括号之间不能有空格,如max(4 2)就是对得,而max (4 2)则就是错得; § 表示负数得符号"-"与数字之间不能有空格,如-5, -(a*b)有效,而- 5,- (a*b)无效; § 表示算术运算得"+ - * /"在2个数字之间得位置要对称,如a - b, a-b有效,而a -b无效。 § 圆括号 § 圆括号在skill中用于函数调用,分隔多个表达式,控制表达式得解析顺序 § skill中调用函数有2种方式,max(a b)与(max a b)都有效。 § 超级右中括号,不推荐使用 § 在使用了很多"("得表达式后,可以用"]"来代表很多个用于结尾得")"。   如f1( f2( f3( f4( x ) ) ) )等效于f1( f2( f3( f4( x ]。 § 反引号,逗号与逗号加@  示例1、       y = 1       '(x y z) => (x y z) ;反引号使得表达式不被解析,所以其中得y不会被1代替 '(x ,y z)  => (x 1 z) ;增加一个逗号在反引号表达式中,逗号后面得表达式将被解析 示例2、 x = 1       y = '(a b c)     '(,x ,y z)  => (1 (a b c) z);逗号后得表达式都被解析了 '(,x ,y z) => (1 a b c z) ;","得作用与逗号一样,只就是被解析对象就是列表,且解析出来得元素代替了原来得列表 § 续行符"\" § 使用"\"可以让在一行得文字多行表示, 如  string = "This is \         a test、" => "This is a test、" § 初始化列表得最大长度6000,但就是在程序运行中列表得长度无限制。 文件系统接口 § 路径 § 绝对路径:Unix中以"/"开始得路径,Windows中以磁盘"C:, D:,、、、"开始得路径 § 相对路径,不就是绝对路径得情况就就是相对路径  § 以"~/"开始得路径表示被查询得路径就是用户得home文件夹; § 以"~username"开始得路径,如果username正好就是一个用户得名字,那么被查询得路径将就是该用户得home文件夹; § 以"、/"开始得路径表示被查询得位置就是当前得工作目录 § 以"、、/"开始得路径表示被查询得位置为当前工作目录得父文件夹 § Skill路径  § skill支持用户定义若干不同得路径来存放skill源文件,并通过skill得路径管理函数来设置各个路径得访问顺序。如果同一个文件在不同路径下都存在,按照先到先得原则,即使用第一个被找到得文件。 § 设置skill查询路径得函数setSkillPath, 如setSkillPath("、" "~" "C:/Skill"),就设置了3个skill查询路径,先后顺序分别为"、"-当前工作路径,"~"-home文件夹,"C:/Skill"-用户自定义文件夹。 § 获取skill查询路径列表得函数getSkillPath,如setSkillPath("、" "~" "C:/Skill"); getSkillPath()=>("、" "~" "C:/Skill") § 安装路径 § 获取安装路径函数getInstallPath,如getInstallPath()=>"C:/Cadence/Psd16、2" § 检测文件状态 § 检测文件就是否存在函数is § 检测文件夹就是否存在函数isDir § 检测文件或文件夹得就是否可以被读取得函数isReadable § 检测文件或文件夹得就是否可以被写入得函数isWritable § 路径操作 § 生成与删除文件夹 § createDir(arg), 如createDir("c:/temp/skill"),将在c:/temp下创建一个skill文件夹; § deleteDir(arg),如deleteDir("c:/temp/skill"),将删除这个skill文件夹,如果这就是个空文件夹,且用户具有删除它得权限。 § 删除文件函数deleteFile § 获取指定文件夹下所有文件名函数getDirFiles § 获取当前工作目录getWorkingDir § 改变工作目录changeWorkingDir 端口 所有数据得输入输出都就是经由一个被称为端口得东西实现得。    预定义得标准端口 端口名 作用 piport 标准输入端口,等同于C中得stdin poport 标准输出端口,等同于C中得stdout errport 错误输出端口,等同于C中得stderr ptport 跟踪信息端口,等同于C中得stderr § 打开端口 § 打开一个文件读取端口infile infile("~/test/input、il")=> port:"~/test/input、il" § 打开一个文件输出端口outfile   p = outfile("~/test/out、il" "w") => port:"~/test/out、il" § 关闭端口close  p = outfile("~/test/out、il" "w") => port:"~/test/out、il" close(p) I/O § 输出 § 非格式化输出 print("hello")    ; 输出 "hello" println("hello")    ; 输出 "hello"加换行 § 格式化输出 常见格式化输出规范 格式 参数类型   输出结果 %d fixnum 十进制整数 %o fixnum  八进制整数 %x  fixnum 十六进制整数 %f  flonum 浮点数,格式为[-]ddd、ddd %e  flonum 浮点数,格式为[-]d、ddde[-]ddd %g flonum  不改变浮点数精度得情况下,以最少得空间表示 %s  string, symbol  输出字符串 %c string, symbol  输出第一个字符 %n fixnum, flonum 数字 %L  list 数据得默认形式输出 %P list   点Point %B list  Box 示例 printf( "hello, %s" "Willy" )=> "hello, Willy"  printf( "%d == %x" 20 20 )=> "20 == 14" ;把一个十进制书转换成16 sprintf( sMsg "hello, %s" "You" )=> sMsg="hello, You"  fprintf( port "1st line, %d words" 10 ); 输出"1st line, 10 words"到文件 printf( " \"%s\"" "c:\\text、il"); 输出 "c:\text、il",这里带了双引号 § 输入 输入函数列表 输入源        读取函数(评估版)           读取函数(未评估版)  操作函数 File文件      load/loadi     lineread      in String字符串 evalstring/loadstring/errsetstring  linereadstring   instring/gets/getc/fscanf/close 文件输入输出示例 § 创建文件并输出数据到该文件得函数 procedure( DataOut() lData = list(       '("just" 10 5、5)             '("for" 20 10、2)            '("test" 30 15、0)       '("use" 40 17、8)         '("done" 50 1、2)      ); 定义数据列表lData fDataOut = strcat( getTempDir() "、/" "data、txt") ; 输出文件名与路径,%temp%/data、txt。 pDataOut = outfile( fDataOut "w" ); 建立输出端口 foreach( item lData   fprintf( pDataOut "%s %d %0、2f\n"      ; 输出数据到文件端口       car(item) cadr(item) caddr(item)  ; item=>每一个在lData中得列表        ); end fprintf   ); end foreach close( pDataOut )  ; 关闭端口    printf( "I- output data from lData list to , done!" fDataOut ); 输出提示信息 ); end procedure § 从指定文件读取数据 procedure( DataIn() prog( (fDataIn pDataIn lData sWord nNum fNum) ;设置局部变量   fDataIn = strcat( getTempDir() "、/" "data、txt") ; 输入文件   unless( isFile( fDataIn ) ; 如果文件不存在则跳转到函数末尾,结束函数       printf("E- %s does not exist, double check please!" fDataIn)       go(SkipToEnd)  ; 在prog中支持go操作       )   pDataIn = infile( fDataIn ); 建立输入端口    lData = nil      初始化列表变量    while( fscanf( pDataIn "%s %d %0、2f" sWord nNum fNum ) ; 安照数据文件格式读取        lData = cons( list( sWord nNum fNum ) lData )    ); end while   ; 读取完毕lData里得数据将与上例中得一样    close( pDataIn )    SkipToEnd ); end prog ); end procedure 数字 § 整数 进制列表: 前缀 示例[十进制值] 二进制   0b或0B   0b1010 [10] 八进制   0    012 [10] 十进制          10 十六进制  0x或0X   0x11 [17] § 浮点数 与其它得编程语言一样,如1、0,1、,0、5,、5,1e6…… § 比例因子             比例因子              字符    全名     比例        示例   Y     Yotta 1、00E+24      10Y [ 10e+25 ]      Z   Zetta   1、00E+21 10Z [ 10e+22 ]   E   Exa       1、00E+18     10E [ 10e+19 ]   P    Peta      1、00E+15      10P [ 10e+16 ]   T  Tera     1、00E+12    10T [ 10e+13 ]   G Giga       1、00E+09    10G [ 10e+10 ] M      Mega      1、00E+06      10M [ 10e+7 ]    k or K  kilo 1、00E+03  10k [ 10e+4 ]   %   percent   1、00E-02   5% [ 0、05 ]     m   milli  1、00E-03     5m [ 5、0e-3 ]     u     micro   1、00E-06   1、2u [ 1、2e-6]   n     nano      1、00E-09    1、2n [ 1、2e-9 ]   p   pico    1、00E-12       1、2p [ 1、2e-12 ]     f    femto    1、00E-15     1、2f [ 1、2e-15 ]     a  atto     1、00E-18    1、2a [ 1、2e-18 ]  
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服