Cadence SKILL

Infobox programming language
name = SKILL

paradigm = OOP or Functional
year = 1990
designer = ?
developer = Cadence Design Systems
latest release version = ?
latest release date = ?
typing = dynamic
implementations = ?
dialects = SKILL/SKILL++
influenced_by = Common Lisp
influenced =
SKILL is the LISP-like scripting language and PCell (Parameterized Cells) description language of Cadence Design Systems IC design software that was originally put forth in an IEEE paper in 1990.

SKILL will also run under the Cadence Allegro PCB design toolset.

History

SKILL was originally based on a flavor of Lisp called "Franz Lisp" created by Franz Inc. of Oakland, CA.

yntax

Skill programmers have a choice of expression syntaxes. Traditional lisp syntax such as

(car mylist)
can be mixed with C-like syntax such as
car(mylist)
. Certain arithmetic operations can be also called using an infix notation. Thus
(plus 1 2)

plus(1 2)

1+2

are all recognized.

Note that all variables in Skill are considered special.

Additional commands with a prefix of "axl" are added for functions specific to the PCB Editor, such as (axlDBGetDesign). Commands with a prefix of "cn" are added for functions specific to the Design Entry tool, such as (cnGetDwgInfo).

Example

procedure(pcGenCell(pcCellView "d") prog((fingers m w_microns l_microns)

if(! pcCellView return())

fingers = pcCellView~>parameters~>fingers if(! fingers then fingers = 1) if(! fixp(fingers) then fingers = 1) m = pcCellView~>parameters~>m if(! m then m = 1) if(! fixp(m) then m = 1) w_microns = pcCellView~>parameters~>w_microns if(! w_microns then w_microns = 1.000000) if(! floatp(w_microns) then w_microns = 1.000000) l_microns = pcCellView~>parameters~>l_microns if(! l_microns then l_microns = 1.000000) if(! floatp(l_microns) then l_microns = 1.000000)

(let (cv tf f quantum polyPitch serial bag prop xCorrection yCorrection contactSpacing polySpacing activeContactEnc polyContactSpacing selectActiveEnc wellActiveEnc m1ContactEnc contactSize deep) (setq cv pcCellView) (setq tf (techGetTechFile cv)) (setq serial (equal m 1)) (setq f (max fingers m)) (setq bag (dbOpenBag (ddGetObj (getSGq tf libName)) "r")) (setq prop (dbFindProp bag "minLength")) (setq quantum (quotient (getq prop value) 2)) (setq prop (dbFindProp bag "technology")) (setq deep (rindex (getq prop value) "DEEP")) (dbCloseBag bag) (setq contactSize (times 2 quantum)) (if (equal (modulo (round (quotient l_microns (quotient quantum 2.0))) 2) 1) then (setq xCorrection (quotient quantum 4.0)) else (setq xCorrection 0)) (if (equal (modulo (round (quotient w_microns (quotient quantum 2.0))) 2) 1) then (setq yCorrection (quotient quantum 4.0)) else (setq yCorrection 0)) (setq contactSpacing (techGetSpacingRule tf "minSpacing" "cc")) ;; 2.0 (setq polySpacing (techGetSpacingRule tf "minSpacing" "poly")) ;; 3.0 (setq polyContactSpacing (techGetSpacingRule tf "minSpacing" "poly" "cc")) ;; 2.0 vs nil (setq activeContactEnc (techGetOrderedSpacingRule tf "minEnclosure" "active" "cc")) ;; 1.0 vs nil (setq selectActiveEnc (techGetOrderedSpacingRule tf "minEnclosure" "pselect" "active")) ;; 2.0 vs nil (setq wellActiveEnc (techGetOrderedSpacingRule tf "minEnclosure" "nwell" "active")) ;; 6.0 vs nil (setq m1ContactEnc (techGetOrderedSpacingRule tf "minEnclosure" "metal1" "cc")) ;; 1.0 vs nil (if (equal serial t) then (setq polyPitch (plus l_microns polySpacing)) else (setq polyPitch (plus l_microns (times 2 (plus polyContactSpacing quantum))))) (let (halfW halfL left right upper lower offset netName idx fig net pin) (if (equal deep "DEEP") then (setq halfW (times (plus w_microns (times 5 quantum)) 0.5)) else (setq halfW (times (plus w_microns (times 4 quantum)) 0.5))) (setq halfL (times l_microns 0.5)) (setq offset 0) (setq netName "G") (setq idx 2) (for g 1 f (setq left (plus (minus halfL) offset xCorrection)) (setq right (plus halfL offset xCorrection)) (setq lower (plus (minus halfW) yCorrection)) (setq upper (plus halfW yCorrection)) (dbCreateRect cv "poly" (list (range left lower) (range right upper))) (setq fig (dbCreateRect cv (list "poly" "pin") (list (range left lower) (range right upper)))) (setq net (dbCreateNet cv netName)) (dbCreateTerm net netName "input") (setq pin (dbCreatePin net fig netName)) (setSGq pin (list "top" "bottom") accessDir) (setq netName (strcat "G" (sprintf nil "%d" (postincrement idx)))) (setq offset (plus offset polyPitch)) ) ) (let (polyEdgeActiveEdge w h hOffset hOffsetStep actLeft actRight actUpper actLower selLeft selRight selUpper selLower wellLeft wellRight wellUpper wellLower numContacts conLeft conRight conUpper conLower netName idx minWidth rightContactOffset leftContactOffset actChunkWidth) (setq polyEdgeActiveEdge (plus polyContactSpacing contactSize activeContactEnc)) (setq w (plus (times 2 polyEdgeActiveEdge) (times (difference f 1) polyPitch) l_microns)) (setq h w_microns) (setq minWidth (lessp w_microns (plus (times 2 activeContactEnc) contactSize))) (if (equal (mod f 2) 1) then (setq offset (times polyPitch (quotient f 2))) else (setq offset (plus (times polyPitch (quotient (difference f 1) 2)) (times polyPitch 0.5))) ) (setq actLeft (plus (minus (times w 0.5)) offset xCorrection)) (setq actRight (plus (times w 0.5) offset xCorrection)) (setq actLower (plus (minus (times h 0.5)) yCorrection)) (setq actUpper (plus (times h 0.5) yCorrection)) (dbCreateRect cv "pactive" (list (range actLeft actLower) (range actRight actUpper))) (if minWidth then (setq actUpper (plus actLower (times 4 quantum)))) (setq selLeft (difference actLeft selectActiveEnc)) (setq selRight (plus actRight selectActiveEnc)) (if (equal deep "DEEP") then (setq selLower (difference actLower selectActiveEnc (times 0.5 quantum))) (setq selUpper (plus actUpper selectActiveEnc (times 0.5 quantum))) else (setq selLower (difference actLower selectActiveEnc)) (setq selUpper (plus actUpper selectActiveEnc)) ) (dbCreateRect cv "pselect" (list (range selLeft selLower) (range selRight selUpper))) (setq wellLeft (difference actLeft wellActiveEnc)) (setq wellRight (plus actRight wellActiveEnc)) (setq wellLower (difference actLower wellActiveEnc)) (setq wellUpper (plus actUpper wellActiveEnc)) (dbCreateRect cv "nwell" (list (range wellLeft wellLower) (range wellRight wellUpper))) (if minWidth then (setq numContacts 1) (setq actChunkWidth (plus (times 2 activeContactEnc) contactSize)) else (setq numContacts (floor (quotient (plus (difference w_microns (times 2 activeContactEnc)) contactSpacing) (plus contactSize contactSpacing)))) ) (if (equal serial t) then (setq leftContactOffset (plus actLeft activeContactEnc)) (setq rightContactOffset (plus leftContactOffset (times 2 (plus quantum polyContactSpacing)) (times f l_microns) (times (difference f 1) polySpacing))) (let (vOffset vOffsetStep lower conRight conLower conUpper halfW mid m1Left m1Right m1Lower m1Upper fig net pin) (setq vOffset 0) (setq vOffsetStep (plus contactSize contactSpacing)) (setq conRight (plus leftContactOffset contactSize)) (setq lower (plus actLower activeContactEnc)) (for c 1 numContacts (setq conLower (plus lower vOffset)) (setq conUpper (plus conLower contactSize)) (dbCreateRect cv "cc" (list (range leftContactOffset conLower) (range conRight conUpper))) (setq vOffset (plus vOffset vOffsetStep)) ) (setq halfW (plus quantum m1ContactEnc)) (setq mid (plus leftContactOffset quantum)) (setq m1Left (difference mid halfW)) (setq m1Right (plus mid halfW)) (setq m1Lower actLower) (setq m1Upper actUpper) (dbCreateRect cv "metal1" (list (range m1Left m1Lower) (range m1Right m1Upper))) (setq fig (dbCreateRect cv (list "metal1" "pin") (list (range m1Left m1Lower) (range m1Right m1Upper)))) (setq net (dbCreateNet cv "S")) (dbCreateTerm net "S" "inputOutput") (setq pin (dbCreatePin net fig "S")) (setSGq pin (list "top" "bottom") accessDir) ) (let (vOffset vOffsetStep lower conRight conLower conUpper halfW mid m1Left m1Right m1Lower m1Upper fig net pin) (setq vOffset 0) (setq vOffsetStep (plus contactSize contactSpacing)) (setq conRight (plus rightContactOffset contactSize)) (setq lower (plus actLower activeContactEnc)) (for c 1 numContacts (setq conLower (plus lower vOffset)) (setq conUpper (plus conLower contactSize)) (dbCreateRect cv "cc" (list (range rightContactOffset conLower) (range conRight conUpper))) (setq vOffset (plus vOffset vOffsetStep)) ) (setq halfW (plus quantum m1ContactEnc)) (setq mid (plus rightContactOffset quantum)) (setq m1Left (difference mid halfW)) (setq m1Right (plus mid halfW)) (setq m1Lower actLower) (setq m1Upper actUpper) (dbCreateRect cv "metal1" (list (range m1Left m1Lower) (range m1Right m1Upper))) (setq fig (dbCreateRect cv (list "metal1" "pin") (list (range m1Left m1Lower) (range m1Right m1Upper)))) (setq net (dbCreateNet cv "D")) (dbCreateTerm net "D" "inputOutput") (setq pin (dbCreatePin net fig "D")) (setSGq pin (list "top" "bottom") accessDir) ) (if minWidth then (dbCreateRect cv "pactive" (list (range actLeft actLower) (range (plus actLeft actChunkWidth) actUpper))) (dbCreateRect cv "pactive" (list (range (difference rightContactOffset activeContactEnc) actLower) (range (plus (difference rightContactOffset activeContactEnc) actChunkWidth) actUpper))) ) else (setq hOffset (plus actLeft activeContactEnc)) (setq hOffsetStep (plus (times 2 (plus quantum polyContactSpacing)) l_microns)) (setq netName "S") (setq idx 2) (for groups 1 f (let (vOffset vOffsetStep lower conRight conLower conUpper halfW mid m1Left m1Right m1Lower m1Upper fig net pin) (setq vOffset 0) (setq vOffsetStep (plus contactSize contactSpacing)) (setq conRight (plus hOffset contactSize)) (setq lower (plus actLower activeContactEnc)) (for c 1 numContacts (setq conLower (plus lower vOffset)) (setq conUpper (plus conLower contactSize)) (dbCreateRect cv "cc" (list (range hOffset conLower) (range conRight conUpper))) (setq vOffset (plus vOffset vOffsetStep)) ) (setq halfW (plus quantum m1ContactEnc)) (setq mid (plus hOffset quantum)) (setq m1Left (difference mid halfW)) (setq m1Right (plus mid halfW)) (setq m1Lower actLower) (setq m1Upper actUpper) (dbCreateRect cv "metal1" (list (range m1Left m1Lower) (range m1Right m1Upper))) (setq fig (dbCreateRect cv (list "metal1" "pin") (list (range m1Left m1Lower) (range m1Right m1Upper)))) (setq net (dbCreateNet cv netName)) (dbCreateTerm net netName "inputOutput") (setq pin (dbCreatePin net fig netName)) (setSGq pin (list "top" "bottom") accessDir) ) (if minWidth then (dbCreateRect cv "pactive" (list (range (difference hOffset activeContactEnc) actLower) (range (plus (difference hOffset activeContactEnc) actChunkWidth) actUpper))) ) (setq hOffset (plus hOffset hOffsetStep)) (setq netName (strcat "S" (sprintf nil "%d" (postincrement idx)))) ) (let (vOffset vOffsetStep lower conRight conLower conUpper halfW mid m1Left m1Right m1Lower m1Upper fig net pin) (setq vOffset 0) (setq vOffsetStep (plus contactSize contactSpacing)) (setq conRight (plus hOffset contactSize)) (setq lower (plus actLower activeContactEnc)) (for c 1 numContacts (setq conLower (plus lower vOffset)) (setq conUpper (plus conLower contactSize)) (dbCreateRect cv "cc" (list (range hOffset conLower) (range conRight conUpper))) (setq vOffset (plus vOffset vOffsetStep)) ) (setq halfW (plus quantum m1ContactEnc)) (setq mid (plus hOffset quantum)) (setq m1Left (difference mid halfW)) (setq m1Right (plus mid halfW)) (setq m1Lower actLower) (setq m1Upper actUpper) (dbCreateRect cv "metal1" (list (range m1Left m1Lower) (range m1Right m1Upper))) (setq fig (dbCreateRect cv (list "metal1" "pin") (list (range m1Left m1Lower) (range m1Right m1Upper)))) (setq net (dbCreateNet cv "D")) (dbCreateTerm net "D" "inputOutput") (setq pin (dbCreatePin net fig "D")) (setSGq pin (list "top" "bottom") accessDir) ) (if minWidth then (dbCreateRect cv "pactive" (list (range (difference hOffset activeContactEnc) actLower) (range (plus (difference hOffset activeContactEnc) actChunkWidth) actUpper))) ))) (dbReplaceProp cv "viewSubType" "string" "maskLayoutParamCell") (dbReplaceProp cv "function" "string" "transistor") ) t

return(t) ))

References

Academic:

* G. Wood and H-F S. Law, "SKILL - An Interactive Procedural Design Environment," Proceedings of Custom Integrated Circuits Conference, 1986, pp.544-547

* Timothy J. Barnes, "SKILL: A CAD System Extension Language," Design Automation Conference, 1990, pp.266-271

External links

* [http://www.cadence.com Cadence Design Systems]
* [http://www.CopperCAD.com CopperCAD Design - Commercial site for Custom and Pre-Packaged SKILL Programs]
* [http://sourcelink.cadence.com/docs/files/Release_Info/Docs/sklanguser/sklanguser06.70/chap1.html#1008210 Short example - requires a password - for Paid users only.]
* [http://www.ece.uci.edu/eceware/cadence/sklanguser/chap1.html#1008210 Other example - Dead Link]


Wikimedia Foundation. 2010.

Look at other dictionaries:

  • Cadence Capital Limited — is a boutique investment company listed on the Australian Securities Exchange (ASX). History The company started in October 2005 as a very small unlisted investment vehicle, having raised $5,050,700 in capital.It subsequently issued a Prospectus… …   Wikipedia

  • arts, East Asian — Introduction       music and visual and performing arts of China, Korea, and Japan. The literatures of these countries are covered in the articles Chinese literature, Korean literature, and Japanese literature.       Some studies of East Asia… …   Universalium

  • S4 League — Éditeur Neowiz Games Développeur Pentavision Date de sortie 7 octobre 2008 …   Wikipédia en Français

  • literature — /lit euhr euh cheuhr, choor , li treuh /, n. 1. writings in which expression and form, in connection with ideas of permanent and universal interest, are characteristic or essential features, as poetry, novels, history, biography, and essays. 2.… …   Universalium

  • Clavier-Übung III — Johann Sebastian Bach, 1746 The Clavier Übung III, sometimes referred to as the German Organ Mass, is a collection of compositions for organ by Johann Sebastian Bach, started in 1735–6 and published in 1739. It is considered to be Bach s most… …   Wikipedia

  • MUSIC — This article is arranged according to the following outline: introduction written sources of direct and circumstantial evidence the material relics and iconography notated sources oral tradition archives and important collections of jewish music… …   Encyclopedia of Judaism

  • Rapping — Rap redirects here. For other uses, see Rap (disambiguation). MCing redirects here. For the hosting of events in general, see Master of Ceremonies. This article is about rapping as a technique or activity. For more information on the music genre …   Wikipedia

  • Vedic meter — For the quatrain poetic form of North India and Pakistan, see Chhand (poetry). See Sanskrit meter for meter in Classical Sanskrit poetry. Chandas redirects here. See Chandas (font) for the computer typeface. Part of a series on …   Wikipedia

  • circus — circusy, adj. /serr keuhs/, n., pl. circuses. 1. a large public entertainment, typically presented in one or more very large tents or in an outdoor or indoor arena, featuring exhibitions of pageantry, feats of skill and daring, performing animals …   Universalium

  • Trill (music) — Example of a trill, on the note B.  Play with (help …   Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”